ROOT logo
// @(#)root/base:$Id: TUri.h 20877 2007-11-19 11:17:07Z rdm $
// Author: Gerhard E. Bruckner 15/07/07

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TUri
#define ROOT_TUri


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TUri                                                                 //
//                                                                      //
// This class represents a RFC3986 compatible URI.                      //
// See http://rfc.net/rfc3986.html.                                     //
// It provides member functions to return the different parts of        //
// an URI.                                                              //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif


class TUri;
Bool_t  operator==(const TUri &u1, const TUri &u2);


class TUri : public TObject {

friend Bool_t operator==(const TUri &u1, const TUri &u2); // comparison operator

private:

   // In order to represent the five basic components of an URI,
   // we use 7 member variables (authority gets splitted in 3 parts)
   //
   //   foo://user:pass@example.com:8042/over/there?name=ferret#nose
   //   \_/   \________________________/\_________/ \_________/ \__/
   //    |                 |                |            |        |
   //  scheme          authority           path        query   fragment
   //
   // In many cases we have to distinguish between empty
   // TString and undefined value (i.e. delimiter not found).
   // Therefore, we use a TString to hold the string value
   // and a corresponding Bool_t to store if it is defined or not.
   // The Bool_t has precedence.

   TString fScheme;
   TString fUserinfo;     // authority/userinfo: user@password, ...
   TString fHost;         // authority/host: hostname or ip-address
   TString fPort;         // authority/port: port number, normally 1-65535
   TString fPath;
   TString fQuery;
   TString fFragment;

   Bool_t fHasScheme;
   Bool_t fHasUserinfo;
   Bool_t fHasHost;
   Bool_t fHasPort;
   Bool_t fHasPath;
   Bool_t fHasQuery;
   Bool_t fHasFragment;

public:
   TUri(const TUri &uri);
   TUri() { Reset(); }
   TUri(const TString &uri);
   TUri(const char *uri);
   TUri &operator=(const TUri &rhs); //copy ctor
   virtual ~TUri() { }

   const TString GetUri() const;
   const TString GetScheme() const { return fScheme; }
   const TString GetHierPart() const;
   const TString GetRelativePart() const;
   const TString GetAuthority() const;
   const TString GetUserInfo() const { return fUserinfo; }
   const TString GetHost() const { return fHost; }
   const TString GetPort() const { return fPort; }
   const TString GetPath() const { return fPath; }
   const TString GetQuery() const { return fQuery; }
   const TString GetFragment() const { return fFragment; }

   Bool_t HasScheme() const { return fHasScheme; }
   Bool_t HasHierPart() const { return IsHierPart(GetHierPart()); }
   Bool_t HasAuthority() const { return fHasHost; }
   Bool_t HasUserInfo() const { return fHasUserinfo; }
   Bool_t HasHost() const { return fHasHost; }
   Bool_t HasPort() const { return fHasPort; }
   Bool_t HasPath() const { return fHasPath; }
   Bool_t HasQuery() const { return fHasQuery; }
   Bool_t HasFragment() const { return fHasFragment; }
   Bool_t HasRelativePart() const { return IsRelativePart(GetRelativePart()); }

   Bool_t SetUri(const TString &uri);
   Bool_t SetScheme(const TString &scheme);
   Bool_t SetHierPart(const TString &hier);
   Bool_t SetAuthority(const TString &authority);
   Bool_t SetUserInfo(const TString &userinfo);
   Bool_t SetHost(const TString &host);
   Bool_t SetPort(const TString &port);
   Bool_t SetPath(const TString &path);
   Bool_t SetQuery(const TString &path);
   Bool_t SetFragment(const TString &fragment);

   Bool_t SetRelativePart(const TString&);

   void   Print(Option_t *option = "") const;
   Bool_t IsSortable() const { return kTRUE; }

   void Normalise();
   void Reset();

   Bool_t IsAbsolute() const;
   Bool_t IsRelative() const;
   Bool_t IsUri() const;
   Bool_t IsReference() const;

   static Bool_t IsUnreserved(const TString &string);

   static const TString PctEncode(const TString &source);
   static const TString PctDecode(const TString &source);
   static const TString PctDecodeUnreserved(const TString &source);
   static const TString PctNormalise(const TString &source);

