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

oleobject.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 doxygen 1.7.6.1

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