From b7d3a622aa58729f92941c2b6710c5481b16f19e Mon Sep 17 00:00:00 2001 From: Steve Lamerton Date: Wed, 3 Aug 2011 18:31:48 +0000 Subject: [PATCH] Rework IE virtual file system support to use new syntax. Remove now unused code for resolving links ourselves, we can let the backend resolves them itself. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/SOC2011_WEBVIEW@68507 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/webview_ie.h | 22 +---- include/wx/webview.h | 1 - include/wx/webviewfilehandler.h | 3 +- src/common/webviewfilehandler.cpp | 152 ++++++------------------------ src/msw/webview_ie.cpp | 50 ---------- 5 files changed, 32 insertions(+), 196 deletions(-) diff --git a/include/wx/msw/webview_ie.h b/include/wx/msw/webview_ie.h index f327502df4..aec06fc0d1 100644 --- a/include/wx/msw/webview_ie.h +++ b/include/wx/msw/webview_ie.h @@ -160,7 +160,7 @@ private: wxDECLARE_DYNAMIC_CLASS(wxWebViewIE); }; -class VirtualProtocol : public IInternetProtocol, public IInternetProtocolInfo +class VirtualProtocol : public IInternetProtocol { protected: ULONG m_refCount; @@ -204,26 +204,6 @@ public: ULARGE_INTEGER* WXUNUSED(plibNewPosition)) { return E_FAIL; } HRESULT STDMETHODCALLTYPE UnlockRequest() { return S_OK; } - - //IInternetProtocolInfo - HRESULT STDMETHODCALLTYPE CombineUrl(LPCWSTR pwzBaseUrl, - LPCWSTR pwzRelativeUrl, - DWORD dwCombineFlags, - LPWSTR pwzResult, DWORD cchResult, - DWORD *pcchResult, DWORD dwReserved); - HRESULT STDMETHODCALLTYPE CompareUrl(LPCWSTR WXUNUSED(pwzUrl1), - LPCWSTR WXUNUSED(pwzUrl2), - DWORD WXUNUSED(dwCompareFlags)) - { return INET_E_DEFAULT_ACTION; } - HRESULT STDMETHODCALLTYPE ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, - DWORD dwParseFlags, LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD dwReserved); - HRESULT STDMETHODCALLTYPE QueryInfo(LPCWSTR pwzUrl, - QUERYOPTION OueryOption, - DWORD dwQueryFlags, LPVOID pBuffer, - DWORD cbBuffer, DWORD *pcbBuf, - DWORD dwReserved); }; class ClassFactory : public IClassFactory diff --git a/include/wx/webview.h b/include/wx/webview.h index 0bc9f8547e..11958d379c 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -106,7 +106,6 @@ class WXDLLIMPEXP_WEB wxWebHandler public: virtual wxString GetName() const = 0; virtual wxFSFile* GetFile(const wxString &uri) = 0; - virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri) = 0; }; extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewNameStr[]; diff --git a/include/wx/webviewfilehandler.h b/include/wx/webviewfilehandler.h index a3ea4367e1..787a0c4240 100644 --- a/include/wx/webviewfilehandler.h +++ b/include/wx/webviewfilehandler.h @@ -20,7 +20,7 @@ class wxFileSystem; #include "wx/webview.h" //Loads from uris such as file:///C:/example/example.html or archives such as -//file:///C:/example/example.zip?protocol=zip;path=example.html +//file:///C:/example/example.zip;protocol=zip/example.html class WXDLLIMPEXP_WEB wxWebFileHandler : public wxWebHandler { @@ -28,7 +28,6 @@ public: wxWebFileHandler(); virtual wxString GetName() const { return m_name; } virtual wxFSFile* GetFile(const wxString &uri); - virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri); private: wxString m_name; wxFileSystem* m_fileSystem; diff --git a/src/common/webviewfilehandler.cpp b/src/common/webviewfilehandler.cpp index 6b542ffc21..eab45afea0 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) @@ -87,12 +52,22 @@ wxWebFileHandler::wxWebFileHandler() 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) + //We iterate through the string to see if there is a protocol description + int start = -1; + for(int i = 0; i < uri.length(); i++) + { + if(uri[i] == ';' && uri.substr(i, 10) == ";protocol=") + { + start = i; + break; + } + } + + //We do not have a protocol string so we just pass the path withouth the + if(start == -1) { size_t doubleslash = uri.find("//"); - //The path is incorrectly formed without // after the first protocol + //The path is incorrectly formed without // after the scheme if(doubleslash == wxString::npos) return NULL; @@ -100,97 +75,30 @@ wxFSFile* wxWebFileHandler::GetFile(const wxString &uri) EscapeFileNameCharsInURL(uri.substr(doubleslash + 2)); return m_fileSystem->OpenFile(fspath); } - //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 now have the path and the protocol and so can format a correct uri - //to pass to wxFileSystem to get a wxFSFile + //Otherwise we need to extract the protocol + else + { + int end = uri.find('/', start); + //For the path to be valid there must to a path after the protocol + if(end == wxString::npos) + { + return NULL; + } + wxString mainpath = uri.substr(0, start); + wxString archivepath = uri.substr(end); + wxString protstring = uri.substr(start, end - start); + wxString protocol = protstring.substr(10); + //We can now construct the correct path 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(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) - { - 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) - { - //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 - { - //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 - { - 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 diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index 276e352964..bb3add6495 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -985,12 +985,6 @@ HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject) AddRef(); return S_OK; } - else if(riid == IID_IInternetProtocolInfo) - { - *ppvObject = (IInternetProtocolInfo*)this; - AddRef(); - return S_OK; - } else { *ppvObject = NULL; @@ -1078,50 +1072,6 @@ HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) } } -HRESULT VirtualProtocol::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, - DWORD WXUNUSED(dwCombineFlags), - LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD WXUNUSED(dwReserved)) -{ - - wxString newuri = m_handler->CombineURIs(pwzBaseUrl, pwzRelativeUrl); - //Check the buffer we are given can hold the new url - if(wxStrlen(newuri) > cchResult) - return S_FALSE; - - wxStrcpy(pwzResult, newuri.c_str()); - *pcchResult = wxStrlen(newuri); - return S_OK; -} - -HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, - PARSEACTION WXUNUSED(ParseAction), - DWORD WXUNUSED(dwParseFlags), - LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD WXUNUSED(dwReserved)) -{ - //Check the buffer we are given can hold the new url - if(wxStrlen(pwzUrl) > cchResult) - return S_FALSE; - - wxStrcpy(pwzResult, pwzUrl); - *pcchResult = wxStrlen(pwzResult); - return S_OK; -} - -HRESULT VirtualProtocol::QueryInfo(LPCWSTR WXUNUSED(pwzUrl), - QUERYOPTION WXUNUSED(OueryOption), - DWORD WXUNUSED(dwQueryFlags), - LPVOID WXUNUSED(pBuffer), - DWORD WXUNUSED(cbBuffer), - DWORD* WXUNUSED(pcbBuf), - DWORD WXUNUSED(dwReserved)) -{ - return INET_E_DEFAULT_ACTION; -} - HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void ** ppvObject) { -- 2.45.2