Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenclient.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2005 Jacek Caban for CodeWeavers 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include <stdio.h> 00020 00021 #include "wine/debug.h" 00022 #include "shdocvw.h" 00023 #include "mshtmdid.h" 00024 #include "idispids.h" 00025 00026 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); 00027 00028 #define CLIENTSITE_THIS(iface) DEFINE_THIS(DocHost, OleClientSite, iface) 00029 00030 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv) 00031 { 00032 DocHost *This = CLIENTSITE_THIS(iface); 00033 00034 *ppv = NULL; 00035 00036 if(IsEqualGUID(&IID_IUnknown, riid)) { 00037 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 00038 *ppv = CLIENTSITE(This); 00039 }else if(IsEqualGUID(&IID_IOleClientSite, riid)) { 00040 TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppv); 00041 *ppv = CLIENTSITE(This); 00042 }else if(IsEqualGUID(&IID_IOleWindow, riid)) { 00043 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv); 00044 *ppv = INPLACESITE(This); 00045 }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) { 00046 TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppv); 00047 *ppv = INPLACESITE(This); 00048 }else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)) { 00049 TRACE("(%p)->(IID_IDocHostUIHandler %p)\n", This, ppv); 00050 *ppv = DOCHOSTUI(This); 00051 }else if(IsEqualGUID(&IID_IDocHostUIHandler2, riid)) { 00052 TRACE("(%p)->(IID_IDocHostUIHandler2 %p)\n", This, ppv); 00053 *ppv = DOCHOSTUI2(This); 00054 }else if(IsEqualGUID(&IID_IOleDocumentSite, riid)) { 00055 TRACE("(%p)->(IID_IOleDocumentSite %p)\n", This, ppv); 00056 *ppv = DOCSITE(This); 00057 }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) { 00058 TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv); 00059 *ppv = OLECMD(This); 00060 }else if(IsEqualGUID(&IID_IDispatch, riid)) { 00061 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); 00062 *ppv = CLDISP(This); 00063 }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) { 00064 TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppv); 00065 *ppv = PROPNOTIF(This); 00066 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { 00067 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); 00068 *ppv = SERVPROV(This); 00069 } 00070 00071 if(*ppv) { 00072 IOleClientSite_AddRef(CLIENTSITE(This)); 00073 return S_OK; 00074 } 00075 00076 WARN("Unsupported interface %s\n", debugstr_guid(riid)); 00077 00078 return E_NOINTERFACE; 00079 } 00080 00081 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface) 00082 { 00083 DocHost *This = CLIENTSITE_THIS(iface); 00084 return IDispatch_AddRef(This->disp); 00085 } 00086 00087 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface) 00088 { 00089 DocHost *This = CLIENTSITE_THIS(iface); 00090 return IDispatch_Release(This->disp); 00091 } 00092 00093 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface) 00094 { 00095 DocHost *This = CLIENTSITE_THIS(iface); 00096 FIXME("(%p)\n", This); 00097 return E_NOTIMPL; 00098 } 00099 00100 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, 00101 DWORD dwWhichMoniker, IMoniker **ppmk) 00102 { 00103 DocHost *This = CLIENTSITE_THIS(iface); 00104 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk); 00105 return E_NOTIMPL; 00106 } 00107 00108 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer) 00109 { 00110 DocHost *This = CLIENTSITE_THIS(iface); 00111 FIXME("(%p)->(%p)\n", This, ppContainer); 00112 return E_NOTIMPL; 00113 } 00114 00115 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface) 00116 { 00117 DocHost *This = CLIENTSITE_THIS(iface); 00118 FIXME("(%p)\n", This); 00119 return E_NOTIMPL; 00120 } 00121 00122 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow) 00123 { 00124 DocHost *This = CLIENTSITE_THIS(iface); 00125 FIXME("(%p)->(%x)\n", This, fShow); 00126 return E_NOTIMPL; 00127 } 00128 00129 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface) 00130 { 00131 DocHost *This = CLIENTSITE_THIS(iface); 00132 FIXME("(%p)\n", This); 00133 return E_NOTIMPL; 00134 } 00135 00136 #undef CLIENTSITE_THIS 00137 00138 static const IOleClientSiteVtbl OleClientSiteVtbl = { 00139 ClientSite_QueryInterface, 00140 ClientSite_AddRef, 00141 ClientSite_Release, 00142 ClientSite_SaveObject, 00143 ClientSite_GetMoniker, 00144 ClientSite_GetContainer, 00145 ClientSite_ShowObject, 00146 ClientSite_OnShowWindow, 00147 ClientSite_RequestNewObjectLayout 00148 }; 00149 00150 #define INPLACESITE_THIS(iface) DEFINE_THIS(DocHost, OleInPlaceSite, iface) 00151 00152 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv) 00153 { 00154 DocHost *This = INPLACESITE_THIS(iface); 00155 return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv); 00156 } 00157 00158 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface) 00159 { 00160 DocHost *This = INPLACESITE_THIS(iface); 00161 return IOleClientSite_AddRef(CLIENTSITE(This)); 00162 } 00163 00164 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface) 00165 { 00166 DocHost *This = INPLACESITE_THIS(iface); 00167 return IOleClientSite_Release(CLIENTSITE(This)); 00168 } 00169 00170 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd) 00171 { 00172 DocHost *This = INPLACESITE_THIS(iface); 00173 00174 TRACE("(%p)->(%p)\n", This, phwnd); 00175 00176 *phwnd = This->hwnd; 00177 return S_OK; 00178 } 00179 00180 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode) 00181 { 00182 DocHost *This = INPLACESITE_THIS(iface); 00183 FIXME("(%p)->(%x)\n", This, fEnterMode); 00184 return E_NOTIMPL; 00185 } 00186 00187 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface) 00188 { 00189 DocHost *This = INPLACESITE_THIS(iface); 00190 00191 TRACE("(%p)\n", This); 00192 00193 /* Nothing to do here */ 00194 return S_OK; 00195 } 00196 00197 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface) 00198 { 00199 DocHost *This = INPLACESITE_THIS(iface); 00200 00201 TRACE("(%p)\n", This); 00202 00203 /* Nothing to do here */ 00204 return S_OK; 00205 } 00206 00207 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface) 00208 { 00209 DocHost *This = INPLACESITE_THIS(iface); 00210 FIXME("(%p)\n", This); 00211 return E_NOTIMPL; 00212 } 00213 00214 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface, 00215 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, 00216 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) 00217 { 00218 DocHost *This = INPLACESITE_THIS(iface); 00219 00220 TRACE("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect, 00221 lprcClipRect, lpFrameInfo); 00222 00223 IOleInPlaceFrame_AddRef(INPLACEFRAME(This)); 00224 *ppFrame = INPLACEFRAME(This); 00225 *ppDoc = NULL; 00226 00227 GetClientRect(This->hwnd, lprcPosRect); 00228 *lprcClipRect = *lprcPosRect; 00229 00230 lpFrameInfo->fMDIApp = FALSE; 00231 lpFrameInfo->hwndFrame = This->frame_hwnd; 00232 lpFrameInfo->haccel = NULL; 00233 lpFrameInfo->cAccelEntries = 0; /* FIXME: should be 5 */ 00234 00235 return S_OK; 00236 } 00237 00238 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent) 00239 { 00240 DocHost *This = INPLACESITE_THIS(iface); 00241 FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy); 00242 return E_NOTIMPL; 00243 } 00244 00245 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable) 00246 { 00247 DocHost *This = INPLACESITE_THIS(iface); 00248 FIXME("(%p)->(%x)\n", This, fUndoable); 00249 return E_NOTIMPL; 00250 } 00251 00252 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface) 00253 { 00254 DocHost *This = INPLACESITE_THIS(iface); 00255 00256 TRACE("(%p)\n", This); 00257 00258 /* Nothing to do here */ 00259 return S_OK; 00260 } 00261 00262 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface) 00263 { 00264 DocHost *This = INPLACESITE_THIS(iface); 00265 FIXME("(%p)\n", This); 00266 return E_NOTIMPL; 00267 } 00268 00269 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface) 00270 { 00271 DocHost *This = INPLACESITE_THIS(iface); 00272 FIXME("(%p)\n", This); 00273 return E_NOTIMPL; 00274 } 00275 00276 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, 00277 LPCRECT lprcPosRect) 00278 { 00279 DocHost *This = INPLACESITE_THIS(iface); 00280 FIXME("(%p)->(%p)\n", This, lprcPosRect); 00281 return E_NOTIMPL; 00282 } 00283 00284 #undef INPLACESITE_THIS 00285 00286 static const IOleInPlaceSiteVtbl OleInPlaceSiteVtbl = { 00287 InPlaceSite_QueryInterface, 00288 InPlaceSite_AddRef, 00289 InPlaceSite_Release, 00290 InPlaceSite_GetWindow, 00291 InPlaceSite_ContextSensitiveHelp, 00292 InPlaceSite_CanInPlaceActivate, 00293 InPlaceSite_OnInPlaceActivate, 00294 InPlaceSite_OnUIActivate, 00295 InPlaceSite_GetWindowContext, 00296 InPlaceSite_Scroll, 00297 InPlaceSite_OnUIDeactivate, 00298 InPlaceSite_OnInPlaceDeactivate, 00299 InPlaceSite_DiscardUndoState, 00300 InPlaceSite_DeactivateAndUndo, 00301 InPlaceSite_OnPosRectChange 00302 }; 00303 00304 #define DOCSITE_THIS(iface) DEFINE_THIS(DocHost, OleDocumentSite, iface) 00305 00306 static HRESULT WINAPI OleDocumentSite_QueryInterface(IOleDocumentSite *iface, 00307 REFIID riid, void **ppv) 00308 { 00309 DocHost *This = DOCSITE_THIS(iface); 00310 return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv); 00311 } 00312 00313 static ULONG WINAPI OleDocumentSite_AddRef(IOleDocumentSite *iface) 00314 { 00315 DocHost *This = DOCSITE_THIS(iface); 00316 return IOleClientSite_AddRef(CLIENTSITE(This)); 00317 } 00318 00319 static ULONG WINAPI OleDocumentSite_Release(IOleDocumentSite *iface) 00320 { 00321 DocHost *This = DOCSITE_THIS(iface); 00322 return IOleClientSite_Release(CLIENTSITE(This)); 00323 } 00324 00325 static HRESULT WINAPI OleDocumentSite_ActivateMe(IOleDocumentSite *iface, 00326 IOleDocumentView *pViewToActivate) 00327 { 00328 DocHost *This = DOCSITE_THIS(iface); 00329 IOleDocument *oledoc; 00330 RECT rect; 00331 HRESULT hres; 00332 00333 TRACE("(%p)->(%p)\n", This, pViewToActivate); 00334 00335 hres = IUnknown_QueryInterface(This->document, &IID_IOleDocument, (void**)&oledoc); 00336 if(FAILED(hres)) 00337 return hres; 00338 00339 IOleDocument_CreateView(oledoc, INPLACESITE(This), NULL, 0, &This->view); 00340 IOleDocument_Release(oledoc); 00341 00342 GetClientRect(This->hwnd, &rect); 00343 IOleDocumentView_SetRect(This->view, &rect); 00344 00345 hres = IOleDocumentView_Show(This->view, TRUE); 00346 00347 return hres; 00348 } 00349 00350 #undef DOCSITE_THIS 00351 00352 static const IOleDocumentSiteVtbl OleDocumentSiteVtbl = { 00353 OleDocumentSite_QueryInterface, 00354 OleDocumentSite_AddRef, 00355 OleDocumentSite_Release, 00356 OleDocumentSite_ActivateMe 00357 }; 00358 00359 #define DISP_THIS(iface) DEFINE_THIS(DocHost, Dispatch, iface) 00360 00361 static HRESULT WINAPI ClDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv) 00362 { 00363 DocHost *This = DISP_THIS(iface); 00364 return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv); 00365 } 00366 00367 static ULONG WINAPI ClDispatch_AddRef(IDispatch *iface) 00368 { 00369 DocHost *This = DISP_THIS(iface); 00370 return IOleClientSite_AddRef(CLIENTSITE(This)); 00371 } 00372 00373 static ULONG WINAPI ClDispatch_Release(IDispatch *iface) 00374 { 00375 DocHost *This = DISP_THIS(iface); 00376 return IOleClientSite_Release(CLIENTSITE(This)); 00377 } 00378 00379 static HRESULT WINAPI ClDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) 00380 { 00381 DocHost *This = DISP_THIS(iface); 00382 00383 TRACE("(%p)->(%p)\n", This, pctinfo); 00384 00385 return E_NOTIMPL; 00386 } 00387 00388 static HRESULT WINAPI ClDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, 00389 ITypeInfo **ppTInfo) 00390 { 00391 DocHost *This = DISP_THIS(iface); 00392 00393 TRACE("(%p)->(%u %d %p)\n", This, iTInfo, lcid, ppTInfo); 00394 00395 return E_NOTIMPL; 00396 } 00397 00398 static HRESULT WINAPI ClDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, 00399 UINT cNames, LCID lcid, DISPID *rgDispId) 00400 { 00401 DocHost *This = DISP_THIS(iface); 00402 00403 TRACE("(%p)->(%s %p %u %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames, 00404 lcid, rgDispId); 00405 00406 return E_NOTIMPL; 00407 } 00408 00409 static const char *debugstr_dispid(DISPID dispid) 00410 { 00411 static char buf[16]; 00412 00413 #define CASE_DISPID(did) case did: return #did 00414 switch(dispid) { 00415 CASE_DISPID(DISPID_AMBIENT_USERMODE); 00416 CASE_DISPID(DISPID_AMBIENT_DLCONTROL); 00417 CASE_DISPID(DISPID_AMBIENT_USERAGENT); 00418 CASE_DISPID(DISPID_AMBIENT_PALETTE); 00419 CASE_DISPID(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); 00420 CASE_DISPID(DISPID_AMBIENT_SILENT); 00421 } 00422 #undef CASE_DISPID 00423 00424 sprintf(buf, "%d", dispid); 00425 return buf; 00426 } 00427 00428 static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, 00429 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 00430 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 00431 { 00432 DocHost *This = DISP_THIS(iface); 00433 00434 TRACE("(%p)->(%s %s %d %04x %p %p %p %p)\n", This, debugstr_dispid(dispIdMember), 00435 debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 00436 00437 switch(dispIdMember) { 00438 case DISPID_AMBIENT_USERMODE: 00439 case DISPID_AMBIENT_DLCONTROL: 00440 case DISPID_AMBIENT_USERAGENT: 00441 case DISPID_AMBIENT_PALETTE: 00442 if(!This->client_disp) 00443 return E_FAIL; 00444 return IDispatch_Invoke(This->client_disp, dispIdMember, riid, lcid, wFlags, 00445 pDispParams, pVarResult, pExcepInfo, puArgErr); 00446 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED: 00447 V_VT(pVarResult) = VT_BOOL; 00448 V_BOOL(pVarResult) = This->offline; 00449 return S_OK; 00450 case DISPID_AMBIENT_SILENT: 00451 V_VT(pVarResult) = VT_BOOL; 00452 V_BOOL(pVarResult) = This->offline; 00453 return S_OK; 00454 } 00455 00456 FIXME("unhandled dispid %d\n", dispIdMember); 00457 return E_NOTIMPL; 00458 } 00459 00460 #undef DISP_THIS 00461 00462 static const IDispatchVtbl DispatchVtbl = { 00463 ClDispatch_QueryInterface, 00464 ClDispatch_AddRef, 00465 ClDispatch_Release, 00466 ClDispatch_GetTypeInfoCount, 00467 ClDispatch_GetTypeInfo, 00468 ClDispatch_GetIDsOfNames, 00469 ClDispatch_Invoke 00470 }; 00471 00472 #define SERVPROV_THIS(iface) DEFINE_THIS(DocHost, ServiceProvider, iface) 00473 00474 static HRESULT WINAPI ClServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, 00475 void **ppv) 00476 { 00477 DocHost *This = SERVPROV_THIS(iface); 00478 return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv); 00479 } 00480 00481 static ULONG WINAPI ClServiceProvider_AddRef(IServiceProvider *iface) 00482 { 00483 DocHost *This = SERVPROV_THIS(iface); 00484 return IOleClientSite_AddRef(CLIENTSITE(This)); 00485 } 00486 00487 static ULONG WINAPI ClServiceProvider_Release(IServiceProvider *iface) 00488 { 00489 DocHost *This = SERVPROV_THIS(iface); 00490 return IOleClientSite_Release(CLIENTSITE(This)); 00491 } 00492 00493 static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, 00494 REFIID riid, void **ppv) 00495 { 00496 DocHost *This = SERVPROV_THIS(iface); 00497 00498 if(IsEqualGUID(&IID_IHlinkFrame, guidService)) { 00499 TRACE("(%p)->(IID_IHlinkFrame %s %p)\n", This, debugstr_guid(riid), ppv); 00500 return IDispatch_QueryInterface(This->disp, riid, ppv); 00501 } 00502 00503 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); 00504 00505 return E_NOINTERFACE; 00506 } 00507 00508 #undef SERVPROV_THIS 00509 00510 static const IServiceProviderVtbl ServiceProviderVtbl = { 00511 ClServiceProvider_QueryInterface, 00512 ClServiceProvider_AddRef, 00513 ClServiceProvider_Release, 00514 ClServiceProvider_QueryService 00515 }; 00516 00517 void DocHost_ClientSite_Init(DocHost *This) 00518 { 00519 This->lpOleClientSiteVtbl = &OleClientSiteVtbl; 00520 This->lpOleInPlaceSiteVtbl = &OleInPlaceSiteVtbl; 00521 This->lpOleDocumentSiteVtbl = &OleDocumentSiteVtbl; 00522 This->lpDispatchVtbl = &DispatchVtbl; 00523 This->lpServiceProviderVtbl = &ServiceProviderVtbl; 00524 00525 This->view = NULL; 00526 } 00527 00528 void DocHost_ClientSite_Release(DocHost *This) 00529 { 00530 if(This->view) 00531 IOleDocumentView_Release(This->view); 00532 } Generated on Sat May 26 2012 04:24:50 for ReactOS by
1.7.6.1
|