urlmon: Fix return value from QueryService.
[wine.git] / dlls / mshtml / oleobj.c
blob8a7bddc5ea0863157e2951b9ede596ff171690df
1 /*
2 * Copyright 2005 Jacek Caban
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
22 #include <stdio.h>
24 #define COBJMACROS
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "shlguid.h"
31 #include "mshtmdid.h"
32 #include "idispids.h"
34 #include "wine/debug.h"
36 #include "mshtml_private.h"
37 #include "initguid.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
41 DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
42 #define DOCHOST_DOCCANNAVIGATE 0
44 /**********************************************************
45 * IOleObject implementation
48 #define OLEOBJ_THIS(iface) DEFINE_THIS(HTMLDocument, OleObject, iface)
50 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
52 HTMLDocument *This = OLEOBJ_THIS(iface);
53 return htmldoc_query_interface(This, riid, ppv);
56 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
58 HTMLDocument *This = OLEOBJ_THIS(iface);
59 return htmldoc_addref(This);
62 static ULONG WINAPI OleObject_Release(IOleObject *iface)
64 HTMLDocument *This = OLEOBJ_THIS(iface);
65 return htmldoc_release(This);
68 static void update_hostinfo(HTMLDocumentObj *This, DOCHOSTUIINFO *hostinfo)
70 nsIScrollable *scrollable;
71 nsresult nsres;
73 if(!This->nscontainer)
74 return;
76 nsres = nsIWebBrowser_QueryInterface(This->nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
77 if(NS_SUCCEEDED(nsres)) {
78 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_Y,
79 (hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO) ? Scrollbar_Never : Scrollbar_Always);
80 if(NS_FAILED(nsres))
81 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
83 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_X,
84 hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO ? Scrollbar_Never : Scrollbar_Auto);
85 if(NS_FAILED(nsres))
86 ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
88 nsIScrollable_Release(scrollable);
89 }else {
90 ERR("Could not get nsIScrollable: %08x\n", nsres);
94 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
96 HTMLDocument *This = OLEOBJ_THIS(iface);
97 IOleCommandTarget *cmdtrg = NULL;
98 IOleWindow *ole_window;
99 BOOL hostui_setup;
100 VARIANT silent;
101 HWND hwnd;
102 HRESULT hres;
104 TRACE("(%p)->(%p)\n", This, pClientSite);
106 if(pClientSite == This->doc_obj->client)
107 return S_OK;
109 if(This->doc_obj->client) {
110 IOleClientSite_Release(This->doc_obj->client);
111 This->doc_obj->client = NULL;
112 This->doc_obj->usermode = UNKNOWN_USERMODE;
115 if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) {
116 IDocHostUIHandler_Release(This->doc_obj->hostui);
117 This->doc_obj->hostui = NULL;
120 memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO));
122 if(!pClientSite)
123 return S_OK;
125 IOleClientSite_AddRef(pClientSite);
126 This->doc_obj->client = pClientSite;
128 hostui_setup = This->doc_obj->hostui_setup;
130 if(!This->doc_obj->hostui) {
131 IDocHostUIHandler *uihandler;
133 This->doc_obj->custom_hostui = FALSE;
135 hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler);
136 if(SUCCEEDED(hres))
137 This->doc_obj->hostui = uihandler;
140 if(This->doc_obj->hostui) {
141 DOCHOSTUIINFO hostinfo;
142 LPOLESTR key_path = NULL, override_key_path = NULL;
143 IDocHostUIHandler2 *uihandler2;
145 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
146 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
147 hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo);
148 if(SUCCEEDED(hres)) {
149 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
150 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
151 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
152 update_hostinfo(This->doc_obj, &hostinfo);
153 This->doc_obj->hostinfo = hostinfo;
156 if(!hostui_setup) {
157 hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0);
158 if(hres == S_OK && key_path) {
159 if(key_path[0]) {
160 /* FIXME: use key_path */
161 TRACE("key_path = %s\n", debugstr_w(key_path));
163 CoTaskMemFree(key_path);
166 hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2,
167 (void**)&uihandler2);
168 if(SUCCEEDED(hres)) {
169 hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0);
170 if(hres == S_OK && override_key_path && override_key_path[0]) {
171 if(override_key_path[0]) {
172 /*FIXME: use override_key_path */
173 TRACE("override_key_path = %s\n", debugstr_w(override_key_path));
175 CoTaskMemFree(override_key_path);
177 IDocHostUIHandler2_Release(uihandler2);
180 This->doc_obj->hostui_setup = TRUE;
184 /* Native calls here GetWindow. What is it for?
185 * We don't have anything to do with it here (yet). */
186 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window);
187 if(SUCCEEDED(hres)) {
188 IOleWindow_GetWindow(ole_window, &hwnd);
189 IOleWindow_Release(ole_window);
192 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
193 if(SUCCEEDED(hres)) {
194 VARIANT var;
195 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
197 if(!hostui_setup) {
198 V_VT(&var) = VT_UNKNOWN;
199 V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window);
200 IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL);
203 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
205 V_VT(&var) = VT_I4;
206 V_I4(&var) = 0;
207 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX,
208 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
209 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS,
210 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
212 IOleCommandTarget_Release(cmdtrg);
215 if(This->doc_obj->usermode == UNKNOWN_USERMODE)
216 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERMODE);
218 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
220 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent);
221 if(SUCCEEDED(hres)) {
222 if(V_VT(&silent) != VT_BOOL)
223 WARN("V_VT(silent) = %d\n", V_VT(&silent));
224 else if(V_BOOL(&silent))
225 FIXME("silent == true\n");
228 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERAGENT);
229 IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_PALETTE);
231 return S_OK;
234 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
236 HTMLDocument *This = OLEOBJ_THIS(iface);
238 TRACE("(%p)->(%p)\n", This, ppClientSite);
240 if(!ppClientSite)
241 return E_INVALIDARG;
243 if(This->doc_obj->client)
244 IOleClientSite_AddRef(This->doc_obj->client);
245 *ppClientSite = This->doc_obj->client;
247 return S_OK;
250 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
252 HTMLDocument *This = OLEOBJ_THIS(iface);
253 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
254 return E_NOTIMPL;
257 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
259 HTMLDocument *This = OLEOBJ_THIS(iface);
261 TRACE("(%p)->(%08x)\n", This, dwSaveOption);
263 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
264 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
266 if(This->doc_obj->in_place_active)
267 IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
269 HTMLDocument_LockContainer(This->doc_obj, FALSE);
271 if(This->advise_holder)
272 IOleAdviseHolder_SendOnClose(This->advise_holder);
274 return S_OK;
277 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
279 HTMLDocument *This = OLEOBJ_THIS(iface);
280 FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk);
281 return E_NOTIMPL;
284 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
286 HTMLDocument *This = OLEOBJ_THIS(iface);
287 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
288 return E_NOTIMPL;
291 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
292 DWORD dwReserved)
294 HTMLDocument *This = OLEOBJ_THIS(iface);
295 FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved);
296 return E_NOTIMPL;
299 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
301 HTMLDocument *This = OLEOBJ_THIS(iface);
302 FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject);
303 return E_NOTIMPL;
306 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
307 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
309 HTMLDocument *This = OLEOBJ_THIS(iface);
310 IOleDocumentSite *pDocSite;
311 HRESULT hres;
313 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
315 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
316 FIXME("iVerb = %d not supported\n", iVerb);
317 return E_NOTIMPL;
320 if(!pActiveSite)
321 pActiveSite = This->doc_obj->client;
323 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
324 if(SUCCEEDED(hres)) {
325 HTMLDocument_LockContainer(This->doc_obj, TRUE);
327 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
328 hres = IOleDocumentSite_ActivateMe(pDocSite, DOCVIEW(This));
329 IOleDocumentSite_Release(pDocSite);
330 }else {
331 hres = IOleDocumentView_UIActivate(DOCVIEW(This), TRUE);
332 if(SUCCEEDED(hres)) {
333 if(lprcPosRect) {
334 RECT rect; /* We need to pass rect as not const pointer */
335 rect = *lprcPosRect;
336 IOleDocumentView_SetRect(DOCVIEW(This), &rect);
338 IOleDocumentView_Show(DOCVIEW(This), TRUE);
342 return hres;
345 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
347 HTMLDocument *This = OLEOBJ_THIS(iface);
348 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
349 return E_NOTIMPL;
352 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
354 HTMLDocument *This = OLEOBJ_THIS(iface);
355 FIXME("(%p)\n", This);
356 return E_NOTIMPL;
359 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
361 HTMLDocument *This = OLEOBJ_THIS(iface);
362 FIXME("(%p)\n", This);
363 return E_NOTIMPL;
366 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
368 HTMLDocument *This = OLEOBJ_THIS(iface);
370 TRACE("(%p)->(%p)\n", This, pClsid);
372 if(!pClsid)
373 return E_INVALIDARG;
375 *pClsid = CLSID_HTMLDocument;
376 return S_OK;
379 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
381 HTMLDocument *This = OLEOBJ_THIS(iface);
382 FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType);
383 return E_NOTIMPL;
386 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
388 HTMLDocument *This = OLEOBJ_THIS(iface);
389 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
390 return E_NOTIMPL;
393 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
395 HTMLDocument *This = OLEOBJ_THIS(iface);
396 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
397 return E_NOTIMPL;
400 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
402 HTMLDocument *This = OLEOBJ_THIS(iface);
403 TRACE("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
405 if(!pdwConnection)
406 return E_INVALIDARG;
408 if(!pAdvSink) {
409 *pdwConnection = 0;
410 return E_INVALIDARG;
413 if(!This->advise_holder) {
414 CreateOleAdviseHolder(&This->advise_holder);
415 if(!This->advise_holder)
416 return E_OUTOFMEMORY;
419 return IOleAdviseHolder_Advise(This->advise_holder, pAdvSink, pdwConnection);
422 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
424 HTMLDocument *This = OLEOBJ_THIS(iface);
425 TRACE("(%p)->(%d)\n", This, dwConnection);
427 if(!This->advise_holder)
428 return OLE_E_NOCONNECTION;
430 return IOleAdviseHolder_Unadvise(This->advise_holder, dwConnection);
433 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
435 HTMLDocument *This = OLEOBJ_THIS(iface);
437 if(!This->advise_holder) {
438 *ppenumAdvise = NULL;
439 return S_OK;
442 return IOleAdviseHolder_EnumAdvise(This->advise_holder, ppenumAdvise);
445 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
447 HTMLDocument *This = OLEOBJ_THIS(iface);
448 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
449 return E_NOTIMPL;
452 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
454 HTMLDocument *This = OLEOBJ_THIS(iface);
455 FIXME("(%p)->(%p)\n", This, pLogpal);
456 return E_NOTIMPL;
459 #undef OLEPBJ_THIS
461 static const IOleObjectVtbl OleObjectVtbl = {
462 OleObject_QueryInterface,
463 OleObject_AddRef,
464 OleObject_Release,
465 OleObject_SetClientSite,
466 OleObject_GetClientSite,
467 OleObject_SetHostNames,
468 OleObject_Close,
469 OleObject_SetMoniker,
470 OleObject_GetMoniker,
471 OleObject_InitFromData,
472 OleObject_GetClipboardData,
473 OleObject_DoVerb,
474 OleObject_EnumVerbs,
475 OleObject_Update,
476 OleObject_IsUpToDate,
477 OleObject_GetUserClassID,
478 OleObject_GetUserType,
479 OleObject_SetExtent,
480 OleObject_GetExtent,
481 OleObject_Advise,
482 OleObject_Unadvise,
483 OleObject_EnumAdvise,
484 OleObject_GetMiscStatus,
485 OleObject_SetColorScheme
488 /**********************************************************
489 * IOleDocument implementation
492 #define OLEDOC_THIS(iface) DEFINE_THIS(HTMLDocument, OleDocument, iface)
494 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppv)
496 HTMLDocument *This = OLEDOC_THIS(iface);
497 return htmldoc_query_interface(This, riid, ppv);
500 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
502 HTMLDocument *This = OLEDOC_THIS(iface);
503 return htmldoc_addref(This);
506 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
508 HTMLDocument *This = OLEDOC_THIS(iface);
509 return htmldoc_release(This);
512 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
513 DWORD dwReserved, IOleDocumentView **ppView)
515 HTMLDocument *This = OLEDOC_THIS(iface);
516 HRESULT hres;
518 TRACE("(%p)->(%p %p %d %p)\n", This, pIPSite, pstm, dwReserved, ppView);
520 if(!ppView)
521 return E_INVALIDARG;
523 /* FIXME:
524 * Windows implementation creates new IOleDocumentView when function is called for the
525 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
526 * if the application uses returned interfaces, passed to ActivateMe or returned by
527 * QueryInterface, so there is no reason to create new interface. This needs more testing.
530 if(pIPSite) {
531 hres = IOleDocumentView_SetInPlaceSite(DOCVIEW(This), pIPSite);
532 if(FAILED(hres))
533 return hres;
536 if(pstm)
537 FIXME("pstm is not supported\n");
539 IOleDocumentView_AddRef(DOCVIEW(This));
540 *ppView = DOCVIEW(This);
541 return S_OK;
544 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
546 HTMLDocument *This = OLEDOC_THIS(iface);
547 FIXME("(%p)->(%p)\n", This, pdwStatus);
548 return E_NOTIMPL;
551 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
552 IOleDocumentView **ppView)
554 HTMLDocument *This = OLEDOC_THIS(iface);
555 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
556 return E_NOTIMPL;
559 #undef OLEDOC_THIS
561 static const IOleDocumentVtbl OleDocumentVtbl = {
562 OleDocument_QueryInterface,
563 OleDocument_AddRef,
564 OleDocument_Release,
565 OleDocument_CreateView,
566 OleDocument_GetDocMiscStatus,
567 OleDocument_EnumViews
570 /**********************************************************
571 * IOleControl implementation
574 #define CONTROL_THIS(iface) DEFINE_THIS(HTMLDocument, OleControl, iface)
576 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
578 HTMLDocument *This = CONTROL_THIS(iface);
579 return htmldoc_query_interface(This, riid, ppv);
582 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
584 HTMLDocument *This = CONTROL_THIS(iface);
585 return htmldoc_addref(This);
588 static ULONG WINAPI OleControl_Release(IOleControl *iface)
590 HTMLDocument *This = CONTROL_THIS(iface);
591 return htmldoc_release(This);
594 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
596 HTMLDocument *This = CONTROL_THIS(iface);
597 FIXME("(%p)->(%p)\n", This, pCI);
598 return E_NOTIMPL;
601 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
603 HTMLDocument *This = CONTROL_THIS(iface);
604 FIXME("(%p)->(%p)\n", This, pMsg);
605 return E_NOTIMPL;
608 HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
610 IDispatch *disp = NULL;
611 DISPPARAMS dispparams = {NULL, 0};
612 UINT err;
613 HRESULT hres;
615 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
616 if(FAILED(hres)) {
617 TRACE("Could not get IDispatch\n");
618 return hres;
621 VariantInit(res);
623 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
624 DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
626 IDispatch_Release(disp);
628 return hres;
631 static HRESULT on_change_dlcontrol(HTMLDocument *This)
633 VARIANT res;
634 HRESULT hres;
636 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_DLCONTROL, &res);
637 if(SUCCEEDED(hres))
638 FIXME("unsupported dlcontrol %08x\n", V_I4(&res));
640 return S_OK;
643 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
645 HTMLDocument *This = CONTROL_THIS(iface);
646 IOleClientSite *client;
647 VARIANT res;
648 HRESULT hres;
650 client = This->doc_obj->client;
651 if(!client) {
652 TRACE("client = NULL\n");
653 return S_OK;
656 switch(dispID) {
657 case DISPID_AMBIENT_USERMODE:
658 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
659 hres = get_client_disp_property(client, DISPID_AMBIENT_USERMODE, &res);
660 if(FAILED(hres))
661 return S_OK;
663 if(V_VT(&res) == VT_BOOL) {
664 if(V_BOOL(&res)) {
665 This->doc_obj->usermode = BROWSEMODE;
666 }else {
667 FIXME("edit mode is not supported\n");
668 This->doc_obj->usermode = EDITMODE;
670 }else {
671 FIXME("V_VT(res)=%d\n", V_VT(&res));
673 return S_OK;
674 case DISPID_AMBIENT_DLCONTROL:
675 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
676 return on_change_dlcontrol(This);
677 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
678 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
679 on_change_dlcontrol(This);
680 hres = get_client_disp_property(client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
681 if(FAILED(hres))
682 return S_OK;
684 if(V_VT(&res) == VT_BOOL) {
685 if(V_BOOL(&res)) {
686 FIXME("offline connection is not supported\n");
687 hres = E_FAIL;
689 }else {
690 FIXME("V_VT(res)=%d\n", V_VT(&res));
692 return S_OK;
693 case DISPID_AMBIENT_SILENT:
694 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
695 on_change_dlcontrol(This);
696 hres = get_client_disp_property(client, DISPID_AMBIENT_SILENT, &res);
697 if(FAILED(hres))
698 return S_OK;
700 if(V_VT(&res) == VT_BOOL) {
701 if(V_BOOL(&res)) {
702 FIXME("silent mode is not supported\n");
703 hres = E_FAIL;
705 }else {
706 FIXME("V_VT(res)=%d\n", V_VT(&res));
708 return S_OK;
709 case DISPID_AMBIENT_USERAGENT:
710 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
711 hres = get_client_disp_property(client, DISPID_AMBIENT_USERAGENT, &res);
712 if(FAILED(hres))
713 return S_OK;
715 FIXME("not supported AMBIENT_USERAGENT\n");
716 hres = E_FAIL;
717 return S_OK;
718 case DISPID_AMBIENT_PALETTE:
719 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
720 hres = get_client_disp_property(client, DISPID_AMBIENT_PALETTE, &res);
721 if(FAILED(hres))
722 return S_OK;
724 FIXME("not supported AMBIENT_PALETTE\n");
725 hres = E_FAIL;
726 return S_OK;
729 FIXME("(%p) unsupported dispID=%d\n", This, dispID);
730 return E_FAIL;
733 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
735 HTMLDocument *This = CONTROL_THIS(iface);
736 FIXME("(%p)->(%x)\n", This, bFreeze);
737 return E_NOTIMPL;
740 #undef CONTROL_THIS
742 static const IOleControlVtbl OleControlVtbl = {
743 OleControl_QueryInterface,
744 OleControl_AddRef,
745 OleControl_Release,
746 OleControl_GetControlInfo,
747 OleControl_OnMnemonic,
748 OleControl_OnAmbientPropertyChange,
749 OleControl_FreezeEvents
752 /**********************************************************
753 * IObjectWithSite implementation
756 #define OBJSITE_THIS(iface) DEFINE_THIS(HTMLDocument, ObjectWithSite, iface)
758 static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
760 HTMLDocument *This = OBJSITE_THIS(iface);
761 return htmldoc_query_interface(This, riid, ppv);
764 static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface)
766 HTMLDocument *This = OBJSITE_THIS(iface);
767 return htmldoc_addref(This);
770 static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface)
772 HTMLDocument *This = OBJSITE_THIS(iface);
773 return htmldoc_release(This);
776 static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite)
778 HTMLDocument *This = OBJSITE_THIS(iface);
779 FIXME("(%p)->(%p)\n", This, pUnkSite);
780 return E_NOTIMPL;
783 static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite* iface, REFIID riid, PVOID *ppvSite)
785 HTMLDocument *This = OBJSITE_THIS(iface);
786 FIXME("(%p)->(%p)\n", This, ppvSite);
787 return E_NOTIMPL;
790 #undef OBJSITE_THIS
792 static const IObjectWithSiteVtbl ObjectWithSiteVtbl = {
793 ObjectWithSite_QueryInterface,
794 ObjectWithSite_AddRef,
795 ObjectWithSite_Release,
796 ObjectWithSite_SetSite,
797 ObjectWithSite_GetSite
800 static inline HTMLDocument *impl_from_IOleContainer(IOleContainer *iface)
802 return CONTAINING_RECORD(iface, HTMLDocument, IOleContainer_iface);
805 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
807 HTMLDocument *This = impl_from_IOleContainer(iface);
808 return htmldoc_query_interface(This, riid, ppv);
811 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
813 HTMLDocument *This = impl_from_IOleContainer(iface);
814 return htmldoc_addref(This);
817 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
819 HTMLDocument *This = impl_from_IOleContainer(iface);
820 return htmldoc_release(This);
823 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc, LPOLESTR pszDisplayName,
824 ULONG *pchEaten, IMoniker **ppmkOut)
826 HTMLDocument *This = impl_from_IOleContainer(iface);
827 FIXME("(%p)->(%p %s %p %p)\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
828 return E_NOTIMPL;
831 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, IEnumUnknown **ppenum)
833 HTMLDocument *This = impl_from_IOleContainer(iface);
834 FIXME("(%p)->(%x %p)\n", This, grfFlags, ppenum);
835 return E_NOTIMPL;
838 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
840 HTMLDocument *This = impl_from_IOleContainer(iface);
841 FIXME("(%p)->(%x)\n", This, fLock);
842 return E_NOTIMPL;
845 static const IOleContainerVtbl OleContainerVtbl = {
846 OleContainer_QueryInterface,
847 OleContainer_AddRef,
848 OleContainer_Release,
849 OleContainer_ParseDisplayName,
850 OleContainer_EnumObjects,
851 OleContainer_LockContainer
854 void HTMLDocument_LockContainer(HTMLDocumentObj *This, BOOL fLock)
856 IOleContainer *container;
857 HRESULT hres;
859 if(!This->client || This->container_locked == fLock)
860 return;
862 hres = IOleClientSite_GetContainer(This->client, &container);
863 if(SUCCEEDED(hres)) {
864 IOleContainer_LockContainer(container, fLock);
865 This->container_locked = fLock;
866 IOleContainer_Release(container);
870 void HTMLDocument_OleObj_Init(HTMLDocument *This)
872 This->lpOleObjectVtbl = &OleObjectVtbl;
873 This->lpOleDocumentVtbl = &OleDocumentVtbl;
874 This->lpOleControlVtbl = &OleControlVtbl;
875 This->lpObjectWithSiteVtbl = &ObjectWithSiteVtbl;
876 This->IOleContainer_iface.lpVtbl = &OleContainerVtbl;