+class VirtualProtocol : public wxIInternetProtocol
+{
+protected:
+ wxIInternetProtocolSink* m_protocolSink;
+ wxString m_html;
+ VOID * fileP;
+
+ wxFSFile* m_file;
+ wxSharedPtr<wxWebViewHandler> m_handler;
+
+public:
+ VirtualProtocol(wxSharedPtr<wxWebViewHandler> handler);
+ ~VirtualProtocol() {}
+
+ //IUnknown
+ DECLARE_IUNKNOWN_METHODS;
+
+ //IInternetProtocolRoot
+ HRESULT STDMETHODCALLTYPE Abort(HRESULT WXUNUSED(hrReason),
+ DWORD WXUNUSED(dwOptions))
+ { return E_NOTIMPL; }
+ HRESULT STDMETHODCALLTYPE Continue(wxPROTOCOLDATA *WXUNUSED(pProtocolData))
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE Resume() { return S_OK; }
+ HRESULT STDMETHODCALLTYPE Start(LPCWSTR szUrl,
+ wxIInternetProtocolSink *pOIProtSink,
+ wxIInternetBindInfo *pOIBindInfo,
+ DWORD grfPI,
+ HANDLE_PTR dwReserved);
+ HRESULT STDMETHODCALLTYPE Suspend() { return S_OK; }
+ HRESULT STDMETHODCALLTYPE Terminate(DWORD WXUNUSED(dwOptions)) { return S_OK; }
+
+ //IInternetProtocol
+ HRESULT STDMETHODCALLTYPE LockRequest(DWORD WXUNUSED(dwOptions))
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE Read(void *pv, ULONG cb, ULONG *pcbRead);
+ HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER WXUNUSED(dlibMove),
+ DWORD WXUNUSED(dwOrigin),
+ ULARGE_INTEGER* WXUNUSED(plibNewPosition))
+ { return E_FAIL; }
+ HRESULT STDMETHODCALLTYPE UnlockRequest() { return S_OK; }
+};
+
+class ClassFactory : public IClassFactory
+{
+public:
+ ClassFactory(wxSharedPtr<wxWebViewHandler> handler) : m_handler(handler)
+ { AddRef(); }
+
+ wxString GetName() { return m_handler->GetName(); }
+
+ //IClassFactory
+ HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown* pUnkOuter,
+ REFIID riid, void** ppvObject);
+ HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
+
+ //IUnknown
+ DECLARE_IUNKNOWN_METHODS;
+
+private:
+ wxSharedPtr<wxWebViewHandler> m_handler;
+};
+
+class wxIEContainer : public wxActiveXContainer
+{
+public:
+ wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk, DocHostUIHandler* uiHandler = NULL);
+ virtual ~wxIEContainer();
+ virtual bool QueryClientSiteInterface(REFIID iid, void **_interface, const char *&desc);
+private:
+ DocHostUIHandler* m_uiHandler;
+};
+
+class DocHostUIHandler : public wxIDocHostUIHandler
+{
+public:
+ DocHostUIHandler() {};
+ ~DocHostUIHandler() {};
+ virtual HRESULT wxSTDCALL ShowContextMenu(DWORD dwID, POINT *ppt,
+ IUnknown *pcmdtReserved,
+ IDispatch *pdispReserved);
+
+ virtual HRESULT wxSTDCALL GetHostInfo(DOCHOSTUIINFO *pInfo);
+
+ virtual HRESULT wxSTDCALL ShowUI(DWORD dwID,
+ IOleInPlaceActiveObject *pActiveObject,
+ IOleCommandTarget *pCommandTarget,
+ IOleInPlaceFrame *pFrame,
+ IOleInPlaceUIWindow *pDoc);
+
+ virtual HRESULT wxSTDCALL HideUI(void);
+
+ virtual HRESULT wxSTDCALL UpdateUI(void);
+
+ virtual HRESULT wxSTDCALL EnableModeless(BOOL fEnable);
+
+ virtual HRESULT wxSTDCALL OnDocWindowActivate(BOOL fActivate);
+
+ virtual HRESULT wxSTDCALL OnFrameWindowActivate(BOOL fActivate);
+
+ virtual HRESULT wxSTDCALL ResizeBorder(LPCRECT prcBorder,
+ IOleInPlaceUIWindow *pUIWindow,
+ BOOL fRameWindow);
+
+ virtual HRESULT wxSTDCALL TranslateAccelerator(LPMSG lpMsg,
+ const GUID *pguidCmdGroup,
+ DWORD nCmdID);
+
+ virtual HRESULT wxSTDCALL GetOptionKeyPath(LPOLESTR *pchKey,
+ DWORD dw);
+
+ virtual HRESULT wxSTDCALL GetDropTarget(IDropTarget *pDropTarget,
+ IDropTarget **ppDropTarget);
+
+ virtual HRESULT wxSTDCALL GetExternal(IDispatch **ppDispatch);
+
+ virtual HRESULT wxSTDCALL TranslateUrl(DWORD dwTranslate,
+ OLECHAR *pchURLIn,
+ OLECHAR **ppchURLOut);
+
+ virtual HRESULT wxSTDCALL FilterDataObject(IDataObject *pDO,
+ IDataObject **ppDORet);
+ //IUnknown
+ DECLARE_IUNKNOWN_METHODS;
+};
+
+class wxFindPointers
+{
+public:
+ wxFindPointers(wxIMarkupPointer *ptrBegin, wxIMarkupPointer *ptrEnd)
+ {
+ begin = ptrBegin;
+ end = ptrEnd;
+ }
+ //The two markup pointers.
+ wxIMarkupPointer *begin, *end;