Add CombineURIs implementation for wxWebFileProtocolHandler. Update the IE backend to use it. Using the IE backend navigating through zip archives is now functional, including loading resources and links.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68449 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -125,8 +125,109 @@ wxFSFile* wxWebFileProtocolHandler::GetFile(const wxString &uri)
|
|||||||
wxString wxWebFileProtocolHandler::CombineURIs(const wxString &baseuri,
|
wxString wxWebFileProtocolHandler::CombineURIs(const wxString &baseuri,
|
||||||
const wxString &newuri)
|
const wxString &newuri)
|
||||||
{
|
{
|
||||||
//Still need to be implemented correctly
|
//If there is a colon in the path then we just return it
|
||||||
return newuri;
|
if(newuri.find(':') != wxString::npos)
|
||||||
|
{
|
||||||
|
return newuri;
|
||||||
|
}
|
||||||
|
//We have an absolute path and no query string
|
||||||
|
else if(newuri.substr(0, 1) == "/" && baseuri.find('?') == wxString::npos)
|
||||||
|
{
|
||||||
|
//By finding the next / after file:// we get to the end of the
|
||||||
|
//(optional) hostname
|
||||||
|
size_t pos = baseuri.find('/', 7);
|
||||||
|
//So we return up to the end of the hostname, plus the newuri
|
||||||
|
return baseuri.substr(0, pos) + newuri;
|
||||||
|
}
|
||||||
|
//We have an absolute path and a query string
|
||||||
|
else if(newuri.substr(0, 1) == "/" && baseuri.find('?') != wxString::npos)
|
||||||
|
{
|
||||||
|
wxString query = baseuri.substr(baseuri.find('?') + 1);
|
||||||
|
wxString newquery;
|
||||||
|
wxStringTokenizer tokenizer(query, ";");
|
||||||
|
while(tokenizer.HasMoreTokens())
|
||||||
|
{
|
||||||
|
wxString token = tokenizer.GetNextToken();
|
||||||
|
if(token.substr(0, 5) == "path=")
|
||||||
|
{
|
||||||
|
//As the path is absolue simply replace the old path with the
|
||||||
|
//new one
|
||||||
|
newquery = newquery + "path=" + newuri;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newquery += token;
|
||||||
|
}
|
||||||
|
//We need to add the separators back
|
||||||
|
if(tokenizer.HasMoreTokens())
|
||||||
|
newquery += ';';
|
||||||
|
}
|
||||||
|
return baseuri.substr(0, baseuri.find('?')) + "?" + newquery;
|
||||||
|
}
|
||||||
|
//We have a relative path and no query string
|
||||||
|
else if(baseuri.find('?') == wxString::npos)
|
||||||
|
{
|
||||||
|
//By finding the next / after file:// we get to the end of the
|
||||||
|
//(optional) hostname
|
||||||
|
size_t pos = baseuri.find('/', 7);
|
||||||
|
wxString path = baseuri.substr(pos);
|
||||||
|
//Then we remove the last filename
|
||||||
|
path = path.BeforeLast('/') + '/';
|
||||||
|
//Ensure that we have the leading / so we can normalise properly
|
||||||
|
if(path.substr(0, 1) != "/")
|
||||||
|
path = "/" + path;
|
||||||
|
|
||||||
|
//If we have a colon in the path (i.e. we are on windows) we need to
|
||||||
|
//handle it specially
|
||||||
|
if(path.find(':') != wxString::npos)
|
||||||
|
{
|
||||||
|
wxFileName fn(path.AfterFirst('/').AfterFirst('/') + newuri);
|
||||||
|
fn.Normalize(wxPATH_NORM_DOTS, "", wxPATH_UNIX);
|
||||||
|
return baseuri.substr(0, pos) + '/' +
|
||||||
|
path.AfterFirst('/').BeforeFirst('/') + '/' +
|
||||||
|
fn.GetFullPath(wxPATH_UNIX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//We can now use wxFileName to perform the normalisation
|
||||||
|
wxFileName fn(path + newuri);
|
||||||
|
fn.Normalize(wxPATH_NORM_DOTS, "", wxPATH_UNIX);
|
||||||
|
return baseuri.substr(0, pos) + fn.GetFullPath(wxPATH_UNIX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//We have a relative path and a query string
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxString query = baseuri.substr(baseuri.find('?') + 1);
|
||||||
|
wxString newquery;
|
||||||
|
wxStringTokenizer tokenizer(query, ";");
|
||||||
|
while(tokenizer.HasMoreTokens())
|
||||||
|
{
|
||||||
|
wxString token = tokenizer.GetNextToken();
|
||||||
|
if(token.substr(0, 5) == "path=")
|
||||||
|
{
|
||||||
|
wxString path = token.substr(6);
|
||||||
|
//Then we remove the last filename
|
||||||
|
path = path.BeforeLast('/') + '/';
|
||||||
|
//Ensure that we have the leading / so we can normalise properly
|
||||||
|
//if(path.substr(0, 1) != "/")
|
||||||
|
// path = "/" + path;
|
||||||
|
|
||||||
|
//We can now use wxFileName to perform the normalisation
|
||||||
|
wxFileName fn(path + newuri);
|
||||||
|
fn.Normalize(wxPATH_NORM_DOTS, "", wxPATH_UNIX);
|
||||||
|
newquery = newquery + "path=" + fn.GetFullPath(wxPATH_UNIX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newquery += token;
|
||||||
|
}
|
||||||
|
//We need to add the separators back
|
||||||
|
if(tokenizer.HasMoreTokens())
|
||||||
|
newquery += ';';
|
||||||
|
}
|
||||||
|
return baseuri.substr(0, baseuri.find('?')) + "?" + newquery;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
|
@@ -1074,7 +1074,14 @@ HRESULT VirtualProtocol::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
|
|||||||
DWORD cchResult, DWORD *pcchResult,
|
DWORD cchResult, DWORD *pcchResult,
|
||||||
DWORD dwReserved)
|
DWORD dwReserved)
|
||||||
{
|
{
|
||||||
return INET_E_DEFAULT_ACTION;
|
wxString newuri = m_handler->CombineURIs(pwzBaseUrl, pwzRelativeUrl);
|
||||||
|
//Check the buffer we are given can hold the new urll
|
||||||
|
if(wxStrlen(newuri) > cchResult)
|
||||||
|
return S_FALSE;
|
||||||
|
|
||||||
|
wxStrcpy(pwzResult, newuri.c_str());
|
||||||
|
*pcchResult = wxStrlen(newuri);
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction,
|
HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction,
|
||||||
@@ -1083,8 +1090,8 @@ HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction,
|
|||||||
DWORD dwReserved)
|
DWORD dwReserved)
|
||||||
{
|
{
|
||||||
//return INET_E_DEFAULT_ACTION;
|
//return INET_E_DEFAULT_ACTION;
|
||||||
wcscpy(pwzResult, pwzUrl);
|
wxStrcpy(pwzResult, pwzUrl);
|
||||||
*pcchResult = wcslen(pwzResult);
|
*pcchResult = wxStrlen(pwzResult);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user