X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7abf01706714b3eb7777555ce4d1db00d641e40..0613b80c171f77425226621886e9160f6767ad30:/wxPython/contrib/iewin/IEHtmlWin.cpp?ds=sidebyside diff --git a/wxPython/contrib/iewin/IEHtmlWin.cpp b/wxPython/contrib/iewin/IEHtmlWin.cpp index ae566bb1b2..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: @@ -169,24 +171,25 @@ static const CLSID CLSID_MozillaBrowser = 0x00, 0x00, 0x00, 0x00 } }; -//#define PROGID L"Shell.Explorer" +//#define PROGID "Shell.Explorer" #define PROGID CLSID_WebBrowser +//#define PROGID CLSID_MozillaBrowser //#define PROGID CLSID_HTMLDocument -//#define PROGID L"MSCAL.Calendar" -//#define PROGID L"WordPad.Document.1" -//#define PROGID L"SoftwareFX.ChartFX.20" - +//#define PROGID "MSCAL.Calendar" +//#define PROGID "WordPad.Document.1" +//#define PROGID "SoftwareFX.ChartFX.20" wxIEHtmlWin::wxIEHtmlWin(wxWindow * parent, wxWindowID id, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name) - : wxActiveX(parent, PROGID, id, pos, size, style, name) + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) : + wxActiveX(parent, PROGID, id, pos, size, style, name) { SetupBrowser(); } + wxIEHtmlWin::~wxIEHtmlWin() { } @@ -241,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()); }; }; @@ -304,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) { @@ -316,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(), + 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 refernce around stream - IStreamAdaptor *pstrm = new IStreamAdaptor(is); - pstrm->AddRef(); - wxAutoOleInterface strm(pstrm); // Document Interface @@ -353,11 +397,32 @@ bool wxIEHtmlWin::LoadStream(istream *is) HRESULT hr = pPersistStreamInit->InitNew(); if (SUCCEEDED(hr)) hr = pPersistStreamInit->Load(strm); - }; - return true; + return SUCCEEDED(hr); + } + else + 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; @@ -404,6 +469,7 @@ bool wxIEHtmlWin::Stop() return hret == S_OK; } + /////////////////////////////////////////////////////////////////////////////// static wxAutoOleInterface GetSelObject(IOleObject *oleObject) @@ -458,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; @@ -468,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); @@ -479,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 @@ -510,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);