]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/uri.h
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxURI - Class for parsing URIs
5 // Vadim Zeitlin (UTF-8 URI support, many other changes)
7 // Copyright: (c) 2004 Ryan Norton
9 // Licence: wxWindows Licence
10 /////////////////////////////////////////////////////////////////////////////
16 #include "wx/object.h"
17 #include "wx/string.h"
18 #include "wx/arrstr.h"
20 // Host Type that the server component can be
23 wxURI_REGNAME
, // Host is a normal register name (www.mysite.com etc.)
24 wxURI_IPV4ADDRESS
, // Host is a version 4 ip address (192.168.1.100)
25 wxURI_IPV6ADDRESS
, // Host is a version 6 ip address [aa:aa:aa:aa::aa:aa]:5050
26 wxURI_IPVFUTURE
// Host is a future ip address (wxURI is unsure what kind)
41 // Miscellaneous other flags
48 // Generic class for parsing URIs.
51 class WXDLLIMPEXP_BASE wxURI
: public wxObject
55 wxURI(const wxString
& uri
);
57 // default copy ctor, assignment operator and dtor are ok
59 bool Create(const wxString
& uri
);
61 wxURI
& operator=(const wxString
& string
)
67 bool operator==(const wxURI
& uri
) const;
71 bool HasScheme() const { return (m_fields
& wxURI_SCHEME
) != 0; }
72 bool HasUserInfo() const { return (m_fields
& wxURI_USERINFO
) != 0; }
73 bool HasServer() const { return (m_fields
& wxURI_SERVER
) != 0; }
74 bool HasPort() const { return (m_fields
& wxURI_PORT
) != 0; }
75 bool HasPath() const { return (m_fields
& wxURI_PATH
) != 0; }
76 bool HasQuery() const { return (m_fields
& wxURI_QUERY
) != 0; }
77 bool HasFragment() const { return (m_fields
& wxURI_FRAGMENT
) != 0; }
79 const wxString
& GetScheme() const { return m_scheme
; }
80 const wxString
& GetPath() const { return m_path
; }
81 const wxString
& GetQuery() const { return m_query
; }
82 const wxString
& GetFragment() const { return m_fragment
; }
83 const wxString
& GetPort() const { return m_port
; }
84 const wxString
& GetUserInfo() const { return m_userinfo
; }
85 const wxString
& GetServer() const { return m_server
; }
86 wxURIHostType
GetHostType() const { return m_hostType
; }
88 // these functions only work if the user information part of the URI is in
89 // the usual (but insecure and hence explicitly recommended against by the
90 // RFC) "user:password" form
91 wxString
GetUser() const;
92 wxString
GetPassword() const;
95 // combine all URI components into a single string
97 // BuildURI() returns the real URI suitable for use with network libraries,
98 // for example, while BuildUnescapedURI() returns a string suitable to be
100 wxString
BuildURI() const { return DoBuildURI(&wxURI::Nothing
); }
101 wxString
BuildUnescapedURI() const { return DoBuildURI(&wxURI::Unescape
); }
103 // the escaped URI should contain only ASCII characters, including possible
105 static wxString
Unescape(const wxString
& escapedURI
);
108 void Resolve(const wxURI
& base
, int flags
= wxURI_STRICT
);
109 bool IsReference() const;
114 // common part of BuildURI() and BuildUnescapedURI()
115 wxString
DoBuildURI(wxString (*funcDecode
)(const wxString
&)) const;
117 // function which returns its argument unmodified, this is used by
118 // BuildURI() to tell DoBuildURI() that nothing needs to be done with the
120 static wxString
Nothing(const wxString
& value
) { return value
; }
122 bool Parse(const char* uri
);
124 const char* ParseAuthority (const char* uri
);
125 const char* ParseScheme (const char* uri
);
126 const char* ParseUserInfo (const char* uri
);
127 const char* ParseServer (const char* uri
);
128 const char* ParsePort (const char* uri
);
129 const char* ParsePath (const char* uri
);
130 const char* ParseQuery (const char* uri
);
131 const char* ParseFragment (const char* uri
);
134 static bool ParseH16(const char*& uri
);
135 static bool ParseIPv4address(const char*& uri
);
136 static bool ParseIPv6address(const char*& uri
);
137 static bool ParseIPvFuture(const char*& uri
);
139 // should be called with i pointing to '%', returns the encoded character
140 // following it or -1 if invalid and advances i past it (so that it points
141 // to the last character consumed on return)
142 static int DecodeEscape(wxString::const_iterator
& i
);
144 // append next character pointer to by p to the string in an escaped form
145 // and advance p past it
147 // if the next character is '%' and it's followed by 2 hex digits, they are
148 // not escaped (again) by this function, this allows to keep (backwards-
149 // compatible) ambiguity about the input format to wxURI::Create(): it can
150 // be either already escaped or not
151 void AppendNextEscaped(wxString
& s
, const char *& p
);
153 // convert hexadecimal digit to its value; return -1 if c isn't valid
154 static int CharToHex(char c
);
156 // split an URI path string in its component segments (including empty and
157 // "." ones, no post-processing is done)
158 static wxArrayString
SplitInSegments(const wxString
& path
);
160 // various URI grammar helpers
161 static bool IsUnreserved(char c
);
162 static bool IsReserved(char c
);
163 static bool IsGenDelim(char c
);
164 static bool IsSubDelim(char c
);
165 static bool IsHex(char c
);
166 static bool IsAlpha(char c
);
167 static bool IsDigit(char c
);
168 static bool IsEndPath(char c
);
179 wxURIHostType m_hostType
;
183 DECLARE_DYNAMIC_CLASS(wxURI
)