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
This commit is contained in:
@@ -160,7 +160,7 @@ private:
|
|||||||
wxDECLARE_DYNAMIC_CLASS(wxWebViewIE);
|
wxDECLARE_DYNAMIC_CLASS(wxWebViewIE);
|
||||||
};
|
};
|
||||||
|
|
||||||
class VirtualProtocol : public IInternetProtocol, public IInternetProtocolInfo
|
class VirtualProtocol : public IInternetProtocol
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
ULONG m_refCount;
|
ULONG m_refCount;
|
||||||
@@ -204,26 +204,6 @@ public:
|
|||||||
ULARGE_INTEGER* WXUNUSED(plibNewPosition))
|
ULARGE_INTEGER* WXUNUSED(plibNewPosition))
|
||||||
{ return E_FAIL; }
|
{ return E_FAIL; }
|
||||||
HRESULT STDMETHODCALLTYPE UnlockRequest() { return S_OK; }
|
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
|
class ClassFactory : public IClassFactory
|
||||||
|
@@ -106,7 +106,6 @@ class WXDLLIMPEXP_WEB wxWebHandler
|
|||||||
public:
|
public:
|
||||||
virtual wxString GetName() const = 0;
|
virtual wxString GetName() const = 0;
|
||||||
virtual wxFSFile* GetFile(const wxString &uri) = 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[];
|
extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewNameStr[];
|
||||||
|
@@ -20,7 +20,7 @@ class wxFileSystem;
|
|||||||
#include "wx/webview.h"
|
#include "wx/webview.h"
|
||||||
|
|
||||||
//Loads from uris such as file:///C:/example/example.html or archives such as
|
//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
|
class WXDLLIMPEXP_WEB wxWebFileHandler : public wxWebHandler
|
||||||
{
|
{
|
||||||
@@ -28,7 +28,6 @@ public:
|
|||||||
wxWebFileHandler();
|
wxWebFileHandler();
|
||||||
virtual wxString GetName() const { return m_name; }
|
virtual wxString GetName() const { return m_name; }
|
||||||
virtual wxFSFile* GetFile(const wxString &uri);
|
virtual wxFSFile* GetFile(const wxString &uri);
|
||||||
virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri);
|
|
||||||
private:
|
private:
|
||||||
wxString m_name;
|
wxString m_name;
|
||||||
wxFileSystem* m_fileSystem;
|
wxFileSystem* m_fileSystem;
|
||||||
|
@@ -18,41 +18,6 @@
|
|||||||
|
|
||||||
#include "wx/webviewfilehandler.h"
|
#include "wx/webviewfilehandler.h"
|
||||||
#include "wx/filesys.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
|
//Taken from wx/filesys.cpp
|
||||||
static wxString EscapeFileNameCharsInURL(const char *in)
|
static wxString EscapeFileNameCharsInURL(const char *in)
|
||||||
@@ -87,12 +52,22 @@ wxWebFileHandler::wxWebFileHandler()
|
|||||||
|
|
||||||
wxFSFile* wxWebFileHandler::GetFile(const wxString &uri)
|
wxFSFile* wxWebFileHandler::GetFile(const wxString &uri)
|
||||||
{
|
{
|
||||||
size_t pos = uri.find('?');
|
//We iterate through the string to see if there is a protocol description
|
||||||
//There is no query string so we can load the file directly
|
int start = -1;
|
||||||
if(pos == wxString::npos)
|
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("//");
|
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)
|
if(doubleslash == wxString::npos)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -100,97 +75,30 @@ wxFSFile* wxWebFileHandler::GetFile(const wxString &uri)
|
|||||||
EscapeFileNameCharsInURL(uri.substr(doubleslash + 2));
|
EscapeFileNameCharsInURL(uri.substr(doubleslash + 2));
|
||||||
return m_fileSystem->OpenFile(fspath);
|
return m_fileSystem->OpenFile(fspath);
|
||||||
}
|
}
|
||||||
//Otherwise we have a query string of some kind that we need to extract
|
//Otherwise we need to extract the protocol
|
||||||
else{
|
else
|
||||||
wxString lefturi = uri.substr(0, pos);
|
{
|
||||||
|
int end = uri.find('/', start);
|
||||||
//We extract the query parts that we need
|
//For the path to be valid there must to a path after the protocol
|
||||||
QueryMap map = QueryStringToQueryMap(uri.substr(pos));
|
if(end == wxString::npos)
|
||||||
wxString protocol = map["protocol"], path = map["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
|
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("//");
|
size_t doubleslash = uri.find("//");
|
||||||
//The path is incorrectly formed without // after the first protocol
|
//The path is incorrectly formed without // after the first protocol
|
||||||
if(doubleslash == wxString::npos)
|
if(doubleslash == wxString::npos)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
wxString fspath = "file:" +
|
wxString fspath = "file:" +
|
||||||
EscapeFileNameCharsInURL(lefturi.substr(doubleslash + 2))
|
EscapeFileNameCharsInURL(mainpath.substr(doubleslash + 2))
|
||||||
+ "#" + protocol +":" + path;
|
+ "#" + protocol +":" + archivepath;
|
||||||
return m_fileSystem->OpenFile(fspath);
|
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
|
#endif // wxUSE_WEB
|
||||||
|
@@ -985,12 +985,6 @@ HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject)
|
|||||||
AddRef();
|
AddRef();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
else if(riid == IID_IInternetProtocolInfo)
|
|
||||||
{
|
|
||||||
*ppvObject = (IInternetProtocolInfo*)this;
|
|
||||||
AddRef();
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*ppvObject = NULL;
|
*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,
|
HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid,
|
||||||
void ** ppvObject)
|
void ** ppvObject)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user