wxDECLARE_DYNAMIC_CLASS(wxWebViewIE);
};
-class VirtualProtocol : public IInternetProtocol, public IInternetProtocolInfo
+class VirtualProtocol : public IInternetProtocol
{
protected:
ULONG m_refCount;
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
#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)
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;
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
AddRef();
return S_OK;
}
- else if(riid == IID_IInternetProtocolInfo)
- {
- *ppvObject = (IInternetProtocolInfo*)this;
- AddRef();
- return S_OK;
- }
else
{
*ppvObject = NULL;
}
}
-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)
{