X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd65d8c83003ebbf9ab3275957fefa8cd7c87cc3..7bd30a12ade503fd135c686ecc98a6f6d5fecbeb:/include/wx/uri.h diff --git a/include/wx/uri.h b/include/wx/uri.h index 706e5010cf..6b9b9ace15 100644 --- a/include/wx/uri.h +++ b/include/wx/uri.h @@ -1,133 +1,179 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: uri.h -// Purpose: wxURI - Class for parsing/validating URIs +// Name: wx/uri.h +// Purpose: wxURI - Class for parsing URIs // Author: Ryan Norton -// Modified By: +// Vadim Zeitlin (UTF-8 URI support, many other changes) // Created: 07/01/2004 // RCS-ID: $Id$ -// Licence: wxWindows +// Copyright: (c) 2004 Ryan Norton +// 2008 Vadim Zeitlin +// Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_URIH__ -#define _WX_URIH__ - -#if defined(__GNUG__) && !defined(__APPLE__) -#pragma interface "uri.h" -#endif +#ifndef _WX_URI_H_ +#define _WX_URI_H_ #include "wx/defs.h" #include "wx/object.h" #include "wx/string.h" +#include "wx/arrstr.h" -// Host Type that the server can be -typedef enum +// Host Type that the server component can be +enum wxURIHostType { - wxURI_REGNAME, - wxURI_IPV4ADDRESS, - wxURI_IPV6ADDRESS, - wxURI_IPVFUTURE -} wxURIHostType; + wxURI_REGNAME, // Host is a normal register name (www.mysite.com etc.) + wxURI_IPV4ADDRESS, // Host is a version 4 ip address (192.168.1.100) + wxURI_IPV6ADDRESS, // Host is a version 6 ip address [aa:aa:aa:aa::aa:aa]:5050 + wxURI_IPVFUTURE // Host is a future ip address (wxURI is unsure what kind) +}; // Component Flags -typedef enum +enum wxURIFieldType { wxURI_SCHEME = 1, - wxURI_USER = 2, + wxURI_USERINFO = 2, wxURI_SERVER = 4, wxURI_PORT = 8, wxURI_PATH = 16, wxURI_QUERY = 32, wxURI_FRAGMENT = 64 -} wxURIFieldType; +}; + +// Miscellaneous other flags +enum wxURIFlags +{ + wxURI_STRICT = 1 +}; + // Generic class for parsing URIs. // -// Originally based off of RFC 2396 - then -// extended to meet the newer RFC 2396.bis -// specifications. -class wxURI : public wxObject +// See RFC 3986 +class WXDLLIMPEXP_BASE wxURI : public wxObject { public: wxURI(); wxURI(const wxString& uri); - wxURI(const wxURI& uri); - - ~wxURI(); - void Create(const wxString& uri); + // default copy ctor, assignment operator and dtor are ok - bool HasScheme() const; - bool HasUser() const; - bool HasServer() const; - bool HasPort() const; - bool HasPath() const; - bool HasQuery() const; - bool HasFragment() const; + bool Create(const wxString& uri); - const wxString& GetScheme() const; - const wxString& GetPath() const; - const wxString& GetQuery() const; - const wxString& GetFragment() const; - const wxString& GetPort() const; - const wxString& GetUser() const; - const wxString& GetServer() const; - const wxURIHostType& GetHostType() const; + wxURI& operator=(const wxString& string) + { + Create(string); + return *this; + } - wxString Get() const; + bool operator==(const wxURI& uri) const; - void Resolve(const wxURI& base, const bool& bStrict = true); - bool IsReference() const; + // various accessors - wxURI& operator = (const wxURI& uri); - wxURI& operator = (const wxChar* string); - bool operator == (const wxURI& uri) const; - -protected: + bool HasScheme() const { return (m_fields & wxURI_SCHEME) != 0; } + bool HasUserInfo() const { return (m_fields & wxURI_USERINFO) != 0; } + bool HasServer() const { return (m_fields & wxURI_SERVER) != 0; } + bool HasPort() const { return (m_fields & wxURI_PORT) != 0; } + bool HasPath() const { return (m_fields & wxURI_PATH) != 0; } + bool HasQuery() const { return (m_fields & wxURI_QUERY) != 0; } + bool HasFragment() const { return (m_fields & wxURI_FRAGMENT) != 0; } - void Clear(); + const wxString& GetScheme() const { return m_scheme; } + const wxString& GetPath() const { return m_path; } + const wxString& GetQuery() const { return m_query; } + const wxString& GetFragment() const { return m_fragment; } + const wxString& GetPort() const { return m_port; } + const wxString& GetUserInfo() const { return m_userinfo; } + const wxString& GetServer() const { return m_server; } + wxURIHostType GetHostType() const { return m_hostType; } - const wxChar* Parse (const wxChar* uri); - const wxChar* ParseAuthority (const wxChar* uri); - const wxChar* ParseScheme (const wxChar* uri); - const wxChar* ParseUser (const wxChar* uri); - const wxChar* ParseServer (const wxChar* uri); - const wxChar* ParsePort (const wxChar* uri); - const wxChar* ParsePath (const wxChar* uri, const bool& bReference = false, - const bool& bNormalize = true); - const wxChar* ParseQuery (const wxChar* uri); - const wxChar* ParseFragment (const wxChar* uri); + // these functions only work if the user information part of the URI is in + // the usual (but insecure and hence explicitly recommended against by the + // RFC) "user:password" form + wxString GetUser() const; + wxString GetPassword() const; - static bool ParseH16(const wxChar*& uri); - static bool ParseIPv4address(const wxChar*& uri); - static bool ParseIPv6address(const wxChar*& uri); - static bool ParseIPvFuture(const wxChar*& uri); + // combine all URI components into a single string + // + // BuildURI() returns the real URI suitable for use with network libraries, + // for example, while BuildUnescapedURI() returns a string suitable to be + // shown to the user. + wxString BuildURI() const { return DoBuildURI(&wxURI::Nothing); } + wxString BuildUnescapedURI() const { return DoBuildURI(&wxURI::Unescape); } + // the escaped URI should contain only ASCII characters, including possible + // escape sequences + static wxString Unescape(const wxString& escapedURI); - static void Normalize(wxChar* uri, const bool& bIgnoreLeads = false); - static void UpTree(const wxChar* uristart, const wxChar*& uri); - static void Unescape(const wxChar*& s, wxChar& c); - static void Escape (wxString& s, const wxChar& c); - static bool IsEscape(const wxChar*& uri); + void Resolve(const wxURI& base, int flags = wxURI_STRICT); + bool IsReference() const; - static int CharToHex(const wxChar& c); - +protected: + void Clear(); - static bool IsUnreserved (const wxChar& c); - static bool IsReserved (const wxChar& c); - static bool IsGenDelim (const wxChar& c); - static bool IsSubDelim (const wxChar& c); - static bool IsHex(const wxChar& c); - static bool IsAlpha(const wxChar& c); - static bool IsDigit(const wxChar& c); + // common part of BuildURI() and BuildUnescapedURI() + wxString DoBuildURI(wxString (*funcDecode)(const wxString&)) const; + + // function which returns its argument unmodified, this is used by + // BuildURI() to tell DoBuildURI() that nothing needs to be done with the + // URI components + static wxString Nothing(const wxString& value) { return value; } + + bool Parse(const char* uri); + + const char* ParseAuthority (const char* uri); + const char* ParseScheme (const char* uri); + const char* ParseUserInfo (const char* uri); + const char* ParseServer (const char* uri); + const char* ParsePort (const char* uri); + const char* ParsePath (const char* uri); + const char* ParseQuery (const char* uri); + const char* ParseFragment (const char* uri); + + + static bool ParseH16(const char*& uri); + static bool ParseIPv4address(const char*& uri); + static bool ParseIPv6address(const char*& uri); + static bool ParseIPvFuture(const char*& uri); + + // should be called with i pointing to '%', returns the encoded character + // following it or -1 if invalid and advances i past it (so that it points + // to the last character consumed on return) + static int DecodeEscape(wxString::const_iterator& i); + + // append next character pointer to by p to the string in an escaped form + // and advance p past it + // + // if the next character is '%' and it's followed by 2 hex digits, they are + // not escaped (again) by this function, this allows to keep (backwards- + // compatible) ambiguity about the input format to wxURI::Create(): it can + // be either already escaped or not + void AppendNextEscaped(wxString& s, const char *& p); + + // convert hexadecimal digit to its value; return -1 if c isn't valid + static int CharToHex(char c); + + // split an URI path string in its component segments (including empty and + // "." ones, no post-processing is done) + static wxArrayString SplitInSegments(const wxString& path); + + // various URI grammar helpers + static bool IsUnreserved(char c); + static bool IsReserved(char c); + static bool IsGenDelim(char c); + static bool IsSubDelim(char c); + static bool IsHex(char c); + static bool IsAlpha(char c); + static bool IsDigit(char c); + static bool IsEndPath(char c); wxString m_scheme; wxString m_path; wxString m_query; wxString m_fragment; - wxString m_user; + wxString m_userinfo; wxString m_server; wxString m_port; @@ -136,6 +182,7 @@ protected: size_t m_fields; DECLARE_DYNAMIC_CLASS(wxURI) -};//end of wxURI +}; + +#endif // _WX_URI_H_ -#endif //_WX_URIH__