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
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 #ifndef _PURL
00143 #define _PURL
00144
00145 #ifdef P_USE_PRAGMA
00146 #pragma interface
00147 #endif
00148
00149 #ifndef _PTLIB_H
00150 #include <ptlib.h>
00151 #endif
00152
00153
00155
00156
00157 class PURLLegacyScheme;
00158
00164 class PURL : public PObject
00165 {
00166 PCLASSINFO(PURL, PObject)
00167 public:
00169 PURL();
00171 PURL(
00172 const char * cstr,
00173 const char * defaultScheme = NULL
00174 );
00176 PURL(
00177 const PString & str,
00178 const char * defaultScheme = NULL
00179 );
00181 PURL(
00182 const PFilePath & path
00183 );
00184
00193 virtual Comparison Compare(
00194 const PObject & obj
00195 ) const;
00196
00208 virtual PINDEX HashFunction() const;
00209
00212 virtual void PrintOn(
00213 ostream &strm
00214 ) const;
00215
00219 virtual void ReadFrom(
00220 istream &strm
00221 );
00223
00227 inline BOOL Parse(
00228 const char * cstr,
00229 const char * defaultScheme = NULL
00230 ) { return InternalParse(cstr, defaultScheme); }
00232 inline BOOL Parse(
00233 const PString & str,
00234 const char * defaultScheme = NULL
00235 ) { return InternalParse((const char *)str, defaultScheme); }
00236
00238 enum UrlFormat {
00240 FullURL,
00242 PathOnly,
00244 URIOnly,
00246 HostPortOnly
00247 };
00248
00255 PString AsString(
00256 UrlFormat fmt = FullURL
00257 ) const;
00258
00262 PFilePath AsFilePath() const;
00263
00265 enum TranslationType {
00267 LoginTranslation,
00269 PathTranslation,
00271 QueryTranslation
00272 };
00273
00281 static PString TranslateString(
00282 const PString & str,
00283 TranslationType type
00284 );
00285
00293 static PString UntranslateString(
00294 const PString & str,
00295 TranslationType type
00296 );
00297
00299 static void SplitQueryVars(
00300 const PString & queryStr,
00301 PStringToString & queryVars
00302 );
00303
00304
00306 const PCaselessString & GetScheme() const { return scheme; }
00307
00309 void SetScheme(const PString & scheme);
00310
00312 const PString & GetUserName() const { return username; }
00313
00315 void SetUserName(const PString & username);
00316
00318 const PString & GetPassword() const { return password; }
00319
00321 void SetPassword(const PString & password);
00322
00324 const PCaselessString & GetHostName() const { return hostname; }
00325
00327 void SetHostName(const PString & hostname);
00328
00330 WORD GetPort() const { return port; }
00331
00333 void SetPort(WORD newPort);
00334
00336 BOOL GetPortSupplied() const { return portSupplied; }
00337
00339 BOOL GetRelativePath() const { return relativePath; }
00340
00342 const PString & GetPathStr() const { return pathStr; }
00343
00345 void SetPathStr(const PString & pathStr);
00346
00348 const PStringArray & GetPath() const { return path; }
00349
00351 void SetPath(const PStringArray & path);
00352
00354 PString GetParameters() const;
00355
00357 void SetParameters(const PString & parameters);
00358
00360 const PStringToString & GetParamVars() const { return paramVars; }
00361
00363 void SetParamVars(const PStringToString & paramVars);
00364
00366 void SetParamVar(const PString & key, const PString & data);
00367
00369 const PString & GetFragment() const { return fragment; }
00370
00372 PString GetQuery() const;
00373
00375 void SetQuery(const PString & query);
00376
00378 const PStringToString & GetQueryVars() const { return queryVars; }
00379
00381 void SetQueryVars(const PStringToString & queryVars);
00382
00384 void SetQueryVar(const PString & key, const PString & data);
00385
00387 BOOL IsEmpty() const { return urlString.IsEmpty(); }
00388
00389
00396 static BOOL OpenBrowser(
00397 const PString & url
00398 );
00400
00401 BOOL LegacyParse(const PString & _url, const PURLLegacyScheme * schemeInfo);
00402 PString LegacyAsString(PURL::UrlFormat fmt, const PURLLegacyScheme * schemeInfo) const;
00403
00404 protected:
00405 virtual BOOL InternalParse(
00406 const char * cstr,
00407 const char * defaultScheme
00408 );
00409 void Recalculate();
00410 PString urlString;
00411
00412 PCaselessString scheme;
00413 PString username;
00414 PString password;
00415 PCaselessString hostname;
00416 WORD port;
00417 BOOL portSupplied;
00418 BOOL relativePath;
00419 PString pathStr;
00420 PStringArray path;
00421 PStringToString paramVars;
00422 PString fragment;
00423 PStringToString queryVars;
00424 };
00425
00426
00428
00429
00430 class PURLScheme : public PObject
00431 {
00432 PCLASSINFO(PURLScheme, PObject);
00433 public:
00434 virtual PString GetName() const = 0;
00435 virtual BOOL Parse(const PString & url, PURL & purl) const = 0;
00436 virtual PString AsString(PURL::UrlFormat fmt, const PURL & purl) const = 0;
00437 };
00438
00440
00441
00442 class PURLLegacyScheme : public PURLScheme
00443 {
00444 public:
00445 PURLLegacyScheme(const char * _scheme)
00446 : scheme(_scheme) { }
00447
00448 BOOL Parse(const PString & url, PURL & purl) const
00449 { return purl.LegacyParse(url, this); }
00450
00451 PString AsString(PURL::UrlFormat fmt, const PURL & purl) const
00452 { return purl.LegacyAsString(fmt, this); }
00453
00454 PString GetName() const
00455 { return scheme; }
00456
00457 PString scheme;
00458 BOOL hasUsername;
00459 BOOL hasPassword;
00460 BOOL hasHostPort;
00461 BOOL defaultToUserIfNoAt;
00462 BOOL defaultHostToLocal;
00463 BOOL hasQuery;
00464 BOOL hasParameters;
00465 BOOL hasFragments;
00466 BOOL hasPath;
00467 BOOL relativeImpliesScheme;
00468 WORD defaultPort;
00469 };
00470
00471 #endif
00472
00473