X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b4670e5bcaeba0898d4aecd40c2bb0dc00f5de5..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/common/webviewfilehandler.cpp diff --git a/src/common/webviewfilehandler.cpp b/src/common/webviewfilehandler.cpp index 6b542ffc21..3dbbbb3398 100644 --- a/src/common/webviewfilehandler.cpp +++ b/src/common/webviewfilehandler.cpp @@ -18,41 +18,6 @@ #include "wx/webviewfilehandler.h" #include "wx/filesys.h" -#include "wx/tokenzr.h" -#include "wx/hashmap.h" - -typedef wxStringToStringHashMap QueryMap; - -QueryMap QueryStringToQueryMap(wxString query) -{ - QueryMap map; - - if(query.substr(0, 1) == "?") - query = query.substr(1); - - wxStringTokenizer tokenizer(query, ";"); - while(tokenizer.HasMoreTokens()) - { - wxString token = tokenizer.GetNextToken(); - size_t pos = token.find('='); - map[token.substr(0, pos)] = token.substr(pos + 1); - } - return map; -} - -wxString QueryMapToQueryString(QueryMap map) -{ - wxString query = "?"; - - QueryMap::iterator it; - for(it = map.begin(); it != map.end(); ++it) - { - query = query + it->first + "=" + it->second + ";"; - } - - //Chop the end ; off - return query.substr(0, query.length() - 1); -} //Taken from wx/filesys.cpp static wxString EscapeFileNameCharsInURL(const char *in) @@ -81,116 +46,68 @@ static wxString EscapeFileNameCharsInURL(const char *in) wxWebFileHandler::wxWebFileHandler() { - m_name = "test"; + m_name = "file"; m_fileSystem = new wxFileSystem(); } wxFSFile* wxWebFileHandler::GetFile(const wxString &uri) { - size_t pos = uri.find('?'); - //There is no query string so we can load the file directly - if(pos == wxString::npos) + //If there is a fragment at the end of the path then we need to strip it + //off as not all backends do this for us + wxString path = uri; + size_t hashloc = uri.find('#'); + if(hashloc != wxString::npos) { - size_t doubleslash = uri.find("//"); - //The path is incorrectly formed without // after the first protocol - if(doubleslash == wxString::npos) - return NULL; - - wxString fspath = "file:" + - EscapeFileNameCharsInURL(uri.substr(doubleslash + 2)); - return m_fileSystem->OpenFile(fspath); + path = uri.substr(0, hashloc); } - //Otherwise we have a query string of some kind that we need to extract - else{ - wxString lefturi = uri.substr(0, pos); - //We extract the query parts that we need - QueryMap map = QueryStringToQueryMap(uri.substr(pos)); - wxString protocol = map["protocol"], path = map["path"]; + //We iterate through the string to see if there is a protocol description + size_t start = wxString::npos; + for(size_t i = 0; i < path.length(); i++) + { + if(path[i] == ';' && path.substr(i, 10) == ";protocol=") + { + start = i; + break; + } + } - //We now have the path and the protocol and so can format a correct uri - //to pass to wxFileSystem to get a wxFSFile - size_t doubleslash = uri.find("//"); - //The path is incorrectly formed without // after the first protocol + //We do not have a protocol string so we just pass the path withouth the + if(start == wxString::npos) + { + size_t doubleslash = path.find("//"); + //The path is incorrectly formed without // after the scheme if(doubleslash == wxString::npos) return NULL; wxString fspath = "file:" + - EscapeFileNameCharsInURL(lefturi.substr(doubleslash + 2)) - + "#" + protocol +":" + path; + EscapeFileNameCharsInURL(path.substr(doubleslash + 2)); return m_fileSystem->OpenFile(fspath); } -} - -wxString wxWebFileHandler::CombineURIs(const wxString &baseuri, - const wxString &newuri) -{ - //If there is a colon in the path then we just return it - 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) - { - QueryMap map = QueryStringToQueryMap(baseuri.substr(baseuri.find('?'))); - //As the path is absolue simply replace the old path with the new one - map["path"] = newuri; - wxString newquery = QueryMapToQueryString(map); - return baseuri.substr(0, baseuri.find('?')) + newquery; - } - //We have a relative path and no query string - else if(baseuri.find('?') == wxString::npos) + //Otherwise we need to extract the protocol + else { - //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('/') + '/'; - - //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 + size_t end = path.find('/', start); + //For the path to be valid there must to a path after the protocol + if(end == wxString::npos) { - //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); + return NULL; } - } - //We have a relative path and a query string - else - { - QueryMap map = QueryStringToQueryMap(baseuri.substr(baseuri.find('?'))); - wxString path = map["path"]; - //Then we remove the last filename - path = path.BeforeLast('/') + '/'; - - //We can now use wxFileName to perform the normalisation - wxFileName fn(path + newuri); - fn.Normalize(wxPATH_NORM_DOTS, "", wxPATH_UNIX); - map["path"] = fn.GetFullPath(wxPATH_UNIX); + wxString mainpath = path.substr(0, start); + wxString archivepath = path.substr(end); + wxString protstring = path.substr(start, end - start); + wxString protocol = protstring.substr(10); + //We can now construct the correct path + size_t doubleslash = path.find("//"); + //The path is incorrectly formed without // after the first protocol + if(doubleslash == wxString::npos) + return NULL; - wxString newquery = QueryMapToQueryString(map); - return baseuri.substr(0, baseuri.find('?')) + newquery; + wxString fspath = "file:" + + EscapeFileNameCharsInURL(mainpath.substr(doubleslash + 2)) + + "#" + protocol +":" + archivepath; + return m_fileSystem->OpenFile(fspath); } } + #endif // wxUSE_WEB