X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83a732882adf32f93d25cd7e3a0ad20f7231ec49..35f9639d83631e1f6c8afee75203b707ab307388:/wxPython/contrib/iewin/IEHtmlWin.cpp?ds=sidebyside diff --git a/wxPython/contrib/iewin/IEHtmlWin.cpp b/wxPython/contrib/iewin/IEHtmlWin.cpp index 776b234d35..ad35820d51 100644 --- a/wxPython/contrib/iewin/IEHtmlWin.cpp +++ b/wxPython/contrib/iewin/IEHtmlWin.cpp @@ -1,7 +1,9 @@ #include "IEHtmlWin.h" #include +#include #include #include +#include #include #include #include @@ -35,23 +37,23 @@ private: public: FS_DWebBrowserEvents2(wxIEHtmlWin *iewin) : m_iewin(iewin) {} - ~FS_DWebBrowserEvents2() + virtual ~FS_DWebBrowserEvents2() { } //IDispatch STDMETHODIMP GetIDsOfNames(REFIID r, OLECHAR** o, unsigned int i, LCID l, DISPID* d) - { + { return E_NOTIMPL; }; STDMETHODIMP GetTypeInfo(unsigned int i, LCID l, ITypeInfo** t) - { + { return E_NOTIMPL; }; STDMETHODIMP GetTypeInfoCount(unsigned int* i) - { + { return E_NOTIMPL; }; @@ -70,7 +72,7 @@ public: m_iewin->GetParent()->AddPendingEvent(event); }; - bool Process(WXTYPE etype, wxString text = "", long l1 = 0, long l2 = 0) + bool Process(WXTYPE etype, wxString text = wxEmptyString, long l1 = 0, long l2 = 0) { if (! m_iewin || ! m_iewin->GetParent()) return true; @@ -101,7 +103,7 @@ public: return v.bstrVal; } else - return ""; + return wxEmptyString; }; #define STR_ARG(arg) GetStrArg(pDispParams->rgvarg[arg]) @@ -114,7 +116,7 @@ public: WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, unsigned int * puArgErr) - { + { if (wFlags & DISPATCH_PROPERTYGET) return E_NOTIMPL; @@ -123,21 +125,21 @@ public: case DISPID_BEFORENAVIGATE2: if (Process(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2, STR_ARG(5))) *pDispParams->rgvarg->pboolVal = VARIANT_FALSE; - else + else *pDispParams->rgvarg->pboolVal = VARIANT_TRUE; break; case DISPID_NEWWINDOW2: if (Process(wxEVT_COMMAND_MSHTML_NEWWINDOW2)) *pDispParams->rgvarg->pboolVal = VARIANT_FALSE; - else + else *pDispParams->rgvarg->pboolVal = VARIANT_TRUE; break; case DISPID_PROGRESSCHANGE: - Post(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE, "", LONG_ARG(1), LONG_ARG(0)); + Post(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE, wxEmptyString, LONG_ARG(1), LONG_ARG(0)); break; - + case DISPID_DOCUMENTCOMPLETE: Post(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE, STR_ARG(0)); break; @@ -181,7 +183,7 @@ wxIEHtmlWin::wxIEHtmlWin(wxWindow * parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, - const wxString& name) : + const wxString& name) : wxActiveX(parent, PROGID, id, pos, size, style, name) { SetupBrowser(); @@ -242,7 +244,8 @@ void wxIEHtmlWin::SetCharset(wxString charset) { wxAutoOleInterface doc(IID_IHTMLDocument2, disp); if (doc.Ok()) - doc->put_charset((BSTR) wxConvUTF8.cMB2WC(charset).data()); + doc->put_charset((BSTR) (const wchar_t *) charset.wc_str(wxConvUTF8)); + //doc->put_charset((BSTR) wxConvUTF8.cMB2WC(charset).data()); }; }; @@ -284,12 +287,12 @@ private: istream *m_is; public: - - IStreamAdaptor(istream *is) : IStreamAdaptorBase(), m_is(is) + + IStreamAdaptor(istream *is) : IStreamAdaptorBase(), m_is(is) { wxASSERT(m_is != NULL); } - ~IStreamAdaptor() + ~IStreamAdaptor() { delete m_is; } @@ -305,11 +308,37 @@ public: }; }; +class IwxStreamAdaptor : public IStreamAdaptorBase +{ +private: + wxInputStream *m_is; + +public: + + IwxStreamAdaptor(wxInputStream *is) : IStreamAdaptorBase(), m_is(is) + { + wxASSERT(m_is != NULL); + } + ~IwxStreamAdaptor() + { + delete m_is; + } + + // ISequentialStream + HRESULT STDMETHODCALLTYPE Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead) + { + m_is->Read((char *) pv, cb); + if (pcbRead) + *pcbRead = m_is->LastRead(); + + return S_OK; + }; +}; void wxIEHtmlWin::LoadUrl(const wxString& url) { VARIANTARG navFlag, targetFrame, postData, headers; - navFlag.vt = VT_EMPTY; + navFlag.vt = VT_EMPTY; navFlag.vt = VT_I2; navFlag.iVal = navNoReadFromCache; targetFrame.vt = VT_EMPTY; @@ -317,24 +346,38 @@ void wxIEHtmlWin::LoadUrl(const wxString& url) headers.vt = VT_EMPTY; HRESULT hret = 0; - hret = m_webBrowser->Navigate((BSTR) wxConvUTF8.cMB2WC(url).data(), - &navFlag, &targetFrame, &postData, &headers); + hret = m_webBrowser->Navigate((BSTR) (const wchar_t *) url.wc_str(wxConvUTF8), + &navFlag, &targetFrame, &postData, &headers); }; +class wxOwnedMemInputStream : public wxMemoryInputStream +{ +public: + char *m_data; + + wxOwnedMemInputStream(char *data, size_t len) : + wxMemoryInputStream(data, len), m_data(data) + {} + ~wxOwnedMemInputStream() + { + free(m_data); + } +}; bool wxIEHtmlWin::LoadString(wxString html) { - string s = html.c_str(); - istringstream *is = new istringstream(s); - return LoadStream(is); + char *data = NULL; + size_t len = html.length(); +#ifdef UNICODE + len *= 2; +#endif + data = (char *) malloc(len); + memcpy(data, html.c_str(), len); + return LoadStream(new wxOwnedMemInputStream(data, len)); }; -bool wxIEHtmlWin::LoadStream(istream *is) +bool wxIEHtmlWin::LoadStream(IStreamAdaptorBase *pstrm) { - // wrap reference around stream - IStreamAdaptor *pstrm = new IStreamAdaptor(is); - pstrm->AddRef(); - wxAutoOleInterface strm(pstrm); // Document Interface @@ -361,6 +404,25 @@ bool wxIEHtmlWin::LoadStream(istream *is) return false; }; +bool wxIEHtmlWin::LoadStream(istream *is) +{ + // wrap reference around stream + IStreamAdaptor *pstrm = new IStreamAdaptor(is); + pstrm->AddRef(); + + return LoadStream(pstrm); +}; + +bool wxIEHtmlWin::LoadStream(wxInputStream *is) +{ + // wrap reference around stream + IwxStreamAdaptor *pstrm = new IwxStreamAdaptor(is); + pstrm->AddRef(); + + return LoadStream(pstrm); +}; + + bool wxIEHtmlWin::GoBack() { HRESULT hret = 0; @@ -462,17 +524,17 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML) { wxAutoOleInterface tr(GetSelRange(m_oleObject)); if (! tr) - return ""; + return wxEmptyString; BSTR text = NULL; HRESULT hr = E_FAIL; - + if (asHTML) hr = tr->get_htmlText(&text); else hr = tr->get_text(&text); if (hr != S_OK) - return ""; + return wxEmptyString; wxString s = text; SysFreeString(text); @@ -483,41 +545,41 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML) wxString wxIEHtmlWin::GetText(bool asHTML) { if (! m_webBrowser.Ok()) - return ""; + return wxEmptyString; // get document dispatch interface IDispatch *iDisp = NULL; HRESULT hr = m_webBrowser->get_Document(&iDisp); if (hr != S_OK) - return ""; + return wxEmptyString; // Query for Document Interface wxAutoOleInterface hd(IID_IHTMLDocument2, iDisp); iDisp->Release(); if (! hd.Ok()) - return ""; + return wxEmptyString; // get body element IHTMLElement *_body = NULL; hd->get_body(&_body); if (! _body) - return ""; + return wxEmptyString; wxAutoOleInterface body(_body); // get inner text BSTR text = NULL; hr = E_FAIL; - + if (asHTML) hr = body->get_innerHTML(&text); else hr = body->get_innerText(&text); if (hr != S_OK) - return ""; + return wxEmptyString; wxString s = text; SysFreeString(text); - return s; -}; \ No newline at end of file + return s; +};