Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenwebbrowser.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
1.7.6.1
|