#include "IEHtmlWin.h"
#include <wx/strconv.h>
+#include <wx/string.h>
#include <wx/event.h>
#include <wx/listctrl.h>
+#include <wx/mstream.h>
#include <oleidl.h>
#include <winerror.h>
#include <exdispid.h>
#include <sstream>
using namespace std;
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2);
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_NEWWINDOW2);
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE);
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE);
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE);
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_TITLECHANGE);
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_BEFORENAVIGATE2)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_NEWWINDOW2)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_DOCUMENTCOMPLETE)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_PROGRESSCHANGE)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_STATUSTEXTCHANGE)
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_MSHTML_TITLECHANGE)
-IMPLEMENT_DYNAMIC_CLASS(wxMSHTMLEvent, wxNotifyEvent);
+IMPLEMENT_DYNAMIC_CLASS(wxMSHTMLEvent, wxNotifyEvent)
//////////////////////////////////////////////////////////////////////
public:
FS_DWebBrowserEvents2(wxIEHtmlWin *iewin) : m_iewin(iewin) {}
- ~FS_DWebBrowserEvents2()
+ virtual ~FS_DWebBrowserEvents2()
{
}
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;
return v.bstrVal;
}
else
- return "";
+ return wxEmptyString;
};
#define STR_ARG(arg) GetStrArg(pDispParams->rgvarg[arg])
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:
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()
{
}
{
wxAutoOleInterface<IHTMLDocument2> 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());
};
};
};
};
+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)
{
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<IStream> strm(pstrm);
// Document Interface
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;
return hret == S_OK;
}
+
///////////////////////////////////////////////////////////////////////////////
static wxAutoOleInterface<IHTMLSelectionObject> GetSelObject(IOleObject *oleObject)
{
wxAutoOleInterface<IHTMLTxtRange> tr(GetSelRange(m_oleObject));
if (! tr)
- return "";
+ return wxEmptyString;
BSTR text = NULL;
HRESULT hr = E_FAIL;
else
hr = tr->get_text(&text);
if (hr != S_OK)
- return "";
+ return wxEmptyString;
wxString s = text;
SysFreeString(text);
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<IHTMLDocument2> 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<IHTMLElement> body(_body);
// get inner text
else
hr = body->get_innerText(&text);
if (hr != S_OK)
- return "";
+ return wxEmptyString;
wxString s = text;
SysFreeString(text);