]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/webviewfilehandler.cpp
Fix typo in last commit
[wxWidgets.git] / src / common / webviewfilehandler.cpp
index 2f35f738cce79fa3766faf17566654761231bb41..3dbbbb3398f94c21af679e1d7b2a92531715d650 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "wx/webviewfilehandler.h"
 #include "wx/filesys.h"
-#include "wx/tokenzr.h"
 
 //Taken from wx/filesys.cpp
 static wxString EscapeFileNameCharsInURL(const char *in)
@@ -47,167 +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
+        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