api-ms-win-core-url-l1-1-0: Add stub dll.
[wine/multimedia.git] / dlls / mshtml / oleobj.c
blob1a123acaec40b78a7eacc7ec864ceb6c7d711bd5
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 "shdeprecated.h"
32 #include "mshtmdid.h"
33 #include "idispids.h"
35 #include "wine/debug.h"
37 #include "mshtml_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
41 #define DOCHOST_DOCCANNAVIGATE 0
43 typedef struct {
44 IEnumUnknown IEnumUnknown_iface;
45 LONG ref;
46 } EnumUnknown;
48 static inline EnumUnknown *impl_from_IEnumUnknown(IEnumUnknown *iface)
50 return CONTAINING_RECORD(iface, EnumUnknown, IEnumUnknown_iface);
53 static HRESULT WINAPI EnumUnknown_QueryInterface(IEnumUnknown *iface, REFIID riid, void **ppv)
55 EnumUnknown *This = impl_from_IEnumUnknown(iface);
57 if(IsEqualGUID(&IID_IUnknown, riid)) {
58 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
59 *ppv = &This->IEnumUnknown_iface;
60 }else if(IsEqualGUID(&IID_IEnumUnknown, riid)) {
61 TRACE("(%p)->(IID_IEnumUnknown %p)\n", This, ppv);
62 *ppv = &This->IEnumUnknown_iface;
63 }else {
64 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
65 *ppv = NULL;
66 return E_NOINTERFACE;
69 IUnknown_AddRef((IUnknown*)*ppv);
70 return S_OK;
73 static ULONG WINAPI EnumUnknown_AddRef(IEnumUnknown *iface)
75 EnumUnknown *This = impl_from_IEnumUnknown(iface);
76 LONG ref = InterlockedIncrement(&This->ref);
78 TRACE("(%p) ref=%d\n", This, ref);
80 return ref;
83 static ULONG WINAPI EnumUnknown_Release(IEnumUnknown *iface)
85 EnumUnknown *This = impl_from_IEnumUnknown(iface);
86 LONG ref = InterlockedDecrement(&This->ref);
88 TRACE("(%p) ref=%d\n", This, ref);
90 if(!ref)
91 heap_free(This);
93 return ref;
96 static HRESULT WINAPI EnumUnknown_Next(IEnumUnknown *iface, ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
98 EnumUnknown *This = impl_from_IEnumUnknown(iface);
100 TRACE("(%p)->(%u %p %p)\n", This, celt, rgelt, pceltFetched);
102 /* FIXME: It's not clear if we should ever return something here */
103 if(pceltFetched)
104 *pceltFetched = 0;
105 return S_FALSE;
108 static HRESULT WINAPI EnumUnknown_Skip(IEnumUnknown *iface, ULONG celt)
110 EnumUnknown *This = impl_from_IEnumUnknown(iface);
111 FIXME("(%p)->(%u)\n", This, celt);
112 return E_NOTIMPL;
115 static HRESULT WINAPI EnumUnknown_Reset(IEnumUnknown *iface)
117 EnumUnknown *This = impl_from_IEnumUnknown(iface);
118 FIXME("(%p)\n", This);
119 return E_NOTIMPL;
122 static HRESULT WINAPI EnumUnknown_Clone(IEnumUnknown *iface, IEnumUnknown **ppenum)
124 EnumUnknown *This = impl_from_IEnumUnknown(iface);
125 FIXME("(%p)->(%p)\n", This, ppenum);
126 return E_NOTIMPL;
129 static const IEnumUnknownVtbl EnumUnknownVtbl = {
130 EnumUnknown_QueryInterface,
131 EnumUnknown_AddRef,
132 EnumUnknown_Release,
133 EnumUnknown_Next,
134 EnumUnknown_Skip,
135 EnumUnknown_Reset,
136 EnumUnknown_Clone
139 /**********************************************************
140 * IOleObject implementation
143 static inline HTMLDocument *impl_from_IOleObject(IOleObject *iface)
145 return CONTAINING_RECORD(iface, HTMLDocument, IOleObject_iface);
148 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
150 HTMLDocument *This = impl_from_IOleObject(iface);
151 return htmldoc_query_interface(This, riid, ppv);
154 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
156 HTMLDocument *This = impl_from_IOleObject(iface);
157 return htmldoc_addref(This);
160 static ULONG WINAPI OleObject_Release(IOleObject *iface)
162 HTMLDocument *This = impl_from_IOleObject(iface);
163 return htmldoc_release(This);
166 static void update_hostinfo(HTMLDocumentObj *This, DOCHOSTUIINFO *hostinfo)
168 nsIScrollable *scrollable;
169 nsresult nsres;
171 if(!This->nscontainer)
172 return;
174 nsres = nsIWebBrowser_QueryInterface(This->nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
175 if(NS_SUCCEEDED(nsres)) {
176 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_Y,
177 (hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO) ? Scrollbar_Never : Scrollbar_Always);
178 if(NS_FAILED(nsres))
179 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
181 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_X,
182 hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO ? Scrollbar_Never : Scrollbar_Auto);
183 if(NS_FAILED(nsres))
184 ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
186 nsIScrollable_Release(scrollable);
187 }else {
188 ERR("Could not get nsIScrollable: %08x\n", nsres);
192 /* Calls undocumented 84 cmd of CGID_ShellDocView */
193 void call_docview_84(HTMLDocumentObj *doc)
195 IOleCommandTarget *olecmd;
196 VARIANT var;
197 HRESULT hres;
199 if(!doc->client)
200 return;
202 hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
203 if(FAILED(hres))
204 return;
206 VariantInit(&var);
207 hres = IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 84, 0, NULL, &var);
208 IOleCommandTarget_Release(olecmd);
209 if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL)
210 FIXME("handle result\n");
213 void set_document_navigation(HTMLDocumentObj *doc, BOOL doc_can_navigate)
215 VARIANT var;
217 if(!doc->client_cmdtrg)
218 return;
220 if(doc_can_navigate) {
221 V_VT(&var) = VT_UNKNOWN;
222 V_UNKNOWN(&var) = (IUnknown*)&doc->basedoc.window->base.IHTMLWindow2_iface;
225 IOleCommandTarget_Exec(doc->client_cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0,
226 doc_can_navigate ? &var : NULL, NULL);
229 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
231 HTMLDocument *This = impl_from_IOleObject(iface);
232 IOleCommandTarget *cmdtrg = NULL;
233 IOleWindow *ole_window;
234 IBrowserService *browser_service;
235 BOOL hostui_setup;
236 VARIANT silent;
237 HWND hwnd;
238 HRESULT hres;
240 TRACE("(%p)->(%p)\n", This, pClientSite);
242 if(pClientSite == This->doc_obj->client)
243 return S_OK;
245 if(This->doc_obj->client) {
246 IOleClientSite_Release(This->doc_obj->client);
247 This->doc_obj->client = NULL;
248 This->doc_obj->usermode = UNKNOWN_USERMODE;
251 if(This->doc_obj->client_cmdtrg) {
252 IOleCommandTarget_Release(This->doc_obj->client_cmdtrg);
253 This->doc_obj->client_cmdtrg = NULL;
256 if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) {
257 IDocHostUIHandler_Release(This->doc_obj->hostui);
258 This->doc_obj->hostui = NULL;
261 if(This->doc_obj->doc_object_service) {
262 IDocObjectService_Release(This->doc_obj->doc_object_service);
263 This->doc_obj->doc_object_service = NULL;
266 if(This->doc_obj->webbrowser) {
267 IUnknown_Release(This->doc_obj->webbrowser);
268 This->doc_obj->webbrowser = NULL;
271 if(This->doc_obj->browser_service) {
272 IUnknown_Release(This->doc_obj->browser_service);
273 This->doc_obj->browser_service = NULL;
276 if(This->doc_obj->travel_log) {
277 ITravelLog_Release(This->doc_obj->travel_log);
278 This->doc_obj->travel_log = NULL;
281 memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO));
283 if(!pClientSite)
284 return S_OK;
286 IOleClientSite_AddRef(pClientSite);
287 This->doc_obj->client = pClientSite;
289 hostui_setup = This->doc_obj->hostui_setup;
291 if(!This->doc_obj->hostui) {
292 IDocHostUIHandler *uihandler;
294 This->doc_obj->custom_hostui = FALSE;
296 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler);
297 if(SUCCEEDED(hres))
298 This->doc_obj->hostui = uihandler;
301 if(This->doc_obj->hostui) {
302 DOCHOSTUIINFO hostinfo;
303 LPOLESTR key_path = NULL, override_key_path = NULL;
304 IDocHostUIHandler2 *uihandler2;
306 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
307 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
308 hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo);
309 if(SUCCEEDED(hres)) {
310 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
311 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
312 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
313 update_hostinfo(This->doc_obj, &hostinfo);
314 This->doc_obj->hostinfo = hostinfo;
317 if(!hostui_setup) {
318 hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0);
319 if(hres == S_OK && key_path) {
320 if(key_path[0]) {
321 /* FIXME: use key_path */
322 TRACE("key_path = %s\n", debugstr_w(key_path));
324 CoTaskMemFree(key_path);
327 hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2,
328 (void**)&uihandler2);
329 if(SUCCEEDED(hres)) {
330 hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0);
331 if(hres == S_OK && override_key_path && override_key_path[0]) {
332 if(override_key_path[0]) {
333 /*FIXME: use override_key_path */
334 TRACE("override_key_path = %s\n", debugstr_w(override_key_path));
336 CoTaskMemFree(override_key_path);
338 IDocHostUIHandler2_Release(uihandler2);
341 This->doc_obj->hostui_setup = TRUE;
345 /* Native calls here GetWindow. What is it for?
346 * We don't have anything to do with it here (yet). */
347 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window);
348 if(SUCCEEDED(hres)) {
349 IOleWindow_GetWindow(ole_window, &hwnd);
350 IOleWindow_Release(ole_window);
353 hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser,
354 &IID_IBrowserService, (void**)&browser_service);
355 if(SUCCEEDED(hres)) {
356 ITravelLog *travel_log;
358 This->doc_obj->browser_service = (IUnknown*)browser_service;
360 hres = IBrowserService_GetTravelLog(browser_service, &travel_log);
361 if(SUCCEEDED(hres))
362 This->doc_obj->travel_log = travel_log;
363 }else {
364 browser_service = NULL;
367 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
368 if(SUCCEEDED(hres)) {
369 VARIANT var;
370 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
372 This->doc_obj->client_cmdtrg = cmdtrg;
374 if(!hostui_setup) {
375 IDocObjectService *doc_object_service;
376 IWebBrowser2 *wb;
378 set_document_navigation(This->doc_obj, TRUE);
380 if(browser_service) {
381 hres = IBrowserService_QueryInterface(browser_service,
382 &IID_IDocObjectService, (void**)&doc_object_service);
383 if(SUCCEEDED(hres)) {
384 This->doc_obj->doc_object_service = doc_object_service;
387 * Some embedding routines, esp. in regards to use of IDocObjectService, differ if
388 * embedder supports IWebBrowserApp.
390 hres = do_query_service((IUnknown*)pClientSite, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb);
391 if(SUCCEEDED(hres))
392 This->doc_obj->webbrowser = (IUnknown*)wb;
397 call_docview_84(This->doc_obj);
399 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
401 V_VT(&var) = VT_I4;
402 V_I4(&var) = 0;
403 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX,
404 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
405 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS,
406 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
409 if(This->doc_obj->usermode == UNKNOWN_USERMODE)
410 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERMODE);
412 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface,
413 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
415 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent);
416 if(SUCCEEDED(hres)) {
417 if(V_VT(&silent) != VT_BOOL)
418 WARN("silent = %s\n", debugstr_variant(&silent));
419 else if(V_BOOL(&silent))
420 FIXME("silent == true\n");
423 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERAGENT);
424 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_PALETTE);
426 return S_OK;
429 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
431 HTMLDocument *This = impl_from_IOleObject(iface);
433 TRACE("(%p)->(%p)\n", This, ppClientSite);
435 if(!ppClientSite)
436 return E_INVALIDARG;
438 if(This->doc_obj->client)
439 IOleClientSite_AddRef(This->doc_obj->client);
440 *ppClientSite = This->doc_obj->client;
442 return S_OK;
445 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
447 HTMLDocument *This = impl_from_IOleObject(iface);
448 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
449 return E_NOTIMPL;
452 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
454 HTMLDocument *This = impl_from_IOleObject(iface);
456 TRACE("(%p)->(%08x)\n", This, dwSaveOption);
458 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
459 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
461 if(This->doc_obj->in_place_active)
462 IOleInPlaceObjectWindowless_InPlaceDeactivate(&This->IOleInPlaceObjectWindowless_iface);
464 HTMLDocument_LockContainer(This->doc_obj, FALSE);
466 if(This->advise_holder)
467 IOleAdviseHolder_SendOnClose(This->advise_holder);
469 return S_OK;
472 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
474 HTMLDocument *This = impl_from_IOleObject(iface);
475 FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk);
476 return E_NOTIMPL;
479 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
481 HTMLDocument *This = impl_from_IOleObject(iface);
482 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
483 return E_NOTIMPL;
486 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
487 DWORD dwReserved)
489 HTMLDocument *This = impl_from_IOleObject(iface);
490 FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved);
491 return E_NOTIMPL;
494 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
496 HTMLDocument *This = impl_from_IOleObject(iface);
497 FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject);
498 return E_NOTIMPL;
501 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
502 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
504 HTMLDocument *This = impl_from_IOleObject(iface);
505 IOleDocumentSite *pDocSite;
506 HRESULT hres;
508 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
510 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
511 FIXME("iVerb = %d not supported\n", iVerb);
512 return E_NOTIMPL;
515 if(!pActiveSite)
516 pActiveSite = This->doc_obj->client;
518 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
519 if(SUCCEEDED(hres)) {
520 HTMLDocument_LockContainer(This->doc_obj, TRUE);
522 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
523 hres = IOleDocumentSite_ActivateMe(pDocSite, &This->IOleDocumentView_iface);
524 IOleDocumentSite_Release(pDocSite);
525 }else {
526 hres = IOleDocumentView_UIActivate(&This->IOleDocumentView_iface, TRUE);
527 if(SUCCEEDED(hres)) {
528 if(lprcPosRect) {
529 RECT rect; /* We need to pass rect as not const pointer */
530 rect = *lprcPosRect;
531 IOleDocumentView_SetRect(&This->IOleDocumentView_iface, &rect);
533 IOleDocumentView_Show(&This->IOleDocumentView_iface, TRUE);
537 return hres;
540 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
542 HTMLDocument *This = impl_from_IOleObject(iface);
543 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
544 return E_NOTIMPL;
547 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
549 HTMLDocument *This = impl_from_IOleObject(iface);
550 FIXME("(%p)\n", This);
551 return E_NOTIMPL;
554 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
556 HTMLDocument *This = impl_from_IOleObject(iface);
557 FIXME("(%p)\n", This);
558 return E_NOTIMPL;
561 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
563 HTMLDocument *This = impl_from_IOleObject(iface);
565 TRACE("(%p)->(%p)\n", This, pClsid);
567 if(!pClsid)
568 return E_INVALIDARG;
570 *pClsid = CLSID_HTMLDocument;
571 return S_OK;
574 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
576 HTMLDocument *This = impl_from_IOleObject(iface);
577 FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType);
578 return E_NOTIMPL;
581 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
583 HTMLDocument *This = impl_from_IOleObject(iface);
584 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
585 return E_NOTIMPL;
588 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
590 HTMLDocument *This = impl_from_IOleObject(iface);
591 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
592 return E_NOTIMPL;
595 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
597 HTMLDocument *This = impl_from_IOleObject(iface);
598 TRACE("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
600 if(!pdwConnection)
601 return E_INVALIDARG;
603 if(!pAdvSink) {
604 *pdwConnection = 0;
605 return E_INVALIDARG;
608 if(!This->advise_holder) {
609 CreateOleAdviseHolder(&This->advise_holder);
610 if(!This->advise_holder)
611 return E_OUTOFMEMORY;
614 return IOleAdviseHolder_Advise(This->advise_holder, pAdvSink, pdwConnection);
617 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
619 HTMLDocument *This = impl_from_IOleObject(iface);
620 TRACE("(%p)->(%d)\n", This, dwConnection);
622 if(!This->advise_holder)
623 return OLE_E_NOCONNECTION;
625 return IOleAdviseHolder_Unadvise(This->advise_holder, dwConnection);
628 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
630 HTMLDocument *This = impl_from_IOleObject(iface);
632 if(!This->advise_holder) {
633 *ppenumAdvise = NULL;
634 return S_OK;
637 return IOleAdviseHolder_EnumAdvise(This->advise_holder, ppenumAdvise);
640 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
642 HTMLDocument *This = impl_from_IOleObject(iface);
643 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
644 return E_NOTIMPL;
647 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
649 HTMLDocument *This = impl_from_IOleObject(iface);
650 FIXME("(%p)->(%p)\n", This, pLogpal);
651 return E_NOTIMPL;
654 static const IOleObjectVtbl OleObjectVtbl = {
655 OleObject_QueryInterface,
656 OleObject_AddRef,
657 OleObject_Release,
658 OleObject_SetClientSite,
659 OleObject_GetClientSite,
660 OleObject_SetHostNames,
661 OleObject_Close,
662 OleObject_SetMoniker,
663 OleObject_GetMoniker,
664 OleObject_InitFromData,
665 OleObject_GetClipboardData,
666 OleObject_DoVerb,
667 OleObject_EnumVerbs,
668 OleObject_Update,
669 OleObject_IsUpToDate,
670 OleObject_GetUserClassID,
671 OleObject_GetUserType,
672 OleObject_SetExtent,
673 OleObject_GetExtent,
674 OleObject_Advise,
675 OleObject_Unadvise,
676 OleObject_EnumAdvise,
677 OleObject_GetMiscStatus,
678 OleObject_SetColorScheme
681 /**********************************************************
682 * IOleDocument implementation
685 static inline HTMLDocument *impl_from_IOleDocument(IOleDocument *iface)
687 return CONTAINING_RECORD(iface, HTMLDocument, IOleDocument_iface);
690 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppv)
692 HTMLDocument *This = impl_from_IOleDocument(iface);
693 return htmldoc_query_interface(This, riid, ppv);
696 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
698 HTMLDocument *This = impl_from_IOleDocument(iface);
699 return htmldoc_addref(This);
702 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
704 HTMLDocument *This = impl_from_IOleDocument(iface);
705 return htmldoc_release(This);
708 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
709 DWORD dwReserved, IOleDocumentView **ppView)
711 HTMLDocument *This = impl_from_IOleDocument(iface);
712 HRESULT hres;
714 TRACE("(%p)->(%p %p %d %p)\n", This, pIPSite, pstm, dwReserved, ppView);
716 if(!ppView)
717 return E_INVALIDARG;
719 /* FIXME:
720 * Windows implementation creates new IOleDocumentView when function is called for the
721 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
722 * if the application uses returned interfaces, passed to ActivateMe or returned by
723 * QueryInterface, so there is no reason to create new interface. This needs more testing.
726 if(pIPSite) {
727 hres = IOleDocumentView_SetInPlaceSite(&This->IOleDocumentView_iface, pIPSite);
728 if(FAILED(hres))
729 return hres;
732 if(pstm)
733 FIXME("pstm is not supported\n");
735 IOleDocumentView_AddRef(&This->IOleDocumentView_iface);
736 *ppView = &This->IOleDocumentView_iface;
737 return S_OK;
740 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
742 HTMLDocument *This = impl_from_IOleDocument(iface);
743 FIXME("(%p)->(%p)\n", This, pdwStatus);
744 return E_NOTIMPL;
747 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
748 IOleDocumentView **ppView)
750 HTMLDocument *This = impl_from_IOleDocument(iface);
751 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
752 return E_NOTIMPL;
755 static const IOleDocumentVtbl OleDocumentVtbl = {
756 OleDocument_QueryInterface,
757 OleDocument_AddRef,
758 OleDocument_Release,
759 OleDocument_CreateView,
760 OleDocument_GetDocMiscStatus,
761 OleDocument_EnumViews
764 /**********************************************************
765 * IOleControl implementation
768 static inline HTMLDocument *impl_from_IOleControl(IOleControl *iface)
770 return CONTAINING_RECORD(iface, HTMLDocument, IOleControl_iface);
773 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
775 HTMLDocument *This = impl_from_IOleControl(iface);
776 return htmldoc_query_interface(This, riid, ppv);
779 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
781 HTMLDocument *This = impl_from_IOleControl(iface);
782 return htmldoc_addref(This);
785 static ULONG WINAPI OleControl_Release(IOleControl *iface)
787 HTMLDocument *This = impl_from_IOleControl(iface);
788 return htmldoc_release(This);
791 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
793 HTMLDocument *This = impl_from_IOleControl(iface);
794 FIXME("(%p)->(%p)\n", This, pCI);
795 return E_NOTIMPL;
798 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
800 HTMLDocument *This = impl_from_IOleControl(iface);
801 FIXME("(%p)->(%p)\n", This, pMsg);
802 return E_NOTIMPL;
805 HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
807 IDispatch *disp = NULL;
808 DISPPARAMS dispparams = {NULL, 0};
809 UINT err;
810 HRESULT hres;
812 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
813 if(FAILED(hres)) {
814 TRACE("Could not get IDispatch\n");
815 return hres;
818 VariantInit(res);
820 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
821 DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
823 IDispatch_Release(disp);
825 return hres;
828 static HRESULT on_change_dlcontrol(HTMLDocument *This)
830 VARIANT res;
831 HRESULT hres;
833 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_DLCONTROL, &res);
834 if(SUCCEEDED(hres))
835 FIXME("unsupported dlcontrol %08x\n", V_I4(&res));
837 return S_OK;
840 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
842 HTMLDocument *This = impl_from_IOleControl(iface);
843 IOleClientSite *client;
844 VARIANT res;
845 HRESULT hres;
847 client = This->doc_obj->client;
848 if(!client) {
849 TRACE("client = NULL\n");
850 return S_OK;
853 switch(dispID) {
854 case DISPID_AMBIENT_USERMODE:
855 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
856 hres = get_client_disp_property(client, DISPID_AMBIENT_USERMODE, &res);
857 if(FAILED(hres))
858 return S_OK;
860 if(V_VT(&res) == VT_BOOL) {
861 if(V_BOOL(&res)) {
862 This->doc_obj->usermode = BROWSEMODE;
863 }else {
864 FIXME("edit mode is not supported\n");
865 This->doc_obj->usermode = EDITMODE;
867 }else {
868 FIXME("usermode=%s\n", debugstr_variant(&res));
870 return S_OK;
871 case DISPID_AMBIENT_DLCONTROL:
872 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
873 return on_change_dlcontrol(This);
874 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
875 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
876 on_change_dlcontrol(This);
877 hres = get_client_disp_property(client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
878 if(FAILED(hres))
879 return S_OK;
881 if(V_VT(&res) == VT_BOOL) {
882 if(V_BOOL(&res)) {
883 FIXME("offline connection is not supported\n");
884 hres = E_FAIL;
886 }else {
887 FIXME("offlineconnected=%s\n", debugstr_variant(&res));
889 return S_OK;
890 case DISPID_AMBIENT_SILENT:
891 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
892 on_change_dlcontrol(This);
893 hres = get_client_disp_property(client, DISPID_AMBIENT_SILENT, &res);
894 if(FAILED(hres))
895 return S_OK;
897 if(V_VT(&res) == VT_BOOL) {
898 if(V_BOOL(&res)) {
899 FIXME("silent mode is not supported\n");
900 hres = E_FAIL;
902 }else {
903 FIXME("silent=%s\n", debugstr_variant(&res));
905 return S_OK;
906 case DISPID_AMBIENT_USERAGENT:
907 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
908 hres = get_client_disp_property(client, DISPID_AMBIENT_USERAGENT, &res);
909 if(FAILED(hres))
910 return S_OK;
912 FIXME("not supported AMBIENT_USERAGENT\n");
913 hres = E_FAIL;
914 return S_OK;
915 case DISPID_AMBIENT_PALETTE:
916 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
917 hres = get_client_disp_property(client, DISPID_AMBIENT_PALETTE, &res);
918 if(FAILED(hres))
919 return S_OK;
921 FIXME("not supported AMBIENT_PALETTE\n");
922 hres = E_FAIL;
923 return S_OK;
926 FIXME("(%p) unsupported dispID=%d\n", This, dispID);
927 return E_FAIL;
930 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
932 HTMLDocument *This = impl_from_IOleControl(iface);
933 FIXME("(%p)->(%x)\n", This, bFreeze);
934 return E_NOTIMPL;
937 static const IOleControlVtbl OleControlVtbl = {
938 OleControl_QueryInterface,
939 OleControl_AddRef,
940 OleControl_Release,
941 OleControl_GetControlInfo,
942 OleControl_OnMnemonic,
943 OleControl_OnAmbientPropertyChange,
944 OleControl_FreezeEvents
947 /**********************************************************
948 * IObjectWithSite implementation
951 static inline HTMLDocument *impl_from_IObjectWithSite(IObjectWithSite *iface)
953 return CONTAINING_RECORD(iface, HTMLDocument, IObjectWithSite_iface);
956 static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
958 HTMLDocument *This = impl_from_IObjectWithSite(iface);
959 return htmldoc_query_interface(This, riid, ppv);
962 static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface)
964 HTMLDocument *This = impl_from_IObjectWithSite(iface);
965 return htmldoc_addref(This);
968 static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface)
970 HTMLDocument *This = impl_from_IObjectWithSite(iface);
971 return htmldoc_release(This);
974 static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite)
976 HTMLDocument *This = impl_from_IObjectWithSite(iface);
977 FIXME("(%p)->(%p)\n", This, pUnkSite);
978 return E_NOTIMPL;
981 static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite* iface, REFIID riid, PVOID *ppvSite)
983 HTMLDocument *This = impl_from_IObjectWithSite(iface);
984 FIXME("(%p)->(%p)\n", This, ppvSite);
985 return E_NOTIMPL;
988 static const IObjectWithSiteVtbl ObjectWithSiteVtbl = {
989 ObjectWithSite_QueryInterface,
990 ObjectWithSite_AddRef,
991 ObjectWithSite_Release,
992 ObjectWithSite_SetSite,
993 ObjectWithSite_GetSite
996 /**********************************************************
997 * IOleContainer implementation
1000 static inline HTMLDocument *impl_from_IOleContainer(IOleContainer *iface)
1002 return CONTAINING_RECORD(iface, HTMLDocument, IOleContainer_iface);
1005 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
1007 HTMLDocument *This = impl_from_IOleContainer(iface);
1008 return htmldoc_query_interface(This, riid, ppv);
1011 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
1013 HTMLDocument *This = impl_from_IOleContainer(iface);
1014 return htmldoc_addref(This);
1017 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
1019 HTMLDocument *This = impl_from_IOleContainer(iface);
1020 return htmldoc_release(This);
1023 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc, LPOLESTR pszDisplayName,
1024 ULONG *pchEaten, IMoniker **ppmkOut)
1026 HTMLDocument *This = impl_from_IOleContainer(iface);
1027 FIXME("(%p)->(%p %s %p %p)\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
1028 return E_NOTIMPL;
1031 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, IEnumUnknown **ppenum)
1033 HTMLDocument *This = impl_from_IOleContainer(iface);
1034 EnumUnknown *ret;
1036 TRACE("(%p)->(%x %p)\n", This, grfFlags, ppenum);
1038 ret = heap_alloc(sizeof(*ret));
1039 if(!ret)
1040 return E_OUTOFMEMORY;
1042 ret->IEnumUnknown_iface.lpVtbl = &EnumUnknownVtbl;
1043 ret->ref = 1;
1045 *ppenum = &ret->IEnumUnknown_iface;
1046 return S_OK;
1049 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
1051 HTMLDocument *This = impl_from_IOleContainer(iface);
1052 FIXME("(%p)->(%x)\n", This, fLock);
1053 return E_NOTIMPL;
1056 static const IOleContainerVtbl OleContainerVtbl = {
1057 OleContainer_QueryInterface,
1058 OleContainer_AddRef,
1059 OleContainer_Release,
1060 OleContainer_ParseDisplayName,
1061 OleContainer_EnumObjects,
1062 OleContainer_LockContainer
1065 static inline HTMLDocumentObj *impl_from_ITargetContainer(ITargetContainer *iface)
1067 return CONTAINING_RECORD(iface, HTMLDocumentObj, ITargetContainer_iface);
1070 static HRESULT WINAPI TargetContainer_QueryInterface(ITargetContainer *iface, REFIID riid, void **ppv)
1072 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1073 return ICustomDoc_QueryInterface(&This->ICustomDoc_iface, riid, ppv);
1076 static ULONG WINAPI TargetContainer_AddRef(ITargetContainer *iface)
1078 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1079 return ICustomDoc_AddRef(&This->ICustomDoc_iface);
1082 static ULONG WINAPI TargetContainer_Release(ITargetContainer *iface)
1084 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1085 return ICustomDoc_Release(&This->ICustomDoc_iface);
1088 static HRESULT WINAPI TargetContainer_GetFrameUrl(ITargetContainer *iface, LPWSTR *ppszFrameSrc)
1090 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1091 FIXME("(%p)->(%p)\n", This, ppszFrameSrc);
1092 return E_NOTIMPL;
1095 static HRESULT WINAPI TargetContainer_GetFramesContainer(ITargetContainer *iface, IOleContainer **ppContainer)
1097 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1099 TRACE("(%p)->(%p)\n", This, ppContainer);
1101 /* NOTE: we should return wrapped interface here */
1102 IOleContainer_AddRef(&This->basedoc.IOleContainer_iface);
1103 *ppContainer = &This->basedoc.IOleContainer_iface;
1104 return S_OK;
1107 static const ITargetContainerVtbl TargetContainerVtbl = {
1108 TargetContainer_QueryInterface,
1109 TargetContainer_AddRef,
1110 TargetContainer_Release,
1111 TargetContainer_GetFrameUrl,
1112 TargetContainer_GetFramesContainer
1115 void TargetContainer_Init(HTMLDocumentObj *This)
1117 This->ITargetContainer_iface.lpVtbl = &TargetContainerVtbl;
1120 /**********************************************************
1121 * IObjectSafety implementation
1124 static inline HTMLDocument *impl_from_IObjectSafety(IObjectSafety *iface)
1126 return CONTAINING_RECORD(iface, HTMLDocument, IObjectSafety_iface);
1129 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
1131 HTMLDocument *This = impl_from_IObjectSafety(iface);
1132 return htmldoc_query_interface(This, riid, ppv);
1135 static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface)
1137 HTMLDocument *This = impl_from_IObjectSafety(iface);
1138 return htmldoc_addref(This);
1141 static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface)
1143 HTMLDocument *This = impl_from_IObjectSafety(iface);
1144 return htmldoc_release(This);
1147 static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface,
1148 REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
1150 HTMLDocument *This = impl_from_IObjectSafety(iface);
1151 FIXME("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
1152 return E_NOTIMPL;
1155 static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface,
1156 REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
1158 HTMLDocument *This = impl_from_IObjectSafety(iface);
1159 FIXME("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
1161 if(IsEqualGUID(&IID_IPersistMoniker, riid) &&
1162 dwOptionSetMask==INTERFACESAFE_FOR_UNTRUSTED_DATA &&
1163 dwEnabledOptions==INTERFACESAFE_FOR_UNTRUSTED_DATA)
1164 return S_OK;
1166 return E_NOTIMPL;
1169 static const IObjectSafetyVtbl ObjectSafetyVtbl = {
1170 ObjectSafety_QueryInterface,
1171 ObjectSafety_AddRef,
1172 ObjectSafety_Release,
1173 ObjectSafety_GetInterfaceSafetyOptions,
1174 ObjectSafety_SetInterfaceSafetyOptions
1177 void HTMLDocument_LockContainer(HTMLDocumentObj *This, BOOL fLock)
1179 IOleContainer *container;
1180 HRESULT hres;
1182 if(!This->client || This->container_locked == fLock)
1183 return;
1185 hres = IOleClientSite_GetContainer(This->client, &container);
1186 if(SUCCEEDED(hres)) {
1187 IOleContainer_LockContainer(container, fLock);
1188 This->container_locked = fLock;
1189 IOleContainer_Release(container);
1193 void HTMLDocument_OleObj_Init(HTMLDocument *This)
1195 This->IOleObject_iface.lpVtbl = &OleObjectVtbl;
1196 This->IOleDocument_iface.lpVtbl = &OleDocumentVtbl;
1197 This->IOleControl_iface.lpVtbl = &OleControlVtbl;
1198 This->IObjectWithSite_iface.lpVtbl = &ObjectWithSiteVtbl;
1199 This->IOleContainer_iface.lpVtbl = &OleContainerVtbl;
1200 This->IObjectSafety_iface.lpVtbl = &ObjectSafetyVtbl;