]> git.saurik.com Git - wxWidgets.git/commitdiff
Add CombineURIs implementation for wxWebFileProtocolHandler. Update the IE backend...
authorSteve Lamerton <steve.lamerton@gmail.com>
Fri, 29 Jul 2011 10:33:54 +0000 (10:33 +0000)
committerSteve Lamerton <steve.lamerton@gmail.com>
Fri, 29 Jul 2011 10:33:54 +0000 (10:33 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68449 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/webview.cpp
src/msw/webview_ie.cpp

index 6fa131c2f23c4f871d9b9cb0d2f6c6e6bc303cb7..9c0c88f0ba07fb6ccf5178ba9512ede03792b598 100644 (file)
@@ -125,8 +125,109 @@ wxFSFile* wxWebFileProtocolHandler::GetFile(const wxString &uri)
 wxString wxWebFileProtocolHandler::CombineURIs(const wxString &baseuri, 
                                                const wxString &newuri)
 {
-    //Still need to be implemented correctly
-    return 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;
+    }
 }
 
 // static
index a3ddf371552a3495710d0a70d3b521fa8820d469..0250dd85f0883204da128273b2723bc0a6d89168 100644 (file)
@@ -1074,7 +1074,14 @@ HRESULT VirtualProtocol::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
                                     DWORD cchResult, DWORD *pcchResult, 
                                     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,
@@ -1083,8 +1090,8 @@ HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction,
                                   DWORD dwReserved)
 {
     //return INET_E_DEFAULT_ACTION;
-    wcscpy(pwzResult, pwzUrl);
-    *pcchResult = wcslen(pwzResult);
+    wxStrcpy(pwzResult, pwzUrl);
+    *pcchResult = wxStrlen(pwzResult);
     return S_OK;
 }