   static Bool_t IsScheme(const TString&);
   static Bool_t IsHierPart(const TString&);
   static Bool_t IsAuthority(const TString&);
   static Bool_t IsUserInfo(const TString&);
   static Bool_t IsHost(const TString&);
   static Bool_t IsIpv4(const TString&);
   static Bool_t IsRegName(const TString&);
   static Bool_t IsPort(const TString&);
   static Bool_t IsPath(const TString&);
   static Bool_t IsPathAbsolute(const TString&);
   static Bool_t IsPathAbempty(const TString&);
   static Bool_t IsPathNoscheme(const TString&);
   static Bool_t IsPathRootless(const TString&);
   static Bool_t IsPathEmpty(const TString&);
   static Bool_t IsQuery(const TString&);
   static Bool_t IsFragment(const TString&);

   static Bool_t IsRelativePart(const TString&);

   static const TString RemoveDotSegments(const TString&);

   static TUri Transform(const TUri &reference, const TUri &base);
   static const TString MergePaths(const TUri &reference, const TUri &base);

   ClassDef(TUri, 1)  //Represents an URI
};

#endif
 TUri.h:1
 TUri.h:2
 TUri.h:3
 TUri.h:4
 TUri.h:5
 TUri.h:6
 TUri.h:7
 TUri.h:8
 TUri.h:9
 TUri.h:10
 TUri.h:11
 TUri.h:12
 TUri.h:13
 TUri.h:14
 TUri.h:15
 TUri.h:16
 TUri.h:17
 TUri.h:18
 TUri.h:19
 TUri.h:20
 TUri.h:21
 TUri.h:22
 TUri.h:23
 TUri.h:24
 TUri.h:25
 TUri.h:26
 TUri.h:27
 TUri.h:28
 TUri.h:29
 TUri.h:30
 TUri.h:31
 TUri.h:32
 TUri.h:33
 TUri.h:34
 TUri.h:35
 TUri.h:36
 TUri.h:37
 TUri.h:38
 TUri.h:39
 TUri.h:40
 TUri.h:41
 TUri.h:42
 TUri.h:43
 TUri.h:44
 TUri.h:45
 TUri.h:46
 TUri.h:47
 TUri.h:48
 TUri.h:49
 TUri.h:50
 TUri.h:51
 TUri.h:52
 TUri.h:53
 TUri.h:54
 TUri.h:55
 TUri.h:56
 TUri.h:57
 TUri.h:58
 TUri.h:59
 TUri.h:60
 TUri.h:61
 TUri.h:62
 TUri.h:63
 TUri.h:64
 TUri.h:65
 TUri.h:66
 TUri.h:67
 TUri.h:68
 TUri.h:69
 TUri.h:70
 TUri.h:71
 TUri.h:72
 TUri.h:73
 TUri.h:74
 TUri.h:75
 TUri.h:76
 TUri.h:77
 TUri.h:78
 TUri.h:79
 TUri.h:80
 TUri.h:81
 TUri.h:82
 TUri.h:83
 TUri.h:84
 TUri.h:85
 TUri.h:86
 TUri.h:87
 TUri.h:88
 TUri.h:89
 TUri.h:90
 TUri.h:91
 TUri.h:92
 TUri.h:93
 TUri.h:94
 TUri.h:95
 TUri.h:96
 TUri.h:97
 TUri.h:98
 TUri.h:99
 TUri.h:100
 TUri.h:101
 TUri.h:102
 TUri.h:103
 TUri.h:104
 TUri.h:105
 TUri.h:106
 TUri.h:107
 TUri.h:108
 TUri.h:109
 TUri.h:110
 TUri.h:111
 TUri.h:112
 TUri.h:113
 TUri.h:114
 TUri.h:115
 TUri.h:116
 TUri.h:117
 TUri.h:118
 TUri.h:119
 TUri.h:120
 TUri.h:121
 TUri.h:122
 TUri.h:123
 TUri.h:124
 TUri.h:125
 TUri.h:126
 TUri.h:127
 TUri.h:128
 TUri.h:129
 TUri.h:130
 TUri.h:131
 TUri.h:132
 TUri.h:133
 TUri.h:134
 TUri.h:135
 TUri.h:136
 TUri.h:137
 TUri.h:138
 TUri.h:139
 TUri.h:140
 TUri.h:141
 TUri.h:142
 TUri.h:143
 TUri.h:144
 TUri.h:145
 TUri.h:146
 TUri.h:147
 TUri.h:148
 TUri.h:149
 TUri.h:150
 TUri.h:151
 TUri.h:152
 TUri.h:153
 TUri.h:154
 TUri.h:155
 TUri.h:156
 TUri.h:157
 TUri.h:158
 TUri.h:159
 TUri.h:160
 TUri.h:161
 TUri.h:162
 TUri.h:163
 TUri.h:164