// headers
// ---------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "uri.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
// definitions
// ---------------------------------------------------------------------------
-IMPLEMENT_CLASS(wxURI, wxObject);
+IMPLEMENT_CLASS(wxURI, wxObject)
// ===========================================================================
// implementation
wxChar wxURI::TranslateEscape(const wxChar* s)
{
- wxASSERT_MSG(IsHex(*s) && IsHex(*(s+1)), wxT("Invalid escape!"));
+ wxASSERT_MSG( IsHex(s[0]) && IsHex(s[1]), wxT("Invalid escape sequence!"));
- //<<4 == 16
- return (wxChar)( CharToHex(*s) << 4 ) | CharToHex(*++s);
+ return wx_truncate_cast(wxChar, (CharToHex(s[0]) << 4 ) | CharToHex(s[1]));
}
wxString wxURI::Unescape(const wxString& uri)
{
// pct-encoded = "%" HEXDIG HEXDIG
if(*uri == wxT('%') && IsHex(*(uri+1)) && IsHex(*(uri+2)))
- {
- uri += 3;
return true;
- }
else
return false;
}
// Master URI parsing method. Just calls the individual parsing methods
//
// URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
-// URI-reference = URI / relative-URITestCase
+// URI-reference = URI / relative
// ---------------------------------------------------------------------------
const wxChar* wxURI::Parse(const wxChar* uri)
// authority = [ userinfo "@" ] host [ ":" port ]
if (*uri == wxT('/') && *(uri+1) == wxT('/'))
{
+ //skip past the two slashes
uri += 2;
+ // ############# DEVIATION FROM RFC #########################
+ // Don't parse the server component for file URIs
+ if(m_scheme != wxT("file"))
+ {
+ //normal way
uri = ParseUserInfo(uri);
uri = ParseServer(uri);
return ParsePort(uri);
+ }
}
return uri;
// userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
while(*uri && *uri != wxT('@') && *uri != wxT('/') && *uri != wxT('#') && *uri != wxT('?'))
{
- if(IsUnreserved(*uri) || IsEscape(uri) ||
+ if(IsUnreserved(*uri) ||
IsSubDelim(*uri) || *uri == wxT(':'))
m_userinfo += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_userinfo += *uri++;
+ m_userinfo += *uri++;
+ m_userinfo += *uri++;
+ }
else
Escape(m_userinfo, *uri++);
}
// reg-name = *( unreserved / pct-encoded / sub-delims )
while(*uri && *uri != wxT('/') && *uri != wxT(':') && *uri != wxT('#') && *uri != wxT('?'))
{
- if(IsUnreserved(*uri) || IsEscape(uri) || IsSubDelim(*uri))
+ if(IsUnreserved(*uri) || IsSubDelim(*uri))
+ m_server += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_server += *uri++;
+ m_server += *uri++;
m_server += *uri++;
+ }
else
Escape(m_server, *uri++);
}
while(*uri && *uri != wxT('#') && *uri != wxT('?'))
{
- if( IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) ||
+ if( IsUnreserved(*uri) || IsSubDelim(*uri) ||
*uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/'))
m_path += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_path += *uri++;
+ m_path += *uri++;
+ m_path += *uri++;
+ }
else
Escape(m_path, *uri++);
}
//no colon allowed
while(*uri && *uri != wxT('#') && *uri != wxT('?'))
{
- if(IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) ||
+ if(IsUnreserved(*uri) || IsSubDelim(*uri) ||
*uri == wxT('@') || *uri == wxT('/'))
m_path += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_path += *uri++;
+ m_path += *uri++;
+ m_path += *uri++;
+ }
else
Escape(m_path, *uri++);
}
{
while(*uri && *uri != wxT('#') && *uri != wxT('?'))
{
- if(IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) ||
+ if(IsUnreserved(*uri) || IsSubDelim(*uri) ||
*uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/'))
m_path += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_path += *uri++;
+ m_path += *uri++;
+ m_path += *uri++;
+ }
else
Escape(m_path, *uri++);
}
++uri;
while(*uri && *uri != wxT('#'))
{
- if (IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) ||
+ if (IsUnreserved(*uri) || IsSubDelim(*uri) ||
*uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?'))
m_query += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_query += *uri++;
+ m_query += *uri++;
+ m_query += *uri++;
+ }
else
Escape(m_query, *uri++);
}
++uri;
while(*uri)
{
- if (IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) ||
+ if (IsUnreserved(*uri) || IsSubDelim(*uri) ||
*uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?'))
m_fragment += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_fragment += *uri++;
+ m_fragment += *uri++;
+ m_fragment += *uri++;
+ }
else
Escape(m_fragment, *uri++);
}
{ return c >= wxT('0') && c <= wxT('9'); }
-// ---------------------------------------------------------------------------
-//
-// wxURL Compatibility
-//
-// ---------------------------------------------------------------------------
-
-#if wxUSE_URL
-
-#if WXWIN_COMPATIBILITY_2_4
-
-#include "wx/url.h"
-
-wxString wxURL::GetProtocolName() const
-{
- return m_scheme;
-}
-
-wxString wxURL::GetHostName() const
-{
- return m_server;
-}
-
-wxString wxURL::GetPath() const
-{
- return m_path;
-}
-
-//Note that this old code really doesn't convert to a URI that well and looks
-//more like a dirty hack than anything else...
-
-wxString wxURL::ConvertToValidURI(const wxString& uri, const wxChar* delims)
-{
- wxString out_str;
- wxString hexa_code;
- size_t i;
-
- for (i = 0; i < uri.Len(); i++)
- {
- wxChar c = uri.GetChar(i);
-
- if (c == wxT(' '))
- {
- // GRG, Apr/2000: changed to "%20" instead of '+'
-
- out_str += wxT("%20");
- }
- else
- {
- // GRG, Apr/2000: modified according to the URI definition (RFC 2396)
- //
- // - Alphanumeric characters are never escaped
- // - Unreserved marks are never escaped
- // - Delimiters must be escaped if they appear within a component
- // but not if they are used to separate components. Here we have
- // no clear way to distinguish between these two cases, so they
- // are escaped unless they are passed in the 'delims' parameter
- // (allowed delimiters).
-
- static const wxChar marks[] = wxT("-_.!~*()'");
-
- if ( !wxIsalnum(c) && !wxStrchr(marks, c) && !wxStrchr(delims, c) )
- {
- hexa_code.Printf(wxT("%%%02X"), c);
- out_str += hexa_code;
- }
- else
- {
- out_str += c;
- }
- }
- }
-
- return out_str;
-}
-
-wxString wxURL::ConvertFromURI(const wxString& uri)
-{
- return wxURI::Unescape(uri);
-}
-
-#endif //WXWIN_COMPATIBILITY_2_4
-
-#endif //wxUSE_URL
-
//end of uri.cpp