mscoree: Factor out common code for calling .NET methods.
[wine.git] / dlls / mshtml / oleobj.c
blobca012881671c4cd17b3c972f4d980f7715b6bfb8
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>
23 #include <assert.h>
25 #define COBJMACROS
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winuser.h"
30 #include "ole2.h"
31 #include "shlguid.h"
32 #include "shdeprecated.h"
33 #include "mshtmdid.h"
34 #include "idispids.h"
36 #include "wine/debug.h"
38 #include "mshtml_private.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
42 #define DOCHOST_DOCCANNAVIGATE 0
44 typedef struct {
45 IEnumUnknown IEnumUnknown_iface;
46 LONG ref;
47 } EnumUnknown;
49 static inline EnumUnknown *impl_from_IEnumUnknown(IEnumUnknown *iface)
51 return CONTAINING_RECORD(iface, EnumUnknown, IEnumUnknown_iface);
54 static HRESULT WINAPI EnumUnknown_QueryInterface(IEnumUnknown *iface, REFIID riid, void **ppv)
56 EnumUnknown *This = impl_from_IEnumUnknown(iface);
58 if(IsEqualGUID(&IID_IUnknown, riid)) {
59 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
60 *ppv = &This->IEnumUnknown_iface;
61 }else if(IsEqualGUID(&IID_IEnumUnknown, riid)) {
62 TRACE("(%p)->(IID_IEnumUnknown %p)\n", This, ppv);
63 *ppv = &This->IEnumUnknown_iface;
64 }else {
65 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
66 *ppv = NULL;
67 return E_NOINTERFACE;
70 IUnknown_AddRef((IUnknown*)*ppv);
71 return S_OK;
74 static ULONG WINAPI EnumUnknown_AddRef(IEnumUnknown *iface)
76 EnumUnknown *This = impl_from_IEnumUnknown(iface);
77 LONG ref = InterlockedIncrement(&This->ref);
79 TRACE("(%p) ref=%d\n", This, ref);
81 return ref;
84 static ULONG WINAPI EnumUnknown_Release(IEnumUnknown *iface)
86 EnumUnknown *This = impl_from_IEnumUnknown(iface);
87 LONG ref = InterlockedDecrement(&This->ref);
89 TRACE("(%p) ref=%d\n", This, ref);
91 if(!ref)
92 heap_free(This);
94 return ref;
97 static HRESULT WINAPI EnumUnknown_Next(IEnumUnknown *iface, ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
99 EnumUnknown *This = impl_from_IEnumUnknown(iface);
101 TRACE("(%p)->(%u %p %p)\n", This, celt, rgelt, pceltFetched);
103 /* FIXME: It's not clear if we should ever return something here */
104 if(pceltFetched)
105 *pceltFetched = 0;
106 return S_FALSE;
109 static HRESULT WINAPI EnumUnknown_Skip(IEnumUnknown *iface, ULONG celt)
111 EnumUnknown *This = impl_from_IEnumUnknown(iface);
112 FIXME("(%p)->(%u)\n", This, celt);
113 return E_NOTIMPL;
116 static HRESULT WINAPI EnumUnknown_Reset(IEnumUnknown *iface)
118 EnumUnknown *This = impl_from_IEnumUnknown(iface);
119 FIXME("(%p)\n", This);
120 return E_NOTIMPL;
123 static HRESULT WINAPI EnumUnknown_Clone(IEnumUnknown *iface, IEnumUnknown **ppenum)
125 EnumUnknown *This = impl_from_IEnumUnknown(iface);
126 FIXME("(%p)->(%p)\n", This, ppenum);
127 return E_NOTIMPL;
130 static const IEnumUnknownVtbl EnumUnknownVtbl = {
131 EnumUnknown_QueryInterface,
132 EnumUnknown_AddRef,
133 EnumUnknown_Release,
134 EnumUnknown_Next,
135 EnumUnknown_Skip,
136 EnumUnknown_Reset,
137 EnumUnknown_Clone
140 /**********************************************************
141 * IOleObject implementation
144 static inline HTMLDocument *impl_from_IOleObject(IOleObject *iface)
146 return CONTAINING_RECORD(iface, HTMLDocument, IOleObject_iface);
149 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
151 HTMLDocument *This = impl_from_IOleObject(iface);
152 return htmldoc_query_interface(This, riid, ppv);
155 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
157 HTMLDocument *This = impl_from_IOleObject(iface);
158 return htmldoc_addref(This);
161 static ULONG WINAPI OleObject_Release(IOleObject *iface)
163 HTMLDocument *This = impl_from_IOleObject(iface);
164 return htmldoc_release(This);
167 static void update_hostinfo(HTMLDocumentObj *This, DOCHOSTUIINFO *hostinfo)
169 nsIScrollable *scrollable;
170 nsresult nsres;
172 if(!This->nscontainer)
173 return;
175 nsres = nsIWebBrowser_QueryInterface(This->nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
176 if(NS_SUCCEEDED(nsres)) {
177 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_Y,
178 (hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO) ? Scrollbar_Never : Scrollbar_Always);
179 if(NS_FAILED(nsres))
180 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
182 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_X,
183 hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO ? Scrollbar_Never : Scrollbar_Auto);
184 if(NS_FAILED(nsres))
185 ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
187 nsIScrollable_Release(scrollable);
188 }else {
189 ERR("Could not get nsIScrollable: %08x\n", nsres);
193 /* Calls undocumented 84 cmd of CGID_ShellDocView */
194 void call_docview_84(HTMLDocumentObj *doc)
196 IOleCommandTarget *olecmd;
197 VARIANT var;
198 HRESULT hres;
200 if(!doc->client)
201 return;
203 hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
204 if(FAILED(hres))
205 return;
207 VariantInit(&var);
208 hres = IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 84, 0, NULL, &var);
209 IOleCommandTarget_Release(olecmd);
210 if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL)
211 FIXME("handle result\n");
214 void set_document_navigation(HTMLDocumentObj *doc, BOOL doc_can_navigate)
216 VARIANT var;
218 if(!doc->client_cmdtrg)
219 return;
221 if(doc_can_navigate) {
222 V_VT(&var) = VT_UNKNOWN;
223 V_UNKNOWN(&var) = (IUnknown*)&doc->basedoc.window->base.IHTMLWindow2_iface;
226 IOleCommandTarget_Exec(doc->client_cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0,
227 doc_can_navigate ? &var : NULL, NULL);
230 static void load_settings(HTMLDocumentObj *doc)
232 nsIMarkupDocumentViewer *markup_document_viewer;
233 nsIContentViewer *content_viewer;
234 nsIDocShell *doc_shell;
235 HKEY settings_key;
236 DWORD val, size;
237 LONG res;
238 nsresult nsres;
240 static const WCHAR ie_keyW[] = {
241 'S','O','F','T','W','A','R','E','\\',
242 'M','i','c','r','o','s','o','f','t','\\',
243 'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',0};
244 static const WCHAR zoomW[] = {'Z','o','o','m',0};
245 static const WCHAR zoom_factorW[] = {'Z','o','o','m','F','a','c','t','o','r',0};
247 res = RegOpenKeyW(HKEY_CURRENT_USER, ie_keyW, &settings_key);
248 if(res != ERROR_SUCCESS)
249 return;
251 size = sizeof(val);
252 res = RegGetValueW(settings_key, zoomW, zoom_factorW, RRF_RT_REG_DWORD, NULL, &val, &size);
253 RegCloseKey(settings_key);
254 if(res != ERROR_SUCCESS)
255 return;
257 TRACE("Setting ZoomFactor to %u\n", val);
259 nsres = get_nsinterface((nsISupports*)doc->nscontainer->navigation, &IID_nsIDocShell, (void**)&doc_shell);
260 assert(nsres == NS_OK);
262 nsres = nsIDocShell_GetContentViewer(doc_shell, &content_viewer);
263 assert(nsres == NS_OK && content_viewer);
265 nsres = nsISupports_QueryInterface(content_viewer, &IID_nsIMarkupDocumentViewer, (void**)&markup_document_viewer);
266 nsISupports_Release(content_viewer);
267 assert(nsres == NS_OK);
269 nsres = nsIMarkupDocumentViewer_SetFullZoom(markup_document_viewer, (float)val/100000);
270 if(NS_FAILED(nsres))
271 ERR("SetFullZoom failed: %08x\n", nsres);
273 nsIDocShell_Release(doc_shell);
276 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
278 HTMLDocument *This = impl_from_IOleObject(iface);
279 IOleCommandTarget *cmdtrg = NULL;
280 IOleWindow *ole_window;
281 IBrowserService *browser_service;
282 BOOL hostui_setup;
283 VARIANT silent;
284 HWND hwnd;
285 HRESULT hres;
287 TRACE("(%p)->(%p)\n", This, pClientSite);
289 if(pClientSite == This->doc_obj->client)
290 return S_OK;
292 if(This->doc_obj->client) {
293 IOleClientSite_Release(This->doc_obj->client);
294 This->doc_obj->client = NULL;
295 This->doc_obj->usermode = UNKNOWN_USERMODE;
298 if(This->doc_obj->client_cmdtrg) {
299 IOleCommandTarget_Release(This->doc_obj->client_cmdtrg);
300 This->doc_obj->client_cmdtrg = NULL;
303 if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) {
304 IDocHostUIHandler_Release(This->doc_obj->hostui);
305 This->doc_obj->hostui = NULL;
308 if(This->doc_obj->doc_object_service) {
309 IDocObjectService_Release(This->doc_obj->doc_object_service);
310 This->doc_obj->doc_object_service = NULL;
313 if(This->doc_obj->webbrowser) {
314 IUnknown_Release(This->doc_obj->webbrowser);
315 This->doc_obj->webbrowser = NULL;
318 if(This->doc_obj->browser_service) {
319 IUnknown_Release(This->doc_obj->browser_service);
320 This->doc_obj->browser_service = NULL;
323 if(This->doc_obj->travel_log) {
324 ITravelLog_Release(This->doc_obj->travel_log);
325 This->doc_obj->travel_log = NULL;
328 memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO));
330 if(!pClientSite)
331 return S_OK;
333 IOleClientSite_AddRef(pClientSite);
334 This->doc_obj->client = pClientSite;
336 hostui_setup = This->doc_obj->hostui_setup;
338 if(!This->doc_obj->hostui) {
339 IDocHostUIHandler *uihandler;
341 This->doc_obj->custom_hostui = FALSE;
343 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler);
344 if(SUCCEEDED(hres))
345 This->doc_obj->hostui = uihandler;
348 if(This->doc_obj->hostui) {
349 DOCHOSTUIINFO hostinfo;
350 LPOLESTR key_path = NULL, override_key_path = NULL;
351 IDocHostUIHandler2 *uihandler2;
353 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
354 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
355 hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo);
356 if(SUCCEEDED(hres)) {
357 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
358 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
359 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
360 update_hostinfo(This->doc_obj, &hostinfo);
361 This->doc_obj->hostinfo = hostinfo;
364 if(!hostui_setup) {
365 hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0);
366 if(hres == S_OK && key_path) {
367 if(key_path[0]) {
368 /* FIXME: use key_path */
369 FIXME("key_path = %s\n", debugstr_w(key_path));
371 CoTaskMemFree(key_path);
374 hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2,
375 (void**)&uihandler2);
376 if(SUCCEEDED(hres)) {
377 hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0);
378 if(hres == S_OK && override_key_path) {
379 if(override_key_path[0]) {
380 /*FIXME: use override_key_path */
381 FIXME("override_key_path = %s\n", debugstr_w(override_key_path));
383 CoTaskMemFree(override_key_path);
385 IDocHostUIHandler2_Release(uihandler2);
388 This->doc_obj->hostui_setup = TRUE;
392 load_settings(This->doc_obj);
394 /* Native calls here GetWindow. What is it for?
395 * We don't have anything to do with it here (yet). */
396 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window);
397 if(SUCCEEDED(hres)) {
398 IOleWindow_GetWindow(ole_window, &hwnd);
399 IOleWindow_Release(ole_window);
402 hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser,
403 &IID_IBrowserService, (void**)&browser_service);
404 if(SUCCEEDED(hres)) {
405 ITravelLog *travel_log;
407 This->doc_obj->browser_service = (IUnknown*)browser_service;
409 hres = IBrowserService_GetTravelLog(browser_service, &travel_log);
410 if(SUCCEEDED(hres))
411 This->doc_obj->travel_log = travel_log;
412 }else {
413 browser_service = NULL;
416 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
417 if(SUCCEEDED(hres)) {
418 VARIANT var;
419 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
421 This->doc_obj->client_cmdtrg = cmdtrg;
423 if(!hostui_setup) {
424 IDocObjectService *doc_object_service;
425 IWebBrowser2 *wb;
427 set_document_navigation(This->doc_obj, TRUE);
429 if(browser_service) {
430 hres = IBrowserService_QueryInterface(browser_service,
431 &IID_IDocObjectService, (void**)&doc_object_service);
432 if(SUCCEEDED(hres)) {
433 This->doc_obj->doc_object_service = doc_object_service;
436 * Some embedding routines, esp. in regards to use of IDocObjectService, differ if
437 * embedder supports IWebBrowserApp.
439 hres = do_query_service((IUnknown*)pClientSite, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb);
440 if(SUCCEEDED(hres))
441 This->doc_obj->webbrowser = (IUnknown*)wb;
446 call_docview_84(This->doc_obj);
448 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
450 V_VT(&var) = VT_I4;
451 V_I4(&var) = 0;
452 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX,
453 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
454 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS,
455 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
458 if(This->doc_obj->usermode == UNKNOWN_USERMODE)
459 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERMODE);
461 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface,
462 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
464 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent);
465 if(SUCCEEDED(hres)) {
466 if(V_VT(&silent) != VT_BOOL)
467 WARN("silent = %s\n", debugstr_variant(&silent));
468 else if(V_BOOL(&silent))
469 FIXME("silent == true\n");
472 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERAGENT);
473 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_PALETTE);
475 return S_OK;
478 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
480 HTMLDocument *This = impl_from_IOleObject(iface);
482 TRACE("(%p)->(%p)\n", This, ppClientSite);
484 if(!ppClientSite)
485 return E_INVALIDARG;
487 if(This->doc_obj->client)
488 IOleClientSite_AddRef(This->doc_obj->client);
489 *ppClientSite = This->doc_obj->client;
491 return S_OK;
494 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
496 HTMLDocument *This = impl_from_IOleObject(iface);
497 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
498 return E_NOTIMPL;
501 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
503 HTMLDocument *This = impl_from_IOleObject(iface);
505 TRACE("(%p)->(%08x)\n", This, dwSaveOption);
507 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
508 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
510 if(This->doc_obj->in_place_active)
511 IOleInPlaceObjectWindowless_InPlaceDeactivate(&This->IOleInPlaceObjectWindowless_iface);
513 HTMLDocument_LockContainer(This->doc_obj, FALSE);
515 if(This->advise_holder)
516 IOleAdviseHolder_SendOnClose(This->advise_holder);
518 return S_OK;
521 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
523 HTMLDocument *This = impl_from_IOleObject(iface);
524 FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk);
525 return E_NOTIMPL;
528 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
530 HTMLDocument *This = impl_from_IOleObject(iface);
531 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
532 return E_NOTIMPL;
535 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
536 DWORD dwReserved)
538 HTMLDocument *This = impl_from_IOleObject(iface);
539 FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved);
540 return E_NOTIMPL;
543 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
545 HTMLDocument *This = impl_from_IOleObject(iface);
546 FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject);
547 return E_NOTIMPL;
550 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
551 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
553 HTMLDocument *This = impl_from_IOleObject(iface);
554 IOleDocumentSite *pDocSite;
555 HRESULT hres;
557 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
559 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
560 FIXME("iVerb = %d not supported\n", iVerb);
561 return E_NOTIMPL;
564 if(!pActiveSite)
565 pActiveSite = This->doc_obj->client;
567 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
568 if(SUCCEEDED(hres)) {
569 HTMLDocument_LockContainer(This->doc_obj, TRUE);
571 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
572 hres = IOleDocumentSite_ActivateMe(pDocSite, &This->IOleDocumentView_iface);
573 IOleDocumentSite_Release(pDocSite);
574 }else {
575 hres = IOleDocumentView_UIActivate(&This->IOleDocumentView_iface, TRUE);
576 if(SUCCEEDED(hres)) {
577 if(lprcPosRect) {
578 RECT rect; /* We need to pass rect as not const pointer */
579 rect = *lprcPosRect;
580 IOleDocumentView_SetRect(&This->IOleDocumentView_iface, &rect);
582 IOleDocumentView_Show(&This->IOleDocumentView_iface, TRUE);
586 return hres;
589 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
591 HTMLDocument *This = impl_from_IOleObject(iface);
592 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
593 return E_NOTIMPL;
596 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
598 HTMLDocument *This = impl_from_IOleObject(iface);
599 FIXME("(%p)\n", This);
600 return E_NOTIMPL;
603 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
605 HTMLDocument *This = impl_from_IOleObject(iface);
606 FIXME("(%p)\n", This);
607 return E_NOTIMPL;
610 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
612 HTMLDocument *This = impl_from_IOleObject(iface);
614 TRACE("(%p)->(%p)\n", This, pClsid);
616 if(!pClsid)
617 return E_INVALIDARG;
619 *pClsid = CLSID_HTMLDocument;
620 return S_OK;
623 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
625 HTMLDocument *This = impl_from_IOleObject(iface);
626 FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType);
627 return E_NOTIMPL;
630 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
632 HTMLDocument *This = impl_from_IOleObject(iface);
633 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
634 return E_NOTIMPL;
637 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
639 HTMLDocument *This = impl_from_IOleObject(iface);
640 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
641 return E_NOTIMPL;
644 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
646 HTMLDocument *This = impl_from_IOleObject(iface);
647 TRACE("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
649 if(!pdwConnection)
650 return E_INVALIDARG;
652 if(!pAdvSink) {
653 *pdwConnection = 0;
654 return E_INVALIDARG;
657 if(!This->advise_holder) {
658 CreateOleAdviseHolder(&This->advise_holder);
659 if(!This->advise_holder)
660 return E_OUTOFMEMORY;
663 return IOleAdviseHolder_Advise(This->advise_holder, pAdvSink, pdwConnection);
666 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
668 HTMLDocument *This = impl_from_IOleObject(iface);
669 TRACE("(%p)->(%d)\n", This, dwConnection);
671 if(!This->advise_holder)
672 return OLE_E_NOCONNECTION;
674 return IOleAdviseHolder_Unadvise(This->advise_holder, dwConnection);
677 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
679 HTMLDocument *This = impl_from_IOleObject(iface);
681 if(!This->advise_holder) {
682 *ppenumAdvise = NULL;
683 return S_OK;
686 return IOleAdviseHolder_EnumAdvise(This->advise_holder, ppenumAdvise);
689 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
691 HTMLDocument *This = impl_from_IOleObject(iface);
692 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
693 return E_NOTIMPL;
696 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
698 HTMLDocument *This = impl_from_IOleObject(iface);
699 FIXME("(%p)->(%p)\n", This, pLogpal);
700 return E_NOTIMPL;
703 static const IOleObjectVtbl OleObjectVtbl = {
704 OleObject_QueryInterface,
705 OleObject_AddRef,
706 OleObject_Release,
707 OleObject_SetClientSite,
708 OleObject_GetClientSite,
709 OleObject_SetHostNames,
710 OleObject_Close,
711 OleObject_SetMoniker,
712 OleObject_GetMoniker,
713 OleObject_InitFromData,
714 OleObject_GetClipboardData,
715 OleObject_DoVerb,
716 OleObject_EnumVerbs,
717 OleObject_Update,
718 OleObject_IsUpToDate,
719 OleObject_GetUserClassID,
720 OleObject_GetUserType,
721 OleObject_SetExtent,
722 OleObject_GetExtent,
723 OleObject_Advise,
724 OleObject_Unadvise,
725 OleObject_EnumAdvise,
726 OleObject_GetMiscStatus,
727 OleObject_SetColorScheme
730 /**********************************************************
731 * IOleDocument implementation
734 static inline HTMLDocument *impl_from_IOleDocument(IOleDocument *iface)
736 return CONTAINING_RECORD(iface, HTMLDocument, IOleDocument_iface);
739 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppv)
741 HTMLDocument *This = impl_from_IOleDocument(iface);
742 return htmldoc_query_interface(This, riid, ppv);
745 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
747 HTMLDocument *This = impl_from_IOleDocument(iface);
748 return htmldoc_addref(This);
751 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
753 HTMLDocument *This = impl_from_IOleDocument(iface);
754 return htmldoc_release(This);
757 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
758 DWORD dwReserved, IOleDocumentView **ppView)
760 HTMLDocument *This = impl_from_IOleDocument(iface);
761 HRESULT hres;
763 TRACE("(%p)->(%p %p %d %p)\n", This, pIPSite, pstm, dwReserved, ppView);
765 if(!ppView)
766 return E_INVALIDARG;
768 /* FIXME:
769 * Windows implementation creates new IOleDocumentView when function is called for the
770 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
771 * if the application uses returned interfaces, passed to ActivateMe or returned by
772 * QueryInterface, so there is no reason to create new interface. This needs more testing.
775 if(pIPSite) {
776 hres = IOleDocumentView_SetInPlaceSite(&This->IOleDocumentView_iface, pIPSite);
777 if(FAILED(hres))
778 return hres;
781 if(pstm)
782 FIXME("pstm is not supported\n");
784 IOleDocumentView_AddRef(&This->IOleDocumentView_iface);
785 *ppView = &This->IOleDocumentView_iface;
786 return S_OK;
789 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
791 HTMLDocument *This = impl_from_IOleDocument(iface);
792 FIXME("(%p)->(%p)\n", This, pdwStatus);
793 return E_NOTIMPL;
796 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
797 IOleDocumentView **ppView)
799 HTMLDocument *This = impl_from_IOleDocument(iface);
800 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
801 return E_NOTIMPL;
804 static const IOleDocumentVtbl OleDocumentVtbl = {
805 OleDocument_QueryInterface,
806 OleDocument_AddRef,
807 OleDocument_Release,
808 OleDocument_CreateView,
809 OleDocument_GetDocMiscStatus,
810 OleDocument_EnumViews
813 /**********************************************************
814 * IOleControl implementation
817 static inline HTMLDocument *impl_from_IOleControl(IOleControl *iface)
819 return CONTAINING_RECORD(iface, HTMLDocument, IOleControl_iface);
822 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
824 HTMLDocument *This = impl_from_IOleControl(iface);
825 return htmldoc_query_interface(This, riid, ppv);
828 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
830 HTMLDocument *This = impl_from_IOleControl(iface);
831 return htmldoc_addref(This);
834 static ULONG WINAPI OleControl_Release(IOleControl *iface)
836 HTMLDocument *This = impl_from_IOleControl(iface);
837 return htmldoc_release(This);
840 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
842 HTMLDocument *This = impl_from_IOleControl(iface);
843 FIXME("(%p)->(%p)\n", This, pCI);
844 return E_NOTIMPL;
847 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
849 HTMLDocument *This = impl_from_IOleControl(iface);
850 FIXME("(%p)->(%p)\n", This, pMsg);
851 return E_NOTIMPL;
854 HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
856 IDispatch *disp = NULL;
857 DISPPARAMS dispparams = {NULL, 0};
858 UINT err;
859 HRESULT hres;
861 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
862 if(FAILED(hres)) {
863 TRACE("Could not get IDispatch\n");
864 return hres;
867 VariantInit(res);
869 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
870 DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
872 IDispatch_Release(disp);
874 return hres;
877 static HRESULT on_change_dlcontrol(HTMLDocument *This)
879 VARIANT res;
880 HRESULT hres;
882 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_DLCONTROL, &res);
883 if(SUCCEEDED(hres))
884 FIXME("unsupported dlcontrol %08x\n", V_I4(&res));
886 return S_OK;
889 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
891 HTMLDocument *This = impl_from_IOleControl(iface);
892 IOleClientSite *client;
893 VARIANT res;
894 HRESULT hres;
896 client = This->doc_obj->client;
897 if(!client) {
898 TRACE("client = NULL\n");
899 return S_OK;
902 switch(dispID) {
903 case DISPID_AMBIENT_USERMODE:
904 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
905 hres = get_client_disp_property(client, DISPID_AMBIENT_USERMODE, &res);
906 if(FAILED(hres))
907 return S_OK;
909 if(V_VT(&res) == VT_BOOL) {
910 if(V_BOOL(&res)) {
911 This->doc_obj->usermode = BROWSEMODE;
912 }else {
913 FIXME("edit mode is not supported\n");
914 This->doc_obj->usermode = EDITMODE;
916 }else {
917 FIXME("usermode=%s\n", debugstr_variant(&res));
919 return S_OK;
920 case DISPID_AMBIENT_DLCONTROL:
921 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
922 return on_change_dlcontrol(This);
923 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
924 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
925 on_change_dlcontrol(This);
926 hres = get_client_disp_property(client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
927 if(FAILED(hres))
928 return S_OK;
930 if(V_VT(&res) == VT_BOOL) {
931 if(V_BOOL(&res)) {
932 FIXME("offline connection is not supported\n");
933 hres = E_FAIL;
935 }else {
936 FIXME("offlineconnected=%s\n", debugstr_variant(&res));
938 return S_OK;
939 case DISPID_AMBIENT_SILENT:
940 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
941 on_change_dlcontrol(This);
942 hres = get_client_disp_property(client, DISPID_AMBIENT_SILENT, &res);
943 if(FAILED(hres))
944 return S_OK;
946 if(V_VT(&res) == VT_BOOL) {
947 if(V_BOOL(&res)) {
948 FIXME("silent mode is not supported\n");
949 hres = E_FAIL;
951 }else {
952 FIXME("silent=%s\n", debugstr_variant(&res));
954 return S_OK;
955 case DISPID_AMBIENT_USERAGENT:
956 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
957 hres = get_client_disp_property(client, DISPID_AMBIENT_USERAGENT, &res);
958 if(FAILED(hres))
959 return S_OK;
961 FIXME("not supported AMBIENT_USERAGENT\n");
962 hres = E_FAIL;
963 return S_OK;
964 case DISPID_AMBIENT_PALETTE:
965 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
966 hres = get_client_disp_property(client, DISPID_AMBIENT_PALETTE, &res);
967 if(FAILED(hres))
968 return S_OK;
970 FIXME("not supported AMBIENT_PALETTE\n");
971 hres = E_FAIL;
972 return S_OK;
975 FIXME("(%p) unsupported dispID=%d\n", This, dispID);
976 return E_FAIL;
979 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
981 HTMLDocument *This = impl_from_IOleControl(iface);
982 FIXME("(%p)->(%x)\n", This, bFreeze);
983 return E_NOTIMPL;
986 static const IOleControlVtbl OleControlVtbl = {
987 OleControl_QueryInterface,
988 OleControl_AddRef,
989 OleControl_Release,
990 OleControl_GetControlInfo,
991 OleControl_OnMnemonic,
992 OleControl_OnAmbientPropertyChange,
993 OleControl_FreezeEvents
996 /**********************************************************
997 * IObjectWithSite implementation
1000 static inline HTMLDocument *impl_from_IObjectWithSite(IObjectWithSite *iface)
1002 return CONTAINING_RECORD(iface, HTMLDocument, IObjectWithSite_iface);
1005 static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
1007 HTMLDocument *This = impl_from_IObjectWithSite(iface);
1008 return htmldoc_query_interface(This, riid, ppv);
1011 static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface)
1013 HTMLDocument *This = impl_from_IObjectWithSite(iface);
1014 return htmldoc_addref(This);
1017 static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface)
1019 HTMLDocument *This = impl_from_IObjectWithSite(iface);
1020 return htmldoc_release(This);
1023 static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite)
1025 HTMLDocument *This = impl_from_IObjectWithSite(iface);
1026 FIXME("(%p)->(%p)\n", This, pUnkSite);
1027 return E_NOTIMPL;
1030 static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite* iface, REFIID riid, PVOID *ppvSite)
1032 HTMLDocument *This = impl_from_IObjectWithSite(iface);
1033 FIXME("(%p)->(%p)\n", This, ppvSite);
1034 return E_NOTIMPL;
1037 static const IObjectWithSiteVtbl ObjectWithSiteVtbl = {
1038 ObjectWithSite_QueryInterface,
1039 ObjectWithSite_AddRef,
1040 ObjectWithSite_Release,
1041 ObjectWithSite_SetSite,
1042 ObjectWithSite_GetSite
1045 /**********************************************************
1046 * IOleContainer implementation
1049 static inline HTMLDocument *impl_from_IOleContainer(IOleContainer *iface)
1051 return CONTAINING_RECORD(iface, HTMLDocument, IOleContainer_iface);
1054 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
1056 HTMLDocument *This = impl_from_IOleContainer(iface);
1057 return htmldoc_query_interface(This, riid, ppv);
1060 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
1062 HTMLDocument *This = impl_from_IOleContainer(iface);
1063 return htmldoc_addref(This);
1066 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
1068 HTMLDocument *This = impl_from_IOleContainer(iface);
1069 return htmldoc_release(This);
1072 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc, LPOLESTR pszDisplayName,
1073 ULONG *pchEaten, IMoniker **ppmkOut)
1075 HTMLDocument *This = impl_from_IOleContainer(iface);
1076 FIXME("(%p)->(%p %s %p %p)\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
1077 return E_NOTIMPL;
1080 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, IEnumUnknown **ppenum)
1082 HTMLDocument *This = impl_from_IOleContainer(iface);
1083 EnumUnknown *ret;
1085 TRACE("(%p)->(%x %p)\n", This, grfFlags, ppenum);
1087 ret = heap_alloc(sizeof(*ret));
1088 if(!ret)
1089 return E_OUTOFMEMORY;
1091 ret->IEnumUnknown_iface.lpVtbl = &EnumUnknownVtbl;
1092 ret->ref = 1;
1094 *ppenum = &ret->IEnumUnknown_iface;
1095 return S_OK;
1098 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
1100 HTMLDocument *This = impl_from_IOleContainer(iface);
1101 FIXME("(%p)->(%x)\n", This, fLock);
1102 return E_NOTIMPL;
1105 static const IOleContainerVtbl OleContainerVtbl = {
1106 OleContainer_QueryInterface,
1107 OleContainer_AddRef,
1108 OleContainer_Release,
1109 OleContainer_ParseDisplayName,
1110 OleContainer_EnumObjects,
1111 OleContainer_LockContainer
1114 static inline HTMLDocumentObj *impl_from_ITargetContainer(ITargetContainer *iface)
1116 return CONTAINING_RECORD(iface, HTMLDocumentObj, ITargetContainer_iface);
1119 static HRESULT WINAPI TargetContainer_QueryInterface(ITargetContainer *iface, REFIID riid, void **ppv)
1121 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1122 return ICustomDoc_QueryInterface(&This->ICustomDoc_iface, riid, ppv);
1125 static ULONG WINAPI TargetContainer_AddRef(ITargetContainer *iface)
1127 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1128 return ICustomDoc_AddRef(&This->ICustomDoc_iface);
1131 static ULONG WINAPI TargetContainer_Release(ITargetContainer *iface)
1133 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1134 return ICustomDoc_Release(&This->ICustomDoc_iface);
1137 static HRESULT WINAPI TargetContainer_GetFrameUrl(ITargetContainer *iface, LPWSTR *ppszFrameSrc)
1139 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1140 FIXME("(%p)->(%p)\n", This, ppszFrameSrc);
1141 return E_NOTIMPL;
1144 static HRESULT WINAPI TargetContainer_GetFramesContainer(ITargetContainer *iface, IOleContainer **ppContainer)
1146 HTMLDocumentObj *This = impl_from_ITargetContainer(iface);
1148 TRACE("(%p)->(%p)\n", This, ppContainer);
1150 /* NOTE: we should return wrapped interface here */
1151 IOleContainer_AddRef(&This->basedoc.IOleContainer_iface);
1152 *ppContainer = &This->basedoc.IOleContainer_iface;
1153 return S_OK;
1156 static const ITargetContainerVtbl TargetContainerVtbl = {
1157 TargetContainer_QueryInterface,
1158 TargetContainer_AddRef,
1159 TargetContainer_Release,
1160 TargetContainer_GetFrameUrl,
1161 TargetContainer_GetFramesContainer
1164 void TargetContainer_Init(HTMLDocumentObj *This)
1166 This->ITargetContainer_iface.lpVtbl = &TargetContainerVtbl;
1169 /**********************************************************
1170 * IObjectSafety implementation
1173 static inline HTMLDocument *impl_from_IObjectSafety(IObjectSafety *iface)
1175 return CONTAINING_RECORD(iface, HTMLDocument, IObjectSafety_iface);
1178 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
1180 HTMLDocument *This = impl_from_IObjectSafety(iface);
1181 return htmldoc_query_interface(This, riid, ppv);
1184 static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface)
1186 HTMLDocument *This = impl_from_IObjectSafety(iface);
1187 return htmldoc_addref(This);
1190 static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface)
1192 HTMLDocument *This = impl_from_IObjectSafety(iface);
1193 return htmldoc_release(This);
1196 static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface,
1197 REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
1199 HTMLDocument *This = impl_from_IObjectSafety(iface);
1200 FIXME("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
1201 return E_NOTIMPL;
1204 static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface,
1205 REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
1207 HTMLDocument *This = impl_from_IObjectSafety(iface);
1208 FIXME("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
1210 if(IsEqualGUID(&IID_IPersistMoniker, riid) &&
1211 dwOptionSetMask==INTERFACESAFE_FOR_UNTRUSTED_DATA &&
1212 dwEnabledOptions==INTERFACESAFE_FOR_UNTRUSTED_DATA)
1213 return S_OK;
1215 return E_NOTIMPL;
1218 static const IObjectSafetyVtbl ObjectSafetyVtbl = {
1219 ObjectSafety_QueryInterface,
1220 ObjectSafety_AddRef,
1221 ObjectSafety_Release,
1222 ObjectSafety_GetInterfaceSafetyOptions,
1223 ObjectSafety_SetInterfaceSafetyOptions
1226 void HTMLDocument_LockContainer(HTMLDocumentObj *This, BOOL fLock)
1228 IOleContainer *container;
1229 HRESULT hres;
1231 if(!This->client || This->container_locked == fLock)
1232 return;
1234 hres = IOleClientSite_GetContainer(This->client, &container);
1235 if(SUCCEEDED(hres)) {
1236 IOleContainer_LockContainer(container, fLock);
1237 This->container_locked = fLock;
1238 IOleContainer_Release(container);
1242 void HTMLDocument_OleObj_Init(HTMLDocument *This)
1244 This->IOleObject_iface.lpVtbl = &OleObjectVtbl;
1245 This->IOleDocument_iface.lpVtbl = &OleDocumentVtbl;
1246 This->IOleControl_iface.lpVtbl = &OleControlVtbl;
1247 This->IObjectWithSite_iface.lpVtbl = &ObjectWithSiteVtbl;
1248 This->IOleContainer_iface.lpVtbl = &OleContainerVtbl;
1249 This->IObjectSafety_iface.lpVtbl = &ObjectSafetyVtbl;