<set var="WEB_SRC" hints="files">
$(WEB_SRC_PLATFORM)
src/common/webview.cpp
+ src/common/webviewfilehandler.cpp
</set>
<set var="WEB_HDR_PLATFORM" hints="files">
<set var="WEB_HDR" hints="files">
$(WEB_HDR_PLATFORM)
wx/webview.h
+ wx/webviewfilehandler.h
</set>
<!-- ====================================================================== -->
virtual void RunScript(const wxString& javascript);
//Virtual Filesystem Support
- virtual void RegisterProtocol(wxWebProtocolHandler* hanlder);
+ virtual void RegisterHandler(wxWebHandler* handler);
/** FIXME: hack to work around signals being received too early */
bool m_ready;
virtual void RunScript(const wxString& javascript);
//Virtual Filesystem Support
- virtual void RegisterProtocol(wxWebProtocolHandler* hanlder);
+ virtual void RegisterHandler(wxWebHandler* handler);
// ---- IE-specific methods
VOID * fileP;
wxFSFile* m_file;
- wxWebProtocolHandler* m_handler;
+ wxWebHandler* m_handler;
public:
- VirtualProtocol(wxWebProtocolHandler *handler);
+ VirtualProtocol(wxWebHandler *handler);
~VirtualProtocol();
//IUnknown
private:
ULONG m_refCount;
public:
- ClassFactory(wxWebProtocolHandler* handler) : m_handler(handler) {}
+ ClassFactory(wxWebHandler* handler) : m_handler(handler) {}
//IUnknown
ULONG STDMETHODCALLTYPE AddRef();
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
REFIID riid, void** ppvObject);
HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
private:
- wxWebProtocolHandler* m_handler;
+ wxWebHandler* m_handler;
};
#endif // wxUSE_WEBVIEW_IE
void RunScript(const wxString& javascript);
//Virtual Filesystem Support
- virtual void RegisterProtocol(wxWebProtocolHandler* hanlder) {};
+ virtual void RegisterHandler(wxWebHandler* handler) {};
// ---- methods not from the parent (common) interface
bool CanGetPageSource();
wxWEB_VIEW_BACKEND_IE
};
-//Base class for custom protocol handlers
-class WXDLLIMPEXP_WEB wxWebProtocolHandler
+//Base class for custom scheme handlers
+class WXDLLIMPEXP_WEB wxWebHandler
{
public:
- virtual wxString GetProtocol() = 0;
+ virtual wxString GetName() const = 0;
virtual wxFSFile* GetFile(const wxString &uri) = 0;
virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri) = 0;
};
-//Loads from uris such as file:///C:/example/example.html or archives such as
-//file:///C:/example/example.zip?protocol=zip;path=example.html
-class WXDLLIMPEXP_WEB wxWebFileProtocolHandler : public wxWebProtocolHandler
-{
-public:
- wxWebFileProtocolHandler();
- virtual wxString GetProtocol() { return m_protocol; }
- virtual wxFSFile* GetFile(const wxString &uri);
- virtual wxString CombineURIs(const wxString &baseuri, const wxString &newuri);
-private:
- wxString m_protocol;
- wxFileSystem* m_fileSystem;
-};
-
extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewNameStr[];
extern WXDLLIMPEXP_DATA_WEB(const char) wxWebViewDefaultURLStr[];
virtual void Redo() = 0;
//Virtual Filesystem Support
- virtual void RegisterProtocol(wxWebProtocolHandler* handler) = 0;
+ virtual void RegisterHandler(wxWebHandler* handler) = 0;
};
class WXDLLIMPEXP_WEB wxWebNavigationEvent : public wxCommandEvent
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: webviewfilehandler.h
+// Purpose: Custom handler for the file scheme to allow archive browsing
+// Author: Steven Lamerton
+// Id: $Id$
+// Copyright: (c) 2011 Steven Lamerton
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_WEB_VIEW_FILE_HANDLER_H_
+#define _WX_WEB_VIEW_FILE_HANDLER_H_
+
+#include "wx/setup.h"
+
+#if wxUSE_WEB
+
+class wxFSFile;
+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
+
+class WXDLLIMPEXP_WEB wxWebFileHandler : public wxWebHandler
+{
+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;
+};
+
+#endif
+
+#endif // _WX_WEB_VIEW_FILE_HANDLER_H_
#include <wx/notifmsg.h>
#include <wx/settings.h>
#include <wx/webview.h>
+#include <wx/webviewfilehandler.h>
#include <wx/infobar.h>
#include <wx/filesys.h>
#include <wx/fs_arc.h>
topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1));
//We register the test:// protocol for testing purposes
- m_browser->RegisterProtocol(new wxWebFileProtocolHandler());
+ m_browser->RegisterHandler(new wxWebFileHandler());
SetSizer(topsizer);
#include "wx/osx/webview_webkit.h"
#include "wx/gtk/webview_webkit.h"
#include "wx/msw/webview_ie.h"
-#include "wx/filesys.h"
-#include "wx/tokenzr.h"
// DLL options compatibility check:
#include "wx/app.h"
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, wxWebNavigationEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, wxWebNavigationEvent );
-//Taken from wx/filesys.cpp
-static wxString EscapeFileNameCharsInURL(const char *in)
-{
- wxString s;
-
- for ( const unsigned char *p = (const unsigned char*)in; *p; ++p )
- {
- const unsigned char c = *p;
-
- if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' ||
- (c >= '0' && c <= '9') ||
- (c >= 'a' && c <= 'z') ||
- (c >= 'A' && c <= 'Z') )
- {
- s << c;
- }
- else
- {
- s << wxString::Format("%%%02x", c);
- }
- }
-
- return s;
-}
-
-wxWebFileProtocolHandler::wxWebFileProtocolHandler()
-{
- m_protocol = "test";
- m_fileSystem = new wxFileSystem();
-}
-
-wxFSFile* wxWebFileProtocolHandler::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)
- {
- 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(uri.substr(doubleslash + 2));
- return m_fileSystem->OpenFile(fspath);
- }
- //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 now have the path and the protocol and so can format a correct uri
- //to pass to wxFileSystem to get a wxFSFile
- 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;
- return m_fileSystem->OpenFile(fspath);
- }
-}
-
-wxString wxWebFileProtocolHandler::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)
- {
- 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
wxWebView* wxWebView::New(wxWebViewBackend backend)
{
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: webviewfilehandler.cpp
+// Purpose: Custom handler for the file scheme to allow archive browsing
+// Author: Steven Lamerton
+// Id: $Id$
+// Copyright: (c) 2011 Steven Lamerton
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_WEB
+
+#if defined(__BORLANDC__)
+ #pragma hdrstop
+#endif
+
+#include "wx/webviewfilehandler.h"
+#include "wx/filesys.h"
+#include "wx/tokenzr.h"
+
+//Taken from wx/filesys.cpp
+static wxString EscapeFileNameCharsInURL(const char *in)
+{
+ wxString s;
+
+ for ( const unsigned char *p = (const unsigned char*)in; *p; ++p )
+ {
+ const unsigned char c = *p;
+
+ if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' ||
+ (c >= '0' && c <= '9') ||
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') )
+ {
+ s << c;
+ }
+ else
+ {
+ s << wxString::Format("%%%02x", c);
+ }
+ }
+
+ return s;
+}
+
+wxWebFileHandler::wxWebFileHandler()
+{
+ m_name = "test";
+ m_fileSystem = new wxFileSystem();
+}
+
+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)
+ {
+ 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(uri.substr(doubleslash + 2));
+ return m_fileSystem->OpenFile(fspath);
+ }
+ //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 now have the path and the protocol and so can format a correct uri
+ //to pass to wxFileSystem to get a wxFSFile
+ 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;
+ 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)
+ {
+ 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;
+ }
+}
+#endif // wxUSE_WEB
document->Release();
}
-void wxWebViewIE::RegisterProtocol(wxWebProtocolHandler* handler)
+void wxWebViewIE::RegisterHandler(wxWebHandler* handler)
{
ClassFactory* cf = new ClassFactory(handler);
IInternetSession* session;
wxFAIL_MSG("Could not retrive internet session");
}
- HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetProtocol(), 0, NULL, 0);
+ HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetName(), 0, NULL, 0);
if(FAILED(hr))
{
wxFAIL_MSG("Could not register protocol");
evt.Skip();
}
-VirtualProtocol::VirtualProtocol(wxWebProtocolHandler *handler)
+VirtualProtocol::VirtualProtocol(wxWebHandler *handler)
{
m_refCount = 0;
m_file = NULL;