void wxURI::Clear()
{
- m_scheme = m_user = m_server = m_port = m_path =
+ m_scheme = m_userinfo = m_server = m_port = m_path =
m_query = m_fragment = wxEmptyString;
m_hostType = wxURI_REGNAME;
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 (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;
}
+// ---------------------------------------------------------------------------
+// GetUser
+// GetPassword
+//
+// Gets the username and password via the old URL method.
+// ---------------------------------------------------------------------------
+wxString wxURI::GetUser() const
+{
+ size_t dwPasswordPos = m_userinfo.find(':');
+
+ if (dwPasswordPos == wxString::npos)
+ dwPasswordPos = 0;
+
+ return m_userinfo(0, dwPasswordPos);
+}
+
+wxString wxURI::GetPassword() const
+{
+ size_t dwPasswordPos = m_userinfo.find(':');
+
+ if (dwPasswordPos == wxString::npos)
+ return wxT("");
+ else
+ return m_userinfo(dwPasswordPos+1, m_userinfo.length() + 1);
+}
+
// ---------------------------------------------------------------------------
// BuildURI
//
{
ret += wxT("//");
- if (HasUser())
- ret = ret + m_user + wxT("@");
+ if (HasUserInfo())
+ ret = ret + m_userinfo + wxT("@");
ret += m_server;
{
ret += wxT("//");
- if (HasUser())
- ret = ret + wxURI::Unescape(m_user) + wxT("@");
+ if (HasUserInfo())
+ ret = ret + wxURI::Unescape(m_userinfo) + wxT("@");
if (m_hostType == wxURI_REGNAME)
ret += wxURI::Unescape(m_server);
//ref over components
m_scheme = uri.m_scheme;
- m_user = uri.m_user;
+ m_userinfo = uri.m_userinfo;
m_server = uri.m_server;
m_hostType = uri.m_hostType;
m_port = uri.m_port;
if (HasServer())
{
- if (HasUser())
+ if (HasUserInfo())
{
- if (m_user != uri.m_user)
+ if (m_userinfo != uri.m_userinfo)
return false;
}
- else if (uri.HasUser())
+ else if (uri.HasUserInfo())
return false;
if (m_server != uri.m_server ||
// 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)
{
uri += 2;
- uri = ParseUser(uri);
+ uri = ParseUserInfo(uri);
uri = ParseServer(uri);
return ParsePort(uri);
}
return uri;
}
-const wxChar* wxURI::ParseUser(const wxChar* uri)
+const wxChar* wxURI::ParseUserInfo(const wxChar* uri)
{
wxASSERT(uri != NULL);
// 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_user += *uri++;
+ m_userinfo += *uri++;
+ else if (IsEscape(uri))
+ {
+ m_userinfo += *uri++;
+ m_userinfo += *uri++;
+ m_userinfo += *uri++;
+ }
else
- Escape(m_user, *uri++);
+ Escape(m_userinfo, *uri++);
}
if(*uri == wxT('@'))
{
//valid userinfo
- m_fields |= wxURI_USER;
+ m_fields |= wxURI_USERINFO;
uricopy = ++uri;
}
else
- m_user = wxEmptyString;
+ m_userinfo = wxEmptyString;
return uricopy;
}
// 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++);
}
}
//No authority - inherit
- if (base.HasUser())
+ if (base.HasUserInfo())
{
- m_user = base.m_user;
- m_fields |= wxURI_USER;
+ m_userinfo = base.m_userinfo;
+ m_fields |= wxURI_USERINFO;
}
m_server = base.m_server;
// ---------------------------------------------------------------------------
//
-// wxURL Compatability
+// wxURL Compatibility
//
// ---------------------------------------------------------------------------