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 #ifndef _PURL
00137 #define _PURL
00138
00139 #ifdef P_USE_PRAGMA
00140 #pragma interface
00141 #endif
00142
00143 #include <ptlib.h>
00144
00145
00147
00148
00149 class PURLLegacyScheme;
00150
00156 class PURL : public PObject
00157 {
00158 PCLASSINFO(PURL, PObject)
00159 public:
00161 PURL();
00163 PURL(
00164 const char * cstr,
00165 const char * defaultScheme = NULL
00166 );
00168 PURL(
00169 const PString & str,
00170 const char * defaultScheme = NULL
00171 );
00173 PURL(
00174 const PFilePath & path
00175 );
00176
00185 virtual Comparison Compare(
00186 const PObject & obj
00187 ) const;
00188
00200 virtual PINDEX HashFunction() const;
00201
00204 virtual void PrintOn(
00205 ostream &strm
00206 ) const;
00207
00211 virtual void ReadFrom(
00212 istream &strm
00213 );
00215
00219 inline BOOL Parse(
00220 const char * cstr,
00221 const char * defaultScheme = NULL
00222 ) { return InternalParse(cstr, defaultScheme); }
00224 inline BOOL Parse(
00225 const PString & str,
00226 const char * defaultScheme = NULL
00227 ) { return InternalParse((const char *)str, defaultScheme); }
00228
00230 enum UrlFormat {
00232 FullURL,
00234 PathOnly,
00236 URIOnly,
00238 HostPortOnly
00239 };
00240
00247 PString AsString(
00248 UrlFormat fmt = FullURL
00249 ) const;
00250
00254 PFilePath AsFilePath() const;
00255
00257 enum TranslationType {
00259 LoginTranslation,
00261 PathTranslation,
00263 QueryTranslation
00264 };
00265
00273 static PString TranslateString(
00274 const PString & str,
00275 TranslationType type
00276 );
00277
00285 static PString UntranslateString(
00286 const PString & str,
00287 TranslationType type
00288 );
00289
00291 static void SplitQueryVars(
00292 const PString & queryStr,
00293 PStringToString & queryVars
00294 );
00295
00296
00298 const PCaselessString & GetScheme() const { return scheme; }
00299
00301 void SetScheme(const PString & scheme);
00302
00304 const PString & GetUserName() const { return username; }
00305
00307 void SetUserName(const PString & username);
00308
00310 const PString & GetPassword() const { return password; }
00311
00313 void SetPassword(const PString & password);
00314
00316 const PCaselessString & GetHostName() const { return hostname; }
00317
00319 void SetHostName(const PString & hostname);
00320
00322 WORD GetPort() const { return port; }
00323
00325 void SetPort(WORD newPort);
00326
00328 BOOL GetRelativePath() const { return relativePath; }
00329
00331 const PString & GetPathStr() const { return pathStr; }
00332
00334 void SetPathStr(const PString & pathStr);
00335
00337 const PStringArray & GetPath() const { return path; }
00338
00340 void SetPath(const PStringArray & path);
00341
00343 PString GetParameters() const;
00344
00346 void SetParameters(const PString & parameters);
00347
00349 const PStringToString & GetParamVars() const { return paramVars; }
00350
00352 void SetParamVars(const PStringToString & paramVars);
00353
00355 void SetParamVar(const PString & key, const PString & data);
00356
00358 const PString & GetFragment() const { return fragment; }
00359
00361 PString GetQuery() const;
00362
00364 void SetQuery(const PString & query);
00365
00367 const PStringToString & GetQueryVars() const { return queryVars; }
00368
00370 void SetQueryVars(const PStringToString & queryVars);
00371
00373 void SetQueryVar(const PString & key, const PString & data);
00374
00376 BOOL IsEmpty() const { return urlString.IsEmpty(); }
00377
00378
00385 static BOOL OpenBrowser(
00386 const PString & url
00387 );
00389
00390 BOOL LegacyParse(const PString & _url, const PURLLegacyScheme * schemeInfo);
00391 PString LegacyAsString(PURL::UrlFormat fmt, const PURLLegacyScheme * schemeInfo) const;
00392
00393 protected:
00394 virtual BOOL InternalParse(
00395 const char * cstr,
00396 const char * defaultScheme
00397 );
00398 void Recalculate();
00399 PString urlString;
00400
00401 PCaselessString scheme;
00402 PString username;
00403 PString password;
00404 PCaselessString hostname;
00405 WORD port;
00406 BOOL portSupplied;
00407 BOOL relativePath;
00408 PString pathStr;
00409 PStringArray path;
00410 PStringToString paramVars;
00411 PString fragment;
00412 PStringToString queryVars;
00413 };
00414
00415
00417
00418
00419 class PURLScheme : public PObject
00420 {
00421 PCLASSINFO(PURLScheme, PObject);
00422 public:
00423 virtual PString GetName() const = 0;
00424 virtual BOOL Parse(const PString & url, PURL & purl) const = 0;
00425 virtual PString AsString(PURL::UrlFormat fmt, const PURL & purl) const = 0;
00426 };
00427
00429
00430
00431 class PURLLegacyScheme : public PURLScheme
00432 {
00433 public:
00434 PURLLegacyScheme(const char * _scheme)
00435 : scheme(_scheme) { }
00436
00437 BOOL Parse(const PString & url, PURL & purl) const
00438 { return purl.LegacyParse(url, this); }
00439
00440 PString AsString(PURL::UrlFormat fmt, const PURL & purl) const
00441 { return purl.LegacyAsString(fmt, this); }
00442
00443 PString GetName() const
00444 { return scheme; }
00445
00446 PString scheme;
00447 BOOL hasUsername;
00448 BOOL hasPassword;
00449 BOOL hasHostPort;
00450 BOOL defaultToUserIfNoAt;
00451 BOOL defaultHostToLocal;
00452 BOOL hasQuery;
00453 BOOL hasParameters;
00454 BOOL hasFragments;
00455 BOOL hasPath;
00456 BOOL relativeImpliesScheme;
00457 WORD defaultPort;
00458 };
00459
00460 #endif
00461
00462