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 #ifndef PTLIB_PURL_H
00032 #define PTLIB_PURL_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038
00039 #if P_URL
00040
00041 #include <ptlib/pfactory.h>
00042
00043
00045
00046
00047 class PURLLegacyScheme;
00048
00054 class PURL : public PObject
00055 {
00056 PCLASSINFO(PURL, PObject)
00057 public:
00059 PURL();
00061 PURL(
00062 const char * cstr,
00063 const char * defaultScheme = "http"
00064 );
00066 PURL(
00067 const PString & str,
00068 const char * defaultScheme = "http"
00069 );
00071 PURL(
00072 const PFilePath & path
00073 );
00074
00075 PURL(const PURL & other);
00076 PURL & operator=(const PURL & other);
00077
00086 virtual Comparison Compare(
00087 const PObject & obj
00088 ) const;
00089
00101 virtual PINDEX HashFunction() const;
00102
00105 virtual void PrintOn(
00106 ostream &strm
00107 ) const;
00108
00112 virtual void ReadFrom(
00113 istream &strm
00114 );
00116
00120 inline PBoolean Parse(
00121 const char * cstr,
00122 const char * defaultScheme = NULL
00123 ) { return InternalParse(cstr, defaultScheme); }
00125 inline PBoolean Parse(
00126 const PString & str,
00127 const char * defaultScheme = NULL
00128 ) { return InternalParse((const char *)str, defaultScheme); }
00129
00131 enum UrlFormat {
00133 FullURL,
00135 PathOnly,
00137 URIOnly,
00139 HostPortOnly
00140 };
00141
00148 PString AsString(
00149 UrlFormat fmt = FullURL
00150 ) const;
00151 operator PString() const { return AsString(); }
00152
00156 PFilePath AsFilePath() const;
00157
00159 enum TranslationType {
00161 LoginTranslation,
00163 PathTranslation,
00165 QueryTranslation,
00167 ParameterTranslation,
00169 QuotedParameterTranslation
00170 };
00171
00179 static PString TranslateString(
00180 const PString & str,
00181 TranslationType type
00182 );
00183
00191 static PString UntranslateString(
00192 const PString & str,
00193 TranslationType type
00194 );
00195
00197 static void SplitVars(
00198 const PString & str,
00199 PStringToString & vars,
00200 char sep1 = ';',
00201 char sep2 = '=',
00202 TranslationType type = ParameterTranslation
00203 );
00204
00206 static void SplitQueryVars(
00207 const PString & queryStr,
00208 PStringToString & queryVars
00209 ) { SplitVars(queryStr, queryVars, '&', '=', QueryTranslation); }
00210
00213 static void OutputVars(
00214 ostream & strm,
00215 const PStringToString & vars,
00216 char sep0 = ';',
00217 char sep1 = ';',
00218 char sep2 = '=',
00219 TranslationType type = ParameterTranslation
00220 );
00221
00222
00224 const PCaselessString & GetScheme() const { return scheme; }
00225
00227 void SetScheme(const PString & scheme);
00228
00230 const PString & GetUserName() const { return username; }
00231
00233 void SetUserName(const PString & username);
00234
00236 const PString & GetPassword() const { return password; }
00237
00239 void SetPassword(const PString & password);
00240
00242 const PCaselessString & GetHostName() const { return hostname; }
00243
00245 void SetHostName(const PString & hostname);
00246
00248 WORD GetPort() const { return port; }
00249
00251 void SetPort(WORD newPort);
00252
00254 PBoolean GetPortSupplied() const { return portSupplied; }
00255
00257 PBoolean GetRelativePath() const { return relativePath; }
00258
00260 PString GetPathStr() const;
00261
00263 void SetPathStr(const PString & pathStr);
00264
00266 const PStringArray & GetPath() const { return path; }
00267
00269 void SetPath(const PStringArray & path);
00270
00272 void AppendPath(const PString & segment);
00273
00275 PString GetParameters() const;
00276
00278 void SetParameters(const PString & parameters);
00279
00282 const PStringOptions & GetParamVars() const { return paramVars; }
00283
00286 void SetParamVars(const PStringToString & paramVars);
00287
00290 void SetParamVar(
00291 const PString & key,
00292 const PString & data,
00293 bool emptyDataDeletes = true
00294 );
00295
00297 const PString & GetFragment() const { return fragment; }
00298
00300 PString GetQuery() const;
00301
00304 void SetQuery(const PString & query);
00305
00308 const PStringOptions & GetQueryVars() const { return queryVars; }
00309
00312 void SetQueryVars(const PStringToString & queryVars);
00313
00316 void SetQueryVar(const PString & key, const PString & data);
00317
00319 const PString & GetContents() const { return m_contents; }
00320
00322 void SetContents(const PString & str);
00323
00325 PBoolean IsEmpty() const { return urlString.IsEmpty(); }
00326
00327
00332 bool LoadResource(
00333 PString & data,
00334 const PString & requiredContentType = PString::Empty()
00335 ) const;
00336 bool LoadResource(
00337 PBYTEArray & data,
00338 const PString & requiredContentType = PString::Empty()
00339 ) const;
00340
00347 bool OpenBrowser() const { return OpenBrowser(AsString()); }
00348 static bool OpenBrowser(
00349 const PString & url
00350 );
00352
00353 PBoolean LegacyParse(const PString & url, const PURLLegacyScheme * schemeInfo);
00354 PString LegacyAsString(PURL::UrlFormat fmt, const PURLLegacyScheme * schemeInfo) const;
00355
00356 protected:
00357 void CopyContents(const PURL & other);
00358 virtual PBoolean InternalParse(
00359 const char * cstr,
00360 const char * defaultScheme
00361 );
00362 void Recalculate();
00363 PString urlString;
00364
00365 PCaselessString scheme;
00366 PString username;
00367 PString password;
00368 PCaselessString hostname;
00369 WORD port;
00370 PBoolean portSupplied;
00371 PBoolean relativePath;
00372 PStringArray path;
00373 PStringOptions paramVars;
00374 PString fragment;
00375 PStringOptions queryVars;
00376 PString m_contents;
00377 };
00378
00379
00381
00382
00383 class PURLScheme : public PObject
00384 {
00385 PCLASSINFO(PURLScheme, PObject);
00386 public:
00387 virtual PString GetName() const = 0;
00388 virtual PBoolean Parse(const PString & url, PURL & purl) const = 0;
00389 virtual PString AsString(PURL::UrlFormat fmt, const PURL & purl) const = 0;
00390 };
00391
00392 typedef PFactory<PURLScheme> PURLSchemeFactory;
00393
00394
00396
00397
00398 class PURLLegacyScheme : public PURLScheme
00399 {
00400 public:
00401 PURLLegacyScheme(
00402 const char * s,
00403 bool user = false,
00404 bool pass = false,
00405 bool host = false,
00406 bool def = false,
00407 bool defhost = false,
00408 bool query = false,
00409 bool params = false,
00410 bool frags = false,
00411 bool path = false,
00412 bool rel = false,
00413 WORD port = 0
00414 )
00415 : scheme(s)
00416 , hasUsername (user)
00417 , hasPassword (pass)
00418 , hasHostPort (host)
00419 , defaultToUserIfNoAt (def)
00420 , defaultHostToLocal (defhost)
00421 , hasQuery (query)
00422 , hasParameters (params)
00423 , hasFragments (frags)
00424 , hasPath (path)
00425 , relativeImpliesScheme (rel)
00426 , defaultPort (port)
00427 { }
00428
00429 PBoolean Parse(const PString & url, PURL & purl) const
00430 { return purl.LegacyParse(url, this); }
00431
00432 PString AsString(PURL::UrlFormat fmt, const PURL & purl) const
00433 { return purl.LegacyAsString(fmt, this); }
00434
00435 PString GetName() const
00436 { return scheme; }
00437
00438 PString scheme;
00439 bool hasUsername;
00440 bool hasPassword;
00441 bool hasHostPort;
00442 bool defaultToUserIfNoAt;
00443 bool defaultHostToLocal;
00444 bool hasQuery;
00445 bool hasParameters;
00446 bool hasFragments;
00447 bool hasPath;
00448 bool relativeImpliesScheme;
00449 WORD defaultPort;
00450 };
00451
00452 #define PURL_LEGACY_SCHEME(schemeName, user, pass, host, def, defhost, query, params, frags, path, rel, port) \
00453 class PURLLegacyScheme_##schemeName : public PURLLegacyScheme \
00454 { \
00455 public: \
00456 PURLLegacyScheme_##schemeName() \
00457 : PURLLegacyScheme(#schemeName, user, pass, host, def, defhost, query, params, frags, path, rel, port) \
00458 { } \
00459 }; \
00460 static PURLSchemeFactory::Worker<PURLLegacyScheme_##schemeName> schemeName##Factory(#schemeName, true); \
00461
00462
00463
00465
00466
00467 class PURLLoader : public PObject
00468 {
00469 PCLASSINFO(PURLLoader, PObject);
00470 public:
00471 virtual bool Load(const PURL & url, PString & str, const PString & requiredContentType) = 0;
00472 virtual bool Load(const PURL & url, PBYTEArray & data, const PString & requiredContentType) = 0;
00473 };
00474
00475 typedef PFactory<PURLLoader> PURLLoaderFactory;
00476
00477
00478 #endif // P_URL
00479
00480 #endif // PTLIB_PURL_H
00481
00482
00483