X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eff8f7952ed2ecc85b48dd01a047658d7f4eafcb..cf5d4c76af8d7bea5b2dcb5755dc6efd1bffcd58:/src/msw/webview_ie.cpp diff --git a/src/msw/webview_ie.cpp b/src/msw/webview_ie.cpp index a3ddf37155..17e63ec3f3 100644 --- a/src/msw/webview_ie.cpp +++ b/src/msw/webview_ie.cpp @@ -3,7 +3,7 @@ // Purpose: wxMSW wxWebViewIE class implementation for web view component // Author: Marianne Gagnon // Id: $Id$ -// Copyright: (c) 2010 Marianne Gagnon, Steven Lamerton +// Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,7 +16,7 @@ #include "wx/msw/webview_ie.h" -#if wxUSE_WEBVIEW_IE +#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE #include #include @@ -26,9 +26,21 @@ #include "wx/msw/registry.h" #include "wx/msw/missing.h" #include "wx/filesys.h" +#include "wx/dynlib.h" +#include -//We link to urlmon as it is required for CoInternetGetSession -#pragma comment(lib, "urlmon") +/* These GUID definitions are our own implementation to support interfaces + * normally in urlmon.h. See include/wx/msw/webview_ie.h + */ + +namespace { + +DEFINE_GUID(wxIID_IInternetProtocolRoot,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb); +DEFINE_GUID(wxIID_IInternetProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb); + +} + +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView); BEGIN_EVENT_TABLE(wxWebViewIE, wxControl) EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent) @@ -71,60 +83,85 @@ bool wxWebViewIE::Create(wxWindow* parent, m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser); - SetBackgroundStyle(wxBG_STYLE_PAINT); - SetDoubleBuffered(true); - LoadUrl(url); + LoadURL(url); return true; } +wxWebViewIE::~wxWebViewIE() +{ + for(unsigned int i = 0; i < m_factories.size(); i++) + { + m_factories[i]->Release(); + } +} -void wxWebViewIE::LoadUrl(const wxString& url) +void wxWebViewIE::LoadURL(const wxString& url) { - m_ie.CallMethod("Navigate", (BSTR) url.wc_str(), NULL, NULL, NULL, NULL); + m_ie.CallMethod("Navigate", wxConvertStringToOle(url)); } void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl) { - BSTR bstr = SysAllocString(html.wc_str()); - - // Creates a new one-dimensional array + BSTR bstr = SysAllocString(OLESTR("")); SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); if (psaStrings != NULL) { VARIANT *param; - HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m); param->vt = VT_BSTR; param->bstrVal = bstr; - hr = SafeArrayUnaccessData(psaStrings); + hr = SafeArrayUnaccessData(psaStrings); + IHTMLDocument2* document = GetDocument(); document->write(psaStrings); + document->close(); document->Release(); - // SafeArrayDestroy calls SysFreeString for each BSTR SafeArrayDestroy(psaStrings); - //We send the events when we are done to mimic webkit - //Navigated event - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), baseUrl, "", false); - event.SetEventObject(this); - HandleWindowEvent(event); - - //Document complete event - event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED); - event.SetEventObject(this); - HandleWindowEvent(event); + bstr = SysAllocString(html.wc_str()); + + // Creates a new one-dimensional array + psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1); + if (psaStrings != NULL) + { + hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m); + param->vt = VT_BSTR; + param->bstrVal = bstr; + hr = SafeArrayUnaccessData(psaStrings); + + document = GetDocument(); + document->write(psaStrings); + document->Release(); + + // SafeArrayDestroy calls SysFreeString for each BSTR + SafeArrayDestroy(psaStrings); + + //We send the events when we are done to mimic webkit + //Navigated event + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + GetId(), baseUrl, ""); + event.SetEventObject(this); + HandleWindowEvent(event); + + //Document complete event + event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED); + event.SetEventObject(this); + HandleWindowEvent(event); + } + else + { + wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL"); + } } else { - wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL"); + wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL during clear"); } - } -wxString wxWebViewIE::GetPageSource() +wxString wxWebViewIE::GetPageSource() const { IHTMLDocument2* document = GetDocument(); IHTMLElement *bodyTag = NULL; @@ -148,14 +185,17 @@ wxString wxWebViewIE::GetPageSource() return source; } -wxWebViewZoom wxWebViewIE::GetZoom() +wxWebViewZoom wxWebViewIE::GetZoom() const { - if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_LAYOUT) - return GetIEOpticalZoom(); - else if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_TEXT) - return GetIETextZoom(); - else - wxFAIL; + switch( m_zoomType ) + { + case wxWEB_VIEW_ZOOM_TYPE_LAYOUT: + return GetIEOpticalZoom(); + case wxWEB_VIEW_ZOOM_TYPE_TEXT: + return GetIETextZoom(); + default: + wxFAIL; + } //Dummy return to stop compiler warnings return wxWEB_VIEW_ZOOM_MEDIUM; @@ -164,12 +204,17 @@ wxWebViewZoom wxWebViewIE::GetZoom() void wxWebViewIE::SetZoom(wxWebViewZoom zoom) { - if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_LAYOUT) - SetIEOpticalZoom(zoom); - else if(m_zoomType == wxWEB_VIEW_ZOOM_TYPE_TEXT) - SetIETextZoom(zoom); - else - wxFAIL; + switch( m_zoomType ) + { + case wxWEB_VIEW_ZOOM_TYPE_LAYOUT: + SetIEOpticalZoom(zoom); + break; + case wxWEB_VIEW_ZOOM_TYPE_TEXT: + SetIETextZoom(zoom); + break; + default: + wxFAIL; + } } void wxWebViewIE::SetIETextZoom(wxWebViewZoom level) @@ -182,21 +227,27 @@ void wxWebViewIE::SetIETextZoom(wxWebViewZoom level) V_VT(&zoomVariant) = VT_I4; V_I4(&zoomVariant) = level; - HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM, - OLECMDEXECOPT_DONTPROMPTUSER, - &zoomVariant, NULL); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB(OLECMDID_ZOOM, + OLECMDEXECOPT_DONTPROMPTUSER, + &zoomVariant, NULL); wxASSERT(result == S_OK); } -wxWebViewZoom wxWebViewIE::GetIETextZoom() +wxWebViewZoom wxWebViewIE::GetIETextZoom() const { VARIANT zoomVariant; VariantInit (&zoomVariant); V_VT(&zoomVariant) = VT_I4; - HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM, - OLECMDEXECOPT_DONTPROMPTUSER, - NULL, &zoomVariant); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB(OLECMDID_ZOOM, + OLECMDEXECOPT_DONTPROMPTUSER, + NULL, &zoomVariant); wxASSERT(result == S_OK); //We can safely cast here as we know that the range matches our enum @@ -233,22 +284,28 @@ void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level) wxFAIL; } - HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM, - OLECMDEXECOPT_DODEFAULT, - &zoomVariant, - NULL); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/, + OLECMDEXECOPT_DODEFAULT, + &zoomVariant, + NULL); wxASSERT(result == S_OK); } -wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() +wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const { VARIANT zoomVariant; VariantInit (&zoomVariant); V_VT(&zoomVariant) = VT_I4; - HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM, - OLECMDEXECOPT_DODEFAULT, NULL, - &zoomVariant); +#if wxDEBUG_LEVEL + HRESULT result = +#endif + m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/, + OLECMDEXECOPT_DODEFAULT, NULL, + &zoomVariant); wxASSERT(result == S_OK); const int zoom = V_I4(&zoomVariant); @@ -307,7 +364,7 @@ void wxWebViewIE::Print() OLECMDEXECOPT_DODEFAULT, NULL, NULL); } -bool wxWebViewIE::CanGoBack() +bool wxWebViewIE::CanGoBack() const { if(m_historyEnabled) return m_historyPosition > 0; @@ -315,7 +372,7 @@ bool wxWebViewIE::CanGoBack() return false; } -bool wxWebViewIE::CanGoForward() +bool wxWebViewIE::CanGoForward() const { if(m_historyEnabled) return m_historyPosition != static_cast(m_historyList.size()) - 1; @@ -323,7 +380,7 @@ bool wxWebViewIE::CanGoForward() return false; } -void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) +void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) { int pos = -1; for(unsigned int i = 0; i < m_historyList.size(); i++) @@ -335,13 +392,13 @@ void wxWebViewIE::LoadHistoryItem(wxSharedPtr item) wxASSERT_MSG(pos != static_cast(m_historyList.size()), "invalid history item"); m_historyLoadingFromList = true; - LoadUrl(item->GetUrl()); + LoadURL(item->GetUrl()); m_historyPosition = pos; } -wxVector > wxWebViewIE::GetBackwardHistory() +wxVector > wxWebViewIE::GetBackwardHistory() { - wxVector > backhist; + wxVector > backhist; //As we don't have std::copy or an iterator constructor in the wxwidgets //native vector we construct it by hand for(int i = 0; i < m_historyPosition; i++) @@ -351,9 +408,9 @@ wxVector > wxWebViewIE::GetBackwardHistory() return backhist; } -wxVector > wxWebViewIE::GetForwardHistory() +wxVector > wxWebViewIE::GetForwardHistory() { - wxVector > forwardhist; + wxVector > forwardhist; //As we don't have std::copy or an iterator constructor in the wxwidgets //native vector we construct it by hand for(int i = m_historyPosition + 1; i < static_cast(m_historyList.size()); i++) @@ -425,13 +482,16 @@ void wxWebViewIE::SetOfflineMode(bool offline) { // FIXME: the wxWidgets docs do not really document what the return // parameter of PutProperty is - const bool success = m_ie.PutProperty("Offline", (offline ? - VARIANT_TRUE : - VARIANT_FALSE)); +#if wxDEBUG_LEVEL + const bool success = +#endif + m_ie.PutProperty("Offline", (offline ? + VARIANT_TRUE : + VARIANT_FALSE)); wxASSERT(success); } -bool wxWebViewIE::IsBusy() +bool wxWebViewIE::IsBusy() const { if (m_isBusy) return true; @@ -442,7 +502,7 @@ bool wxWebViewIE::IsBusy() return out.GetBool(); } -wxString wxWebViewIE::GetCurrentURL() +wxString wxWebViewIE::GetCurrentURL() const { wxVariant out = m_ie.GetProperty("LocationURL"); @@ -450,7 +510,7 @@ wxString wxWebViewIE::GetCurrentURL() return out.GetString(); } -wxString wxWebViewIE::GetCurrentTitle() +wxString wxWebViewIE::GetCurrentTitle() const { IHTMLDocument2* document = GetDocument(); BSTR title; @@ -460,16 +520,16 @@ wxString wxWebViewIE::GetCurrentTitle() return wxString(title); } -bool wxWebViewIE::CanCut() +bool wxWebViewIE::CanCut() const { return CanExecCommand("Cut"); } -bool wxWebViewIE::CanCopy() +bool wxWebViewIE::CanCopy() const { return CanExecCommand("Copy"); } -bool wxWebViewIE::CanPaste() +bool wxWebViewIE::CanPaste() const { return CanExecCommand("Paste"); } @@ -489,11 +549,11 @@ void wxWebViewIE::Paste() ExecCommand("Paste"); } -bool wxWebViewIE::CanUndo() +bool wxWebViewIE::CanUndo() const { return CanExecCommand("Undo"); } -bool wxWebViewIE::CanRedo() +bool wxWebViewIE::CanRedo() const { return CanExecCommand("Redo"); } @@ -519,7 +579,7 @@ void wxWebViewIE::SetEditable(bool enable) document->Release(); } -bool wxWebViewIE::IsEditable() +bool wxWebViewIE::IsEditable() const { IHTMLDocument2* document = GetDocument(); BSTR mode; @@ -536,7 +596,7 @@ void wxWebViewIE::SelectAll() ExecCommand("SelectAll"); } -bool wxWebViewIE::HasSelection() +bool wxWebViewIE::HasSelection() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -558,7 +618,7 @@ void wxWebViewIE::DeleteSelection() ExecCommand("Delete"); } -wxString wxWebViewIE::GetSelectedText() +wxString wxWebViewIE::GetSelectedText() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -587,7 +647,7 @@ wxString wxWebViewIE::GetSelectedText() return selected; } -wxString wxWebViewIE::GetSelectedSource() +wxString wxWebViewIE::GetSelectedSource() const { IHTMLDocument2* document = GetDocument(); IHTMLSelectionObject* selection; @@ -630,7 +690,7 @@ void wxWebViewIE::ClearSelection() document->Release(); } -wxString wxWebViewIE::GetPageText() +wxString wxWebViewIE::GetPageText() const { IHTMLDocument2* document = GetDocument(); wxString text; @@ -658,28 +718,45 @@ void wxWebViewIE::RunScript(const wxString& javascript) VARIANT level; VariantInit(&level); V_VT(&level) = VT_EMPTY; - window->execScript(SysAllocString(javascript), SysAllocString(language), &level); + window->execScript(SysAllocString(javascript.wc_str()), + SysAllocString(language.wc_str()), + &level); } document->Release(); } -void wxWebViewIE::RegisterProtocol(wxWebProtocolHandler* handler) +void wxWebViewIE::RegisterHandler(wxSharedPtr handler) { - ClassFactory* cf = new ClassFactory(handler); - IInternetSession* session; - if(FAILED(CoInternetGetSession(0, &session, 0))) + wxDynamicLibrary urlMon(wxT("urlmon.dll")); + if(urlMon.HasSymbol(wxT("CoInternetGetSession"))) { - wxFAIL_MSG("Could not retrive internet session"); - } + typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD, wxIInternetSession**, DWORD); + wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon); - HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, handler->GetProtocol(), 0, NULL, 0); - if(FAILED(hr)) + ClassFactory* cf = new ClassFactory(handler); + wxIInternetSession* session; + HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0); + if(FAILED(res)) + { + wxFAIL_MSG("Could not retrive internet session"); + } + + HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol, + handler->GetName().wc_str(), + 0, NULL, 0); + if(FAILED(hr)) + { + wxFAIL_MSG("Could not register protocol"); + } + m_factories.push_back(cf); + } + else { - wxFAIL_MSG("Could not register protocol"); + wxFAIL_MSG("urlmon does not contain CoInternetGetSession"); } } -bool wxWebViewIE::CanExecCommand(wxString command) +bool wxWebViewIE::CanExecCommand(wxString command) const { IHTMLDocument2* document = GetDocument(); VARIANT_BOOL enabled; @@ -697,7 +774,7 @@ void wxWebViewIE::ExecCommand(wxString command) document->Release(); } -IHTMLDocument2* wxWebViewIE::GetDocument() +IHTMLDocument2* wxWebViewIE::GetDocument() const { wxVariant variant = m_ie.GetProperty("Document"); IHTMLDocument2* document = (IHTMLDocument2*)variant.GetVoidPtr(); @@ -720,12 +797,21 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); wxString target = evt[3].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, - GetId(), url, target, true); - event.SetEventObject(this); - HandleWindowEvent(event); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, + GetId(), url, target); - if (event.IsVetoed()) + //skip empty javascript events. + if(url == "javascript:\"\"" && target.IsEmpty()) + { + event.Veto(); + } + else + { + event.SetEventObject(this); + HandleWindowEvent(event); + } + + if (!event.IsAllowed()) { wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters(); @@ -746,8 +832,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); // TODO: set target parameter if possible wxString target = wxEmptyString; - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - GetId(), url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + GetId(), url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -772,7 +858,13 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) //As we are complete we also add to the history list, but not if the //page is not the main page, ie it is a subframe - if(m_historyEnabled && !m_historyLoadingFromList && url == GetCurrentURL()) + //We also have to check if we are loading a file:// url, if so we + //need to change the comparison as ie passes back a different style + //of url + if(m_historyEnabled && !m_historyLoadingFromList && + (url == GetCurrentURL() || + (GetCurrentURL().substr(0, 4) == "file" && + wxFileSystem::URLToFileName(GetCurrentURL()).GetFullPath() == url))) { //If we are not at the end of the list, then erase everything //between us and the end before adding the new page @@ -781,7 +873,7 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) m_historyList.erase(m_historyList.begin() + m_historyPosition + 1, m_historyList.end()); } - wxSharedPtr item(new wxWebHistoryItem(url, GetCurrentTitle())); + wxSharedPtr item(new wxWebViewHistoryItem(url, GetCurrentTitle())); m_historyList.push_back(item); m_historyPosition++; } @@ -789,8 +881,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) m_historyLoadingFromList = false; // TODO: set target parameter if possible wxString target = wxEmptyString; - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(), - url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(), + url, target); event.SetEventObject(this); HandleWindowEvent(event); break; @@ -803,12 +895,19 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) case DISPID_TITLECHANGE: { + wxString title = evt[0].GetString(); + + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + GetId(), GetCurrentURL(), ""); + event.SetString(title); + event.SetEventObject(this); + HandleWindowEvent(event); break; } case DISPID_NAVIGATEERROR: { - wxWebNavigationError errorType = wxWEB_NAV_ERR_OTHER; + wxWebViewNavigationError errorType = wxWEB_NAV_ERR_OTHER; wxString errorCode = "?"; switch (evt[3].GetLong()) { @@ -922,8 +1021,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) wxString url = evt[1].GetString(); wxString target = evt[2].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(), - url, target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(), + url, target); event.SetEventObject(this); event.SetInt(errorType); event.SetString(errorCode); @@ -934,8 +1033,8 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) { wxString url = evt[4].GetString(); - wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, - GetId(), url, wxEmptyString, true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, + GetId(), url, wxEmptyString); event.SetEventObject(this); HandleWindowEvent(event); @@ -950,61 +1049,22 @@ void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt) evt.Skip(); } -VirtualProtocol::VirtualProtocol(wxWebProtocolHandler *handler) +VirtualProtocol::VirtualProtocol(wxSharedPtr handler) { - m_refCount = 0; m_file = NULL; m_handler = handler; } -VirtualProtocol::~VirtualProtocol() -{ -} - -ULONG VirtualProtocol::AddRef() -{ - m_refCount++; - return m_refCount; -} - -HRESULT VirtualProtocol::QueryInterface(REFIID riid, void **ppvObject) -{ - if(riid == IID_IUnknown || riid == IID_IInternetProtocolRoot || - riid == IID_IInternetProtocol) - { - *ppvObject = (IInternetProtocol*)this; - AddRef(); - return S_OK; - } - else if(riid == IID_IInternetProtocolInfo) - { - *ppvObject = (IInternetProtocolInfo*)this; - AddRef(); - return S_OK; - } - else - { - *ppvObject = NULL; - return E_POINTER; - } -} +BEGIN_IID_TABLE(VirtualProtocol) + ADD_IID(Unknown) + ADD_RAW_IID(wxIID_IInternetProtocolRoot) + ADD_RAW_IID(wxIID_IInternetProtocol) +END_IID_TABLE; -ULONG VirtualProtocol::Release() -{ - m_refCount--; - if (m_refCount > 0) - { - return m_refCount; - } - else - { - delete this; - return 0; - } -} +IMPLEMENT_IUNKNOWN_METHODS(VirtualProtocol) -HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, - IInternetBindInfo *pOIBindInfo, DWORD grfPI, +HRESULT VirtualProtocol::Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink, + wxIInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) { wxUnusedVar(szUrl); @@ -1012,7 +1072,7 @@ HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink wxUnusedVar(grfPI); wxUnusedVar(dwReserved); m_protocolSink = pOIProtSink; - + //We get the file itself from the protocol handler m_file = m_handler->GetFile(szUrl); @@ -1023,17 +1083,17 @@ HRESULT VirtualProtocol::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink //We return the stream length for current and total size as we can always //read the whole file from the stream wxFileOffset length = m_file->GetStream()->GetLength(); - m_protocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION | - BSCF_DATAFULLYAVAILABLE | - BSCF_LASTDATANOTIFICATION, + m_protocolSink->ReportData(wxBSCF_FIRSTDATANOTIFICATION | + wxBSCF_DATAFULLYAVAILABLE | + wxBSCF_LASTDATANOTIFICATION, length, length); - return S_OK; + return S_OK; } HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) { //If the file is null we return false to indicte it is finished - if(!m_file) + if(!m_file) return S_FALSE; wxStreamError err = m_file->GetStream()->Read(pv, cb).GetLastError(); @@ -1069,37 +1129,17 @@ HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead) } } -HRESULT VirtualProtocol::CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, - DWORD dwCombineFlags, LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD dwReserved) -{ - return INET_E_DEFAULT_ACTION; -} +BEGIN_IID_TABLE(ClassFactory) + ADD_IID(Unknown) + ADD_IID(ClassFactory) +END_IID_TABLE; -HRESULT VirtualProtocol::ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, - DWORD dwParseFlags, LPWSTR pwzResult, - DWORD cchResult, DWORD *pcchResult, - DWORD dwReserved) -{ - //return INET_E_DEFAULT_ACTION; - wcscpy(pwzResult, pwzUrl); - *pcchResult = wcslen(pwzResult); - return S_OK; -} - -HRESULT VirtualProtocol::QueryInfo(LPCWSTR pwzUrl, QUERYOPTION OueryOption, - DWORD dwQueryFlags, LPVOID pBuffer, - DWORD cbBuffer, DWORD *pcbBuf, - DWORD dwReserved) -{ - return INET_E_DEFAULT_ACTION; -} +IMPLEMENT_IUNKNOWN_METHODS(ClassFactory) HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void ** ppvObject) { - if (pUnkOuter) + if (pUnkOuter) return CLASS_E_NOAGGREGATION; VirtualProtocol* vp = new VirtualProtocol(m_handler); vp->AddRef(); @@ -1107,7 +1147,7 @@ HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, vp->Release(); return hr; -} +} STDMETHODIMP ClassFactory::LockServer(BOOL fLock) { @@ -1115,41 +1155,4 @@ STDMETHODIMP ClassFactory::LockServer(BOOL fLock) return S_OK; } -ULONG ClassFactory::AddRef(void) -{ - m_refCount++; - return m_refCount; -} - -HRESULT ClassFactory::QueryInterface(REFIID riid, void **ppvObject) -{ - if ((riid == IID_IUnknown) || (riid == IID_IClassFactory)) - { - *ppvObject = this; - AddRef(); - return S_OK; - } - else - { - *ppvObject = NULL; - return E_POINTER; - } - -} - -ULONG ClassFactory::Release(void) -{ - m_refCount--; - if (m_refCount > 0) - { - return m_refCount; - } - else - { - delete this; - return 0; - } - -} - -#endif +#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE