Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenoleobject.c
Go to the documentation of this file.
00001 /* 00002 * Implementation of IOleObject interfaces for WebBrowser control 00003 * 00004 * - IOleObject 00005 * - IOleInPlaceObject 00006 * - IOleControl 00007 * 00008 * Copyright 2001 John R. Sheets (for CodeWeavers) 00009 * Copyright 2005 Jacek Caban 00010 * 00011 * This library is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU Lesser General Public 00013 * License as published by the Free Software Foundation; either 00014 * version 2.1 of the License, or (at your option) any later version. 00015 * 00016 * This library is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 * Lesser General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Lesser General Public 00022 * License along with this library; if not, write to the Free Software 00023 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00024 */ 00025 00026 #include <string.h> 00027 #include "wine/debug.h" 00028 #include "shdocvw.h" 00029 #include "htiframe.h" 00030 #include "idispids.h" 00031 #include "mshtmdid.h" 00032 00033 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); 00034 00035 /* shlwapi.dll */ 00036 HWND WINAPI SHSetParentHwnd(HWND hWnd, HWND hWndParent); 00037 00038 static ATOM shell_embedding_atom = 0; 00039 00040 static LRESULT resize_window(WebBrowser *This, LONG width, LONG height) 00041 { 00042 if(This->doc_host.hwnd) 00043 SetWindowPos(This->doc_host.hwnd, NULL, 0, 0, width, height, 00044 SWP_NOZORDER | SWP_NOACTIVATE); 00045 00046 return 0; 00047 } 00048 00049 static LRESULT WINAPI shell_embedding_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 00050 { 00051 WebBrowser *This; 00052 00053 static const WCHAR wszTHIS[] = {'T','H','I','S',0}; 00054 00055 if(msg == WM_CREATE) { 00056 This = *(WebBrowser**)lParam; 00057 SetPropW(hwnd, wszTHIS, This); 00058 }else { 00059 This = GetPropW(hwnd, wszTHIS); 00060 } 00061 00062 switch(msg) { 00063 case WM_SIZE: 00064 return resize_window(This, LOWORD(lParam), HIWORD(lParam)); 00065 case WM_DOCHOSTTASK: 00066 return process_dochost_task(&This->doc_host, lParam); 00067 } 00068 00069 return DefWindowProcW(hwnd, msg, wParam, lParam); 00070 } 00071 00072 static void create_shell_embedding_hwnd(WebBrowser *This) 00073 { 00074 IOleInPlaceSite *inplace; 00075 HWND parent = NULL; 00076 HRESULT hres; 00077 00078 static const WCHAR wszShellEmbedding[] = 00079 {'S','h','e','l','l',' ','E','m','b','e','d','d','i','n','g',0}; 00080 00081 if(!shell_embedding_atom) { 00082 static WNDCLASSEXW wndclass = { 00083 sizeof(wndclass), 00084 CS_DBLCLKS, 00085 shell_embedding_proc, 00086 0, 0 /* native uses 8 */, NULL, NULL, NULL, 00087 (HBRUSH)(COLOR_WINDOW + 1), NULL, 00088 wszShellEmbedding, 00089 NULL 00090 }; 00091 wndclass.hInstance = shdocvw_hinstance; 00092 00093 RegisterClassExW(&wndclass); 00094 } 00095 00096 hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace); 00097 if(SUCCEEDED(hres)) { 00098 IOleInPlaceSite_GetWindow(inplace, &parent); 00099 IOleInPlaceSite_Release(inplace); 00100 } 00101 00102 This->doc_host.frame_hwnd = This->shell_embedding_hwnd = CreateWindowExW( 00103 WS_EX_WINDOWEDGE, 00104 wszShellEmbedding, wszShellEmbedding, 00105 WS_CLIPSIBLINGS | WS_CLIPCHILDREN 00106 | (parent ? WS_CHILD | WS_TABSTOP : WS_POPUP | WS_MAXIMIZEBOX), 00107 0, 0, 0, 0, parent, 00108 NULL, shdocvw_hinstance, This); 00109 00110 TRACE("parent=%p hwnd=%p\n", parent, This->shell_embedding_hwnd); 00111 } 00112 00113 static HRESULT activate_inplace(WebBrowser *This, IOleClientSite *active_site) 00114 { 00115 HWND parent_hwnd; 00116 HRESULT hres; 00117 00118 if(This->inplace) 00119 return S_OK; 00120 00121 if(!active_site) 00122 return E_INVALIDARG; 00123 00124 hres = IOleClientSite_QueryInterface(active_site, &IID_IOleInPlaceSite, 00125 (void**)&This->inplace); 00126 if(FAILED(hres)) { 00127 WARN("Could not get IOleInPlaceSite\n"); 00128 return hres; 00129 } 00130 00131 hres = IOleInPlaceSite_CanInPlaceActivate(This->inplace); 00132 if(hres != S_OK) { 00133 WARN("CanInPlaceActivate returned: %08x\n", hres); 00134 IOleInPlaceSite_Release(This->inplace); 00135 return E_FAIL; 00136 } 00137 00138 hres = IOleInPlaceSite_GetWindow(This->inplace, &parent_hwnd); 00139 if(SUCCEEDED(hres)) 00140 SHSetParentHwnd(This->shell_embedding_hwnd, parent_hwnd); 00141 00142 IOleInPlaceSite_OnInPlaceActivate(This->inplace); 00143 00144 This->frameinfo.cb = sizeof(OLEINPLACEFRAMEINFO); 00145 IOleInPlaceSite_GetWindowContext(This->inplace, &This->doc_host.frame, &This->uiwindow, 00146 &This->pos_rect, &This->clip_rect, 00147 &This->frameinfo); 00148 00149 SetWindowPos(This->shell_embedding_hwnd, NULL, 00150 This->pos_rect.left, This->pos_rect.top, 00151 This->pos_rect.right-This->pos_rect.left, 00152 This->pos_rect.bottom-This->pos_rect.top, 00153 SWP_NOZORDER | SWP_SHOWWINDOW); 00154 00155 if(This->client) { 00156 IOleContainer *container; 00157 00158 IOleClientSite_ShowObject(This->client); 00159 00160 hres = IOleClientSite_GetContainer(This->client, &container); 00161 if(SUCCEEDED(hres)) { 00162 if(This->container) 00163 IOleContainer_Release(This->container); 00164 This->container = container; 00165 } 00166 } 00167 00168 if(This->doc_host.frame) 00169 IOleInPlaceFrame_GetWindow(This->doc_host.frame, &This->frame_hwnd); 00170 00171 return S_OK; 00172 } 00173 00174 static HRESULT activate_ui(WebBrowser *This, IOleClientSite *active_site) 00175 { 00176 HRESULT hres; 00177 00178 static const WCHAR wszitem[] = {'i','t','e','m',0}; 00179 00180 if(This->inplace) 00181 { 00182 if(This->shell_embedding_hwnd) 00183 ShowWindow(This->shell_embedding_hwnd, SW_SHOW); 00184 return S_OK; 00185 } 00186 00187 hres = activate_inplace(This, active_site); 00188 if(FAILED(hres)) 00189 return hres; 00190 00191 IOleInPlaceSite_OnUIActivate(This->inplace); 00192 00193 if(This->doc_host.frame) 00194 IOleInPlaceFrame_SetActiveObject(This->doc_host.frame, ACTIVEOBJ(This), wszitem); 00195 if(This->uiwindow) 00196 IOleInPlaceUIWindow_SetActiveObject(This->uiwindow, ACTIVEOBJ(This), wszitem); 00197 00198 if(This->doc_host.frame) 00199 IOleInPlaceFrame_SetMenu(This->doc_host.frame, NULL, NULL, This->shell_embedding_hwnd); 00200 00201 SetFocus(This->shell_embedding_hwnd); 00202 00203 return S_OK; 00204 } 00205 00206 static HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res) 00207 { 00208 IDispatch *disp = NULL; 00209 DISPPARAMS dispparams = {NULL, 0}; 00210 HRESULT hres; 00211 00212 VariantInit(res); 00213 00214 if(!client) 00215 return S_OK; 00216 00217 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp); 00218 if(FAILED(hres)) { 00219 TRACE("Could not get IDispatch\n"); 00220 return hres; 00221 } 00222 00223 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT, 00224 DISPATCH_PROPERTYGET, &dispparams, res, NULL, NULL); 00225 00226 IDispatch_Release(disp); 00227 00228 return hres; 00229 } 00230 00231 static HRESULT on_offlineconnected_change(WebBrowser *This) 00232 { 00233 VARIANT offline; 00234 00235 get_client_disp_property(This->client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline); 00236 00237 if(V_VT(&offline) == VT_BOOL) 00238 IWebBrowser2_put_Offline(WEBBROWSER2(This), V_BOOL(&offline)); 00239 else if(V_VT(&offline) != VT_EMPTY) 00240 WARN("wrong V_VT(silent) %d\n", V_VT(&offline)); 00241 00242 return S_OK; 00243 } 00244 00245 static HRESULT on_silent_change(WebBrowser *This) 00246 { 00247 VARIANT silent; 00248 00249 get_client_disp_property(This->client, DISPID_AMBIENT_SILENT, &silent); 00250 00251 if(V_VT(&silent) == VT_BOOL) 00252 IWebBrowser2_put_Silent(WEBBROWSER2(This), V_BOOL(&silent)); 00253 else if(V_VT(&silent) != VT_EMPTY) 00254 WARN("wrong V_VT(silent) %d\n", V_VT(&silent)); 00255 00256 return S_OK; 00257 } 00258 00259 static void release_client_site(WebBrowser *This) 00260 { 00261 release_dochost_client(&This->doc_host); 00262 00263 if(This->shell_embedding_hwnd) { 00264 DestroyWindow(This->shell_embedding_hwnd); 00265 This->shell_embedding_hwnd = NULL; 00266 } 00267 00268 if(This->inplace) { 00269 IOleInPlaceSite_Release(This->inplace); 00270 This->inplace = NULL; 00271 } 00272 00273 if(This->container) { 00274 IOleContainer_Release(This->container); 00275 This->container = NULL; 00276 } 00277 00278 if(This->uiwindow) { 00279 IOleInPlaceUIWindow_Release(This->uiwindow); 00280 This->uiwindow = NULL; 00281 } 00282 00283 if(This->client) { 00284 IOleClientSite_Release(This->client); 00285 This->client = NULL; 00286 } 00287 } 00288 00289 /********************************************************************** 00290 * Implement the IOleObject interface for the WebBrowser control 00291 */ 00292 00293 #define OLEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleObject, iface) 00294 00295 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv) 00296 { 00297 WebBrowser *This = OLEOBJ_THIS(iface); 00298 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppv); 00299 } 00300 00301 static ULONG WINAPI OleObject_AddRef(IOleObject *iface) 00302 { 00303 WebBrowser *This = OLEOBJ_THIS(iface); 00304 return IWebBrowser_AddRef(WEBBROWSER(This)); 00305 } 00306 00307 static ULONG WINAPI OleObject_Release(IOleObject *iface) 00308 { 00309 WebBrowser *This = OLEOBJ_THIS(iface); 00310 return IWebBrowser_Release(WEBBROWSER(This)); 00311 } 00312 00313 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite) 00314 { 00315 WebBrowser *This = OLEOBJ_THIS(iface); 00316 IDocHostUIHandler *hostui; 00317 IOleContainer *container; 00318 IDispatch *disp; 00319 HRESULT hres; 00320 00321 TRACE("(%p)->(%p)\n", This, pClientSite); 00322 00323 if(This->client == pClientSite) 00324 return S_OK; 00325 00326 release_client_site(This); 00327 00328 if(!pClientSite) { 00329 if(This->doc_host.document) 00330 deactivate_document(&This->doc_host); 00331 return S_OK; 00332 } 00333 00334 IOleClientSite_AddRef(pClientSite); 00335 This->client = pClientSite; 00336 00337 hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch, 00338 (void**)&disp); 00339 if(SUCCEEDED(hres)) 00340 This->doc_host.client_disp = disp; 00341 00342 hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler, 00343 (void**)&hostui); 00344 if(SUCCEEDED(hres)) 00345 This->doc_host.hostui = hostui; 00346 00347 hres = IOleClientSite_GetContainer(This->client, &container); 00348 if(SUCCEEDED(hres)) { 00349 ITargetContainer *target_container; 00350 00351 hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer, 00352 (void**)&target_container); 00353 if(SUCCEEDED(hres)) { 00354 FIXME("Unsupported ITargetContainer\n"); 00355 ITargetContainer_Release(target_container); 00356 } 00357 00358 IOleContainer_Release(container); 00359 } 00360 00361 create_shell_embedding_hwnd(This); 00362 00363 on_offlineconnected_change(This); 00364 on_silent_change(This); 00365 00366 return S_OK; 00367 } 00368 00369 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, LPOLECLIENTSITE *ppClientSite) 00370 { 00371 WebBrowser *This = OLEOBJ_THIS(iface); 00372 00373 TRACE("(%p)->(%p)\n", This, ppClientSite); 00374 00375 if(!ppClientSite) 00376 return E_INVALIDARG; 00377 00378 if(This->client) 00379 IOleClientSite_AddRef(This->client); 00380 *ppClientSite = This->client; 00381 00382 return S_OK; 00383 } 00384 00385 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, 00386 LPCOLESTR szContainerObj) 00387 { 00388 WebBrowser *This = OLEOBJ_THIS(iface); 00389 00390 TRACE("(%p)->(%s, %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj)); 00391 00392 /* We have nothing to do here. */ 00393 return S_OK; 00394 } 00395 00396 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption) 00397 { 00398 WebBrowser *This = OLEOBJ_THIS(iface); 00399 FIXME("(%p)->(%d)\n", This, dwSaveOption); 00400 return E_NOTIMPL; 00401 } 00402 00403 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk) 00404 { 00405 WebBrowser *This = OLEOBJ_THIS(iface); 00406 FIXME("(%p)->(%d, %p)\n", This, dwWhichMoniker, pmk); 00407 return E_NOTIMPL; 00408 } 00409 00410 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, 00411 DWORD dwWhichMoniker, LPMONIKER *ppmk) 00412 { 00413 WebBrowser *This = OLEOBJ_THIS(iface); 00414 FIXME("(%p)->(%d, %d, %p)\n", This, dwAssign, dwWhichMoniker, ppmk); 00415 return E_NOTIMPL; 00416 } 00417 00418 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, LPDATAOBJECT pDataObject, 00419 BOOL fCreation, DWORD dwReserved) 00420 { 00421 WebBrowser *This = OLEOBJ_THIS(iface); 00422 FIXME("(%p)->(%p, %d, %d)\n", This, pDataObject, fCreation, dwReserved); 00423 return E_NOTIMPL; 00424 } 00425 00426 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, 00427 LPDATAOBJECT *ppDataObject) 00428 { 00429 WebBrowser *This = OLEOBJ_THIS(iface); 00430 FIXME("(%p)->(%d, %p)\n", This, dwReserved, ppDataObject); 00431 return E_NOTIMPL; 00432 } 00433 00434 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tagMSG* lpmsg, 00435 LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) 00436 { 00437 WebBrowser *This = OLEOBJ_THIS(iface); 00438 00439 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, 00440 lprcPosRect); 00441 00442 switch (iVerb) 00443 { 00444 case OLEIVERB_SHOW: 00445 TRACE("OLEIVERB_SHOW\n"); 00446 return activate_ui(This, pActiveSite); 00447 case OLEIVERB_UIACTIVATE: 00448 TRACE("OLEIVERB_UIACTIVATE\n"); 00449 return activate_ui(This, pActiveSite); 00450 case OLEIVERB_INPLACEACTIVATE: 00451 TRACE("OLEIVERB_INPLACEACTIVATE\n"); 00452 return activate_inplace(This, pActiveSite); 00453 case OLEIVERB_HIDE: 00454 TRACE("OLEIVERB_HIDE\n"); 00455 if(This->shell_embedding_hwnd) 00456 ShowWindow(This->shell_embedding_hwnd, SW_HIDE); 00457 return S_OK; 00458 default: 00459 FIXME("stub for %d\n", iVerb); 00460 break; 00461 } 00462 00463 return E_NOTIMPL; 00464 } 00465 00466 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb) 00467 { 00468 WebBrowser *This = OLEOBJ_THIS(iface); 00469 TRACE("(%p)->(%p)\n", This, ppEnumOleVerb); 00470 return OleRegEnumVerbs(&CLSID_WebBrowser, ppEnumOleVerb); 00471 } 00472 00473 static HRESULT WINAPI OleObject_Update(IOleObject *iface) 00474 { 00475 WebBrowser *This = OLEOBJ_THIS(iface); 00476 FIXME("(%p)\n", This); 00477 return E_NOTIMPL; 00478 } 00479 00480 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface) 00481 { 00482 WebBrowser *This = OLEOBJ_THIS(iface); 00483 FIXME("(%p)\n", This); 00484 return E_NOTIMPL; 00485 } 00486 00487 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID* pClsid) 00488 { 00489 WebBrowser *This = OLEOBJ_THIS(iface); 00490 FIXME("(%p)->(%p)\n", This, pClsid); 00491 return E_NOTIMPL; 00492 } 00493 00494 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, 00495 LPOLESTR* pszUserType) 00496 { 00497 WebBrowser *This = OLEOBJ_THIS(iface); 00498 TRACE("(%p, %d, %p)\n", This, dwFormOfType, pszUserType); 00499 return OleRegGetUserType(&CLSID_WebBrowser, dwFormOfType, pszUserType); 00500 } 00501 00502 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) 00503 { 00504 WebBrowser *This = OLEOBJ_THIS(iface); 00505 00506 TRACE("(%p)->(%x %p)\n", This, dwDrawAspect, psizel); 00507 00508 /* Tests show that dwDrawAspect is ignored */ 00509 This->extent = *psizel; 00510 return S_OK; 00511 } 00512 00513 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel) 00514 { 00515 WebBrowser *This = OLEOBJ_THIS(iface); 00516 00517 TRACE("(%p)->(%x, %p)\n", This, dwDrawAspect, psizel); 00518 00519 /* Tests show that dwDrawAspect is ignored */ 00520 *psizel = This->extent; 00521 return S_OK; 00522 } 00523 00524 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, 00525 DWORD* pdwConnection) 00526 { 00527 WebBrowser *This = OLEOBJ_THIS(iface); 00528 FIXME("(%p)->(%p, %p)\n", This, pAdvSink, pdwConnection); 00529 return E_NOTIMPL; 00530 } 00531 00532 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection) 00533 { 00534 WebBrowser *This = OLEOBJ_THIS(iface); 00535 FIXME("(%p)->(%d)\n", This, dwConnection); 00536 return E_NOTIMPL; 00537 } 00538 00539 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise) 00540 { 00541 WebBrowser *This = OLEOBJ_THIS(iface); 00542 FIXME("(%p)->(%p)\n", This, ppenumAdvise); 00543 return S_OK; 00544 } 00545 00546 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus) 00547 { 00548 WebBrowser *This = OLEOBJ_THIS(iface); 00549 00550 TRACE("(%p)->(%x, %p)\n", This, dwAspect, pdwStatus); 00551 00552 *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT 00553 |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE; 00554 00555 return S_OK; 00556 } 00557 00558 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE* pLogpal) 00559 { 00560 WebBrowser *This = OLEOBJ_THIS(iface); 00561 FIXME("(%p)->(%p)\n", This, pLogpal); 00562 return E_NOTIMPL; 00563 } 00564 00565 #undef OLEOBJ_THIS 00566 00567 static const IOleObjectVtbl OleObjectVtbl = 00568 { 00569 OleObject_QueryInterface, 00570 OleObject_AddRef, 00571 OleObject_Release, 00572 OleObject_SetClientSite, 00573 OleObject_GetClientSite, 00574 OleObject_SetHostNames, 00575 OleObject_Close, 00576 OleObject_SetMoniker, 00577 OleObject_GetMoniker, 00578 OleObject_InitFromData, 00579 OleObject_GetClipboardData, 00580 OleObject_DoVerb, 00581 OleObject_EnumVerbs, 00582 OleObject_Update, 00583 OleObject_IsUpToDate, 00584 OleObject_GetUserClassID, 00585 OleObject_GetUserType, 00586 OleObject_SetExtent, 00587 OleObject_GetExtent, 00588 OleObject_Advise, 00589 OleObject_Unadvise, 00590 OleObject_EnumAdvise, 00591 OleObject_GetMiscStatus, 00592 OleObject_SetColorScheme 00593 }; 00594 00595 /********************************************************************** 00596 * Implement the IOleInPlaceObject interface 00597 */ 00598 00599 #define INPLACEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceObject, iface) 00600 00601 static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObject *iface, 00602 REFIID riid, LPVOID *ppobj) 00603 { 00604 WebBrowser *This = INPLACEOBJ_THIS(iface); 00605 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj); 00606 } 00607 00608 static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObject *iface) 00609 { 00610 WebBrowser *This = INPLACEOBJ_THIS(iface); 00611 return IWebBrowser_AddRef(WEBBROWSER(This)); 00612 } 00613 00614 static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObject *iface) 00615 { 00616 WebBrowser *This = INPLACEOBJ_THIS(iface); 00617 return IWebBrowser_Release(WEBBROWSER(This)); 00618 } 00619 00620 static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObject *iface, HWND* phwnd) 00621 { 00622 WebBrowser *This = INPLACEOBJ_THIS(iface); 00623 00624 TRACE("(%p)->(%p)\n", This, phwnd); 00625 00626 *phwnd = This->shell_embedding_hwnd; 00627 return S_OK; 00628 } 00629 00630 static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObject *iface, 00631 BOOL fEnterMode) 00632 { 00633 WebBrowser *This = INPLACEOBJ_THIS(iface); 00634 FIXME("(%p)->(%x)\n", This, fEnterMode); 00635 return E_NOTIMPL; 00636 } 00637 00638 static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *iface) 00639 { 00640 WebBrowser *This = INPLACEOBJ_THIS(iface); 00641 FIXME("(%p)\n", This); 00642 00643 if(This->inplace) { 00644 IOleInPlaceSite_Release(This->inplace); 00645 This->inplace = NULL; 00646 } 00647 00648 return S_OK; 00649 } 00650 00651 static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface) 00652 { 00653 WebBrowser *This = INPLACEOBJ_THIS(iface); 00654 FIXME("(%p)\n", This); 00655 return E_NOTIMPL; 00656 } 00657 00658 static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObject *iface, 00659 LPCRECT lprcPosRect, LPCRECT lprcClipRect) 00660 { 00661 WebBrowser *This = INPLACEOBJ_THIS(iface); 00662 00663 TRACE("(%p)->(%p %p)\n", This, lprcPosRect, lprcClipRect); 00664 00665 This->pos_rect = *lprcPosRect; 00666 00667 if(lprcClipRect) 00668 This->clip_rect = *lprcClipRect; 00669 00670 if(This->shell_embedding_hwnd) { 00671 SetWindowPos(This->shell_embedding_hwnd, NULL, 00672 lprcPosRect->left, lprcPosRect->top, 00673 lprcPosRect->right-lprcPosRect->left, 00674 lprcPosRect->bottom-lprcPosRect->top, 00675 SWP_NOZORDER | SWP_NOACTIVATE); 00676 } 00677 00678 return S_OK; 00679 } 00680 00681 static HRESULT WINAPI OleInPlaceObject_ReactivateAndUndo(IOleInPlaceObject *iface) 00682 { 00683 WebBrowser *This = INPLACEOBJ_THIS(iface); 00684 FIXME("(%p)\n", This); 00685 return E_NOTIMPL; 00686 } 00687 00688 #undef INPLACEOBJ_THIS 00689 00690 static const IOleInPlaceObjectVtbl OleInPlaceObjectVtbl = 00691 { 00692 OleInPlaceObject_QueryInterface, 00693 OleInPlaceObject_AddRef, 00694 OleInPlaceObject_Release, 00695 OleInPlaceObject_GetWindow, 00696 OleInPlaceObject_ContextSensitiveHelp, 00697 OleInPlaceObject_InPlaceDeactivate, 00698 OleInPlaceObject_UIDeactivate, 00699 OleInPlaceObject_SetObjectRects, 00700 OleInPlaceObject_ReactivateAndUndo 00701 }; 00702 00703 /********************************************************************** 00704 * Implement the IOleControl interface 00705 */ 00706 00707 #define CONTROL_THIS(iface) DEFINE_THIS(WebBrowser, OleControl, iface) 00708 00709 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, 00710 REFIID riid, LPVOID *ppobj) 00711 { 00712 WebBrowser *This = CONTROL_THIS(iface); 00713 return IWebBrowser_QueryInterface(WEBBROWSER(This), riid, ppobj); 00714 } 00715 00716 static ULONG WINAPI OleControl_AddRef(IOleControl *iface) 00717 { 00718 WebBrowser *This = CONTROL_THIS(iface); 00719 return IWebBrowser_AddRef(WEBBROWSER(This)); 00720 } 00721 00722 static ULONG WINAPI OleControl_Release(IOleControl *iface) 00723 { 00724 WebBrowser *This = CONTROL_THIS(iface); 00725 return IWebBrowser_Release(WEBBROWSER(This)); 00726 } 00727 00728 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, LPCONTROLINFO pCI) 00729 { 00730 WebBrowser *This = CONTROL_THIS(iface); 00731 00732 TRACE("(%p)->(%p)\n", This, pCI); 00733 00734 /* Tests show that this function should be not implemented */ 00735 return E_NOTIMPL; 00736 } 00737 00738 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, struct tagMSG *pMsg) 00739 { 00740 WebBrowser *This = CONTROL_THIS(iface); 00741 FIXME("(%p)->(%p)\n", This, pMsg); 00742 return E_NOTIMPL; 00743 } 00744 00745 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID) 00746 { 00747 WebBrowser *This = CONTROL_THIS(iface); 00748 00749 TRACE("(%p)->(%d)\n", This, dispID); 00750 00751 switch(dispID) { 00752 case DISPID_UNKNOWN: 00753 /* Unknown means multiple properties changed, so check them all. 00754 * BUT the Webbrowser OleControl object doesn't appear to do this. 00755 */ 00756 return S_OK; 00757 case DISPID_AMBIENT_DLCONTROL: 00758 return S_OK; 00759 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED: 00760 return on_offlineconnected_change(This); 00761 case DISPID_AMBIENT_SILENT: 00762 return on_silent_change(This); 00763 } 00764 00765 FIXME("Unknown dispID %d\n", dispID); 00766 return E_NOTIMPL; 00767 } 00768 00769 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze) 00770 { 00771 WebBrowser *This = CONTROL_THIS(iface); 00772 FIXME("(%p)->(%x)\n", This, bFreeze); 00773 return E_NOTIMPL; 00774 } 00775 00776 #undef CONTROL_THIS 00777 00778 static const IOleControlVtbl OleControlVtbl = 00779 { 00780 OleControl_QueryInterface, 00781 OleControl_AddRef, 00782 OleControl_Release, 00783 OleControl_GetControlInfo, 00784 OleControl_OnMnemonic, 00785 OleControl_OnAmbientPropertyChange, 00786 OleControl_FreezeEvents 00787 }; 00788 00789 #define ACTIVEOBJ_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceActiveObject, iface) 00790 00791 static HRESULT WINAPI InPlaceActiveObject_QueryInterface(IOleInPlaceActiveObject *iface, 00792 REFIID riid, void **ppv) 00793 { 00794 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00795 return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv); 00796 } 00797 00798 static ULONG WINAPI InPlaceActiveObject_AddRef(IOleInPlaceActiveObject *iface) 00799 { 00800 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00801 return IWebBrowser2_AddRef(WEBBROWSER2(This)); 00802 } 00803 00804 static ULONG WINAPI InPlaceActiveObject_Release(IOleInPlaceActiveObject *iface) 00805 { 00806 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00807 return IWebBrowser2_Release(WEBBROWSER2(This)); 00808 } 00809 00810 static HRESULT WINAPI InPlaceActiveObject_GetWindow(IOleInPlaceActiveObject *iface, 00811 HWND *phwnd) 00812 { 00813 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00814 return IOleInPlaceObject_GetWindow(INPLACEOBJ(This), phwnd); 00815 } 00816 00817 static HRESULT WINAPI InPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceActiveObject *iface, 00818 BOOL fEnterMode) 00819 { 00820 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00821 return IOleInPlaceObject_ContextSensitiveHelp(INPLACEOBJ(This), fEnterMode); 00822 } 00823 00824 static HRESULT WINAPI InPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface, 00825 LPMSG lpmsg) 00826 { 00827 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00828 FIXME("(%p)->(%p)\n", This, lpmsg); 00829 return E_NOTIMPL; 00830 } 00831 00832 static HRESULT WINAPI InPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface, 00833 BOOL fActivate) 00834 { 00835 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00836 FIXME("(%p)->(%x)\n", This, fActivate); 00837 return E_NOTIMPL; 00838 } 00839 00840 static HRESULT WINAPI InPlaceActiveObject_OnDocWindowActivate(IOleInPlaceActiveObject *iface, 00841 BOOL fActivate) 00842 { 00843 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00844 FIXME("(%p)->(%x)\n", This, fActivate); 00845 return E_NOTIMPL; 00846 } 00847 00848 static HRESULT WINAPI InPlaceActiveObject_ResizeBorder(IOleInPlaceActiveObject *iface, 00849 LPCRECT lprcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow) 00850 { 00851 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00852 FIXME("(%p)->(%p %p %x)\n", This, lprcBorder, pUIWindow, fFrameWindow); 00853 return E_NOTIMPL; 00854 } 00855 00856 static HRESULT WINAPI InPlaceActiveObject_EnableModeless(IOleInPlaceActiveObject *iface, 00857 BOOL fEnable) 00858 { 00859 WebBrowser *This = ACTIVEOBJ_THIS(iface); 00860 FIXME("(%p)->(%x)\n", This, fEnable); 00861 return E_NOTIMPL; 00862 } 00863 00864 #undef ACTIVEOBJ_THIS 00865 00866 static const IOleInPlaceActiveObjectVtbl OleInPlaceActiveObjectVtbl = { 00867 InPlaceActiveObject_QueryInterface, 00868 InPlaceActiveObject_AddRef, 00869 InPlaceActiveObject_Release, 00870 InPlaceActiveObject_GetWindow, 00871 InPlaceActiveObject_ContextSensitiveHelp, 00872 InPlaceActiveObject_TranslateAccelerator, 00873 InPlaceActiveObject_OnFrameWindowActivate, 00874 InPlaceActiveObject_OnDocWindowActivate, 00875 InPlaceActiveObject_ResizeBorder, 00876 InPlaceActiveObject_EnableModeless 00877 }; 00878 00879 #define OLECMD_THIS(iface) DEFINE_THIS(WebBrowser, OleCommandTarget, iface) 00880 00881 static HRESULT WINAPI WBOleCommandTarget_QueryInterface(IOleCommandTarget *iface, 00882 REFIID riid, void **ppv) 00883 { 00884 WebBrowser *This = OLECMD_THIS(iface); 00885 return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppv); 00886 } 00887 00888 static ULONG WINAPI WBOleCommandTarget_AddRef(IOleCommandTarget *iface) 00889 { 00890 WebBrowser *This = OLECMD_THIS(iface); 00891 return IWebBrowser2_AddRef(WEBBROWSER(This)); 00892 } 00893 00894 static ULONG WINAPI WBOleCommandTarget_Release(IOleCommandTarget *iface) 00895 { 00896 WebBrowser *This = OLECMD_THIS(iface); 00897 return IWebBrowser2_Release(WEBBROWSER(This)); 00898 } 00899 00900 static HRESULT WINAPI WBOleCommandTarget_QueryStatus(IOleCommandTarget *iface, 00901 const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) 00902 { 00903 WebBrowser *This = OLECMD_THIS(iface); 00904 IOleCommandTarget *cmdtrg; 00905 HRESULT hres; 00906 00907 TRACE("(%p)->(%s %u %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, 00908 pCmdText); 00909 00910 if(!This->doc_host.document) 00911 return 0x80040104; 00912 00913 /* NOTE: There are probably some commands that we should handle here 00914 * instead of forwarding to document object. */ 00915 00916 hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IOleCommandTarget, (void**)&cmdtrg); 00917 if(FAILED(hres)) 00918 return hres; 00919 00920 hres = IOleCommandTarget_QueryStatus(cmdtrg, pguidCmdGroup, cCmds, prgCmds, pCmdText); 00921 IOleCommandTarget_Release(cmdtrg); 00922 00923 return hres; 00924 } 00925 00926 static HRESULT WINAPI WBOleCommandTarget_Exec(IOleCommandTarget *iface, 00927 const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, 00928 VARIANT *pvaOut) 00929 { 00930 WebBrowser *This = OLECMD_THIS(iface); 00931 FIXME("(%p)->(%s %d %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), nCmdID, 00932 nCmdexecopt, pvaIn, pvaOut); 00933 return E_NOTIMPL; 00934 } 00935 00936 #undef OLECMD_THIS 00937 00938 static const IOleCommandTargetVtbl OleCommandTargetVtbl = { 00939 WBOleCommandTarget_QueryInterface, 00940 WBOleCommandTarget_AddRef, 00941 WBOleCommandTarget_Release, 00942 WBOleCommandTarget_QueryStatus, 00943 WBOleCommandTarget_Exec 00944 }; 00945 00946 void WebBrowser_OleObject_Init(WebBrowser *This) 00947 { 00948 DWORD dpi_x; 00949 DWORD dpi_y; 00950 HDC hdc; 00951 00952 /* default aspect ratio is 96dpi / 96dpi */ 00953 hdc = GetDC(0); 00954 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); 00955 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); 00956 ReleaseDC(0, hdc); 00957 00958 This->lpOleObjectVtbl = &OleObjectVtbl; 00959 This->lpOleInPlaceObjectVtbl = &OleInPlaceObjectVtbl; 00960 This->lpOleControlVtbl = &OleControlVtbl; 00961 This->lpOleInPlaceActiveObjectVtbl = &OleInPlaceActiveObjectVtbl; 00962 This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl; 00963 00964 /* Default size is 50x20 pixels, in himetric units */ 00965 This->extent.cx = MulDiv( 50, 2540, dpi_x ); 00966 This->extent.cy = MulDiv( 20, 2540, dpi_y ); 00967 } 00968 00969 void WebBrowser_OleObject_Destroy(WebBrowser *This) 00970 { 00971 release_client_site(This); 00972 } Generated on Sun May 27 2012 04:26:15 for ReactOS by
1.7.6.1
|