X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/811712d820a6c3461b8cd4a1f5322d4d1a76f0da..0613b80c171f77425226621886e9160f6767ad30:/wxPython/contrib/iewin/IEHtmlWin.cpp diff --git a/wxPython/contrib/iewin/IEHtmlWin.cpp b/wxPython/contrib/iewin/IEHtmlWin.cpp index 60640ab2cd..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,7 +37,7 @@ private: public: FS_DWebBrowserEvents2(wxIEHtmlWin *iewin) : m_iewin(iewin) {} - ~FS_DWebBrowserEvents2() + virtual ~FS_DWebBrowserEvents2() { } @@ -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]) @@ -135,7 +137,7 @@ public: 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: @@ -242,7 +244,8 @@ void wxIEHtmlWin::SetCharset(wxString charset) { wxAutoOleInterface doc(IID_IHTMLDocument2, disp); if (doc.Ok()) - doc->put_charset((BSTR) (const wchar_t*)charset.wc_str(wxConvUTF8)); + doc->put_charset((BSTR) (const wchar_t *) charset.wc_str(wxConvUTF8)); + //doc->put_charset((BSTR) wxConvUTF8.cMB2WC(charset).data()); }; }; @@ -305,6 +308,32 @@ 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) { @@ -317,24 +346,38 @@ void wxIEHtmlWin::LoadUrl(const wxString& url) headers.vt = VT_EMPTY; HRESULT hret = 0; - hret = m_webBrowser->Navigate((BSTR) (const wchar_t*)url.wc_str(wxConvUTF8), + 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.mb_str(wxConvUTF8); - 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,7 +524,7 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML) { wxAutoOleInterface tr(GetSelRange(m_oleObject)); if (! tr) - return ""; + return wxEmptyString; BSTR text = NULL; HRESULT hr = E_FAIL; @@ -472,7 +534,7 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML) else hr = tr->get_text(&text); if (hr != S_OK) - return ""; + return wxEmptyString; wxString s = text; SysFreeString(text); @@ -483,26 +545,26 @@ 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 @@ -514,7 +576,7 @@ wxString wxIEHtmlWin::GetText(bool asHTML) else hr = body->get_innerText(&text); if (hr != S_OK) - return ""; + return wxEmptyString; wxString s = text; SysFreeString(text);