00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
#ifndef _PURL
00120
#define _PURL
00121
00122
#ifdef P_USE_PRAGMA
00123
#pragma interface
00124
#endif
00125
00127
00128
00129
class PURLLegacyScheme;
00130
00136 class PURL :
public PObject
00137 {
00138
PCLASSINFO(
PURL,
PObject)
00139
public:
00141
PURL();
00143
PURL(
00144
const char * cstr,
00145
const char * defaultScheme = NULL
00146 );
00148
PURL(
00149
const PString & str,
00150
const char * defaultScheme = NULL
00151 );
00153
PURL(
00154
const PFilePath &
path
00155 );
00156
00165
virtual Comparison
Compare(
00166
const PObject & obj
00167 )
const;
00168
00180
virtual PINDEX
HashFunction()
const;
00181
00184
virtual void PrintOn(
00185 ostream &strm
00186 )
const;
00187
00191
virtual void ReadFrom(
00192 istream &strm
00193 );
00195
00199 inline BOOL
Parse(
00200
const char * cstr,
00201
const char * defaultScheme = NULL
00202 ) {
return InternalParse(cstr, defaultScheme); }
00204 inline BOOL Parse(
00205
const PString & str,
00206
const char * defaultScheme = NULL
00207 ) {
return InternalParse((
const char *)str, defaultScheme); }
00208
00210 enum UrlFormat {
00212
FullURL,
00214
PathOnly,
00216
URIOnly,
00218
HostPortOnly
00219 };
00220
00227
PString AsString(
00228 UrlFormat fmt = FullURL
00229 )
const;
00230
00234
PFilePath AsFilePath() const;
00235
00237 enum TranslationType {
00239
LoginTranslation,
00241
PathTranslation,
00243
QueryTranslation
00244 };
00245
00253
static PString TranslateString(
00254
const PString & str,
00255 TranslationType type
00256 );
00257
00265
static PString UntranslateString(
00266
const PString & str,
00267 TranslationType type
00268 );
00269
00271
static void SplitQueryVars(
00272
const PString & queryStr,
00273
PStringToString & queryVars
00274 );
00275
00276
00278 const PCaselessString &
GetScheme()
const {
return scheme; }
00279
00281
void SetScheme(
const PString & scheme);
00282
00284 const PString &
GetUserName()
const {
return username; }
00285
00287
void SetUserName(
const PString & username);
00288
00290 const PString &
GetPassword()
const {
return password; }
00291
00293
void SetPassword(
const PString & password);
00294
00296 const PCaselessString &
GetHostName()
const {
return hostname; }
00297
00299
void SetHostName(
const PString & hostname);
00300
00302 WORD
GetPort()
const {
return port; }
00303
00305
void SetPort(WORD newPort);
00306
00308 BOOL
GetRelativePath()
const {
return relativePath; }
00309
00311 const PString &
GetPathStr()
const {
return pathStr; }
00312
00314
void SetPathStr(
const PString & pathStr);
00315
00317 const PStringArray &
GetPath()
const {
return path; }
00318
00320
void SetPath(
const PStringArray & path);
00321
00323
PString GetParameters() const;
00324
00326
void SetParameters(const
PString & parameters);
00327
00329 const
PStringToString & GetParamVars()
const {
return paramVars; }
00330
00332
void SetParamVars(
const PStringToString & paramVars);
00333
00335
void SetParamVar(
const PString & key,
const PString & data);
00336
00338 const PString &
GetFragment()
const {
return fragment; }
00339
00341
PString GetQuery() const;
00342
00344
void SetQuery(const
PString & query);
00345
00347 const
PStringToString & GetQueryVars()
const {
return queryVars; }
00348
00350
void SetQueryVars(
const PStringToString & queryVars);
00351
00353
void SetQueryVar(
const PString & key,
const PString & data);
00354
00356 BOOL
IsEmpty()
const {
return urlString.
IsEmpty(); }
00357
00358
00365
static BOOL OpenBrowser(
00366
const PString & url
00367 );
00369
00370 BOOL LegacyParse(
const PString & _url,
const PURLLegacyScheme * schemeInfo);
00371
PString LegacyAsString(PURL::UrlFormat fmt,
const PURLLegacyScheme * schemeInfo)
const;
00372
00373
protected:
00374
virtual BOOL InternalParse(
00375
const char * cstr,
00376
const char * defaultScheme
00377 );
00378
void Recalculate();
00379 PString urlString;
00380
00381 PCaselessString scheme;
00382 PString username;
00383 PString password;
00384 PCaselessString hostname;
00385 WORD
port;
00386 BOOL
relativePath;
00387 PString pathStr;
00388 PStringArray path;
00389 PStringToString paramVars;
00390 PString fragment;
00391 PStringToString queryVars;
00392 };
00393
00394
00395 class PURLScheme :
public PObject
00396 {
00397
PCLASSINFO(
PURLScheme,
PObject);
00398
public:
00399
virtual PString GetName()
const = 0;
00400
virtual BOOL
Parse(
const PString & url,
PURL & purl)
const = 0;
00401
virtual PString AsString(PURL::UrlFormat fmt,
const PURL & purl)
const = 0;
00402 };
00403
00404
#ifdef _WIN32
00405
# ifndef P_DISABLE_FACTORY_INSTANCES
00406
# ifndef P_FACTORY_INSTANCE_PURLScheme
00407
# define P_FACTORY_INSTANCE_PURLScheme 1
00408
# pragma message("Including PURLScheme factory loader")
00409
PLOAD_FACTORY(
PURLScheme,
PString)
00410 # endif
00411
# endif
00412
#endif
00413
00414
#endif
00415
00416