]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/contrib/iewin/IEHtmlWin.cpp
added newline at end of file (avoids gcc warning when building with Xcode 2.2)
[wxWidgets.git] / wxPython / contrib / iewin / IEHtmlWin.cpp
index ae566bb1b2da2eccc1957363ea9897b799c82d56..b098197b764f802f26728c49dfb75c0d4224096f 100644 (file)
@@ -1,7 +1,9 @@
 #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)
 
 
 //////////////////////////////////////////////////////////////////////
@@ -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<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());
        };
 };
 
@@ -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<IStream>     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<IHTMLSelectionObject> GetSelObject(IOleObject *oleObject)
@@ -458,7 +524,7 @@ wxString wxIEHtmlWin::GetStringSelection(bool asHTML)
 {
        wxAutoOleInterface<IHTMLTxtRange> 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<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
@@ -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);