]> git.saurik.com Git - wxWidgets.git/blame - src/msw/webview_ie.cpp
Vietnamese translations update from Trần Ngọc Quân.
[wxWidgets.git] / src / msw / webview_ie.cpp
CommitLineData
61b98a2d 1/////////////////////////////////////////////////////////////////////////////
8290e3cd 2// Name: src/msw/webview_ie.cpp
61b98a2d
SL
3// Purpose: wxMSW wxWebViewIE class implementation for web view component
4// Author: Marianne Gagnon
5// Id: $Id$
153530af 6// Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton
61b98a2d
SL
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
384b8d9f
SL
10// For compilers that support precompilation, includes "wx.h".
11#include "wx/wxprec.h"
12
13#if defined(__BORLANDC__)
14 #pragma hdrstop
15#endif
16
8290e3cd 17#include "wx/msw/webview_ie.h"
61b98a2d 18
9d2f31db 19#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE
61b98a2d
SL
20
21#include <olectl.h>
22#include <oleidl.h>
23#include <exdispid.h>
24#include <exdisp.h>
25#include <mshtml.h>
cd4e4673 26#include "wx/msw/registry.h"
1d7d04d7 27#include "wx/msw/missing.h"
7d3f6b4d 28#include "wx/filesys.h"
e924e848 29#include "wx/dynlib.h"
f559d1a2
VZ
30#include <initguid.h>
31
32/* These GUID definitions are our own implementation to support interfaces
33 * normally in urlmon.h. See include/wx/msw/webview_ie.h
34 */
35
36namespace {
37
38DEFINE_GUID(wxIID_IInternetProtocolRoot,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
39DEFINE_GUID(wxIID_IInternetProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
accc94d5 40DEFINE_GUID(wxIID_IDocHostUIHandler, 0xbd3f23c0, 0xd43e, 0x11cf, 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a);
f559d1a2
VZ
41
42}
7d3f6b4d 43
cddf4541
SL
44wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView);
45
61b98a2d 46BEGIN_EVENT_TABLE(wxWebViewIE, wxControl)
97ad1425
SL
47 EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent)
48 EVT_ERASE_BACKGROUND(wxWebViewIE::onEraseBg)
61b98a2d
SL
49END_EVENT_TABLE()
50
51bool wxWebViewIE::Create(wxWindow* parent,
52 wxWindowID id,
53 const wxString& url,
54 const wxPoint& pos,
55 const wxSize& size,
56 long style,
57 const wxString& name)
58{
59 if (!wxControl::Create(parent, id, pos, size, style,
60 wxDefaultValidator, name))
61 {
62 return false;
63 }
64
65 m_webBrowser = NULL;
61b98a2d 66 m_isBusy = false;
74af0b13
SL
67 m_historyLoadingFromList = false;
68 m_historyEnabled = true;
69 m_historyPosition = -1;
c5f417cb 70 m_zoomType = wxWEB_VIEW_ZOOM_TYPE_TEXT;
61b98a2d
SL
71
72 if (::CoCreateInstance(CLSID_WebBrowser, NULL,
73 CLSCTX_INPROC_SERVER, // CLSCTX_INPROC,
74 IID_IWebBrowser2 , (void**)&m_webBrowser) != 0)
75 {
76 wxLogError("Failed to initialize IE, CoCreateInstance returned an error");
77 return false;
78 }
79
80 m_ie.SetDispatchPtr(m_webBrowser); // wxAutomationObject will release itself
81
82 m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
83 m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
61b98a2d 84
accc94d5
SL
85 m_uiHandler = new DocHostUIHandler;
86 m_uiHandler->AddRef();
87
88 m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler);
61b98a2d 89
9447a0d6
SL
90 EnableControlFeature(21 /* FEATURE_DISABLE_NAVIGATION_SOUNDS */);
91
4d0dddc7 92 LoadURL(url);
61b98a2d
SL
93 return true;
94}
95
39498710
SL
96wxWebViewIE::~wxWebViewIE()
97{
98 for(unsigned int i = 0; i < m_factories.size(); i++)
99 {
100 m_factories[i]->Release();
101 }
accc94d5
SL
102
103 m_uiHandler->Release();
39498710 104}
61b98a2d 105
4d0dddc7 106void wxWebViewIE::LoadURL(const wxString& url)
61b98a2d 107{
e8d243a9 108 m_ie.CallMethod("Navigate", wxConvertStringToOle(url));
61b98a2d
SL
109}
110
442262d4 111void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
61b98a2d 112{
7f98bdd6 113 BSTR bstr = SysAllocString(OLESTR(""));
61b98a2d
SL
114 SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
115 if (psaStrings != NULL)
116 {
117 VARIANT *param;
118 HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
119 param->vt = VT_BSTR;
120 param->bstrVal = bstr;
442262d4 121
7f98bdd6 122 hr = SafeArrayUnaccessData(psaStrings);
accc94d5 123
617227c3 124 IHTMLDocument2* document = GetDocument();
e81ef297
SL
125
126 if(!document)
127 return;
128
61b98a2d 129 document->write(psaStrings);
7f98bdd6 130 document->close();
442262d4 131 document->Release();
61b98a2d 132
61b98a2d 133 SafeArrayDestroy(psaStrings);
442262d4 134
7f98bdd6
SL
135 bstr = SysAllocString(html.wc_str());
136
137 // Creates a new one-dimensional array
138 psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
139 if (psaStrings != NULL)
140 {
141 hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
142 param->vt = VT_BSTR;
143 param->bstrVal = bstr;
144 hr = SafeArrayUnaccessData(psaStrings);
145
146 document = GetDocument();
e81ef297
SL
147
148 if(!document)
149 return;
150
7f98bdd6
SL
151 document->write(psaStrings);
152 document->Release();
153
154 // SafeArrayDestroy calls SysFreeString for each BSTR
155 SafeArrayDestroy(psaStrings);
156
157 //We send the events when we are done to mimic webkit
158 //Navigated event
159 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
160 GetId(), baseUrl, "");
161 event.SetEventObject(this);
162 HandleWindowEvent(event);
163
164 //Document complete event
165 event.SetEventType(wxEVT_COMMAND_WEB_VIEW_LOADED);
166 event.SetEventObject(this);
167 HandleWindowEvent(event);
168 }
169 else
170 {
171 wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
172 }
61b98a2d
SL
173 }
174 else
175 {
7f98bdd6 176 wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL during clear");
61b98a2d 177 }
61b98a2d
SL
178}
179
e669ddde 180wxString wxWebViewIE::GetPageSource() const
61b98a2d 181{
617227c3 182 IHTMLDocument2* document = GetDocument();
e81ef297
SL
183
184 if(document)
7fbc727b 185 {
e81ef297
SL
186 IHTMLElement *bodyTag = NULL;
187 IHTMLElement *htmlTag = NULL;
188 wxString source;
189 HRESULT hr = document->get_body(&bodyTag);
7fbc727b
SL
190 if(SUCCEEDED(hr))
191 {
e81ef297
SL
192 hr = bodyTag->get_parentElement(&htmlTag);
193 if(SUCCEEDED(hr))
194 {
195 BSTR bstr;
196 htmlTag->get_outerHTML(&bstr);
197 source = wxString(bstr);
198 htmlTag->Release();
199 }
200 bodyTag->Release();
7fbc727b 201 }
61b98a2d 202
e81ef297
SL
203 document->Release();
204 return source;
205 }
206 else
207 {
208 return "";
209 }
61b98a2d
SL
210}
211
e669ddde 212wxWebViewZoom wxWebViewIE::GetZoom() const
61b98a2d 213{
8acbf08b
SL
214 switch( m_zoomType )
215 {
216 case wxWEB_VIEW_ZOOM_TYPE_LAYOUT:
217 return GetIEOpticalZoom();
218 case wxWEB_VIEW_ZOOM_TYPE_TEXT:
219 return GetIETextZoom();
220 default:
221 wxFAIL;
222 }
423adfde
SL
223
224 //Dummy return to stop compiler warnings
225 return wxWEB_VIEW_ZOOM_MEDIUM;
1d7d04d7 226
61b98a2d 227}
c5f417cb 228
61b98a2d
SL
229void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
230{
8acbf08b
SL
231 switch( m_zoomType )
232 {
233 case wxWEB_VIEW_ZOOM_TYPE_LAYOUT:
234 SetIEOpticalZoom(zoom);
235 break;
236 case wxWEB_VIEW_ZOOM_TYPE_TEXT:
237 SetIETextZoom(zoom);
238 break;
239 default:
240 wxFAIL;
241 }
61b98a2d
SL
242}
243
c5f417cb 244void wxWebViewIE::SetIETextZoom(wxWebViewZoom level)
61b98a2d 245{
1d7d04d7 246 //We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
c5f417cb
SL
247 //is 0 to 4 so the check is unnecessary, these match exactly with the
248 //enum values
61b98a2d
SL
249 VARIANT zoomVariant;
250 VariantInit (&zoomVariant);
251 V_VT(&zoomVariant) = VT_I4;
252 V_I4(&zoomVariant) = level;
253
8acbf08b
SL
254#if wxDEBUG_LEVEL
255 HRESULT result =
256#endif
257 m_webBrowser->ExecWB(OLECMDID_ZOOM,
258 OLECMDEXECOPT_DONTPROMPTUSER,
259 &zoomVariant, NULL);
c5f417cb 260 wxASSERT(result == S_OK);
61b98a2d
SL
261}
262
e669ddde 263wxWebViewZoom wxWebViewIE::GetIETextZoom() const
61b98a2d
SL
264{
265 VARIANT zoomVariant;
266 VariantInit (&zoomVariant);
267 V_VT(&zoomVariant) = VT_I4;
61b98a2d 268
8acbf08b
SL
269#if wxDEBUG_LEVEL
270 HRESULT result =
271#endif
272 m_webBrowser->ExecWB(OLECMDID_ZOOM,
273 OLECMDEXECOPT_DONTPROMPTUSER,
274 NULL, &zoomVariant);
c5f417cb 275 wxASSERT(result == S_OK);
61b98a2d 276
c5f417cb
SL
277 //We can safely cast here as we know that the range matches our enum
278 return static_cast<wxWebViewZoom>(V_I4(&zoomVariant));
61b98a2d
SL
279}
280
c5f417cb 281void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level)
61b98a2d 282{
1d7d04d7 283 //We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
c5f417cb 284 //is 10 to 1000 so the check is unnecessary
61b98a2d
SL
285 VARIANT zoomVariant;
286 VariantInit (&zoomVariant);
287 V_VT(&zoomVariant) = VT_I4;
c5f417cb
SL
288
289 //We make a somewhat arbitray map here, taken from values used by webkit
290 switch(level)
291 {
292 case wxWEB_VIEW_ZOOM_TINY:
293 V_I4(&zoomVariant) = 60;
294 break;
295 case wxWEB_VIEW_ZOOM_SMALL:
296 V_I4(&zoomVariant) = 80;
297 break;
298 case wxWEB_VIEW_ZOOM_MEDIUM:
299 V_I4(&zoomVariant) = 100;
300 break;
301 case wxWEB_VIEW_ZOOM_LARGE:
302 V_I4(&zoomVariant) = 130;
303 break;
304 case wxWEB_VIEW_ZOOM_LARGEST:
305 V_I4(&zoomVariant) = 160;
306 break;
307 default:
308 wxFAIL;
309 }
61b98a2d 310
8acbf08b
SL
311#if wxDEBUG_LEVEL
312 HRESULT result =
313#endif
314 m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
315 OLECMDEXECOPT_DODEFAULT,
316 &zoomVariant,
317 NULL);
c5f417cb 318 wxASSERT(result == S_OK);
61b98a2d
SL
319}
320
e669ddde 321wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const
61b98a2d 322{
61b98a2d
SL
323 VARIANT zoomVariant;
324 VariantInit (&zoomVariant);
325 V_VT(&zoomVariant) = VT_I4;
61b98a2d 326
8acbf08b
SL
327#if wxDEBUG_LEVEL
328 HRESULT result =
329#endif
330 m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
331 OLECMDEXECOPT_DODEFAULT, NULL,
332 &zoomVariant);
c5f417cb 333 wxASSERT(result == S_OK);
61b98a2d
SL
334
335 const int zoom = V_I4(&zoomVariant);
61b98a2d 336
c5f417cb
SL
337 //We make a somewhat arbitray map here, taken from values used by webkit
338 if (zoom <= 65)
339 {
340 return wxWEB_VIEW_ZOOM_TINY;
341 }
342 else if (zoom > 65 && zoom <= 90)
343 {
344 return wxWEB_VIEW_ZOOM_SMALL;
345 }
346 else if (zoom > 90 && zoom <= 115)
347 {
348 return wxWEB_VIEW_ZOOM_MEDIUM;
349 }
350 else if (zoom > 115 && zoom <= 145)
351 {
352 return wxWEB_VIEW_ZOOM_LARGE;
353 }
423adfde 354 else /*if (zoom > 145) */ //Using else removes a compiler warning
c5f417cb
SL
355 {
356 return wxWEB_VIEW_ZOOM_LARGEST;
357 }
61b98a2d
SL
358}
359
c5f417cb 360void wxWebViewIE::SetZoomType(wxWebViewZoomType type)
61b98a2d 361{
c5f417cb 362 m_zoomType = type;
61b98a2d
SL
363}
364
365wxWebViewZoomType wxWebViewIE::GetZoomType() const
366{
c5f417cb 367 return m_zoomType;
61b98a2d
SL
368}
369
cd4e4673 370bool wxWebViewIE::CanSetZoomType(wxWebViewZoomType type) const
61b98a2d 371{
cd4e4673
SL
372 //IE 6 and below only support text zoom, so check the registry to see what
373 //version we actually have
374 wxRegKey key(wxRegKey::HKLM, "Software\\Microsoft\\Internet Explorer");
375 wxString value;
376 key.QueryValue("Version", value);
377
378 long version = wxAtoi(value.Left(1));
379 if(version <= 6 && type == wxWEB_VIEW_ZOOM_TYPE_LAYOUT)
380 return false;
381 else
382 return true;
61b98a2d
SL
383}
384
385void wxWebViewIE::Print()
386{
387 m_webBrowser->ExecWB(OLECMDID_PRINTPREVIEW,
388 OLECMDEXECOPT_DODEFAULT, NULL, NULL);
389}
390
e669ddde 391bool wxWebViewIE::CanGoBack() const
61b98a2d 392{
74af0b13
SL
393 if(m_historyEnabled)
394 return m_historyPosition > 0;
395 else
396 return false;
397}
61b98a2d 398
e669ddde 399bool wxWebViewIE::CanGoForward() const
74af0b13
SL
400{
401 if(m_historyEnabled)
22ca10fa 402 return m_historyPosition != static_cast<int>(m_historyList.size()) - 1;
74af0b13
SL
403 else
404 return false;
61b98a2d
SL
405}
406
c13d6ac1 407void wxWebViewIE::LoadHistoryItem(wxSharedPtr<wxWebViewHistoryItem> item)
61b98a2d 408{
74af0b13
SL
409 int pos = -1;
410 for(unsigned int i = 0; i < m_historyList.size(); i++)
411 {
3e7968c2
SL
412 //We compare the actual pointers to find the correct item
413 if(m_historyList[i].get() == item.get())
74af0b13
SL
414 pos = i;
415 }
1d7d04d7 416 wxASSERT_MSG(pos != static_cast<int>(m_historyList.size()),
22ca10fa 417 "invalid history item");
74af0b13 418 m_historyLoadingFromList = true;
4d0dddc7 419 LoadURL(item->GetUrl());
74af0b13
SL
420 m_historyPosition = pos;
421}
61b98a2d 422
c13d6ac1 423wxVector<wxSharedPtr<wxWebViewHistoryItem> > wxWebViewIE::GetBackwardHistory()
5cbda74b 424{
c13d6ac1 425 wxVector<wxSharedPtr<wxWebViewHistoryItem> > backhist;
5cbda74b
SL
426 //As we don't have std::copy or an iterator constructor in the wxwidgets
427 //native vector we construct it by hand
428 for(int i = 0; i < m_historyPosition; i++)
429 {
430 backhist.push_back(m_historyList[i]);
431 }
432 return backhist;
433}
434
c13d6ac1 435wxVector<wxSharedPtr<wxWebViewHistoryItem> > wxWebViewIE::GetForwardHistory()
5cbda74b 436{
c13d6ac1 437 wxVector<wxSharedPtr<wxWebViewHistoryItem> > forwardhist;
5cbda74b
SL
438 //As we don't have std::copy or an iterator constructor in the wxwidgets
439 //native vector we construct it by hand
22ca10fa 440 for(int i = m_historyPosition + 1; i < static_cast<int>(m_historyList.size()); i++)
5cbda74b
SL
441 {
442 forwardhist.push_back(m_historyList[i]);
443 }
444 return forwardhist;
445}
446
74af0b13
SL
447void wxWebViewIE::GoBack()
448{
3e7968c2 449 LoadHistoryItem(m_historyList[m_historyPosition - 1]);
74af0b13
SL
450}
451
452void wxWebViewIE::GoForward()
453{
3e7968c2 454 LoadHistoryItem(m_historyList[m_historyPosition + 1]);
61b98a2d
SL
455}
456
457void wxWebViewIE::Stop()
458{
7fbc727b 459 m_ie.CallMethod("Stop");
61b98a2d
SL
460}
461
74af0b13
SL
462void wxWebViewIE::ClearHistory()
463{
464 m_historyList.clear();
465 m_historyPosition = -1;
466}
467
468void wxWebViewIE::EnableHistory(bool enable)
469{
470 m_historyEnabled = enable;
471 m_historyList.clear();
472 m_historyPosition = -1;
473}
61b98a2d
SL
474
475void wxWebViewIE::Reload(wxWebViewReloadFlags flags)
476{
7aa18fc7
SL
477 VARIANTARG level;
478 VariantInit(&level);
479 V_VT(&level) = VT_I2;
61b98a2d 480
7aa18fc7 481 switch(flags)
61b98a2d 482 {
7aa18fc7
SL
483 case wxWEB_VIEW_RELOAD_DEFAULT:
484 V_I2(&level) = REFRESH_NORMAL;
485 break;
486 case wxWEB_VIEW_RELOAD_NO_CACHE:
487 V_I2(&level) = REFRESH_COMPLETELY;
488 break;
489 default:
490 wxFAIL_MSG("Unexpected reload type");
61b98a2d
SL
491 }
492
7aa18fc7 493 m_webBrowser->Refresh2(&level);
61b98a2d
SL
494}
495
496bool wxWebViewIE::IsOfflineMode()
497{
498 wxVariant out = m_ie.GetProperty("Offline");
499
500 wxASSERT(out.GetType() == "bool");
501
502 return out.GetBool();
503}
504
505void wxWebViewIE::SetOfflineMode(bool offline)
506{
507 // FIXME: the wxWidgets docs do not really document what the return
508 // parameter of PutProperty is
8acbf08b
SL
509#if wxDEBUG_LEVEL
510 const bool success =
511#endif
512 m_ie.PutProperty("Offline", (offline ?
513 VARIANT_TRUE :
514 VARIANT_FALSE));
61b98a2d
SL
515 wxASSERT(success);
516}
517
e669ddde 518bool wxWebViewIE::IsBusy() const
60eabdbe 519{
61b98a2d
SL
520 if (m_isBusy) return true;
521
522 wxVariant out = m_ie.GetProperty("Busy");
523
524 wxASSERT(out.GetType() == "bool");
525
526 return out.GetBool();
527}
528
e669ddde 529wxString wxWebViewIE::GetCurrentURL() const
61b98a2d
SL
530{
531 wxVariant out = m_ie.GetProperty("LocationURL");
532
533 wxASSERT(out.GetType() == "string");
534 return out.GetString();
535}
536
e669ddde 537wxString wxWebViewIE::GetCurrentTitle() const
61b98a2d 538{
617227c3 539 IHTMLDocument2* document = GetDocument();
7fbc727b 540
e81ef297
SL
541 if(document)
542 {
543 BSTR title;
544 document->get_nameProp(&title);
545 document->Release();
546 return wxString(title);
547 }
548 else
549 {
550 return "";
551 }
61b98a2d
SL
552}
553
e669ddde 554bool wxWebViewIE::CanCut() const
4681a3ea
SL
555{
556 return CanExecCommand("Cut");
557}
558
e669ddde 559bool wxWebViewIE::CanCopy() const
4681a3ea
SL
560{
561 return CanExecCommand("Copy");
562}
34326da7 563
e669ddde 564bool wxWebViewIE::CanPaste() const
4681a3ea
SL
565{
566 return CanExecCommand("Paste");
567}
568
569void wxWebViewIE::Cut()
570{
571 ExecCommand("Cut");
572}
573
574void wxWebViewIE::Copy()
575{
576 ExecCommand("Copy");
577}
578
579void wxWebViewIE::Paste()
580{
581 ExecCommand("Paste");
582}
583
e669ddde 584bool wxWebViewIE::CanUndo() const
97e49559
SL
585{
586 return CanExecCommand("Undo");
587}
34326da7 588
e669ddde 589bool wxWebViewIE::CanRedo() const
97e49559
SL
590{
591 return CanExecCommand("Redo");
592}
593
594void wxWebViewIE::Undo()
595{
596 ExecCommand("Undo");
597}
598
599void wxWebViewIE::Redo()
600{
601 ExecCommand("Redo");
602}
603
c7cbe308
SL
604void wxWebViewIE::SetEditable(bool enable)
605{
606 IHTMLDocument2* document = GetDocument();
7fbc727b 607
e81ef297
SL
608 if(document)
609 {
610 if( enable )
611 document->put_designMode(SysAllocString(L"On"));
612 else
613 document->put_designMode(SysAllocString(L"Off"));
614
615 document->Release();
616 }
c7cbe308
SL
617}
618
e669ddde 619bool wxWebViewIE::IsEditable() const
c7cbe308
SL
620{
621 IHTMLDocument2* document = GetDocument();
e81ef297
SL
622
623 if(document)
624 {
625 BSTR mode;
626 document->get_designMode(&mode);
627 document->Release();
628 if(wxString(mode) == "On")
629 return true;
630 else
631 return false;
632 }
c7cbe308 633 else
e81ef297 634 {
c7cbe308 635 return false;
e81ef297 636 }
c7cbe308
SL
637}
638
63a65070
SL
639void wxWebViewIE::SelectAll()
640{
641 ExecCommand("SelectAll");
642}
643
e669ddde 644bool wxWebViewIE::HasSelection() const
63a65070
SL
645{
646 IHTMLDocument2* document = GetDocument();
e81ef297
SL
647
648 if(document)
7fbc727b 649 {
e81ef297
SL
650 IHTMLSelectionObject* selection;
651 wxString sel;
652 HRESULT hr = document->get_selection(&selection);
653 if(SUCCEEDED(hr))
654 {
655 BSTR type;
656 selection->get_type(&type);
657 sel = wxString(type);
658 selection->Release();
659 }
660 document->Release();
661 return sel != "None";
662 }
663 else
664 {
665 return false;
7fbc727b 666 }
63a65070
SL
667}
668
669void wxWebViewIE::DeleteSelection()
670{
671 ExecCommand("Delete");
672}
673
e669ddde 674wxString wxWebViewIE::GetSelectedText() const
c9355a3d
SL
675{
676 IHTMLDocument2* document = GetDocument();
e81ef297
SL
677
678 if(document)
c9355a3d 679 {
e81ef297
SL
680 IHTMLSelectionObject* selection;
681 wxString selected;
682 HRESULT hr = document->get_selection(&selection);
c9355a3d
SL
683 if(SUCCEEDED(hr))
684 {
e81ef297
SL
685 IDispatch* disrange;
686 hr = selection->createRange(&disrange);
c9355a3d
SL
687 if(SUCCEEDED(hr))
688 {
e81ef297
SL
689 IHTMLTxtRange* range;
690 hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
691 if(SUCCEEDED(hr))
692 {
693 BSTR text;
694 range->get_text(&text);
695 selected = wxString(text);
696 range->Release();
697 }
698 disrange->Release();
c9355a3d 699 }
e81ef297 700 selection->Release();
c9355a3d 701 }
e81ef297
SL
702 document->Release();
703 return selected;
704 }
705 else
706 {
707 return "";
c9355a3d 708 }
c9355a3d
SL
709}
710
e669ddde 711wxString wxWebViewIE::GetSelectedSource() const
0fe8a1b6
SL
712{
713 IHTMLDocument2* document = GetDocument();
e81ef297
SL
714
715 if(document)
0fe8a1b6 716 {
e81ef297
SL
717 IHTMLSelectionObject* selection;
718 wxString selected;
719 HRESULT hr = document->get_selection(&selection);
0fe8a1b6
SL
720 if(SUCCEEDED(hr))
721 {
e81ef297
SL
722 IDispatch* disrange;
723 hr = selection->createRange(&disrange);
0fe8a1b6
SL
724 if(SUCCEEDED(hr))
725 {
e81ef297
SL
726 IHTMLTxtRange* range;
727 hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
728 if(SUCCEEDED(hr))
729 {
730 BSTR text;
731 range->get_htmlText(&text);
732 selected = wxString(text);
733 range->Release();
734 }
735 disrange->Release();
0fe8a1b6 736 }
e81ef297 737 selection->Release();
0fe8a1b6 738 }
e81ef297
SL
739 document->Release();
740 return selected;
741 }
742 else
743 {
744 return "";
0fe8a1b6 745 }
0fe8a1b6
SL
746}
747
41933aa5
SL
748void wxWebViewIE::ClearSelection()
749{
750 IHTMLDocument2* document = GetDocument();
e81ef297
SL
751
752 if(document)
41933aa5 753 {
e81ef297
SL
754 IHTMLSelectionObject* selection;
755 wxString selected;
756 HRESULT hr = document->get_selection(&selection);
757 if(SUCCEEDED(hr))
758 {
759 selection->empty();
760 selection->Release();
761 }
762 document->Release();
41933aa5 763 }
41933aa5
SL
764}
765
e669ddde 766wxString wxWebViewIE::GetPageText() const
241b769f
SL
767{
768 IHTMLDocument2* document = GetDocument();
e81ef297
SL
769
770 if(document)
241b769f 771 {
e81ef297
SL
772 wxString text;
773 IHTMLElement* body;
774 HRESULT hr = document->get_body(&body);
775 if(SUCCEEDED(hr))
776 {
777 BSTR out;
778 body->get_innerText(&out);
779 text = wxString(out);
780 body->Release();
781 }
782 document->Release();
783 return text;
784 }
785 else
786 {
787 return "";
241b769f 788 }
241b769f
SL
789}
790
c9ccc09c
SL
791void wxWebViewIE::RunScript(const wxString& javascript)
792{
793 IHTMLDocument2* document = GetDocument();
e81ef297
SL
794
795 if(document)
c9ccc09c 796 {
e81ef297
SL
797 IHTMLWindow2* window;
798 wxString language = "javascript";
799 HRESULT hr = document->get_parentWindow(&window);
800 if(SUCCEEDED(hr))
801 {
802 VARIANT level;
803 VariantInit(&level);
804 V_VT(&level) = VT_EMPTY;
805 window->execScript(SysAllocString(javascript.wc_str()),
806 SysAllocString(language.wc_str()),
807 &level);
808 }
809 document->Release();
c9ccc09c 810 }
c9ccc09c
SL
811}
812
7d8d6163 813void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
29365629 814{
e924e848
SL
815 wxDynamicLibrary urlMon(wxT("urlmon.dll"));
816 if(urlMon.HasSymbol(wxT("CoInternetGetSession")))
29365629 817 {
f559d1a2 818 typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD, wxIInternetSession**, DWORD);
e924e848
SL
819 wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon);
820
821 ClassFactory* cf = new ClassFactory(handler);
f559d1a2 822 wxIInternetSession* session;
e924e848
SL
823 HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0);
824 if(FAILED(res))
825 {
826 wxFAIL_MSG("Could not retrive internet session");
827 }
29365629 828
c9a828e7
VZ
829 HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol,
830 handler->GetName().wc_str(),
831 0, NULL, 0);
e924e848
SL
832 if(FAILED(hr))
833 {
834 wxFAIL_MSG("Could not register protocol");
835 }
39498710 836 m_factories.push_back(cf);
e924e848
SL
837 }
838 else
29365629 839 {
e924e848 840 wxFAIL_MSG("urlmon does not contain CoInternetGetSession");
29365629
SL
841 }
842}
843
e669ddde 844bool wxWebViewIE::CanExecCommand(wxString command) const
4681a3ea 845{
617227c3 846 IHTMLDocument2* document = GetDocument();
7fbc727b 847
e81ef297
SL
848 if(document)
849 {
850 VARIANT_BOOL enabled;
851
852 document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled);
853 document->Release();
854
855 return (enabled == VARIANT_TRUE);
856 }
857 else
858 {
859 return false;
860 }
4681a3ea 861
4681a3ea
SL
862}
863
864void wxWebViewIE::ExecCommand(wxString command)
865{
617227c3 866 IHTMLDocument2* document = GetDocument();
e81ef297
SL
867
868 if(document)
869 {
870 document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL);
871 document->Release();
872 }
617227c3 873}
4681a3ea 874
e669ddde 875IHTMLDocument2* wxWebViewIE::GetDocument() const
617227c3 876{
e81ef297
SL
877 IDispatch* dispatch;
878 HRESULT result = m_webBrowser->get_Document(&dispatch);
879 if(SUCCEEDED(result))
880 {
881 IHTMLDocument2* document;
882 dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document);
883 //document is set to null automatically if the interface isn't supported
884 return document;
885 }
886 else
887 {
888 return NULL;
889 }
4681a3ea
SL
890}
891
9447a0d6
SL
892bool wxWebViewIE::EnableControlFeature(long flag, bool enable)
893{
894#if wxUSE_DYNLIB_CLASS
895
896 wxDynamicLibrary urlMon(wxT("urlmon.dll"));
34326da7
SL
897 if( urlMon.IsLoaded() &&
898 urlMon.HasSymbol("CoInternetSetFeatureEnabled") &&
9447a0d6
SL
899 urlMon.HasSymbol("CoInternetIsFeatureEnabled"))
900 {
901 typedef HRESULT (WINAPI *CoInternetSetFeatureEnabled_t)(DWORD, DWORD, BOOL);
902 typedef HRESULT (WINAPI *CoInternetIsFeatureEnabled_t)(DWORD, DWORD);
903
904 wxDYNLIB_FUNCTION(CoInternetSetFeatureEnabled_t, CoInternetSetFeatureEnabled, urlMon);
905 wxDYNLIB_FUNCTION(CoInternetIsFeatureEnabled_t, CoInternetIsFeatureEnabled, urlMon);
906
907 HRESULT hr = (*pfnCoInternetIsFeatureEnabled)(flag,
908 0x2 /* SET_FEATURE_ON_PROCESS */);
909 if((hr == S_OK && enable) || (hr == S_FALSE && !enable))
910 return true;
911
912 hr = (*pfnCoInternetSetFeatureEnabled)(flag,
913 0x2/* SET_FEATURE_ON_PROCESS */,
914 (enable ? TRUE : FALSE));
915 if ( FAILED(hr) )
916 {
917 wxLogApiError(wxT("CoInternetSetFeatureEnabled"), hr);
918 return false;
919 }
920 return true;
921 }
922 return false;
923#else
924 wxUnusedVar(flag);
925 wxUnusedVar(enable);
926 return false;
927#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS
928}
929
61b98a2d
SL
930void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt)
931{
932 if (m_webBrowser == NULL) return;
933
934 switch (evt.GetDispatchId())
935 {
936 case DISPID_BEFORENAVIGATE2:
937 {
938 m_isBusy = true;
939
940 wxString url = evt[1].GetString();
941 wxString target = evt[3].GetString();
942
04fa04d8 943 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING,
3225a4b8 944 GetId(), url, target);
e11b9a6b
SL
945
946 //skip empty javascript events.
947 if(url == "javascript:\"\"" && target.IsEmpty())
948 {
949 event.Veto();
950 }
951 else
952 {
953 event.SetEventObject(this);
954 HandleWindowEvent(event);
955 }
61b98a2d 956
3225a4b8 957 if (!event.IsAllowed())
61b98a2d
SL
958 {
959 wxActiveXEventNativeMSW* nativeParams =
960 evt.GetNativeParameters();
961 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
962 }
963
964 // at this point, either the navigation event has been cancelled
965 // and we're not busy, either it was accepted and IWebBrowser2's
966 // Busy property will be true; so we don't need our override
967 // flag anymore.
968 m_isBusy = false;
969
970 break;
971 }
972
973 case DISPID_NAVIGATECOMPLETE2:
974 {
975 wxString url = evt[1].GetString();
976 // TODO: set target parameter if possible
977 wxString target = wxEmptyString;
04fa04d8 978 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
3225a4b8 979 GetId(), url, target);
61b98a2d
SL
980 event.SetEventObject(this);
981 HandleWindowEvent(event);
982 break;
983 }
984
985 case DISPID_PROGRESSCHANGE:
986 {
987 // download progress
988 break;
989 }
990
991 case DISPID_DOCUMENTCOMPLETE:
992 {
3ee442ff
SL
993 //Only send a complete even if we are actually finished, this brings
994 //the event in to line with webkit
995 READYSTATE rs;
996 m_webBrowser->get_ReadyState( &rs );
997 if(rs != READYSTATE_COMPLETE)
998 break;
999
61b98a2d 1000 wxString url = evt[1].GetString();
113e0a92
SL
1001
1002 //As we are complete we also add to the history list, but not if the
1003 //page is not the main page, ie it is a subframe
60eabdbe 1004 //We also have to check if we are loading a file:// url, if so we
f239a200
SL
1005 //need to change the comparison as ie passes back a different style
1006 //of url
60eabdbe
VZ
1007 if(m_historyEnabled && !m_historyLoadingFromList &&
1008 (url == GetCurrentURL() ||
1009 (GetCurrentURL().substr(0, 4) == "file" &&
f239a200 1010 wxFileSystem::URLToFileName(GetCurrentURL()).GetFullPath() == url)))
74af0b13
SL
1011 {
1012 //If we are not at the end of the list, then erase everything
1013 //between us and the end before adding the new page
22ca10fa 1014 if(m_historyPosition != static_cast<int>(m_historyList.size()) - 1)
74af0b13
SL
1015 {
1016 m_historyList.erase(m_historyList.begin() + m_historyPosition + 1,
1017 m_historyList.end());
1018 }
c13d6ac1 1019 wxSharedPtr<wxWebViewHistoryItem> item(new wxWebViewHistoryItem(url, GetCurrentTitle()));
74af0b13
SL
1020 m_historyList.push_back(item);
1021 m_historyPosition++;
1022 }
1023 //Reset as we are done now
1024 m_historyLoadingFromList = false;
61b98a2d
SL
1025 // TODO: set target parameter if possible
1026 wxString target = wxEmptyString;
04fa04d8 1027 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(),
3225a4b8 1028 url, target);
61b98a2d
SL
1029 event.SetEventObject(this);
1030 HandleWindowEvent(event);
1031 break;
1032 }
1033
1034 case DISPID_STATUSTEXTCHANGE:
1035 {
1036 break;
1037 }
1038
1039 case DISPID_TITLECHANGE:
1040 {
153530af
SL
1041 wxString title = evt[0].GetString();
1042
04fa04d8 1043 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED,
3225a4b8 1044 GetId(), GetCurrentURL(), "");
153530af
SL
1045 event.SetString(title);
1046 event.SetEventObject(this);
1047 HandleWindowEvent(event);
61b98a2d
SL
1048 break;
1049 }
1050
1051 case DISPID_NAVIGATEERROR:
1052 {
04fa04d8 1053 wxWebViewNavigationError errorType = wxWEB_NAV_ERR_OTHER;
61b98a2d
SL
1054 wxString errorCode = "?";
1055 switch (evt[3].GetLong())
1056 {
1057 case INET_E_INVALID_URL: // (0x800C0002L or -2146697214)
1058 errorCode = "INET_E_INVALID_URL";
1059 errorType = wxWEB_NAV_ERR_REQUEST;
1060 break;
1061 case INET_E_NO_SESSION: // (0x800C0003L or -2146697213)
1062 errorCode = "INET_E_NO_SESSION";
1063 errorType = wxWEB_NAV_ERR_CONNECTION;
1064 break;
1065 case INET_E_CANNOT_CONNECT: // (0x800C0004L or -2146697212)
1066 errorCode = "INET_E_CANNOT_CONNECT";
1067 errorType = wxWEB_NAV_ERR_CONNECTION;
1068 break;
1069 case INET_E_RESOURCE_NOT_FOUND: // (0x800C0005L or -2146697211)
1070 errorCode = "INET_E_RESOURCE_NOT_FOUND";
1071 errorType = wxWEB_NAV_ERR_NOT_FOUND;
1072 break;
1073 case INET_E_OBJECT_NOT_FOUND: // (0x800C0006L or -2146697210)
1074 errorCode = "INET_E_OBJECT_NOT_FOUND";
1075 errorType = wxWEB_NAV_ERR_NOT_FOUND;
1076 break;
1077 case INET_E_DATA_NOT_AVAILABLE: // (0x800C0007L or -2146697209)
1078 errorCode = "INET_E_DATA_NOT_AVAILABLE";
1079 errorType = wxWEB_NAV_ERR_NOT_FOUND;
1080 break;
1081 case INET_E_DOWNLOAD_FAILURE: // (0x800C0008L or -2146697208)
1082 errorCode = "INET_E_DOWNLOAD_FAILURE";
1083 errorType = wxWEB_NAV_ERR_CONNECTION;
1084 break;
1085 case INET_E_AUTHENTICATION_REQUIRED: // (0x800C0009L or -2146697207)
1086 errorCode = "INET_E_AUTHENTICATION_REQUIRED";
1087 errorType = wxWEB_NAV_ERR_AUTH;
1088 break;
1089 case INET_E_NO_VALID_MEDIA: // (0x800C000AL or -2146697206)
1090 errorCode = "INET_E_NO_VALID_MEDIA";
1091 errorType = wxWEB_NAV_ERR_REQUEST;
1092 break;
1093 case INET_E_CONNECTION_TIMEOUT: // (0x800C000BL or -2146697205)
1094 errorCode = "INET_E_CONNECTION_TIMEOUT";
1095 errorType = wxWEB_NAV_ERR_CONNECTION;
1096 break;
1097 case INET_E_INVALID_REQUEST: // (0x800C000CL or -2146697204)
1098 errorCode = "INET_E_INVALID_REQUEST";
1099 errorType = wxWEB_NAV_ERR_REQUEST;
1100 break;
1101 case INET_E_UNKNOWN_PROTOCOL: // (0x800C000DL or -2146697203)
1102 errorCode = "INET_E_UNKNOWN_PROTOCOL";
1103 errorType = wxWEB_NAV_ERR_REQUEST;
1104 break;
1105 case INET_E_SECURITY_PROBLEM: // (0x800C000EL or -2146697202)
1106 errorCode = "INET_E_SECURITY_PROBLEM";
1107 errorType = wxWEB_NAV_ERR_SECURITY;
1108 break;
1109 case INET_E_CANNOT_LOAD_DATA: // (0x800C000FL or -2146697201)
1110 errorCode = "INET_E_CANNOT_LOAD_DATA";
1111 errorType = wxWEB_NAV_ERR_OTHER;
1112 break;
1113 case INET_E_CANNOT_INSTANTIATE_OBJECT:
1114 // CoCreateInstance will return an error code if this happens,
1115 // we'll handle this above.
1116 return;
1117 break;
1118 case INET_E_REDIRECT_FAILED: // (0x800C0014L or -2146697196)
1119 errorCode = "INET_E_REDIRECT_FAILED";
1120 errorType = wxWEB_NAV_ERR_OTHER;
1121 break;
1122 case INET_E_REDIRECT_TO_DIR: // (0x800C0015L or -2146697195)
1123 errorCode = "INET_E_REDIRECT_TO_DIR";
1124 errorType = wxWEB_NAV_ERR_REQUEST;
1125 break;
1126 case INET_E_CANNOT_LOCK_REQUEST: // (0x800C0016L or -2146697194)
1127 errorCode = "INET_E_CANNOT_LOCK_REQUEST";
1128 errorType = wxWEB_NAV_ERR_OTHER;
1129 break;
1130 case INET_E_USE_EXTEND_BINDING: // (0x800C0017L or -2146697193)
1131 errorCode = "INET_E_USE_EXTEND_BINDING";
1132 errorType = wxWEB_NAV_ERR_OTHER;
1133 break;
1134 case INET_E_TERMINATED_BIND: // (0x800C0018L or -2146697192)
1135 errorCode = "INET_E_TERMINATED_BIND";
1136 errorType = wxWEB_NAV_ERR_OTHER;
1137 break;
1138 case INET_E_INVALID_CERTIFICATE: // (0x800C0019L or -2146697191)
1139 errorCode = "INET_E_INVALID_CERTIFICATE";
1140 errorType = wxWEB_NAV_ERR_CERTIFICATE;
1141 break;
1142 case INET_E_CODE_DOWNLOAD_DECLINED: // (0x800C0100L or -2146696960)
1143 errorCode = "INET_E_CODE_DOWNLOAD_DECLINED";
1144 errorType = wxWEB_NAV_ERR_USER_CANCELLED;
1145 break;
1146 case INET_E_RESULT_DISPATCHED: // (0x800C0200L or -2146696704)
1147 // cancel request cancelled...
1148 errorCode = "INET_E_RESULT_DISPATCHED";
1149 errorType = wxWEB_NAV_ERR_OTHER;
1150 break;
1151 case INET_E_CANNOT_REPLACE_SFP_FILE: // (0x800C0300L or -2146696448)
1152 errorCode = "INET_E_CANNOT_REPLACE_SFP_FILE";
1153 errorType = wxWEB_NAV_ERR_SECURITY;
1154 break;
1155 case INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY:
1156 errorCode = "INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY";
1157 errorType = wxWEB_NAV_ERR_SECURITY;
1158 break;
1159 case INET_E_CODE_INSTALL_SUPPRESSED:
1160 errorCode = "INET_E_CODE_INSTALL_SUPPRESSED";
1161 errorType = wxWEB_NAV_ERR_SECURITY;
1162 break;
1163 }
1164
1165 wxString url = evt[1].GetString();
1166 wxString target = evt[2].GetString();
04fa04d8 1167 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(),
3225a4b8 1168 url, target);
61b98a2d
SL
1169 event.SetEventObject(this);
1170 event.SetInt(errorType);
1171 event.SetString(errorCode);
1172 HandleWindowEvent(event);
1173 break;
1174 }
853b6cd0 1175 case DISPID_NEWWINDOW3:
61b98a2d 1176 {
853b6cd0
SL
1177 wxString url = evt[4].GetString();
1178
04fa04d8 1179 wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW,
3225a4b8 1180 GetId(), url, wxEmptyString);
853b6cd0
SL
1181 event.SetEventObject(this);
1182 HandleWindowEvent(event);
1183
d676fb21
SL
1184 //We always cancel this event otherwise an Internet Exporer window
1185 //is opened for the url
1186 wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters();
1187 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[3]) = VARIANT_TRUE;
be19c556
SL
1188 break;
1189 }
61b98a2d
SL
1190 }
1191
1192 evt.Skip();
1193}
1194
7d8d6163 1195VirtualProtocol::VirtualProtocol(wxSharedPtr<wxWebViewHandler> handler)
7d3f6b4d 1196{
7d3f6b4d 1197 m_file = NULL;
29365629 1198 m_handler = handler;
7d3f6b4d
SL
1199}
1200
9f194b9d
SL
1201BEGIN_IID_TABLE(VirtualProtocol)
1202 ADD_IID(Unknown)
1203 ADD_RAW_IID(wxIID_IInternetProtocolRoot)
1204 ADD_RAW_IID(wxIID_IInternetProtocol)
1205END_IID_TABLE;
7d3f6b4d 1206
9f194b9d 1207IMPLEMENT_IUNKNOWN_METHODS(VirtualProtocol)
7d3f6b4d 1208
f559d1a2
VZ
1209HRESULT VirtualProtocol::Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink,
1210 wxIInternetBindInfo *pOIBindInfo, DWORD grfPI,
0995b9dc 1211 HANDLE_PTR dwReserved)
7d3f6b4d 1212{
0995b9dc
SL
1213 wxUnusedVar(szUrl);
1214 wxUnusedVar(pOIBindInfo);
1215 wxUnusedVar(grfPI);
1216 wxUnusedVar(dwReserved);
7d3f6b4d 1217 m_protocolSink = pOIProtSink;
60eabdbe 1218
29365629
SL
1219 //We get the file itself from the protocol handler
1220 m_file = m_handler->GetFile(szUrl);
1221
7d3f6b4d
SL
1222
1223 if(!m_file)
1224 return INET_E_RESOURCE_NOT_FOUND;
1225
1226 //We return the stream length for current and total size as we can always
1227 //read the whole file from the stream
666f73c4 1228 wxFileOffset length = m_file->GetStream()->GetLength();
f559d1a2
VZ
1229 m_protocolSink->ReportData(wxBSCF_FIRSTDATANOTIFICATION |
1230 wxBSCF_DATAFULLYAVAILABLE |
1231 wxBSCF_LASTDATANOTIFICATION,
666f73c4 1232 length, length);
60eabdbe 1233 return S_OK;
7d3f6b4d
SL
1234}
1235
1236HRESULT VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead)
1237{
1238 //If the file is null we return false to indicte it is finished
60eabdbe 1239 if(!m_file)
7d3f6b4d
SL
1240 return S_FALSE;
1241
1242 wxStreamError err = m_file->GetStream()->Read(pv, cb).GetLastError();
1243 *pcbRead = m_file->GetStream()->LastRead();
1244
1245 if(err == wxSTREAM_NO_ERROR)
1246 {
1247 if(*pcbRead < cb)
1248 {
1249 wxDELETE(m_file);
1250 m_protocolSink->ReportResult(S_OK, 0, NULL);
1251 }
1252 //As we are not eof there is more data
1253 return S_OK;
1254 }
1255 else if(err == wxSTREAM_EOF)
1256 {
1257 wxDELETE(m_file);
1258 m_protocolSink->ReportResult(S_OK, 0, NULL);
1259 //We are eof and so finished
1260 return S_OK;
1261 }
1262 else if(err == wxSTREAM_READ_ERROR)
1263 {
1264 wxDELETE(m_file);
1265 return INET_E_DOWNLOAD_FAILURE;
1266 }
0995b9dc
SL
1267 else
1268 {
1269 //Dummy return to surpress a compiler warning
1270 wxFAIL;
1271 return INET_E_DOWNLOAD_FAILURE;
1272 }
7d3f6b4d
SL
1273}
1274
9f194b9d
SL
1275BEGIN_IID_TABLE(ClassFactory)
1276 ADD_IID(Unknown)
1277 ADD_IID(ClassFactory)
1278END_IID_TABLE;
1279
1280IMPLEMENT_IUNKNOWN_METHODS(ClassFactory)
1281
7d3f6b4d
SL
1282HRESULT ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid,
1283 void ** ppvObject)
1284{
60eabdbe 1285 if (pUnkOuter)
7d3f6b4d 1286 return CLASS_E_NOAGGREGATION;
29365629 1287 VirtualProtocol* vp = new VirtualProtocol(m_handler);
7d3f6b4d
SL
1288 vp->AddRef();
1289 HRESULT hr = vp->QueryInterface(riid, ppvObject);
1290 vp->Release();
1291 return hr;
1292
60eabdbe 1293}
7d3f6b4d
SL
1294
1295STDMETHODIMP ClassFactory::LockServer(BOOL fLock)
1296{
0995b9dc
SL
1297 wxUnusedVar(fLock);
1298 return S_OK;
7d3f6b4d
SL
1299}
1300
34326da7 1301wxIEContainer::wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk,
accc94d5
SL
1302 DocHostUIHandler* uiHandler) :
1303 wxActiveXContainer(parent,iid,pUnk)
1304{
1305 m_uiHandler = uiHandler;
1306}
1307
1308wxIEContainer::~wxIEContainer()
1309{
1310}
1311
34326da7 1312bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface,
accc94d5
SL
1313 const char *&desc)
1314{
1315 if (m_uiHandler && IsEqualIID(iid, wxIID_IDocHostUIHandler))
1316 {
1317 *_interface = (IUnknown *) (wxIDocHostUIHandler *) m_uiHandler;
1318 desc = "IDocHostUIHandler";
1319 return true;
1320 }
1321 return false;
1322}
1323
34326da7
SL
1324HRESULT DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt,
1325 IUnknown *pcmdtReserved,
accc94d5
SL
1326 IDispatch *pdispReserved)
1327{
1328 wxUnusedVar(dwID);
1329 wxUnusedVar(ppt);
1330 wxUnusedVar(pcmdtReserved);
1331 wxUnusedVar(pdispReserved);
1332 return E_NOTIMPL;
1333}
1334
1335HRESULT DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
1336{
34326da7 1337 //don't show 3d border and enable themes.
accc94d5
SL
1338 pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME;
1339 return S_OK;
1340}
1341
1342HRESULT DocHostUIHandler::ShowUI(DWORD dwID,
34326da7 1343 IOleInPlaceActiveObject *pActiveObject,
accc94d5
SL
1344 IOleCommandTarget *pCommandTarget,
1345 IOleInPlaceFrame *pFrame,
1346 IOleInPlaceUIWindow *pDoc)
1347{
1348 wxUnusedVar(dwID);
1349 wxUnusedVar(pActiveObject);
1350 wxUnusedVar(pCommandTarget);
1351 wxUnusedVar(pFrame);
1352 wxUnusedVar(pDoc);
1353 return S_FALSE;
1354}
1355
1356HRESULT DocHostUIHandler::HideUI(void)
1357{
1358 return E_NOTIMPL;
1359}
1360
1361HRESULT DocHostUIHandler::UpdateUI(void)
1362{
1363 return E_NOTIMPL;
1364}
1365
1366HRESULT DocHostUIHandler::EnableModeless(BOOL fEnable)
1367{
1368 wxUnusedVar(fEnable);
1369 return E_NOTIMPL;
1370}
1371
1372HRESULT DocHostUIHandler::OnDocWindowActivate(BOOL fActivate)
1373{
1374 wxUnusedVar(fActivate);
1375 return E_NOTIMPL;
1376}
1377
1378HRESULT DocHostUIHandler::OnFrameWindowActivate(BOOL fActivate)
1379{
1380 wxUnusedVar(fActivate);
1381 return E_NOTIMPL;
1382}
1383
34326da7 1384HRESULT DocHostUIHandler::ResizeBorder(LPCRECT prcBorder,
accc94d5
SL
1385 IOleInPlaceUIWindow *pUIWindow,
1386 BOOL fFrameWindow)
1387{
1388 wxUnusedVar(prcBorder);
1389 wxUnusedVar(pUIWindow);
1390 wxUnusedVar(fFrameWindow);
1391 return E_NOTIMPL;
1392}
1393
34326da7 1394HRESULT DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
accc94d5
SL
1395 const GUID *pguidCmdGroup,
1396 DWORD nCmdID)
1397{
1398 if(lpMsg && lpMsg->message == WM_KEYDOWN)
1399 {
1400 //control is down?
1401 if((GetKeyState(VK_CONTROL) & 0x8000 ))
1402 {
1403 //skip CTRL-N, CTRL-F and CTRL-P
1404 if(lpMsg->wParam == 'N' || lpMsg->wParam == 'P' || lpMsg->wParam == 'F')
1405 {
1406 return S_OK;
1407 }
1408 }
1409 //skip F5
1410 if(lpMsg->wParam == VK_F5)
1411 {
1412 return S_OK;
1413 }
1414 }
1415
1416 wxUnusedVar(pguidCmdGroup);
1417 wxUnusedVar(nCmdID);
1418 return E_NOTIMPL;
1419}
1420
1421HRESULT DocHostUIHandler::GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw)
1422{
1423 wxUnusedVar(pchKey);
1424 wxUnusedVar(dw);
1425 return E_NOTIMPL;
1426}
1427
1428HRESULT DocHostUIHandler::GetDropTarget(IDropTarget *pDropTarget,
1429 IDropTarget **ppDropTarget)
1430{
1431 wxUnusedVar(pDropTarget);
1432 wxUnusedVar(ppDropTarget);
1433 return E_NOTIMPL;
1434}
1435
1436HRESULT DocHostUIHandler::GetExternal(IDispatch **ppDispatch)
1437{
1438 wxUnusedVar(ppDispatch);
1439 return E_NOTIMPL;
1440}
1441
1442HRESULT DocHostUIHandler::TranslateUrl(DWORD dwTranslate,
1443 OLECHAR *pchURLIn,
1444 OLECHAR **ppchURLOut)
1445{
1446 wxUnusedVar(dwTranslate);
1447 wxUnusedVar(pchURLIn);
1448 wxUnusedVar(ppchURLOut);
1449 return E_NOTIMPL;
1450}
1451
1452HRESULT DocHostUIHandler::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
1453{
1454 wxUnusedVar(pDO);
1455 wxUnusedVar(ppDORet);
1456 return E_NOTIMPL;
1457}
1458
1459BEGIN_IID_TABLE(DocHostUIHandler)
1460 ADD_IID(Unknown)
1461 ADD_RAW_IID(wxIID_IDocHostUIHandler)
1462END_IID_TABLE;
1463
1464IMPLEMENT_IUNKNOWN_METHODS(DocHostUIHandler)
1465
9d2f31db 1466#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE