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

webbrowser.c
Go to the documentation of this file.
00001 /*
00002  * Implementation of IWebBrowser interface for WebBrowser control
00003  *
00004  * Copyright 2001 John R. Sheets (for CodeWeavers)
00005  * Copyright 2005 Jacek Caban
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include "wine/debug.h"
00023 #include "shdocvw.h"
00024 #include "exdispid.h"
00025 #include "mshtml.h"
00026 
00027 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
00028 
00029 /**********************************************************************
00030  * Implement the IWebBrowser interface
00031  */
00032 
00033 #define WEBBROWSER_THIS(iface) DEFINE_THIS(WebBrowser, WebBrowser2, iface)
00034 
00035 static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, LPVOID *ppv)
00036 {
00037     WebBrowser *This = WEBBROWSER_THIS(iface);
00038 
00039     if (ppv == NULL)
00040         return E_POINTER;
00041     *ppv = NULL;
00042 
00043     if(IsEqualGUID(&IID_IUnknown, riid)) {
00044         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
00045         *ppv = WEBBROWSER(This);
00046     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
00047         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
00048         *ppv = WEBBROWSER(This);
00049     }else if(IsEqualGUID(&IID_IWebBrowser, riid)) {
00050         TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv);
00051         *ppv = WEBBROWSER(This);
00052     }else if(IsEqualGUID(&IID_IWebBrowserApp, riid)) {
00053         TRACE("(%p)->(IID_IWebBrowserApp %p)\n", This, ppv);
00054         *ppv = WEBBROWSER(This);
00055     }else if(IsEqualGUID(&IID_IWebBrowser2, riid)) {
00056         TRACE("(%p)->(IID_IWebBrowser2 %p)\n", This, ppv);
00057         *ppv = WEBBROWSER(This);
00058     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
00059         TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
00060         *ppv = OLEOBJ(This);
00061     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
00062         TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
00063         *ppv = INPLACEOBJ(This);
00064     }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
00065         TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
00066         *ppv = INPLACEOBJ(This);
00067     }else if(IsEqualGUID(&IID_IOleControl, riid)) {
00068         TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
00069         *ppv = CONTROL(This);
00070     }else if(IsEqualGUID(&IID_IPersist, riid)) {
00071         TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
00072         *ppv = PERSTORAGE(This);
00073     }else if(IsEqualGUID(&IID_IPersistStorage, riid)) {
00074         TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
00075         *ppv = PERSTORAGE(This);
00076     }else if(IsEqualGUID(&IID_IPersistMemory, riid)) {
00077         TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
00078         *ppv = PERMEMORY(This);
00079     }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) {
00080         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
00081         *ppv = PERSTRINIT(This);
00082     }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) {
00083         TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
00084         *ppv = CLASSINFO(This);
00085     }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) {
00086         TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
00087         *ppv = CLASSINFO(This);
00088     }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
00089         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
00090         *ppv = CONPTCONT(&This->doc_host.cps);
00091     }else if(IsEqualGUID(&IID_IViewObject, riid)) {
00092         TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv);
00093         *ppv = VIEWOBJ(This);
00094     }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
00095         TRACE("(%p)->(IID_IViewObject2 %p)\n", This, ppv);
00096         *ppv = VIEWOBJ2(This);
00097     }else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) {
00098         TRACE("(%p)->(IID_IOleInPlaceActiveObject %p)\n", This, ppv);
00099         *ppv = ACTIVEOBJ(This);
00100     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
00101         TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv);
00102         *ppv = OLECMD(This);
00103     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
00104         *ppv = SERVPROV(This);
00105         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
00106     }else if(IsEqualGUID(&IID_IDataObject, riid)) {
00107         *ppv = DATAOBJECT(This);
00108         TRACE("(%p)->(IID_IDataObject %p)\n", This, ppv);
00109     }else if(IsEqualGUID(&IID_IQuickActivate, riid)) {
00110         TRACE("(%p)->(IID_IQuickActivate %p) returning NULL\n", This, ppv);
00111         return E_NOINTERFACE;
00112     }else if(IsEqualGUID(&IID_IRunnableObject, riid)) {
00113         TRACE("(%p)->(IID_IRunnableObject %p) returning NULL\n", This, ppv);
00114         return E_NOINTERFACE;
00115     }else if(IsEqualGUID(&IID_IPerPropertyBrowsing, riid)) {
00116         TRACE("(%p)->(IID_IPerPropertyBrowsing %p) returning NULL\n", This, ppv);
00117         return E_NOINTERFACE;
00118     }else if(IsEqualGUID(&IID_IOleCache, riid)) {
00119         TRACE("(%p)->(IID_IOleCache %p) returning NULL\n", This, ppv);
00120         return E_NOINTERFACE;
00121     }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) {
00122         TRACE("(%p)->(IID_IOleInPlaceSite %p) returning NULL\n", This, ppv);
00123         return E_NOINTERFACE;
00124     }else if(IsEqualGUID(&IID_IObjectWithSite, riid)) {
00125         TRACE("(%p)->(IID_IObjectWithSite %p) returning NULL\n", This, ppv);
00126         return E_NOINTERFACE;
00127     }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) {
00128         TRACE("(%p)->(IID_IViewObjectEx %p) returning NULL\n", This, ppv);
00129         return E_NOINTERFACE;
00130     }else if(IsEqualGUID(&IID_IOleLink, riid)) {
00131         TRACE("(%p)->(IID_IOleLink %p) returning NULL\n", This, ppv);
00132         return E_NOINTERFACE;
00133     }else if(IsEqualGUID(&IID_IMarshal, riid)) {
00134         TRACE("(%p)->(IID_IMarshal %p) returning NULL\n", This, ppv);
00135         return E_NOINTERFACE;
00136     }else if(IsEqualGUID(&IID_IStdMarshalInfo, riid)) {
00137         TRACE("(%p)->(IID_IStdMarshalInfo %p) returning NULL\n", This, ppv);
00138         return E_NOINTERFACE;
00139     }else if(HlinkFrame_QI(&This->hlink_frame, riid, ppv)) {
00140         return S_OK;
00141     }
00142 
00143     if(*ppv) {
00144         IUnknown_AddRef((IUnknown*)*ppv);
00145         return S_OK;
00146     }
00147 
00148     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
00149     return E_NOINTERFACE;
00150 }
00151 
00152 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface)
00153 {
00154     WebBrowser *This = WEBBROWSER_THIS(iface);
00155     LONG ref = InterlockedIncrement(&This->ref);
00156     TRACE("(%p) ref=%d\n", This, ref);
00157     return ref;
00158 }
00159 
00160 static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface)
00161 {
00162     WebBrowser *This = WEBBROWSER_THIS(iface);
00163     LONG ref = InterlockedDecrement(&This->ref);
00164 
00165     TRACE("(%p) ref=%d\n", This, ref);
00166 
00167     if(!ref) {
00168         if(This->doc_host.document)
00169             IUnknown_Release(This->doc_host.document);
00170 
00171         DocHost_Release(&This->doc_host);
00172 
00173         WebBrowser_OleObject_Destroy(This);
00174 
00175         heap_free(This);
00176         SHDOCVW_UnlockModule();
00177     }
00178 
00179     return ref;
00180 }
00181 
00182 /* IDispatch methods */
00183 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser2 *iface, UINT *pctinfo)
00184 {
00185     WebBrowser *This = WEBBROWSER_THIS(iface);
00186 
00187     TRACE("(%p)->(%p)\n", This, pctinfo);
00188 
00189     *pctinfo = 1;
00190     return S_OK;
00191 }
00192 
00193 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser2 *iface, UINT iTInfo, LCID lcid,
00194                                      LPTYPEINFO *ppTInfo)
00195 {
00196     WebBrowser *This = WEBBROWSER_THIS(iface);
00197     ITypeInfo *typeinfo;
00198     HRESULT hres;
00199 
00200     TRACE("(%p)->(%d %d %p)\n", This, iTInfo, lcid, ppTInfo);
00201 
00202     hres = get_typeinfo(&typeinfo);
00203     if(FAILED(hres))
00204         return hres;
00205 
00206     ITypeInfo_AddRef(typeinfo);
00207     *ppTInfo = typeinfo;
00208     return S_OK;
00209 }
00210 
00211 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser2 *iface, REFIID riid,
00212                                        LPOLESTR *rgszNames, UINT cNames,
00213                                        LCID lcid, DISPID *rgDispId)
00214 {
00215     WebBrowser *This = WEBBROWSER_THIS(iface);
00216     ITypeInfo *typeinfo;
00217     HRESULT hres;
00218 
00219     TRACE("(%p)->(%s %p %d %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
00220           lcid, rgDispId);
00221 
00222     hres = get_typeinfo(&typeinfo);
00223     if(FAILED(hres))
00224         return hres;
00225 
00226     return ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
00227 }
00228 
00229 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember,
00230                                 REFIID riid, LCID lcid, WORD wFlags,
00231                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
00232                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
00233 {
00234     WebBrowser *This = WEBBROWSER_THIS(iface);
00235     ITypeInfo *typeinfo;
00236     HRESULT hres;
00237 
00238     TRACE("(%p)->(%d %s %d %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
00239             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
00240 
00241     hres = get_typeinfo(&typeinfo);
00242     if(FAILED(hres))
00243         return hres;
00244 
00245     return ITypeInfo_Invoke(typeinfo, WEBBROWSER2(This), dispIdMember, wFlags, pDispParams,
00246                             pVarResult, pExepInfo, puArgErr);
00247 }
00248 
00249 /* IWebBrowser methods */
00250 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
00251 {
00252     WebBrowser *This = WEBBROWSER_THIS(iface);
00253     FIXME("(%p)\n", This);
00254     return E_NOTIMPL;
00255 }
00256 
00257 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
00258 {
00259     WebBrowser *This = WEBBROWSER_THIS(iface);
00260     FIXME("(%p)\n", This);
00261     return E_NOTIMPL;
00262 }
00263 
00264 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser2 *iface)
00265 {
00266     WebBrowser *This = WEBBROWSER_THIS(iface);
00267     TRACE("(%p)\n", This);
00268     return go_home(&This->doc_host);
00269 }
00270 
00271 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser2 *iface)
00272 {
00273     WebBrowser *This = WEBBROWSER_THIS(iface);
00274     FIXME("(%p)\n", This);
00275     return E_NOTIMPL;
00276 }
00277 
00278 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR szUrl,
00279                                   VARIANT *Flags, VARIANT *TargetFrameName,
00280                                   VARIANT *PostData, VARIANT *Headers)
00281 {
00282     WebBrowser *This = WEBBROWSER_THIS(iface);
00283 
00284     TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(szUrl), debugstr_variant(Flags),
00285           debugstr_variant(TargetFrameName), debugstr_variant(PostData),
00286           debugstr_variant(Headers));
00287 
00288     return navigate_url(&This->doc_host, szUrl, Flags, TargetFrameName, PostData, Headers);
00289 }
00290 
00291 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
00292 {
00293     WebBrowser *This = WEBBROWSER_THIS(iface);
00294     FIXME("(%p)\n", This);
00295     return E_NOTIMPL;
00296 }
00297 
00298 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
00299 {
00300     WebBrowser *This = WEBBROWSER_THIS(iface);
00301     FIXME("(%p)->(%s)\n", This, debugstr_variant(Level));
00302     return E_NOTIMPL;
00303 }
00304 
00305 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser2 *iface)
00306 {
00307     WebBrowser *This = WEBBROWSER_THIS(iface);
00308     FIXME("(%p)\n", This);
00309     return S_OK;
00310 }
00311 
00312 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser2 *iface, IDispatch **ppDisp)
00313 {
00314     WebBrowser *This = WEBBROWSER_THIS(iface);
00315 
00316     TRACE("(%p)->(%p)\n", This, ppDisp);
00317 
00318     if(!ppDisp)
00319         return E_POINTER;
00320 
00321     *ppDisp = (IDispatch*)WEBBROWSER2(This);
00322     IDispatch_AddRef(*ppDisp);
00323     return S_OK;
00324 }
00325 
00326 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser2 *iface, IDispatch **ppDisp)
00327 {
00328     WebBrowser *This = WEBBROWSER_THIS(iface);
00329     FIXME("(%p)->(%p)\n", This, ppDisp);
00330     return E_NOTIMPL;
00331 }
00332 
00333 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser2 *iface, IDispatch **ppDisp)
00334 {
00335     WebBrowser *This = WEBBROWSER_THIS(iface);
00336     FIXME("(%p)->(%p)\n", This, ppDisp);
00337     return E_NOTIMPL;
00338 }
00339 
00340 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser2 *iface, IDispatch **ppDisp)
00341 {
00342     WebBrowser *This = WEBBROWSER_THIS(iface);
00343     IDispatch *disp = NULL;
00344 
00345     TRACE("(%p)->(%p)\n", This, ppDisp);
00346 
00347     if(This->doc_host.document) {
00348         HRESULT hres;
00349 
00350         hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IDispatch, (void**)&disp);
00351         if(SUCCEEDED(hres)) {
00352             IDispatch *html_doc;
00353 
00354             /* Some broken apps cast returned IDispatch to IHTMLDocument2
00355              * without QueryInterface call */
00356             hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc);
00357             if(SUCCEEDED(hres)) {
00358                 IDispatch_Release(disp);
00359                 disp = html_doc;
00360             }
00361         }
00362     }
00363 
00364     *ppDisp = disp;
00365     return S_OK;
00366 }
00367 
00368 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
00369 {
00370     WebBrowser *This = WEBBROWSER_THIS(iface);
00371     FIXME("(%p)->(%p)\n", This, pBool);
00372     return E_NOTIMPL;
00373 }
00374 
00375 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser2 *iface, BSTR *Type)
00376 {
00377     WebBrowser *This = WEBBROWSER_THIS(iface);
00378     FIXME("(%p)->(%p)\n", This, Type);
00379     return E_NOTIMPL;
00380 }
00381 
00382 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser2 *iface, LONG *pl)
00383 {
00384     WebBrowser *This = WEBBROWSER_THIS(iface);
00385 
00386     TRACE("(%p)->(%p)\n", This, pl);
00387 
00388     *pl = This->pos_rect.left;
00389     return S_OK;
00390 }
00391 
00392 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser2 *iface, LONG Left)
00393 {
00394     WebBrowser *This = WEBBROWSER_THIS(iface);
00395     RECT rect;
00396 
00397     TRACE("(%p)->(%d)\n", This, Left);
00398 
00399     if(!This->inplace)
00400         return E_UNEXPECTED;
00401 
00402     rect = This->pos_rect;
00403     rect.left = Left;
00404 
00405     /* We don't really change the window position here.
00406      * We just notify the embedder that he should do so. */
00407     return IOleInPlaceSite_OnPosRectChange(This->inplace, &rect);
00408 }
00409 
00410 static HRESULT WINAPI WebBrowser_get_Top(IWebBrowser2 *iface, LONG *pl)
00411 {
00412     WebBrowser *This = WEBBROWSER_THIS(iface);
00413 
00414     TRACE("(%p)->(%p)\n", This, pl);
00415 
00416     *pl = This->pos_rect.top;
00417     return S_OK;
00418 }
00419 
00420 static HRESULT WINAPI WebBrowser_put_Top(IWebBrowser2 *iface, LONG Top)
00421 {
00422     WebBrowser *This = WEBBROWSER_THIS(iface);
00423     RECT rect;
00424 
00425     TRACE("(%p)->(%d)\n", This, Top);
00426 
00427     if(!This->inplace)
00428         return E_UNEXPECTED;
00429 
00430     rect = This->pos_rect;
00431     rect.top = Top;
00432 
00433     /* We don't really change the window position here.
00434      * We just notify the embedder that he should do so. */
00435     return IOleInPlaceSite_OnPosRectChange(This->inplace, &rect);
00436 }
00437 
00438 static HRESULT WINAPI WebBrowser_get_Width(IWebBrowser2 *iface, LONG *pl)
00439 {
00440     WebBrowser *This = WEBBROWSER_THIS(iface);
00441 
00442     TRACE("(%p)->(%p)\n", This, pl);
00443 
00444     *pl = This->pos_rect.right - This->pos_rect.left;
00445     return S_OK;
00446 }
00447 
00448 static HRESULT WINAPI WebBrowser_put_Width(IWebBrowser2 *iface, LONG Width)
00449 {
00450     WebBrowser *This = WEBBROWSER_THIS(iface);
00451     RECT rect;
00452 
00453     TRACE("(%p)->(%d)\n", This, Width);
00454 
00455     if(!This->inplace)
00456         return E_UNEXPECTED;
00457 
00458     rect = This->pos_rect;
00459     rect.right = rect.left+Width;
00460 
00461     /* We don't really change the window size here.
00462      * We just notify the embedder that he should do so. */
00463    return IOleInPlaceSite_OnPosRectChange(This->inplace, &rect);
00464 }
00465 
00466 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser2 *iface, LONG *pl)
00467 {
00468     WebBrowser *This = WEBBROWSER_THIS(iface);
00469 
00470     TRACE("(%p)->(%p)\n", This, pl);
00471 
00472     *pl = This->pos_rect.bottom - This->pos_rect.top;
00473     return S_OK;
00474 }
00475 
00476 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser2 *iface, LONG Height)
00477 {
00478     WebBrowser *This = WEBBROWSER_THIS(iface);
00479     RECT rect;
00480 
00481     TRACE("(%p)->(%d)\n", This, Height);
00482 
00483     if(!This->inplace)
00484         return E_UNEXPECTED;
00485 
00486     rect = This->pos_rect;
00487     rect.bottom = rect.top+Height;
00488 
00489     /* We don't really change the window size here.
00490      * We just notify the embedder that he should do so. */
00491     return IOleInPlaceSite_OnPosRectChange(This->inplace, &rect);
00492 }
00493 
00494 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser2 *iface, BSTR *LocationName)
00495 {
00496     WebBrowser *This = WEBBROWSER_THIS(iface);
00497     FIXME("(%p)->(%p)\n", This, LocationName);
00498     return E_NOTIMPL;
00499 }
00500 
00501 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser2 *iface, BSTR *LocationURL)
00502 {
00503     WebBrowser *This = WEBBROWSER_THIS(iface);
00504 
00505     FIXME("(%p)->(%p)\n", This, LocationURL);
00506 
00507     if(!This->doc_host.url) {
00508         static const WCHAR null_char = 0;
00509         *LocationURL = SysAllocString(&null_char);
00510         return S_FALSE;
00511     }
00512 
00513     *LocationURL = SysAllocString(This->doc_host.url);
00514     return S_OK;
00515 }
00516 
00517 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
00518 {
00519     WebBrowser *This = WEBBROWSER_THIS(iface);
00520 
00521     TRACE("(%p)->(%p)\n", This, pBool);
00522 
00523     *pBool = This->doc_host.busy;
00524     return S_OK;
00525 }
00526 
00527 static HRESULT WINAPI WebBrowser_Quit(IWebBrowser2 *iface)
00528 {
00529     WebBrowser *This = WEBBROWSER_THIS(iface);
00530 
00531     TRACE("(%p)\n", This);
00532 
00533     /* It's a InternetExplorer specific method, we have nothing to do here. */
00534     return E_FAIL;
00535 }
00536 
00537 static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, int *pcy)
00538 {
00539     WebBrowser *This = WEBBROWSER_THIS(iface);
00540     FIXME("(%p)->(%p %p)\n", This, pcx, pcy);
00541     return E_NOTIMPL;
00542 }
00543 
00544 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
00545 {
00546     WebBrowser *This = WEBBROWSER_THIS(iface);
00547     FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(&vtValue));
00548     return E_NOTIMPL;
00549 }
00550 
00551 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
00552 {
00553     WebBrowser *This = WEBBROWSER_THIS(iface);
00554     FIXME("(%p)->(%s %s)\n", This, debugstr_w(szProperty), debugstr_variant(pvtValue));
00555     return E_NOTIMPL;
00556 }
00557 
00558 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
00559 {
00560     static const WCHAR sName[] = {'M','i','c','r','o','s','o','f','t',' ','W','e','b',
00561                                   ' ','B','r','o','w','s','e','r',' ','C','o','n','t','r','o','l',0};
00562     WebBrowser *This = WEBBROWSER_THIS(iface);
00563 
00564     TRACE("(%p)->(%p)\n", This, Name);
00565 
00566     *Name = SysAllocString(sName);
00567 
00568     return S_OK;
00569 }
00570 
00571 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, LONG *pHWND)
00572 {
00573     WebBrowser *This = WEBBROWSER_THIS(iface);
00574 
00575     TRACE("(%p)->(%p)\n", This, pHWND);
00576 
00577     /* WebBrowser control never has a frame window (in opposition to InternetExplorer) */
00578     *pHWND = 0;
00579     return E_FAIL;
00580 }
00581 
00582 static HRESULT WINAPI WebBrowser_get_FullName(IWebBrowser2 *iface, BSTR *FullName)
00583 {
00584     WebBrowser *This = WEBBROWSER_THIS(iface);
00585     FIXME("(%p)->(%p)\n", This, FullName);
00586     return E_NOTIMPL;
00587 }
00588 
00589 static HRESULT WINAPI WebBrowser_get_Path(IWebBrowser2 *iface, BSTR *Path)
00590 {
00591     WebBrowser *This = WEBBROWSER_THIS(iface);
00592     FIXME("(%p)->(%p)\n", This, Path);
00593     return E_NOTIMPL;
00594 }
00595 
00596 static HRESULT WINAPI WebBrowser_get_Visible(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
00597 {
00598     WebBrowser *This = WEBBROWSER_THIS(iface);
00599 
00600     TRACE("(%p)->(%p)\n", This, pBool);
00601 
00602     *pBool = This->visible;
00603     return S_OK;
00604 }
00605 
00606 static HRESULT WINAPI WebBrowser_put_Visible(IWebBrowser2 *iface, VARIANT_BOOL Value)
00607 {
00608     WebBrowser *This = WEBBROWSER_THIS(iface);
00609     VARIANTARG arg;
00610     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00611 
00612     TRACE("(%p)->(%x)\n", This, Value);
00613 
00614     This->visible = Value;
00615 
00616     V_VT(&arg) = VT_BOOL;
00617     V_BOOL(&arg) = Value;
00618     call_sink(This->doc_host.cps.wbe2, DISPID_ONVISIBLE, &dispparams);
00619 
00620     return S_OK;
00621 }
00622 
00623 static HRESULT WINAPI WebBrowser_get_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
00624 {
00625     WebBrowser *This = WEBBROWSER_THIS(iface);
00626 
00627     TRACE("(%p)->(%p)\n", This, pBool);
00628 
00629     *pBool = This->status_bar;
00630     return S_OK;
00631 }
00632 
00633 static HRESULT WINAPI WebBrowser_put_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
00634 {
00635     WebBrowser *This = WEBBROWSER_THIS(iface);
00636     VARIANTARG arg;
00637     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00638 
00639     TRACE("(%p)->(%x)\n", This, Value);
00640 
00641     This->status_bar = Value ? VARIANT_TRUE : VARIANT_FALSE;
00642 
00643     /* In opposition to InternetExplorer, all we should do here is
00644      * inform the embedder about the status bar change. */
00645 
00646     V_VT(&arg) = VT_BOOL;
00647     V_BOOL(&arg) = Value;
00648     call_sink(This->doc_host.cps.wbe2, DISPID_ONSTATUSBAR, &dispparams);
00649 
00650     return S_OK;
00651 }
00652 
00653 static HRESULT WINAPI WebBrowser_get_StatusText(IWebBrowser2 *iface, BSTR *StatusText)
00654 {
00655     WebBrowser *This = WEBBROWSER_THIS(iface);
00656     FIXME("(%p)->(%p)\n", This, StatusText);
00657     return E_NOTIMPL;
00658 }
00659 
00660 static HRESULT WINAPI WebBrowser_put_StatusText(IWebBrowser2 *iface, BSTR StatusText)
00661 {
00662     WebBrowser *This = WEBBROWSER_THIS(iface);
00663     FIXME("(%p)->(%s)\n", This, debugstr_w(StatusText));
00664     return E_NOTIMPL;
00665 }
00666 
00667 static HRESULT WINAPI WebBrowser_get_ToolBar(IWebBrowser2 *iface, int *Value)
00668 {
00669     WebBrowser *This = WEBBROWSER_THIS(iface);
00670 
00671     TRACE("(%p)->(%p)\n", This, Value);
00672 
00673     *Value = This->tool_bar;
00674     return S_OK;
00675 }
00676 
00677 static HRESULT WINAPI WebBrowser_put_ToolBar(IWebBrowser2 *iface, int Value)
00678 {
00679     WebBrowser *This = WEBBROWSER_THIS(iface);
00680     VARIANTARG arg;
00681     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00682 
00683     TRACE("(%p)->(%x)\n", This, Value);
00684 
00685     This->tool_bar = Value ? VARIANT_TRUE : VARIANT_FALSE;
00686 
00687     /* In opposition to InternetExplorer, all we should do here is
00688      * inform the embedder about the tool bar change. */
00689 
00690     V_VT(&arg) = VT_BOOL;
00691     V_BOOL(&arg) = This->tool_bar;
00692     call_sink(This->doc_host.cps.wbe2, DISPID_ONTOOLBAR, &dispparams);
00693 
00694     return S_OK;
00695 }
00696 
00697 static HRESULT WINAPI WebBrowser_get_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
00698 {
00699     WebBrowser *This = WEBBROWSER_THIS(iface);
00700 
00701     TRACE("(%p)->(%p)\n", This, Value);
00702 
00703     *Value = This->menu_bar;
00704     return S_OK;
00705 }
00706 
00707 static HRESULT WINAPI WebBrowser_put_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
00708 {
00709     WebBrowser *This = WEBBROWSER_THIS(iface);
00710     VARIANTARG arg;
00711     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00712 
00713     TRACE("(%p)->(%x)\n", This, Value);
00714 
00715     This->menu_bar = Value ? VARIANT_TRUE : VARIANT_FALSE;
00716 
00717     /* In opposition to InternetExplorer, all we should do here is
00718      * inform the embedder about the menu bar change. */
00719 
00720     V_VT(&arg) = VT_BOOL;
00721     V_BOOL(&arg) = Value;
00722     call_sink(This->doc_host.cps.wbe2, DISPID_ONMENUBAR, &dispparams);
00723 
00724     return S_OK;
00725 }
00726 
00727 static HRESULT WINAPI WebBrowser_get_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL *pbFullScreen)
00728 {
00729     WebBrowser *This = WEBBROWSER_THIS(iface);
00730 
00731     TRACE("(%p)->(%p)\n", This, pbFullScreen);
00732 
00733     *pbFullScreen = This->full_screen;
00734     return S_OK;
00735 }
00736 
00737 static HRESULT WINAPI WebBrowser_put_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL bFullScreen)
00738 {
00739     WebBrowser *This = WEBBROWSER_THIS(iface);
00740     VARIANTARG arg;
00741     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00742 
00743     /* In opposition to InternetExplorer, all we should do here is
00744      * inform the embedder about the fullscreen change. */
00745 
00746     TRACE("(%p)->(%x)\n", This, bFullScreen);
00747 
00748     This->full_screen = bFullScreen ? VARIANT_TRUE : VARIANT_FALSE;
00749 
00750     V_VT(&arg) = VT_BOOL;
00751     V_BOOL(&arg) = bFullScreen;
00752     call_sink(This->doc_host.cps.wbe2, DISPID_ONFULLSCREEN, &dispparams);
00753 
00754     return S_OK;
00755 }
00756 
00757 static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags,
00758         VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
00759 {
00760     WebBrowser *This = WEBBROWSER_THIS(iface);
00761     LPCWSTR url;
00762 
00763     TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_variant(URL), debugstr_variant(Flags),
00764           debugstr_variant(TargetFrameName), debugstr_variant(PostData), debugstr_variant(Headers));
00765 
00766     if(!This->client)
00767         return E_FAIL;
00768 
00769     if(!URL)
00770         return S_OK;
00771 
00772     switch (V_VT(URL))
00773     {
00774     case VT_BSTR:
00775         url = V_BSTR(URL);
00776         break;
00777     case VT_BSTR|VT_BYREF:
00778         url = *V_BSTRREF(URL);
00779         break;
00780     default:
00781         FIXME("Unsupported V_VT(URL) %d\n", V_VT(URL));
00782         return E_INVALIDARG;
00783     }
00784 
00785     return navigate_url(&This->doc_host, url, Flags, TargetFrameName, PostData, Headers);
00786 }
00787 
00788 static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
00789 {
00790     WebBrowser *This = WEBBROWSER_THIS(iface);
00791     FIXME("(%p)->(%d %p)\n", This, cmdID, pcmdf);
00792     return E_NOTIMPL;
00793 }
00794 
00795 static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
00796         OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00797 {
00798     WebBrowser *This = WEBBROWSER_THIS(iface);
00799     FIXME("(%p)->(%d %d %s %p)\n", This, cmdID, cmdexecopt, debugstr_variant(pvaIn), pvaOut);
00800     return E_NOTIMPL;
00801 }
00802 
00803 static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pvaClsid,
00804         VARIANT *pvarShow, VARIANT *pvarSize)
00805 {
00806     WebBrowser *This = WEBBROWSER_THIS(iface);
00807     FIXME("(%p)->(%s %s %s)\n", This, debugstr_variant(pvaClsid), debugstr_variant(pvarShow),
00808           debugstr_variant(pvarSize));
00809     return E_NOTIMPL;
00810 }
00811 
00812 static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
00813 {
00814     WebBrowser *This = WEBBROWSER_THIS(iface);
00815 
00816     TRACE("(%p)->(%p)\n", This, lpReadyState);
00817 
00818     *lpReadyState = This->doc_host.ready_state;
00819     return S_OK;
00820 }
00821 
00822 static HRESULT WINAPI WebBrowser_get_Offline(IWebBrowser2 *iface, VARIANT_BOOL *pbOffline)
00823 {
00824     WebBrowser *This = WEBBROWSER_THIS(iface);
00825 
00826     TRACE("(%p)->(%p)\n", This, pbOffline);
00827 
00828     *pbOffline = This->doc_host.offline;
00829     return S_OK;
00830 }
00831 
00832 static HRESULT WINAPI WebBrowser_put_Offline(IWebBrowser2 *iface, VARIANT_BOOL bOffline)
00833 {
00834     WebBrowser *This = WEBBROWSER_THIS(iface);
00835 
00836     TRACE("(%p)->(%x)\n", This, bOffline);
00837 
00838     This->doc_host.offline = bOffline ? VARIANT_TRUE : VARIANT_FALSE;
00839     return S_OK;
00840 }
00841 
00842 static HRESULT WINAPI WebBrowser_get_Silent(IWebBrowser2 *iface, VARIANT_BOOL *pbSilent)
00843 {
00844     WebBrowser *This = WEBBROWSER_THIS(iface);
00845 
00846     TRACE("(%p)->(%p)\n", This, pbSilent);
00847 
00848     *pbSilent = This->doc_host.silent;
00849     return S_OK;
00850 }
00851 
00852 static HRESULT WINAPI WebBrowser_put_Silent(IWebBrowser2 *iface, VARIANT_BOOL bSilent)
00853 {
00854     WebBrowser *This = WEBBROWSER_THIS(iface);
00855 
00856     TRACE("(%p)->(%x)\n", This, bSilent);
00857 
00858     This->doc_host.silent = bSilent ? VARIANT_TRUE : VARIANT_FALSE;
00859     return S_OK;
00860 }
00861 
00862 static HRESULT WINAPI WebBrowser_get_RegisterAsBrowser(IWebBrowser2 *iface,
00863         VARIANT_BOOL *pbRegister)
00864 {
00865     WebBrowser *This = WEBBROWSER_THIS(iface);
00866 
00867     FIXME("(%p)->(%p)\n", This, pbRegister);
00868 
00869     *pbRegister = This->register_browser;
00870     return S_OK;
00871 }
00872 
00873 static HRESULT WINAPI WebBrowser_put_RegisterAsBrowser(IWebBrowser2 *iface,
00874         VARIANT_BOOL bRegister)
00875 {
00876     WebBrowser *This = WEBBROWSER_THIS(iface);
00877 
00878     FIXME("(%p)->(%x)\n", This, bRegister);
00879 
00880     This->register_browser = bRegister ? VARIANT_TRUE : VARIANT_FALSE;
00881     return S_OK;
00882 }
00883 
00884 static HRESULT WINAPI WebBrowser_get_RegisterAsDropTarget(IWebBrowser2 *iface,
00885         VARIANT_BOOL *pbRegister)
00886 {
00887     WebBrowser *This = WEBBROWSER_THIS(iface);
00888     FIXME("(%p)->(%p)\n", This, pbRegister);
00889     *pbRegister=0;
00890     return S_OK;
00891 }
00892 
00893 static HRESULT WINAPI WebBrowser_put_RegisterAsDropTarget(IWebBrowser2 *iface,
00894         VARIANT_BOOL bRegister)
00895 {
00896     WebBrowser *This = WEBBROWSER_THIS(iface);
00897     FIXME("(%p)->(%x)\n", This, bRegister);
00898     return S_OK;
00899 }
00900 
00901 static HRESULT WINAPI WebBrowser_get_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL *pbRegister)
00902 {
00903     WebBrowser *This = WEBBROWSER_THIS(iface);
00904 
00905     TRACE("(%p)->(%p)\n", This, pbRegister);
00906 
00907     *pbRegister = This->theater_mode;
00908     return S_OK;
00909 }
00910 
00911 static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL bRegister)
00912 {
00913     WebBrowser *This = WEBBROWSER_THIS(iface);
00914     VARIANTARG arg;
00915     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00916 
00917     TRACE("(%p)->(%x)\n", This, bRegister);
00918 
00919     This->theater_mode = bRegister ? VARIANT_TRUE : VARIANT_FALSE;
00920 
00921     /* In opposition to InternetExplorer, all we should do here is
00922      * inform the embedder about the theater mode change. */
00923 
00924     V_VT(&arg) = VT_BOOL;
00925     V_BOOL(&arg) = bRegister;
00926     call_sink(This->doc_host.cps.wbe2, DISPID_ONTHEATERMODE, &dispparams);
00927 
00928     return S_OK;
00929 }
00930 
00931 static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
00932 {
00933     WebBrowser *This = WEBBROWSER_THIS(iface);
00934 
00935     TRACE("(%p)->(%p)\n", This, Value);
00936 
00937     *Value = This->address_bar;
00938     return S_OK;
00939 }
00940 
00941 static HRESULT WINAPI WebBrowser_put_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
00942 {
00943     WebBrowser *This = WEBBROWSER_THIS(iface);
00944     VARIANTARG arg;
00945     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00946 
00947     TRACE("(%p)->(%x)\n", This, Value);
00948 
00949     This->address_bar = Value ? VARIANT_TRUE : VARIANT_FALSE;
00950 
00951     /* In opposition to InternetExplorer, all we should do here is
00952      * inform the embedder about the address bar change. */
00953 
00954     V_VT(&arg) = VT_BOOL;
00955     V_BOOL(&arg) = Value;
00956     call_sink(This->doc_host.cps.wbe2, DISPID_ONADDRESSBAR, &dispparams);
00957 
00958     return S_OK;
00959 }
00960 
00961 static HRESULT WINAPI WebBrowser_get_Resizable(IWebBrowser2 *iface, VARIANT_BOOL *Value)
00962 {
00963     WebBrowser *This = WEBBROWSER_THIS(iface);
00964 
00965     TRACE("(%p)->(%p)\n", This, Value);
00966 
00967     /* It's InternetExplorer object's method. We have nothing to do here. */
00968     return E_NOTIMPL;
00969 }
00970 
00971 static HRESULT WINAPI WebBrowser_put_Resizable(IWebBrowser2 *iface, VARIANT_BOOL Value)
00972 {
00973     WebBrowser *This = WEBBROWSER_THIS(iface);
00974     VARIANTARG arg;
00975     DISPPARAMS dispparams = {&arg, NULL, 1, 0};
00976 
00977     TRACE("(%p)->(%x)\n", This, Value);
00978 
00979     /* In opposition to InternetExplorer, all we should do here is
00980      * inform the embedder about the resizable change. */
00981 
00982     V_VT(&arg) = VT_BOOL;
00983     V_BOOL(&arg) = Value;
00984     call_sink(This->doc_host.cps.wbe2, DISPID_WINDOWSETRESIZABLE, &dispparams);
00985 
00986     return S_OK;
00987 }
00988 
00989 #undef WEBBROWSER_THIS
00990 
00991 static const IWebBrowser2Vtbl WebBrowser2Vtbl =
00992 {
00993     WebBrowser_QueryInterface,
00994     WebBrowser_AddRef,
00995     WebBrowser_Release,
00996     WebBrowser_GetTypeInfoCount,
00997     WebBrowser_GetTypeInfo,
00998     WebBrowser_GetIDsOfNames,
00999     WebBrowser_Invoke,
01000     WebBrowser_GoBack,
01001     WebBrowser_GoForward,
01002     WebBrowser_GoHome,
01003     WebBrowser_GoSearch,
01004     WebBrowser_Navigate,
01005     WebBrowser_Refresh,
01006     WebBrowser_Refresh2,
01007     WebBrowser_Stop,
01008     WebBrowser_get_Application,
01009     WebBrowser_get_Parent,
01010     WebBrowser_get_Container,
01011     WebBrowser_get_Document,
01012     WebBrowser_get_TopLevelContainer,
01013     WebBrowser_get_Type,
01014     WebBrowser_get_Left,
01015     WebBrowser_put_Left,
01016     WebBrowser_get_Top,
01017     WebBrowser_put_Top,
01018     WebBrowser_get_Width,
01019     WebBrowser_put_Width,
01020     WebBrowser_get_Height,
01021     WebBrowser_put_Height,
01022     WebBrowser_get_LocationName,
01023     WebBrowser_get_LocationURL,
01024     WebBrowser_get_Busy,
01025     WebBrowser_Quit,
01026     WebBrowser_ClientToWindow,
01027     WebBrowser_PutProperty,
01028     WebBrowser_GetProperty,
01029     WebBrowser_get_Name,
01030     WebBrowser_get_HWND,
01031     WebBrowser_get_FullName,
01032     WebBrowser_get_Path,
01033     WebBrowser_get_Visible,
01034     WebBrowser_put_Visible,
01035     WebBrowser_get_StatusBar,
01036     WebBrowser_put_StatusBar,
01037     WebBrowser_get_StatusText,
01038     WebBrowser_put_StatusText,
01039     WebBrowser_get_ToolBar,
01040     WebBrowser_put_ToolBar,
01041     WebBrowser_get_MenuBar,
01042     WebBrowser_put_MenuBar,
01043     WebBrowser_get_FullScreen,
01044     WebBrowser_put_FullScreen,
01045     WebBrowser_Navigate2,
01046     WebBrowser_QueryStatusWB,
01047     WebBrowser_ExecWB,
01048     WebBrowser_ShowBrowserBar,
01049     WebBrowser_get_ReadyState,
01050     WebBrowser_get_Offline,
01051     WebBrowser_put_Offline,
01052     WebBrowser_get_Silent,
01053     WebBrowser_put_Silent,
01054     WebBrowser_get_RegisterAsBrowser,
01055     WebBrowser_put_RegisterAsBrowser,
01056     WebBrowser_get_RegisterAsDropTarget,
01057     WebBrowser_put_RegisterAsDropTarget,
01058     WebBrowser_get_TheaterMode,
01059     WebBrowser_put_TheaterMode,
01060     WebBrowser_get_AddressBar,
01061     WebBrowser_put_AddressBar,
01062     WebBrowser_get_Resizable,
01063     WebBrowser_put_Resizable
01064 };
01065 
01066 #define SERVPROV_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface)
01067 /*
01068  *  IServiceProvider interface.
01069  */
01070 static HRESULT WINAPI WebBrowser_IServiceProvider_QueryInterface(IServiceProvider *iface,
01071             REFIID riid, LPVOID *ppv)
01072 {
01073     WebBrowser *This = SERVPROV_THIS(iface);
01074 
01075     if (ppv == NULL)
01076         return E_POINTER;
01077     *ppv = NULL;
01078 
01079     if(IsEqualGUID(&IID_IUnknown, riid)) {
01080         *ppv = WEBBROWSER(This);
01081         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
01082     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
01083         *ppv = WEBBROWSER(This);
01084         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
01085     }
01086 
01087     if(*ppv) {
01088         IUnknown_AddRef((IUnknown*)*ppv);
01089         return S_OK;
01090     }
01091 
01092     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
01093     return E_NOINTERFACE;
01094 }
01095 
01096 static ULONG WINAPI WebBrowser_IServiceProvider_AddRef(IServiceProvider *iface)
01097 {
01098     WebBrowser *This = SERVPROV_THIS(iface);
01099     return IWebBrowser_AddRef(WEBBROWSER(This));
01100 }
01101 
01102 static ULONG WINAPI WebBrowser_IServiceProvider_Release(IServiceProvider *iface)
01103 {
01104     WebBrowser *This = SERVPROV_THIS(iface);
01105     return IWebBrowser_Release(WEBBROWSER(This));
01106 }
01107 
01108 static HRESULT STDMETHODCALLTYPE WebBrowser_IServiceProvider_QueryService(IServiceProvider *iface,
01109             REFGUID guidService, REFIID riid, void **ppv)
01110 {
01111     WebBrowser *This = SERVPROV_THIS(iface);
01112     static const IID IID_IBrowserService2 =
01113         {0x68BD21CC,0x438B,0x11d2,{0xA5,0x60,0x00,0xA0,0xC,0x2D,0xBF,0xE8}};
01114 
01115     if(*ppv)
01116         ppv = NULL;
01117 
01118     if(IsEqualGUID(&IID_IBrowserService2, riid)) {
01119         TRACE("(%p)->(IID_IBrowserService2 return E_FAIL)\n", This);
01120         return E_FAIL;
01121     }
01122 
01123     FIXME("(%p)->(%s, %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
01124 
01125     return E_NOINTERFACE;
01126 }
01127 
01128 #undef SERVPROV_THIS
01129 
01130 static const IServiceProviderVtbl ServiceProviderVtbl =
01131 {
01132     WebBrowser_IServiceProvider_QueryInterface,
01133     WebBrowser_IServiceProvider_AddRef,
01134     WebBrowser_IServiceProvider_Release,
01135     WebBrowser_IServiceProvider_QueryService
01136 };
01137 
01138 #define DOCHOST_THIS(iface) DEFINE_THIS2(WebBrowser,doc_host,iface)
01139 
01140 static void WINAPI DocHostContainer_GetDocObjRect(DocHost* This, RECT* rc)
01141 {
01142     GetClientRect(This->frame_hwnd, rc);
01143 }
01144 
01145 static HRESULT WINAPI DocHostContainer_SetStatusText(DocHost* This, LPCWSTR text)
01146 {
01147     return E_NOTIMPL;
01148 }
01149 
01150 static void WINAPI DocHostContainer_SetURL(DocHost* This, LPCWSTR url)
01151 {
01152 
01153 }
01154 
01155 static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, DWORD cmdid, DWORD execopt, VARIANT *in,
01156         VARIANT *out)
01157 {
01158     WebBrowser *This = DOCHOST_THIS(doc_host);
01159     IOleCommandTarget *cmdtrg = NULL;
01160     HRESULT hres;
01161 
01162     if(This->client) {
01163         hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
01164         if(FAILED(hres))
01165             cmdtrg = NULL;
01166     }
01167 
01168     if(!cmdtrg && This->container) {
01169         hres = IOleContainer_QueryInterface(This->container, &IID_IOleCommandTarget, (void**)&cmdtrg);
01170         if(FAILED(hres))
01171             cmdtrg = NULL;
01172     }
01173 
01174     if(!cmdtrg)
01175         return S_OK;
01176 
01177     hres = IOleCommandTarget_Exec(cmdtrg, cmd_group, cmdid, execopt, in, out);
01178     IOleCommandTarget_Release(cmdtrg);
01179     if(FAILED(hres))
01180         FIXME("Exec failed\n");
01181 
01182     return hres;
01183 }
01184 
01185 #undef DOCHOST_THIS
01186 
01187 static const IDocHostContainerVtbl DocHostContainerVtbl = {
01188     DocHostContainer_GetDocObjRect,
01189     DocHostContainer_SetStatusText,
01190     DocHostContainer_SetURL,
01191     DocHostContainer_exec
01192 };
01193 
01194 static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, void **ppv)
01195 {
01196     WebBrowser *ret;
01197     HRESULT hres;
01198 
01199     TRACE("(%p %s %p) version=%d\n", pOuter, debugstr_guid(riid), ppv, version);
01200 
01201     ret = heap_alloc_zero(sizeof(WebBrowser));
01202 
01203     ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl;
01204     ret->lpServiceProviderVtbl = &ServiceProviderVtbl;
01205     ret->ref = 1;
01206     ret->version = version;
01207 
01208     DocHost_Init(&ret->doc_host, (IDispatch*)WEBBROWSER2(ret), &DocHostContainerVtbl);
01209 
01210     ret->visible = VARIANT_TRUE;
01211     ret->menu_bar = VARIANT_TRUE;
01212     ret->address_bar = VARIANT_TRUE;
01213     ret->status_bar = VARIANT_TRUE;
01214     ret->tool_bar = VARIANT_TRUE;
01215 
01216     WebBrowser_OleObject_Init(ret);
01217     WebBrowser_ViewObject_Init(ret);
01218     WebBrowser_DataObject_Init(ret);
01219     WebBrowser_Persist_Init(ret);
01220     WebBrowser_ClassInfo_Init(ret);
01221 
01222     HlinkFrame_Init(&ret->hlink_frame, (IUnknown*)WEBBROWSER2(ret), &ret->doc_host);
01223 
01224     SHDOCVW_LockModule();
01225 
01226     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
01227 
01228     IWebBrowser2_Release(WEBBROWSER(ret));
01229     return hres;
01230 }
01231 
01232 HRESULT WebBrowserV1_Create(IUnknown *pOuter, REFIID riid, void **ppv)
01233 {
01234     return WebBrowser_Create(1, pOuter, riid, ppv);
01235 }
01236 
01237 HRESULT WebBrowserV2_Create(IUnknown *pOuter, REFIID riid, void **ppv)
01238 {
01239     return WebBrowser_Create(2, pOuter, riid, ppv);
01240 }

Generated on Sat May 26 2012 04:22:35 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.