]>
git.saurik.com Git - wxWidgets.git/blob - src/common/uri.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Implementation of a uri parser
7 // Copyright: (c) 2004 Ryan Norton
9 /////////////////////////////////////////////////////////////////////////////
11 // ===========================================================================
13 // ===========================================================================
15 // ---------------------------------------------------------------------------
17 // ---------------------------------------------------------------------------
19 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
20 #pragma implementation "uri.h"
23 // For compilers that support precompilation, includes "wx.h".
24 #include "wx/wxprec.h"
32 // ---------------------------------------------------------------------------
34 // ---------------------------------------------------------------------------
36 IMPLEMENT_CLASS(wxURI
, wxObject
);
38 // ===========================================================================
40 // ===========================================================================
42 // ---------------------------------------------------------------------------
44 // ---------------------------------------------------------------------------
46 // ---------------------------------------------------------------------------
50 // ---------------------------------------------------------------------------
52 // ---------------------------------------------------------------------------
54 // ---------------------------------------------------------------------------
56 wxURI::wxURI() : m_hostType(wxURI_REGNAME
), m_fields(0)
60 wxURI::wxURI(const wxString
& uri
) : m_hostType(wxURI_REGNAME
), m_fields(0)
65 wxURI::wxURI(const wxURI
& uri
) : m_hostType(wxURI_REGNAME
), m_fields(0)
70 // ---------------------------------------------------------------------------
71 // Destructor and cleanup
72 // ---------------------------------------------------------------------------
81 m_scheme
= m_user
= m_server
= m_port
= m_path
=
82 m_query
= m_fragment
= wxT("");
84 m_hostType
= wxURI_REGNAME
;
89 // ---------------------------------------------------------------------------
92 // This creates the URI - all we do here is call the main parsing method
93 // ---------------------------------------------------------------------------
95 const wxChar
* wxURI::Create(const wxString
& uri
)
103 // ---------------------------------------------------------------------------
106 // TranslateEscape unencodes a 3 character URL escape sequence
108 // Escape encodes an invalid URI character into a 3 character sequence
110 // IsEscape determines if the input string contains an escape sequence,
111 // if it does, then it moves the input string past the escape sequence
113 // Unescape unencodes all 3 character URL escape sequences in a wxString
114 // ---------------------------------------------------------------------------
116 wxChar
wxURI::TranslateEscape(const wxChar
* s
)
118 wxASSERT_MSG(IsHex(*s
) && IsHex(*(s
+1)), wxT("Invalid escape!"));
120 return CharToHex(*s
) * 0x10 + CharToHex(*++s
);
123 wxString
wxURI::Unescape(const wxString
& uri
)
127 for(size_t i
= 0; i
< uri
.length(); ++i
)
129 if (uri
[i
] == wxT('%'))
131 new_uri
+= wxURI::TranslateEscape( &(uri
.c_str()[i
+1]) );
139 void wxURI::Escape(wxString
& s
, const wxChar
& c
)
141 const wxChar
* hdig
= wxT("0123456789abcdef");
143 s
+= hdig
[(c
>> 4) & 15];
147 bool wxURI::IsEscape(const wxChar
*& uri
)
149 // pct-encoded = "%" HEXDIG HEXDIG
150 if(*uri
== wxT('%') && IsHex(*(uri
+1)) && IsHex(*(uri
+2)))
159 // ---------------------------------------------------------------------------
162 // BuildURI() builds the entire URI into a useable
163 // representation, including proper identification characters such as slashes
165 // BuildUnescapedURI() does the same thing as BuildURI(), only it unescapes
166 // the components that accept escape sequences
167 // ---------------------------------------------------------------------------
169 wxString
wxURI::BuildURI() const
174 ret
= ret
+ m_scheme
+ wxT(":");
181 ret
= ret
+ m_user
+ wxT("@");
186 ret
= ret
+ wxT(":") + m_port
;
192 ret
= ret
+ wxT("?") + m_query
;
195 ret
= ret
+ wxT("#") + m_fragment
;
200 wxString
wxURI::BuildUnescapedURI() const
205 ret
= ret
+ m_scheme
+ wxT(":");
212 ret
= ret
+ wxURI::Unescape(m_user
) + wxT("@");
214 if (m_hostType
== wxURI_REGNAME
)
215 ret
+= wxURI::Unescape(m_server
);
220 ret
= ret
+ wxT(":") + m_port
;
223 ret
+= wxURI::Unescape(m_path
);
226 ret
= ret
+ wxT("?") + wxURI::Unescape(m_query
);
229 ret
= ret
+ wxT("#") + wxURI::Unescape(m_fragment
);
234 // ---------------------------------------------------------------------------
236 // ---------------------------------------------------------------------------
238 wxURI
& wxURI::Assign(const wxURI
& uri
)
241 m_fields
= uri
.m_fields
;
243 //ref over components
244 m_scheme
= uri
.m_scheme
;
246 m_server
= uri
.m_server
;
247 m_hostType
= uri
.m_hostType
;
250 m_query
= uri
.m_query
;
251 m_fragment
= uri
.m_fragment
;
256 wxURI
& wxURI::operator = (const wxURI
& uri
)
261 wxURI
& wxURI::operator = (const wxString
& string
)
267 // ---------------------------------------------------------------------------
269 // ---------------------------------------------------------------------------
271 bool wxURI::operator == (const wxURI
& uri
) const
275 if(m_scheme
!= uri
.m_scheme
)
278 else if (uri
.HasScheme())
286 if (m_user
!= uri
.m_user
)
289 else if (uri
.HasUser())
292 if (m_server
!= uri
.m_server
||
293 m_hostType
!= uri
.m_hostType
)
298 if(m_port
!= uri
.m_port
)
301 else if (uri
.HasPort())
304 else if (uri
.HasServer())
310 if(m_path
!= uri
.m_path
)
313 else if (uri
.HasPath())
318 if (m_query
!= uri
.m_query
)
321 else if (uri
.HasQuery())
326 if (m_fragment
!= uri
.m_fragment
)
329 else if (uri
.HasFragment())
335 // ---------------------------------------------------------------------------
338 // if there is no authority or scheme, it is a reference
339 // ---------------------------------------------------------------------------
341 bool wxURI::IsReference() const
342 { return !HasScheme() || !HasServer(); }
344 // ---------------------------------------------------------------------------
347 // Master URI parsing method. Just calls the individual parsing methods
349 // URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
350 // URI-reference = URI / relative-URITestCase
351 // ---------------------------------------------------------------------------
353 const wxChar
* wxURI::Parse(const wxChar
* uri
)
355 uri
= ParseScheme(uri
);
356 uri
= ParseAuthority(uri
);
357 uri
= ParsePath(uri
);
358 uri
= ParseQuery(uri
);
359 return ParseFragment(uri
);
362 // ---------------------------------------------------------------------------
365 // Individual parsers for each URI component
366 // ---------------------------------------------------------------------------
368 const wxChar
* wxURI::ParseScheme(const wxChar
* uri
)
370 wxASSERT(uri
!= NULL
);
372 //copy of the uri - used for figuring out
373 //length of each component
374 const wxChar
* uricopy
= uri
;
376 //Does the uri have a scheme (first character alpha)?
381 //scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
382 while (IsAlpha(*uri
) || IsDigit(*uri
) ||
391 if (*uri
== wxT(':'))
393 //mark the scheme as valid
394 m_fields
|= wxURI_SCHEME
;
396 //move reference point up to input buffer
400 //relative uri with relative path reference
404 //relative uri with _possible_ relative path reference
409 const wxChar
* wxURI::ParseAuthority(const wxChar
* uri
)
411 // authority = [ userinfo "@" ] host [ ":" port ]
412 if (*uri
== wxT('/') && *(uri
+1) == wxT('/'))
416 uri
= ParseUser(uri
);
417 uri
= ParseServer(uri
);
418 return ParsePort(uri
);
424 const wxChar
* wxURI::ParseUser(const wxChar
* uri
)
426 wxASSERT(uri
!= NULL
);
428 //copy of the uri - used for figuring out
429 //length of each component
430 const wxChar
* uricopy
= uri
;
432 // userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
433 while(*uri
&& *uri
!= wxT('@') && *uri
!= wxT('/') && *uri
!= wxT('#') && *uri
!= wxT('?'))
435 if(IsUnreserved(*uri
) || IsEscape(uri
) ||
436 IsSubDelim(*uri
) || *uri
== wxT(':'))
439 Escape(m_user
, *uri
++);
445 m_fields
|= wxURI_USER
;
455 const wxChar
* wxURI::ParseServer(const wxChar
* uri
)
457 wxASSERT(uri
!= NULL
);
459 //copy of the uri - used for figuring out
460 //length of each component
461 const wxChar
* uricopy
= uri
;
463 // host = IP-literal / IPv4address / reg-name
464 // IP-literal = "[" ( IPv6address / IPvFuture ) "]"
465 if (*uri
== wxT('['))
467 if (ParseIPv6address(++uri
) && *uri
== wxT(']'))
470 m_hostType
= wxURI_IPV6ADDRESS
;
472 wxStringBufferLength
theBuffer(m_server
, uri
- uricopy
);
473 wxMemcpy(theBuffer
, uricopy
, uri
-uricopy
);
474 theBuffer
.SetLength(uri
-uricopy
);
480 if (ParseIPvFuture(++uri
) && *uri
== wxT(']'))
483 m_hostType
= wxURI_IPVFUTURE
;
485 wxStringBufferLength
theBuffer(m_server
, uri
- uricopy
);
486 wxMemcpy(theBuffer
, uricopy
, uri
-uricopy
);
487 theBuffer
.SetLength(uri
-uricopy
);
495 if (ParseIPv4address(uri
))
497 m_hostType
= wxURI_IPV4ADDRESS
;
499 wxStringBufferLength
theBuffer(m_server
, uri
- uricopy
);
500 wxMemcpy(theBuffer
, uricopy
, uri
-uricopy
);
501 theBuffer
.SetLength(uri
-uricopy
);
507 if(m_hostType
== wxURI_REGNAME
)
510 // reg-name = *( unreserved / pct-encoded / sub-delims )
511 while(*uri
&& *uri
!= wxT('/') && *uri
!= wxT(':') && *uri
!= wxT('#') && *uri
!= wxT('?'))
513 if(IsUnreserved(*uri
) || IsEscape(uri
) || IsSubDelim(*uri
))
516 Escape(m_server
, *uri
++);
520 //mark the server as valid
521 m_fields
|= wxURI_SERVER
;
527 const wxChar
* wxURI::ParsePort(const wxChar
* uri
)
529 wxASSERT(uri
!= NULL
);
540 //mark the port as valid
541 m_fields
|= wxURI_PORT
;
547 const wxChar
* wxURI::ParsePath(const wxChar
* uri
, bool bReference
, bool bNormalize
)
549 wxASSERT(uri
!= NULL
);
551 //copy of the uri - used for figuring out
552 //length of each component
553 const wxChar
* uricopy
= uri
;
555 /// hier-part = "//" authority path-abempty
560 /// relative-part = "//" authority path-abempty
565 /// path-abempty = *( "/" segment )
566 /// path-absolute = "/" [ segment-nz *( "/" segment ) ]
567 /// path-noscheme = segment-nz-nc *( "/" segment )
568 /// path-rootless = segment-nz *( "/" segment )
569 /// path-empty = 0<pchar>
572 /// segment-nz = 1*pchar
573 /// segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
574 /// ; non-zero-length segment without any colon ":"
576 /// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
577 if (*uri
== wxT('/'))
581 while(*uri
&& *uri
!= wxT('#') && *uri
!= wxT('?'))
583 if( IsUnreserved(*uri
) || IsSubDelim(*uri
) || IsEscape(uri
) ||
584 *uri
== wxT(':') || *uri
== wxT('@') || *uri
== wxT('/'))
587 Escape(m_path
, *uri
++);
592 wxStringBufferLength
theBuffer(m_path
, m_path
.length() + 1);
593 Normalize(theBuffer
, true);
594 theBuffer
.SetLength(wxStrlen(theBuffer
));
596 //mark the path as valid
597 m_fields
|= wxURI_PATH
;
599 else if(*uri
) //Relative path
604 while(*uri
&& *uri
!= wxT('#') && *uri
!= wxT('?'))
606 if(IsUnreserved(*uri
) || IsSubDelim(*uri
) || IsEscape(uri
) ||
607 *uri
== wxT('@') || *uri
== wxT('/'))
610 Escape(m_path
, *uri
++);
615 while(*uri
&& *uri
!= wxT('#') && *uri
!= wxT('?'))
617 if(IsUnreserved(*uri
) || IsSubDelim(*uri
) || IsEscape(uri
) ||
618 *uri
== wxT(':') || *uri
== wxT('@') || *uri
== wxT('/'))
621 Escape(m_path
, *uri
++);
629 wxStringBufferLength
theBuffer(m_path
, m_path
.length() + 1);
630 Normalize(theBuffer
);
631 theBuffer
.SetLength(wxStrlen(theBuffer
));
634 //mark the path as valid
635 m_fields
|= wxURI_PATH
;
643 const wxChar
* wxURI::ParseQuery(const wxChar
* uri
)
645 wxASSERT(uri
!= NULL
);
647 // query = *( pchar / "/" / "?" )
648 if (*uri
== wxT('?'))
651 while(*uri
&& *uri
!= wxT('#'))
653 if (IsUnreserved(*uri
) || IsSubDelim(*uri
) || IsEscape(uri
) ||
654 *uri
== wxT(':') || *uri
== wxT('@') || *uri
== wxT('/') || *uri
== wxT('?'))
657 Escape(m_query
, *uri
++);
660 //mark the server as valid
661 m_fields
|= wxURI_QUERY
;
668 const wxChar
* wxURI::ParseFragment(const wxChar
* uri
)
670 wxASSERT(uri
!= NULL
);
672 // fragment = *( pchar / "/" / "?" )
673 if (*uri
== wxT('#'))
678 if (IsUnreserved(*uri
) || IsSubDelim(*uri
) || IsEscape(uri
) ||
679 *uri
== wxT(':') || *uri
== wxT('@') || *uri
== wxT('/') || *uri
== wxT('?'))
680 m_fragment
+= *uri
++;
682 Escape(m_fragment
, *uri
++);
685 //mark the server as valid
686 m_fields
|= wxURI_FRAGMENT
;
692 // ---------------------------------------------------------------------------
695 // Builds missing components of this uri from a base uri
697 // A version of the algorithm outlined in the RFC is used here
698 // (it is shown in comments)
700 // Note that an empty URI inherits all components
701 // ---------------------------------------------------------------------------
703 void wxURI::Resolve(const wxURI
& base
, int flags
)
705 wxASSERT_MSG(!base
.IsReference(),
706 wxT("wxURI to inherit from must not be a reference!"));
708 // If we arn't being strict, enable the older (pre-RFC2396)
709 // loophole that allows this uri to inherit other
710 // properties from the base uri - even if the scheme
712 if ( !(flags
& wxURI_STRICT
) &&
713 HasScheme() && base
.HasScheme() &&
714 m_scheme
== base
.m_scheme
)
716 m_fields
-= wxURI_SCHEME
;
720 // Do nothing if this is an absolute wxURI
721 // if defined(R.scheme) then
722 // T.scheme = R.scheme;
723 // T.authority = R.authority;
724 // T.path = remove_dot_segments(R.path);
725 // T.query = R.query;
732 m_scheme
= base
.m_scheme
;
733 m_fields
|= wxURI_SCHEME
;
735 // All we need to do for relative URIs with an
736 // authority component is just inherit the scheme
737 // if defined(R.authority) then
738 // T.authority = R.authority;
739 // T.path = remove_dot_segments(R.path);
740 // T.query = R.query;
746 //No authority - inherit
749 m_user
= base
.m_user
;
750 m_fields
|= wxURI_USER
;
753 m_server
= base
.m_server
;
754 m_hostType
= base
.m_hostType
;
755 m_fields
|= wxURI_SERVER
;
759 m_port
= base
.m_port
;
760 m_fields
|= wxURI_PORT
;
764 // Simple path inheritance from base
767 // T.path = Base.path;
768 m_path
= base
.m_path
;
769 m_fields
|= wxURI_PATH
;
772 // if defined(R.query) then
773 // T.query = R.query;
775 // T.query = Base.query;
779 m_query
= base
.m_query
;
780 m_fields
|= wxURI_QUERY
;
785 // if (R.path starts-with "/") then
786 // T.path = remove_dot_segments(R.path);
788 // T.path = merge(Base.path, R.path);
789 // T.path = remove_dot_segments(T.path);
791 // T.query = R.query;
792 if (m_path
[0u] != wxT('/'))
795 const wxChar
* op
= m_path
.c_str();
796 const wxChar
* bp
= base
.m_path
.c_str() + base
.m_path
.Length();
798 //not a ending directory? move up
799 if (base
.m_path
[0] && *(bp
-1) != wxT('/'))
800 UpTree(base
.m_path
, bp
);
802 //normalize directories
803 while(*op
== wxT('.') && *(op
+1) == wxT('.') &&
804 (*(op
+2) == '\0' || *(op
+2) == wxT('/')) )
806 UpTree(base
.m_path
, bp
);
814 m_path
= base
.m_path
.substr(0, bp
- base
.m_path
.c_str()) +
815 m_path
.Mid((op
- m_path
.c_str()), m_path
.Length());
819 //T.fragment = R.fragment;
822 // ---------------------------------------------------------------------------
825 // Moves a URI path up a directory
826 // ---------------------------------------------------------------------------
829 void wxURI::UpTree(const wxChar
* uristart
, const wxChar
*& uri
)
831 if (uri
!= uristart
&& *(uri
-1) == wxT('/'))
836 for(;uri
!= uristart
; --uri
)
838 if (*uri
== wxT('/'))
846 if (uri
== uristart
&& *uri
== wxT('/'))
851 // ---------------------------------------------------------------------------
854 // Normalizes directories in-place
856 // I.E. ./ and . are ignored
858 // ../ and .. are removed if a directory is before it, along
859 // with that directory (leading .. and ../ are kept)
860 // ---------------------------------------------------------------------------
863 void wxURI::Normalize(wxChar
* s
, bool bIgnoreLeads
)
873 if (*cp
== wxT('.') && (*(cp
+1) == wxT('/') || *(cp
+1) == '\0')
874 && (bp
== cp
|| *(cp
-1) == wxT('/')))
882 else if (*cp
== wxT('.') && *(cp
+1) == wxT('.') &&
883 (*(cp
+2) == wxT('/') || *(cp
+2) == '\0')
884 && (bp
== cp
|| *(cp
-1) == wxT('/')))
886 //.. _or_ ../ - go up the tree
889 UpTree((const wxChar
*)bp
, (const wxChar
*&)s
);
896 else if (!bIgnoreLeads
)
921 // ---------------------------------------------------------------------------
924 // Parses 1 to 4 hex values. Returns true if the first character of the input
925 // string is a valid hex character. It is the caller's responsability to move
926 // the input string back to its original position on failure.
927 // ---------------------------------------------------------------------------
929 bool wxURI::ParseH16(const wxChar
*& uri
)
935 if(IsHex(*++uri
) && IsHex(*++uri
) && IsHex(*++uri
))
941 // ---------------------------------------------------------------------------
944 // Parses a certain version of an IP address and moves the input string past
945 // it. Returns true if the input string contains the proper version of an ip
946 // address. It is the caller's responsability to move the input string back
947 // to its original position on failure.
948 // ---------------------------------------------------------------------------
950 bool wxURI::ParseIPv4address(const wxChar
*& uri
)
952 //IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
954 //dec-octet = DIGIT ; 0-9
955 // / %x31-39 DIGIT ; 10-99
956 // / "1" 2DIGIT ; 100-199
957 // / "2" %x30-34 DIGIT ; 200-249
958 // / "25" %x30-35 ; 250-255
965 //each ip part must be between 0-255 (dupe of version in for loop)
966 if( IsDigit(*++uri
) && IsDigit(*++uri
) &&
967 //100 or less (note !)
968 !( (*(uri
-2) < wxT('2')) ||
970 (*(uri
-2) == wxT('2') &&
971 (*(uri
-1) < wxT('5') || (*(uri
-1) == wxT('5') && *uri
<= wxT('5')))
979 if(IsDigit(*uri
))++uri
;
981 //compilers should unroll this loop
982 for(; iIPv4
< 4; ++iIPv4
)
984 if (*uri
!= wxT('.') || !IsDigit(*++uri
))
987 //each ip part must be between 0-255
988 if( IsDigit(*++uri
) && IsDigit(*++uri
) &&
989 //100 or less (note !)
990 !( (*(uri
-2) < wxT('2')) ||
992 (*(uri
-2) == wxT('2') &&
993 (*(uri
-1) < wxT('5') || (*(uri
-1) == wxT('5') && *uri
<= wxT('5')))
1000 if(IsDigit(*uri
))++uri
;
1006 bool wxURI::ParseIPv6address(const wxChar
*& uri
)
1008 // IPv6address = 6( h16 ":" ) ls32
1009 // / "::" 5( h16 ":" ) ls32
1010 // / [ h16 ] "::" 4( h16 ":" ) ls32
1011 // / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
1012 // / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
1013 // / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
1014 // / [ *4( h16 ":" ) h16 ] "::" ls32
1015 // / [ *5( h16 ":" ) h16 ] "::" h16
1016 // / [ *6( h16 ":" ) h16 ] "::"
1018 size_t numPrefix
= 0,
1021 bool bEndHex
= false;
1023 for( ; numPrefix
< 6; ++numPrefix
)
1032 if(*uri
!= wxT(':'))
1038 if(!bEndHex
&& !ParseH16(uri
))
1045 if (*uri
== wxT(':'))
1047 if (*++uri
!= wxT(':'))
1057 if (*uri
!= wxT(':') || *(uri
+1) != wxT(':'))
1062 while (*--uri
!= wxT(':')) {}
1065 const wxChar
* uristart
= uri
;
1067 // ls32 = ( h16 ":" h16 ) / IPv4address
1068 if (ParseH16(uri
) && *uri
== wxT(':') && ParseH16(uri
))
1073 if (ParseIPv4address(uri
))
1085 maxPostfix
= 4 - numPrefix
;
1089 bool bAllowAltEnding
= maxPostfix
== 0;
1091 for(; maxPostfix
!= 0; --maxPostfix
)
1093 if(!ParseH16(uri
) || *uri
!= wxT(':'))
1099 const wxChar
* uristart
= uri
;
1101 // ls32 = ( h16 ":" h16 ) / IPv4address
1102 if (ParseH16(uri
) && *uri
== wxT(':') && ParseH16(uri
))
1107 if (ParseIPv4address(uri
))
1112 if (!bAllowAltEnding
)
1116 if(numPrefix
<= 5 && ParseH16(uri
))
1122 bool wxURI::ParseIPvFuture(const wxChar
*& uri
)
1124 // IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
1125 if (*++uri
!= wxT('v') || !IsHex(*++uri
))
1128 while (IsHex(*++uri
)) {}
1130 if (*uri
!= wxT('.') || !(IsUnreserved(*++uri
) || IsSubDelim(*uri
) || *uri
== wxT(':')))
1133 while(IsUnreserved(*++uri
) || IsSubDelim(*uri
) || *uri
== wxT(':')) {}
1139 // ---------------------------------------------------------------------------
1142 // Converts a character into a numeric hexidecimal value, or 0 if the
1143 // passed in character is not a valid hex character
1144 // ---------------------------------------------------------------------------
1147 wxInt32
wxURI::CharToHex(const wxChar
& c
)
1149 if ((c
>= wxT('A')) && (c
<= wxT('Z'))) return c
- wxT('A') + 0x0A;
1150 if ((c
>= wxT('a')) && (c
<= wxT('z'))) return c
- wxT('a') + 0x0a;
1151 if ((c
>= wxT('0')) && (c
<= wxT('9'))) return c
- wxT('0') + 0x00;
1156 // ---------------------------------------------------------------------------
1159 // Returns true if the passed in character meets the criteria of the method
1160 // ---------------------------------------------------------------------------
1162 //! unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
1163 bool wxURI::IsUnreserved (const wxChar
& c
)
1164 { return IsAlpha(c
) || IsDigit(c
) ||
1168 c
== wxT('~') //tilde
1172 bool wxURI::IsReserved (const wxChar
& c
)
1174 return IsGenDelim(c
) || IsSubDelim(c
);
1177 //! gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
1178 bool wxURI::IsGenDelim (const wxChar
& c
)
1180 return c
== wxT(':') ||
1189 //! sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
1190 //! / "*" / "+" / "," / ";" / "="
1191 bool wxURI::IsSubDelim (const wxChar
& c
)
1193 return c
== wxT('!') ||
1207 bool wxURI::IsHex(const wxChar
& c
)
1208 { return IsDigit(c
) || (c
>= wxT('a') && c
<= wxT('f')) || (c
>= wxT('A') && c
<= wxT('F')); }
1210 bool wxURI::IsAlpha(const wxChar
& c
)
1211 { return (c
>= wxT('a') && c
<= wxT('z')) || (c
>= wxT('A') && c
<= wxT('Z')); }
1213 bool wxURI::IsDigit(const wxChar
& c
)
1214 { return c
>= wxT('0') && c
<= wxT('9'); }
1217 // ---------------------------------------------------------------------------
1219 // wxURL Compatability
1221 // ---------------------------------------------------------------------------
1225 #if WXWIN_COMPATIBILITY_2_4
1229 wxString
wxURL::ConvertToValidURI(const wxString
& uri
, const wxChar
* WXUNUSED(delims
))
1231 return wxURI(uri
).BuildURI();
1234 wxString
wxURL::ConvertFromURI(const wxString
& uri
)
1236 return wxURI::Unescape(uri
);
1239 #endif //WXWIN_COMPATIBILITY_2_4