ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

webchild.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2004, 2005 Martin Fuchs
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017  */
00018 
00019 
00020  //
00021  // Explorer clone
00022  //
00023  // webchild.h
00024  //
00025  // Martin Fuchs, 08.02.2004
00026  //
00027 
00028 
00029 #ifndef _MSC_VER
00030 #include <exdisp.h>     // for IConnectionPointContainer
00031 #include <exdispid.h>   // for DWebBrowserEvents2 IDs
00032 #endif
00033 
00034 #ifndef DISPID_BEFORENAVIGATE   // missing in MinGW (as of 07.02.2004)
00035 #define DISPID_BEFORENAVIGATE           100
00036 #define DISPID_NAVIGATECOMPLETE         101
00037 #define DISPID_STATUSTEXTCHANGE         102
00038 #define DISPID_QUIT                     103
00039 #define DISPID_DOWNLOADCOMPLETE         104
00040 #define DISPID_COMMANDSTATECHANGE       105
00041 #define DISPID_DOWNLOADBEGIN            106
00042 #define DISPID_NEWWINDOW                107
00043 #define DISPID_PROGRESSCHANGE           108
00044 #define DISPID_WINDOWMOVE               109
00045 #define DISPID_WINDOWRESIZE             110
00046 #define DISPID_WINDOWACTIVATE           111
00047 #define DISPID_PROPERTYCHANGE           112
00048 #define DISPID_TITLECHANGE              113
00049 #define DISPID_TITLEICONCHANGE          114
00050 #define DISPID_FRAMEBEFORENAVIGATE      200
00051 #define DISPID_FRAMENAVIGATECOMPLETE    201
00052 #define DISPID_FRAMENEWWINDOW           204
00053 
00054 #define DISPID_NAVIGATECOMPLETE2        252
00055 #define DISPID_ONQUIT                   253
00056 #define DISPID_ONVISIBLE                254
00057 #define DISPID_ONTOOLBAR                255
00058 #define DISPID_ONMENUBAR                256
00059 #define DISPID_ONSTATUSBAR              257
00060 #define DISPID_ONFULLSCREEN             258
00061 #define DISPID_DOCUMENTCOMPLETE         259
00062 #define DISPID_ONTHEATERMODE            260
00063 #define DISPID_ONADDRESSBAR             261
00064 #define DISPID_WINDOWSETRESIZABLE       262
00065 #define DISPID_WINDOWCLOSING            263
00066 #define DISPID_WINDOWSETLEFT            264
00067 #define DISPID_WINDOWSETTOP             265
00068 #define DISPID_WINDOWSETWIDTH           266
00069 #define DISPID_WINDOWSETHEIGHT          267
00070 #define DISPID_CLIENTTOHOSTWINDOW       268
00071 #define DISPID_SETSECURELOCKICON        269
00072 #define DISPID_FILEDOWNLOAD             270
00073 #define DISPID_NAVIGATEERROR            271
00074 #define DISPID_PRIVACYIMPACTEDSTATECHANGE 272
00075 #endif
00076 
00077 #ifndef V_INT   // missing in MinGW (as of 07.02.2004)
00078 #define V_INT(x) V_UNION(x, intVal)
00079 #endif
00080 
00081 #ifdef _MSC_VER
00082 #pragma warning(disable: 4355)  // use of 'this' for initialization of _connector
00083 #endif
00084 
00085 
00086 template<typename T> struct ConnectionPoint : public SIfacePtr<T>
00087 {
00088     ConnectionPoint(IConnectionPointContainer* pCPC, REFIID riid)
00089     {
00090         CheckError(pCPC->FindConnectionPoint(riid, &this->_p));
00091     }
00092 };
00093 
00094 struct EventConnection
00095 {
00096     EventConnection(IConnectionPoint* connectionpoint, IUnknown* sink)
00097     {
00098         CheckError(connectionpoint->Advise(sink, &_cookie));
00099         _connectionpoint = connectionpoint;
00100     }
00101 
00102     template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
00103     {
00104         CheckError(connectionpoint->Advise(sink, &_cookie));
00105         _connectionpoint = connectionpoint;
00106     }
00107 
00108 /*  template<typename T> EventConnection(SIfacePtr<T>& connectionpoint, IUnknown* sink)
00109     {
00110         CheckError(connectionpoint->Advise(sink, &_cookie));
00111         _connectionpoint = connectionpoint.GetPtr();
00112     } */
00113 
00114 /*  template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
00115     {
00116         CheckError(connectionpoint->Advise(sink, &_cookie));
00117         _connectionpoint = connectionpoint;
00118     } */
00119 
00120     ~EventConnection()
00121     {
00122         if (_connectionpoint)
00123             _connectionpoint->Unadvise(_cookie);
00124     }
00125 
00126 protected:
00127     SIfacePtr<IConnectionPoint> _connectionpoint;
00128     DWORD   _cookie;
00129 };
00130 
00131 struct EventConnector : public EventConnection
00132 {
00133     EventConnector(IUnknown* unknown, REFIID riid, IUnknown* sink)
00134      :  EventConnection(ConnectionPoint<IConnectionPoint>(
00135                 SIfacePtr<IConnectionPointContainer>(unknown, IID_IConnectionPointContainer), riid), sink)
00136     {
00137     }
00138 };
00139 
00140 
00141 struct OleInPlaceClient : public SimpleComObject,
00142                             public IOleClientSite,
00143                             public IOleInPlaceSite
00144 {
00145 protected:
00146     HWND    _hwnd;
00147 
00148 public:
00149     OleInPlaceClient(HWND hwnd=0)
00150      :  _hwnd(hwnd)
00151     {
00152     }
00153 
00154     void attach(HWND hwnd)
00155     {
00156         _hwnd = hwnd;
00157     }
00158 
00159     HRESULT attach_control(IOleObject* ole_obj, LONG iVerb=OLEIVERB_INPLACEACTIVATE, HWND hwndParent=0, LPCRECT pRect=NULL)
00160     {
00161         HRESULT hr = ole_obj->SetClientSite(this);
00162         if (FAILED(hr))
00163             return hr;
00164 
00165 //      hr = ole_obj->SetHostNames(app, doc));
00166 
00167         hr = ole_obj->DoVerb(iVerb, NULL, this, 0, 0/*hwnd*/, NULL/*&rcPos*/);
00168 
00169         return hr;
00170     }
00171 
00172     HRESULT detach(IOleObject* ole_obj, DWORD dwSaveOption=OLECLOSE_SAVEIFDIRTY)
00173     {
00174         HRESULT hr = ole_obj->Close(dwSaveOption);
00175 
00176         _hwnd = 0;
00177 
00178         return hr;
00179     }
00180 
00181     STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
00182     {
00183         if (IsEqualIID(riid, IID_IOleClientSite))
00184             {*ppv=static_cast<IOleClientSite*>(this); IncRef(); return S_OK;}
00185 
00186         if (IsEqualIID(riid, IID_IOleInPlaceSite))
00187             {*ppv=static_cast<IOleInPlaceSite*>(this); IncRef(); return S_OK;}
00188 
00189         if (IsEqualIID(riid, IID_IUnknown))
00190             {*ppv=static_cast<IOleClientSite/*oder auch IOleInPlaceSite*/*>(this); IncRef(); return S_OK;}
00191 
00192         return E_NOINTERFACE;
00193     }
00194 
00195     STDMETHODIMP_(ULONG) AddRef() {return IncRef();}
00196     STDMETHODIMP_(ULONG) Release() {return DecRef();}
00197 
00198 
00199      // IOleWindow:
00200 
00201     virtual /* [input_sync] */ HRESULT STDMETHODCALLTYPE GetWindow(/* [out] */ HWND __RPC_FAR *phwnd)
00202     {
00203         *phwnd = _hwnd;
00204         return S_OK;
00205     }
00206 
00207     virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(/* [in] */ BOOL fEnterMode)
00208     {
00209         return E_NOTIMPL;
00210     }
00211 
00212 
00213      // IOleClientSite:
00214 
00215     virtual HRESULT STDMETHODCALLTYPE SaveObject()
00216     {
00217         return E_NOTIMPL;
00218     }
00219 
00220     virtual HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker __RPC_FAR *__RPC_FAR *ppmk)
00221     {
00222         return E_NOTIMPL;
00223     }
00224 
00225     virtual HRESULT STDMETHODCALLTYPE GetContainer(IOleContainer __RPC_FAR *__RPC_FAR *ppContainer)
00226     {
00227         ppContainer = 0;
00228         return E_NOINTERFACE;
00229     }
00230 
00231     virtual HRESULT STDMETHODCALLTYPE ShowObject()
00232     {
00233         return S_OK;
00234     }
00235 
00236     virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow)
00237     {
00238         return S_OK;
00239     }
00240 
00241     virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout()
00242     {
00243         return S_OK;
00244     }
00245 
00246 
00247      // IOleInPlaceSite:
00248 
00249     virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate()
00250     {
00251         return S_OK;
00252     }
00253 
00254     virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate()
00255     {
00256         return S_OK;
00257     }
00258 
00259     virtual HRESULT STDMETHODCALLTYPE OnUIActivate()
00260     {
00261         return S_OK;
00262     }
00263 
00264     virtual HRESULT STDMETHODCALLTYPE GetWindowContext(
00265         /* [out] */ IOleInPlaceFrame __RPC_FAR *__RPC_FAR *ppFrame,
00266         /* [out] */ IOleInPlaceUIWindow __RPC_FAR *__RPC_FAR *ppDoc,
00267         /* [out] */ LPRECT lprcPosRect,
00268         /* [out] */ LPRECT lprcClipRect,
00269         /* [out][in] */ LPOLEINPLACEFRAMEINFO lpFrameInfo)
00270     {
00271         ClientRect rect(_hwnd);
00272 
00273         ppFrame = 0;
00274         ppDoc = 0;
00275         *lprcPosRect = rect;
00276         *lprcClipRect = rect;
00277 
00278         assert(lpFrameInfo->cb>=sizeof(OLEINPLACEFRAMEINFO));
00279         lpFrameInfo->fMDIApp = FALSE;   //@@
00280         lpFrameInfo->hwndFrame = 0;
00281         lpFrameInfo->haccel = 0;
00282         lpFrameInfo->cAccelEntries = 0;
00283 
00284         return S_OK;
00285     }
00286 
00287     virtual HRESULT STDMETHODCALLTYPE Scroll(/* [in] */ SIZE scrollExtant)
00288     {
00289         return S_OK;
00290     }
00291 
00292     virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(/* [in] */ BOOL fUndoable)
00293     {
00294         return S_OK;
00295     }
00296 
00297     virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate()
00298     {
00299         return S_OK;
00300     }
00301 
00302     virtual HRESULT STDMETHODCALLTYPE DiscardUndoState()
00303     {
00304         return S_OK;
00305     }
00306 
00307     virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo()
00308     {
00309         return S_OK;
00310     }
00311 
00312     virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(/* [in] */ LPCRECT lprcPosRect)
00313     {
00314         return S_OK;
00315     }
00316 };
00317 
00318 
00319  // window with in place activates Active-X Control
00320 
00321 template<typename BASE, typename SMARTPTR> struct IPCtrlWindow : public BASE
00322 {
00323     typedef BASE super;
00324 
00325     IPCtrlWindow(HWND hwnd)
00326      :  super(hwnd)
00327     {
00328     }
00329 
00330     template<typename T> IPCtrlWindow(HWND hwnd, T& info)
00331      :  super(hwnd, info)
00332     {
00333     }
00334 
00335     HRESULT create_control(HWND hwnd, REFIID clsid, REFIID riid)
00336     {
00337          // Erzeugen einer Instanz des Controls
00338         HRESULT hr = _control.CreateInstance(clsid, riid);
00339         if (FAILED(hr))
00340             return hr;
00341 
00342         _client_side.attach(hwnd);
00343 
00344         hr = _client_side.attach_control(SIfacePtr<IOleObject>(_control, IID_IOleObject)/*, OLEIVERB_INPLACEACTIVATE,
00345                                             hwnd, &Rect(10, 10, 500, 500)*/);
00346         if (FAILED(hr))
00347             return hr;
00348 
00349          // try to get a IOleInPlaceObject interface for window resizing
00350         return _control.QueryInterface(IID_IOleInPlaceObject, &_in_place_object);   // _in_place_object = _control
00351     }
00352 
00353 protected:
00354     LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
00355     {
00356         if (nmsg == WM_SIZE) {
00357             if (_in_place_object) {
00358                 RECT rect = {0, 0, LOWORD(lparam), HIWORD(lparam)};
00359 
00360                 _in_place_object->SetObjectRects(&rect, &rect);
00361             }
00362         } else if (nmsg == WM_CLOSE) {
00363             _in_place_object = NULL;
00364 
00365             if (_control) {
00366                 _client_side.detach(SIfacePtr<IOleObject>(_control, IID_IOleObject), OLECLOSE_NOSAVE);
00367                 _control = NULL;
00368             }
00369         }
00370 
00371         return super::WndProc(nmsg, wparam, lparam);
00372     }
00373 
00374     ComInit _usingCOM;
00375     SMARTPTR _control;
00376     OleInPlaceClient _client_side;
00377     SIfacePtr<IOleInPlaceObject> _in_place_object;
00378 };
00379 
00380 
00381 
00382 #include "exdispid.h"
00383 
00384 
00385 struct DWebBrowserEvents2IF
00386 {
00387     virtual ~DWebBrowserEvents2IF() {}
00388 
00389     virtual void StatusTextChange(const BStr& text)
00390         {}
00391 
00392     virtual void ProgressChange(long progress, long progressMax)
00393         {}
00394 
00395     virtual void WindowMove()
00396         {}
00397 
00398     virtual void WindowResize()
00399         {}
00400 
00401     virtual void WindowActivate()
00402         {}
00403 
00404     virtual void PropertyChange(const BStr& property)
00405         {}
00406 
00407     virtual void DownloadComplete()
00408         {}
00409 
00410     virtual void CommandStateChange(long command, bool enable)
00411         {}
00412 
00413     virtual void DownloadBegin()
00414         {}
00415 
00416     virtual void NewWindow2(IDispatch** ppDisp, VARIANT_BOOL& cancel)
00417         {}
00418 
00419     virtual void TitleChange(const BStr& text)
00420         {}
00421 
00422     virtual void TitleIconChange(const BStr& text)
00423         {}
00424 
00425     virtual void FrameBeforeNavigate(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& cancel)
00426         {}
00427 
00428     virtual void FrameNavigateComplete(const BStr& url)
00429         {}
00430 
00431     virtual void FrameNewWindow(const BStr&url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& processed)
00432         {}
00433 
00434     virtual void BeforeNavigate2(IDispatch* pDisp, const Variant& url, const Variant& flags,
00435                             const Variant& targetFrameName, const Variant& postData,
00436                             const Variant& headers, VARIANT_BOOL& cancel)
00437         {}
00438 
00439     virtual void NavigateComplete2(IDispatch* pDisp, const Variant& url)
00440         {}
00441 
00442     virtual void OnQuit()
00443         {}
00444 
00445     virtual void OnVisible(bool Visible)
00446         {}
00447 
00448     virtual void OnToolbar(bool Visible)
00449         {}
00450 
00451     virtual void OnMenubar(bool Visible)
00452         {}
00453 
00454     virtual void OnStatusbar(bool Visible)
00455         {}
00456 
00457     virtual void OnFullscreen(bool Visible)
00458         {}
00459 
00460     virtual void DocumentComplete()
00461         {}
00462 
00463     virtual void OnTheatermode(bool Visible)
00464         {}
00465 
00466     virtual void OnAddressbar(bool Visible)
00467         {}
00468 
00469     virtual void WindowSetResizable(bool Visible)
00470         {}
00471 
00472     virtual void WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL& cancel)
00473         {}
00474 
00475     virtual void WindowSetLeft(long Left)
00476         {}
00477 
00478     virtual void WindowSetTop(long Top)
00479         {}
00480 
00481     virtual void WindowSetWidth(long Width)
00482         {}
00483 
00484     virtual void WindowSetHeight(long Height)
00485         {}
00486 
00487     virtual void ClientToHostWindow(long& CX, long& CY)
00488         {}
00489 
00490     virtual void SetSecureLockIcon(long SecureLockIcon)
00491         {}
00492 
00493     virtual void FileDownload(Variant& cancel)
00494         {}
00495 
00496     virtual void NavigateError(IDispatch* pDisp, const Variant& url, const Variant& Frame, const Variant& StatusCode, VARIANT_BOOL& cancel)
00497         {}
00498 
00499     virtual void PrivacyImpactedStateChange(bool bImpacted)
00500         {}
00501 };
00502 
00503 
00504  // The web browser control has to be initialized completely before being able,
00505  // to display a page, that does not access internet.
00506 struct ANSUNC BrowserNavigator
00507 {
00508     BrowserNavigator();
00509 
00510     void    attach(IWebBrowser* browser);
00511     void    goto_url(LPCTSTR url);
00512     void    set_html_page(const String& html_txt);
00513     void    navigated(LPCTSTR url);
00514 
00515     IWebBrowser* get_browser() {return _browser.get();}
00516 
00517 protected:
00518     SIfacePtr<IWebBrowser> _browser;
00519     String  _new_url;
00520     String  _new_html_txt;
00521     bool    _browser_initialized;
00522 };
00523 
00524 
00525  // MinGW defines a wrong FixedDWebBrowserEvents2 interface with virtual functions for DISPID calls, so we use our own, corrected version:
00526 interface FixedDWebBrowserEvents2 : public IDispatch
00527 {
00528 #ifdef __GNUC__
00529     virtual ~FixedDWebBrowserEvents2() {}
00530 #endif
00531 };
00532 
00533 struct ANSUNC DWebBrowserEvents2Impl
00534  :  public IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl>, public SimpleComObject,
00535     public DWebBrowserEvents2IF
00536 {
00537     typedef IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl> super;
00538 
00539 
00540     DWebBrowserEvents2IF* _callback;
00541 
00542 
00543     DWebBrowserEvents2Impl(BrowserNavigator& navigator)
00544      :  super(DIID_DWebBrowserEvents2),
00545         _navigator(navigator)
00546     {
00547         _callback = this;
00548     }
00549 
00550 
00551 /*   // IUnknown
00552     STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
00553     {
00554         *ppv = NULL;
00555 
00556         if (SUCCEEDED(super::QueryInterface(riid, ppv)))
00557             return S_OK;
00558 
00559         return E_NOINTERFACE;
00560     } */
00561 
00562 
00563      // IDispatch
00564     STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
00565         {return E_NOTIMPL;}
00566 
00567     STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)
00568         {return E_NOTIMPL;}
00569 
00570     STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
00571         {return E_NOTIMPL;}
00572 
00573     STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
00574                         DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr)
00575     {
00576         switch(dispIdMember) {
00577           case DISPID_STATUSTEXTCHANGE:
00578             _callback->StatusTextChange((BStr)Variant(pDispParams->rgvarg[0]));
00579             break;
00580 
00581           case DISPID_COMMANDSTATECHANGE:
00582             _callback->CommandStateChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
00583             break;
00584 
00585           case DISPID_DOWNLOADBEGIN:
00586             _callback->DownloadBegin();
00587             break;
00588 
00589           case DISPID_PROGRESSCHANGE:   // sent when download progress is updated
00590             _callback->ProgressChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
00591             break;
00592 
00593           case DISPID_WINDOWMOVE:       // sent when main window has been moved
00594             _callback->WindowMove();
00595             break;
00596 
00597           case DISPID_WINDOWRESIZE:     // sent when main window has been sized
00598             _callback->WindowResize();
00599             break;
00600 
00601           case DISPID_WINDOWACTIVATE:   // sent when main window has been activated
00602             _callback->WindowActivate();
00603             break;
00604 
00605           case DISPID_PROPERTYCHANGE:   // sent when the PutProperty method is called
00606             _callback->PropertyChange((BStr)Variant(pDispParams->rgvarg[0]));
00607             break;
00608 
00609           case DISPID_TITLECHANGE:      // sent when the document title changes
00610             _callback->TitleChange((BStr)Variant(pDispParams->rgvarg[0]));
00611             break;
00612 
00613           case DISPID_TITLEICONCHANGE:  // sent when the top level window icon may have changed.
00614             _callback->TitleIconChange((BStr)Variant(pDispParams->rgvarg[0]));
00615             break;
00616 
00617 
00618             // anything below here is not present in DWebBrowserEvents, only in DWebBrowserEvents2: ->
00619 
00620           case DISPID_FRAMEBEFORENAVIGATE:
00621             if (pDispParams->cArgs != 6)
00622                 return E_INVALIDARG;
00623             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00624                 return E_INVALIDARG;
00625             _callback->FrameBeforeNavigate(
00626                                   (BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
00627                                   (BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
00628                                   (BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
00629             break;
00630 
00631           case DISPID_FRAMENAVIGATECOMPLETE:
00632             if (pDispParams->cArgs != 1)
00633                 return E_INVALIDARG;
00634             _callback->FrameNavigateComplete((BStr)Variant(pDispParams->rgvarg[0]));
00635             break;
00636 
00637           case DISPID_FRAMENEWWINDOW:
00638             if (pDispParams->cArgs != 6)
00639                 return E_INVALIDARG;
00640             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00641                 return E_INVALIDARG;
00642             _callback->FrameNewWindow((BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
00643                                   (BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
00644                                   (BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
00645             break;
00646 
00647           case DISPID_BEFORENAVIGATE2:  // hyperlink clicked on
00648             if (pDispParams->cArgs != 7)
00649                 return E_INVALIDARG;
00650             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00651                 return E_INVALIDARG;
00652             _callback->BeforeNavigate2(Variant(pDispParams->rgvarg[6]),
00653                                   pDispParams->rgvarg[5], &pDispParams->rgvarg[4],
00654                                   pDispParams->rgvarg[3], &pDispParams->rgvarg[2],
00655                                   pDispParams->rgvarg[1], *V_BOOLREF(&pDispParams->rgvarg[0]));
00656             break;
00657 
00658           case DISPID_NEWWINDOW2:       // sent when a new window should be created
00659             if (pDispParams->cArgs != 2)
00660                 return E_INVALIDARG;
00661             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00662                 return E_INVALIDARG;
00663             if (V_VT(&pDispParams->rgvarg[1]) != (VT_DISPATCH|VT_BYREF))
00664                 return E_INVALIDARG;
00665             _callback->NewWindow2(V_DISPATCHREF(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
00666             break;
00667 
00668           case DISPID_NAVIGATECOMPLETE2:// UIActivate new document
00669             if (pDispParams->cArgs != 2)
00670                 return E_INVALIDARG;
00671 
00672              // notify the navigator
00673             NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
00674 
00675             _callback->NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
00676             break;
00677 
00678           case DISPID_ONQUIT:
00679             _callback->OnQuit();
00680             break;
00681 
00682           case DISPID_ONVISIBLE:        // sent when the window goes visible/hidden
00683             if (pDispParams->cArgs != 1)
00684                 return E_INVALIDARG;
00685             _callback->OnVisible(Variant(pDispParams->rgvarg[0]));
00686             break;
00687 
00688           case DISPID_ONTOOLBAR:        // sent when the toolbar should be shown/hidden
00689             if (pDispParams->cArgs != 1)
00690                 return E_INVALIDARG;
00691             _callback->OnToolbar(Variant(pDispParams->rgvarg[0]));
00692             break;
00693 
00694           case DISPID_ONMENUBAR:        // sent when the menubar should be shown/hidden
00695             if (pDispParams->cArgs != 1)
00696                 return E_INVALIDARG;
00697             _callback->OnMenubar(Variant(pDispParams->rgvarg[0]));
00698             break;
00699 
00700           case DISPID_ONSTATUSBAR:      // sent when the statusbar should be shown/hidden
00701             if (pDispParams->cArgs != 1)
00702                 return E_INVALIDARG;
00703             _callback->OnStatusbar(Variant(pDispParams->rgvarg[0]));
00704             break;
00705 
00706           case DISPID_ONFULLSCREEN:     // sent when kiosk mode should be on/off
00707             if (pDispParams->cArgs != 1)
00708                 return E_INVALIDARG;
00709             _callback->OnFullscreen(Variant(pDispParams->rgvarg[0]));
00710             break;
00711 
00712           case DISPID_DOCUMENTCOMPLETE:// new document goes ReadyState_Complete
00713             _callback->DocumentComplete();
00714             break;
00715 
00716           case DISPID_DOWNLOADCOMPLETE:
00717             _callback->DownloadComplete();
00718             break;
00719 
00720           case DISPID_ONTHEATERMODE:    // sent when theater mode should be on/off
00721             if (pDispParams->cArgs != 1)
00722                 return E_INVALIDARG;
00723             _callback->OnTheatermode(Variant(pDispParams->rgvarg[0]));
00724             break;
00725 
00726           case DISPID_ONADDRESSBAR:     // sent when the address bar should be shown/hidden
00727             if (pDispParams->cArgs != 1)
00728                 return E_INVALIDARG;
00729             _callback->OnAddressbar(Variant(pDispParams->rgvarg[0]));
00730             break;
00731 
00732           case DISPID_WINDOWSETRESIZABLE:// sent to set the style of the host window frame
00733             if (pDispParams->cArgs != 1)
00734                 return E_INVALIDARG;
00735             _callback->WindowSetResizable(Variant(pDispParams->rgvarg[0]));
00736             break;
00737 
00738           case DISPID_WINDOWCLOSING:    // sent before script window.close closes the window
00739             if (pDispParams->cArgs != 2)
00740                 return E_INVALIDARG;
00741             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00742                 return E_INVALIDARG;
00743             _callback->WindowClosing(Variant(pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
00744             break;
00745 
00746           case DISPID_WINDOWSETLEFT:    // sent when the put_left method is called on the WebOC
00747             if (pDispParams->cArgs != 1)
00748                 return E_INVALIDARG;
00749             _callback->WindowSetLeft(Variant(pDispParams->rgvarg[0]));
00750             break;
00751 
00752           case DISPID_WINDOWSETTOP:     // sent when the put_top method is called on the WebOC
00753             if (pDispParams->cArgs != 1)
00754                 return E_INVALIDARG;
00755             _callback->WindowSetTop(Variant(pDispParams->rgvarg[0]));
00756             break;
00757 
00758           case DISPID_WINDOWSETWIDTH:   // sent when the put_width method is called on the WebOC
00759             if (pDispParams->cArgs != 1)
00760                 return E_INVALIDARG;
00761             _callback->WindowSetWidth(Variant(pDispParams->rgvarg[0]));
00762             break;
00763 
00764           case DISPID_WINDOWSETHEIGHT:  // sent when the put_height method is called on the WebOC
00765             if (pDispParams->cArgs != 1)
00766                 return E_INVALIDARG;
00767             _callback->WindowSetHeight(Variant(pDispParams->rgvarg[0]));
00768             break;
00769 
00770           case DISPID_CLIENTTOHOSTWINDOW:// sent during window.open to request conversion of dimensions
00771           {
00772             long cx, cy;
00773             if (pDispParams->cArgs != 2)
00774                 return E_INVALIDARG;
00775             if (V_VT(&pDispParams->rgvarg[0]) != (VT_I4|VT_BYREF))
00776                 return E_INVALIDARG;
00777             if (V_VT(&pDispParams->rgvarg[1]) != (VT_I4|VT_BYREF))
00778                 return E_INVALIDARG;
00779             cx = *V_I4REF(&pDispParams->rgvarg[1]);
00780             cy = *V_I4REF(&pDispParams->rgvarg[0]);
00781             _callback->ClientToHostWindow(cx, cy);
00782             break;
00783           }
00784 
00785           case DISPID_SETSECURELOCKICON:// sent to suggest the appropriate security icon to show
00786             if (pDispParams->cArgs != 1)
00787                 return E_INVALIDARG;
00788             _callback->SetSecureLockIcon(Variant(pDispParams->rgvarg[0]));
00789             break;
00790 
00791           case DISPID_FILEDOWNLOAD: {   // Fired to indicate the File Download dialog is opening
00792             if (pDispParams->cArgs != 1)    //@@ every time 2 ?!
00793                 return E_INVALIDARG;
00794             Variant var(pDispParams->rgvarg[0]);
00795             _callback->FileDownload(var);}
00796             break;
00797 
00798           case DISPID_NAVIGATEERROR:    // Fired to indicate the a binding error has occured
00799             if (pDispParams->cArgs != 5)
00800                 return E_INVALIDARG;
00801             if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
00802                 return E_INVALIDARG;
00803             _callback->NavigateError(Variant(pDispParams->rgvarg[4]), Variant(pDispParams->rgvarg[3]),
00804                                 Variant(pDispParams->rgvarg[2]), Variant(pDispParams->rgvarg[1]),
00805                                 *V_BOOLREF(&pDispParams->rgvarg[0]));
00806             break;
00807 
00808           case DISPID_PRIVACYIMPACTEDSTATECHANGE:// Fired when the user's browsing experience is impacted
00809             if (pDispParams->cArgs != 1)
00810                 return E_INVALIDARG;
00811             _callback->PrivacyImpactedStateChange(Variant(pDispParams->rgvarg[0]));
00812             break;
00813 
00814           default:
00815             return NOERROR;
00816         }
00817 
00818         return S_OK;
00819     }
00820 
00821 protected:
00822     BrowserNavigator& _navigator;
00823 
00824     void NavigateComplete2(IDispatch* pDisp, const Variant& url)
00825     {
00826         String adr = (BStr)url;
00827 
00828         _navigator.navigated(adr);
00829     }
00830 };
00831 
00832 
00834 struct WebChildWindow : public IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> >,
00835                         public DWebBrowserEvents2Impl
00836 {
00837     typedef IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> > super;
00838     typedef DWebBrowserEvents2Impl web_super;
00839 
00840     WebChildWindow(HWND hwnd, const WebChildWndInfo& info);
00841 
00842     static WebChildWindow* create(const FileChildWndInfo& info)
00843     {
00844         ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
00845             WINDOW_CREATOR_INFO(WebChildWindow,WebChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0);
00846 
00847         return static_cast<WebChildWindow*>(child);
00848     }
00849 
00850 
00851      // DWebBrowserEvents2Impl overides ->
00852 
00853     void BeforeNavigate2(IDispatch* pDisp, const Variant& url, const Variant& flags,
00854                             const Variant& targetFrameName, const Variant& postData,
00855                             const Variant& headers, VARIANT_BOOL& cancel)
00856     {
00857         //String adr = (BStr)url;
00858     }
00859 
00860     void NavigateComplete2(IDispatch* pDisp, const Variant& url)
00861     {
00862         web_super::NavigateComplete2(pDisp, url);
00863 
00864         set_url(String(BStr(url)));
00865     }
00866 
00867     void StatusTextChange(const BStr& text)
00868     {
00869         _statusText = text;
00870         SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str());
00871     }
00872 
00873     void ProgressChange(long Progress, long ProgressMax)
00874     {
00875     }
00876 
00877     void WindowMove()
00878     {
00879     }
00880 
00881     void WindowResize()
00882     {
00883     }
00884 
00885     void WindowActivate()
00886     {
00887     }
00888 
00889     void PropertyChange(const BStr& Property)
00890     {
00891         Variant value;
00892         _control->GetProperty(Property, &value);
00893     }
00894 
00895     void CommandStateChange(long command/*CSC_NAVIGATEFORWARD, CSC_NAVIGATEBACK*/, bool enable)
00896     {
00897     }
00898 
00899     void DownloadBegin()
00900     {
00901     }
00902 
00903     void NewWindow2(IDispatch** ppDisp, VARIANT_BOOL& cancel)
00904     {
00905         //*ppDisp = ;
00906         //cancel = TRUE;
00907     }
00908 
00909     void TitleChange(const BStr& text)
00910     {
00911         SetWindowText(_hwnd, String(text));
00912     }
00913 
00914     void TitleIconChange(const BStr& text)
00915     {
00916     }
00917 
00918     void FrameBeforeNavigate(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& cancel)
00919     {
00920     }
00921 
00922     void FrameNavigateComplete(const BStr& url)
00923     {
00924     }
00925 
00926     void FrameNewWindow(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& processed)
00927     {
00928     }
00929 
00930     void OnQuit()
00931     {
00932     }
00933 
00934     void OnVisible(bool Visible)
00935     {
00936     }
00937 
00938     void OnToolbar(bool Visible)
00939     {
00940     }
00941 
00942     void OnMenubar(bool Visible)
00943     {
00944     }
00945 
00946     void OnStatusbar(bool Visible)
00947     {
00948     }
00949 
00950     void OnFullscreen(bool Visible)
00951     {
00952     }
00953 
00954     void DocumentComplete()
00955     {
00956     }
00957 
00958     void OnTheatermode(bool Visible)
00959     {
00960     }
00961 
00962     void OnAddressbar(bool Visible)
00963     {
00964     }
00965 
00966     void WindowSetResizable(bool Visible)
00967     {
00968     }
00969 
00970     void WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL& cancel)
00971     {
00972     }
00973 
00974     void WindowSetLeft(long Left)
00975     {
00976     }
00977 
00978     void WindowSetTop(long Top)
00979     {
00980     }
00981 
00982     void WindowSetWidth(long Width)
00983     {
00984     }
00985 
00986     void WindowSetHeight(long Height)
00987     {
00988     }
00989 
00990     void ClientToHostWindow(long& CX, long& CY)
00991     {
00992     }
00993 
00994     void SetSecureLockIcon(long SecureLockIcon)
00995     {
00996     }
00997 
00998     void FileDownload(Variant& cancel)
00999     {
01000     }
01001 
01002     void NavigateError(IDispatch* pDisp, const Variant& url, const Variant& Frame, const Variant& StatusCode, VARIANT_BOOL& cancel)
01003     {
01004     }
01005 
01006     void PrivacyImpactedStateChange(bool bImpacted)
01007     {
01008     }
01009 
01010 
01011 protected:
01012     BrowserNavigator _navigator;
01013     auto_ptr<EventConnector> _connector;
01014 
01015     LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
01016 
01017     virtual String jump_to_int(LPCTSTR url);
01018 };

Generated on Sat May 26 2012 04:17:33 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.