#include "wx/webviewfilehandler.h"
#include "wx/filesys.h"
-#include "wx/tokenzr.h"
//Taken from wx/filesys.cpp
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
+ path = uri.substr(0, hashloc);
+ }
+
+ //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 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(uri.substr(doubleslash + 2));
+ EscapeFileNameCharsInURL(path.substr(doubleslash + 2));
return m_fileSystem->OpenFile(fspath);
}
- //Otherwise we have a query string of some kind that we need to extract
- else{
- //First we extract the query string, this should have two parameters,
- //protocol=type and path=path
- wxString query = uri.substr(pos + 1), protocol, path;
- //We also trim the query off the end as we handle it alone
- wxString lefturi = uri.substr(0, pos);
- wxStringTokenizer tokenizer(query, ";");
- while(tokenizer.HasMoreTokens() && (protocol == "" || path == ""))
+ //Otherwise we need to extract the protocol
+ 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)
{
- wxString token = tokenizer.GetNextToken();
- if(token.substr(0, 9) == "protocol=")
- {
- protocol = token.substr(9);
- }
- else if(token.substr(0, 5) == "path=")
- {
- path = token.substr(5);
- }
- }
- if(protocol == "" || path == "")
return NULL;
-
- //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("//");
+ }
+ 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 fspath = "file:" +
- EscapeFileNameCharsInURL(lefturi.substr(doubleslash + 2))
- + "#" + protocol +":" + path;
+ EscapeFileNameCharsInURL(mainpath.substr(doubleslash + 2))
+ + "#" + protocol +":" + archivepath;
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)
- {
- 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;
- }
-}
#endif // wxUSE_WEB