]> git.saurik.com Git - wxWidgets.git/commitdiff
Simplify the wxWebFileHandler code by using a map to store the query string and manip...
authorSteve Lamerton <steve.lamerton@gmail.com>
Sun, 31 Jul 2011 10:50:46 +0000 (10:50 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Sun, 31 Jul 2011 10:50:46 +0000 (10:50 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68469 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/webviewfilehandler.cpp

index 2f35f738cce79fa3766faf17566654761231bb41..6b542ffc219ff54f561b7aee930e845ae8cf2baf 100644 (file)
 #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)
@@ -68,26 +102,11 @@ wxFSFile* wxWebFileHandler::GetFile(const wxString &uri)
     }
     //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 == ""))
-        {
-            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 extract the query parts that we need
+        QueryMap map = QueryStringToQueryMap(uri.substr(pos));
+        wxString protocol = map["protocol"], path = map["path"];
 
         //We now have the path and the protocol and so can format a correct uri
         //to pass to wxFileSystem to get a wxFSFile
@@ -104,7 +123,7 @@ wxFSFile* wxWebFileHandler::GetFile(const wxString &uri)
 }
 
 wxString wxWebFileHandler::CombineURIs(const wxString &baseuri, 
-                                               const wxString &newuri)
+                                       const wxString &newuri)
 {
     //If there is a colon in the path then we just return it
     if(newuri.find(':') != wxString::npos)
@@ -123,27 +142,11 @@ wxString wxWebFileHandler::CombineURIs(const wxString &baseuri,
     //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;
+        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)
@@ -154,9 +157,6 @@ wxString wxWebFileHandler::CombineURIs(const wxString &baseuri,
         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
@@ -179,35 +179,18 @@ wxString wxWebFileHandler::CombineURIs(const wxString &baseuri,
     //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;
+        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 newquery = QueryMapToQueryString(map);
+        return baseuri.substr(0, baseuri.find('?')) + newquery;
     }
 }
 #endif // wxUSE_WEB