X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c731eb47101d4656e5b736ce8e377830911bbe1d..59d04dff037f66e9e73b389de72835211f5f0bcd:/wxPython/contrib/iewin/IEHtmlWin.cpp diff --git a/wxPython/contrib/iewin/IEHtmlWin.cpp b/wxPython/contrib/iewin/IEHtmlWin.cpp index ac4131569f..6214694d96 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; }; @@ -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)); break; - + case DISPID_DOCUMENTCOMPLETE: Post(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE, STR_ARG(0)); break; @@ -169,20 +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" - - -wxIEHtmlWin::wxIEHtmlWin(wxWindow * parent, wxWindowID id) - : wxActiveX(parent, PROGID, id) +//#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) { SetupBrowser(); } + wxIEHtmlWin::~wxIEHtmlWin() { } @@ -237,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()); }; }; @@ -279,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; } @@ -300,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; @@ -312,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 refernce around stream - IStreamAdaptor *pstrm = new IStreamAdaptor(is); - pstrm->AddRef(); - wxAutoOleInterface strm(pstrm); // Document Interface @@ -349,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; @@ -400,6 +469,7 @@ bool wxIEHtmlWin::Stop() return hret == S_OK; } + /////////////////////////////////////////////////////////////////////////////// static wxAutoOleInterface GetSelObject(IOleObject *oleObject) @@ -458,7 +528,7 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML) BSTR text = NULL; HRESULT hr = E_FAIL; - + if (asHTML) hr = tr->get_htmlText(&text); else @@ -500,7 +570,7 @@ wxString wxIEHtmlWin::GetText(bool asHTML) // get inner text BSTR text = NULL; hr = E_FAIL; - + if (asHTML) hr = body->get_innerHTML(&text); else @@ -511,5 +581,5 @@ wxString wxIEHtmlWin::GetText(bool asHTML) wxString s = text; SysFreeString(text); - return s; -}; + return s; +}; \ No newline at end of file