void update_title(HTMLDocumentObj *This) { IOleCommandTarget *olecmd; HRESULT hres; if(!(This->update & UPDATE_TITLE)) return; This->update &= ~UPDATE_TITLE; if(!This->client) return; hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { VARIANT title; WCHAR empty[] = {0}; V_VT(&title) = VT_BSTR; V_BSTR(&title) = SysAllocString(empty); IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETTITLE, OLECMDEXECOPT_DONTPROMPTUSER, &title, NULL); SysFreeString(V_BSTR(&title)); IOleCommandTarget_Release(olecmd); } }
static LRESULT on_timer(HTMLDocumentObj *This) { TRACE("(%p) %x\n", This, This->update); KillTimer(This->hwnd, TIMER_ID); if(!This->update) return 0; if(This->update & UPDATE_UI) { if(This->hostui) IDocHostUIHandler_UpdateUI(This->hostui); if(This->client) { IOleCommandTarget *cmdtrg; HRESULT hres; hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); IOleCommandTarget_Release(cmdtrg); } } } update_title(This); This->update = 0; return 0; }
static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { WebBrowser *This = impl_from_IWebBrowser2(iface); IOleCommandTarget *target = NULL; HRESULT hres; TRACE("(%p)->(%d %d %s %p)\n", This, cmdID, cmdexecopt, debugstr_variant(pvaIn), pvaOut); if(This->container) { hres = IOleContainer_QueryInterface(This->container, &IID_IOleCommandTarget, (LPVOID*)&target); if(FAILED(hres)) target = NULL; } if(!target && This->doc_host.document) { hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IOleCommandTarget, (LPVOID*)&target); if(FAILED(hres)) target = NULL; } if(!target) return E_UNEXPECTED; hres = IOleCommandTarget_Exec(target, NULL, cmdID, cmdexecopt, pvaIn, pvaOut); IOleCommandTarget_Release(target); return hres; }
static HRESULT DocHostContainer_exec(DocHost *doc_host, const GUID *cmd_group, DWORD cmdid, DWORD execopt, VARIANT *in, VARIANT *out) { WebBrowser *This = impl_from_DocHost(doc_host); IOleCommandTarget *cmdtrg = NULL; HRESULT hres; if(This->client) { hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(FAILED(hres)) cmdtrg = NULL; } if(!cmdtrg && This->container) { hres = IOleContainer_QueryInterface(This->container, &IID_IOleCommandTarget, (void**)&cmdtrg); if(FAILED(hres)) cmdtrg = NULL; } if(!cmdtrg) return E_NOTIMPL; hres = IOleCommandTarget_Exec(cmdtrg, cmd_group, cmdid, execopt, in, out); IOleCommandTarget_Release(cmdtrg); if(SUCCEEDED(hres)) TRACE("Exec returned %08x %s\n", hres, debugstr_variant(out)); else FIXME("Exec failed\n"); return hres; }
static HRESULT STDMETHODCALLTYPE ITrayBandSiteImpl_AddBand(IN OUT IBandSite *iface, IN IUnknown *punk) { ITrayBandSiteImpl *This = ITrayBandSiteImpl_from_IBandSite(iface); IOleCommandTarget *pOct; HRESULT hRet; hRet = IUnknown_QueryInterface(punk, &IID_IOleCommandTarget, (PVOID*)&pOct); if (SUCCEEDED(hRet)) { /* Send the DBID_DELAYINIT command to initialize the band to be added */ /* FIXME: Should be delayed */ IOleCommandTarget_Exec(pOct, &IID_IDeskBand, DBID_DELAYINIT, 0, NULL, NULL); IOleCommandTarget_Release(pOct); } return IBandSite_AddBand(This->BandSite, punk); }
static HRESULT WINAPI WBOleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) { WebBrowser *This = impl_from_IOleCommandTarget(iface); IOleCommandTarget *cmdtrg; HRESULT hres; TRACE("(%p)->(%s %u %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText); if(!This->doc_host.document) return 0x80040104; /* NOTE: There are probably some commands that we should handle here * instead of forwarding to document object. */ hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IOleCommandTarget, (void**)&cmdtrg); if(FAILED(hres)) return hres; hres = IOleCommandTarget_QueryStatus(cmdtrg, pguidCmdGroup, cCmds, prgCmds, pCmdText); IOleCommandTarget_Release(cmdtrg); return hres; }
static void notify_travellog_update(HTMLDocumentObj *doc) { IOleCommandTarget *cmdtrg; HRESULT hres; if(!doc->is_webbrowser) return; /* Don't notify if we were in about: page */ if(doc->basedoc.window->uri) { DWORD scheme; hres = IUri_GetScheme(doc->basedoc.window->uri, &scheme); if(SUCCEEDED(hres) && scheme == URL_SCHEME_ABOUT) return; } hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT vin; V_VT(&vin) = VT_I4; V_I4(&vin) = 0; IOleCommandTarget_Exec(cmdtrg, &CGID_Explorer, CMDID_EXPLORER_UPDATEHISTORY, 0, &vin, NULL); IOleCommandTarget_Release(cmdtrg); } }
static void handle_docobj_load(HTMLDocumentObj *doc) { IOleCommandTarget *olecmd = NULL; HRESULT hres; if(!doc->client) return; hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { if(doc->download_state) { VARIANT state, progress; V_VT(&progress) = VT_I4; V_I4(&progress) = 0; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL); V_VT(&state) = VT_I4; V_I4(&state) = 0; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, &state, NULL); } IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL); IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL); IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL); IOleCommandTarget_Release(olecmd); } doc->download_state = 0; }
void prepare_for_binding(HTMLDocument *This, IMoniker *mon, DWORD flags) { HRESULT hres; if(This->doc_obj->client) { VARIANT silent, offline; hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { if(V_VT(&silent) != VT_BOOL) WARN("silent = %s\n", debugstr_variant(&silent)); else if(V_BOOL(&silent)) FIXME("silent == true\n"); } hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline); if(SUCCEEDED(hres)) { if(V_VT(&offline) != VT_BOOL) WARN("offline = %s\n", debugstr_variant(&offline)); else if(V_BOOL(&offline)) FIXME("offline == true\n"); } } if(This->window->mon) { update_doc(This, UPDATE_TITLE|UPDATE_UI); }else { update_doc(This, UPDATE_TITLE); set_current_mon(This->window, mon, flags); } if(This->doc_obj->client) { IOleCommandTarget *cmdtrg = NULL; hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var, out; if(flags & BINDING_NAVIGATED) { V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&This->window->base.IHTMLWindow2_iface; V_VT(&out) = VT_EMPTY; hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out); if(SUCCEEDED(hres)) VariantClear(&out); }else if(!(flags & BINDING_FROMHIST)) { V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL); } IOleCommandTarget_Release(cmdtrg); } } }
static HRESULT WINAPI PersistHistory_LoadHistory(IPersistHistory *iface, IStream *pStream, IBindCtx *pbc) { HTMLDocument *This = impl_from_IPersistHistory(iface); ULONG str_len, read; WCHAR *uri_str; IUri *uri; HRESULT hres; TRACE("(%p)->(%p %p)\n", This, pStream, pbc); if(!This->window) { FIXME("No current window\n"); return E_UNEXPECTED; } if(pbc) FIXME("pbc not supported\n"); if(This->doc_obj->client) { IOleCommandTarget *cmdtrg = NULL; hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 138, 0, NULL, NULL); IOleCommandTarget_Release(cmdtrg); } } hres = IStream_Read(pStream, &str_len, sizeof(str_len), &read); if(FAILED(hres)) return hres; if(read != sizeof(str_len)) return E_FAIL; uri_str = heap_alloc((str_len+1)*sizeof(WCHAR)); if(!uri_str) return E_OUTOFMEMORY; hres = IStream_Read(pStream, uri_str, str_len*sizeof(WCHAR), &read); if(SUCCEEDED(hres) && read != str_len*sizeof(WCHAR)) hres = E_FAIL; if(SUCCEEDED(hres)) { uri_str[str_len] = 0; hres = create_uri(uri_str, 0, &uri); } heap_free(uri_str); if(FAILED(hres)) return hres; hres = load_uri(This->window, uri, BINDING_FROMHIST); IUri_Release(uri); return hres; }
static void set_downloading_proc(task_t *_task) { download_proc_task_t *task = (download_proc_task_t*)_task; HTMLDocumentObj *doc = task->doc; IOleCommandTarget *olecmd; HRESULT hres; TRACE("(%p)\n", doc); set_statustext(doc, IDS_STATUS_DOWNLOADINGFROM, task->url); CoTaskMemFree(task->url); if(!doc->client) return; if(task->set_download) { hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { VARIANT var; V_VT(&var) = VT_I4; V_I4(&var) = 1; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Release(olecmd); } doc->download_state = 1; } if(doc->view_sink) IAdviseSink_OnViewChange(doc->view_sink, DVASPECT_CONTENT, -1); if(doc->hostui) { IDropTarget *drop_target = NULL; hres = IDocHostUIHandler_GetDropTarget(doc->hostui, NULL /* FIXME */, &drop_target); if(drop_target) { FIXME("Use IDropTarget\n"); IDropTarget_Release(drop_target); } } }
static void notify_travellog_update(HTMLDocumentObj *doc) { IOleCommandTarget *cmdtrg; HRESULT hres; if(!doc->webbrowser) return; hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT vin; V_VT(&vin) = VT_I4; V_I4(&vin) = 0; IOleCommandTarget_Exec(cmdtrg, &CGID_Explorer, CMDID_EXPLORER_UPDATEHISTORY, 0, &vin, NULL); IOleCommandTarget_Release(cmdtrg); } }
/* Calls undocumented 84 cmd of CGID_ShellDocView */ void call_docview_84(HTMLDocumentObj *doc) { IOleCommandTarget *olecmd; VARIANT var; HRESULT hres; if(!doc->client) return; hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(FAILED(hres)) return; VariantInit(&var); hres = IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 84, 0, NULL, &var); IOleCommandTarget_Release(olecmd); if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL) FIXME("handle result\n"); }
static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf) { WebBrowser *This = impl_from_IWebBrowser2(iface); IOleCommandTarget *target = NULL; OLECMD ole_command[1]; HRESULT hres; TRACE("(%p)->(%d %p)\n", This, cmdID, pcmdf); if (!pcmdf) return E_POINTER; ole_command[0].cmdID = cmdID; ole_command[0].cmdf = *pcmdf; if (This->container) { hres = IOleContainer_QueryInterface(This->container, &IID_IOleCommandTarget, (LPVOID*)&target); if(FAILED(hres)) target = NULL; } if (!target && This->doc_host.document) { hres = IUnknown_QueryInterface(This->doc_host.document, &IID_IOleCommandTarget, (LPVOID*)&target); if(FAILED(hres)) target = NULL; } if (!target) return E_UNEXPECTED; hres = IOleCommandTarget_QueryStatus(target, NULL, 1, ole_command, NULL); if (SUCCEEDED(hres)) *pcmdf = ole_command[0].cmdf; if (hres == OLECMDERR_E_NOTSUPPORTED) { *pcmdf = 0; hres = S_OK; } IOleCommandTarget_Release(target); return hres; }
static void handle_docobj_load(HTMLDocumentObj *doc) { HRESULT hres; if(doc->nscontainer->editor_controller) { nsIController_Release(doc->nscontainer->editor_controller); doc->nscontainer->editor_controller = NULL; } if(doc->usermode == EDITMODE) handle_edit_load(&doc->basedoc); if(doc->client) { IOleCommandTarget *olecmd = NULL; hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { if(doc->download_state) { VARIANT state, progress; V_VT(&progress) = VT_I4; V_I4(&progress) = 0; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL); V_VT(&state) = VT_I4; V_I4(&state) = 0; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, &state, NULL); } IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL); IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL); IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL); IOleCommandTarget_Release(olecmd); } } doc->download_state = 0; }
void set_download_state(HTMLDocumentObj *doc, int state) { if(doc->client) { IOleCommandTarget *olecmd; HRESULT hres; hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { VARIANT var; V_VT(&var) = VT_I4; V_I4(&var) = state; IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Release(olecmd); } } doc->download_state = state; }
static void set_progress_proc(task_t *_task) { docobj_task_t *task = (docobj_task_t*)_task; IOleCommandTarget *olecmd = NULL; HTMLDocumentObj *doc = task->doc; HRESULT hres; TRACE("(%p)\n", doc); if(doc->client) IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(olecmd) { VARIANT progress_max, progress; V_VT(&progress_max) = VT_I4; V_I4(&progress_max) = 0; /* FIXME */ IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER, &progress_max, NULL); V_VT(&progress) = VT_I4; V_I4(&progress) = 0; /* FIXME */ IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL); IOleCommandTarget_Release(olecmd); } if(doc->usermode == EDITMODE && doc->hostui) { DOCHOSTUIINFO hostinfo; memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO)); hostinfo.cbSize = sizeof(DOCHOSTUIINFO); hres = IDocHostUIHandler_GetHostInfo(doc->hostui, &hostinfo); if(SUCCEEDED(hres)) /* FIXME: use hostinfo */ TRACE("hostinfo = {%u %08x %08x %s %s}\n", hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick, debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS)); } }
static HRESULT ITrayBandSiteImpl_Update(IN OUT ITrayBandSiteImpl *This) { IOleCommandTarget *pOct; HRESULT hRet; hRet = IUnknown_QueryInterface(This->punkInner, &IID_IOleCommandTarget, (PVOID*)&pOct); if (SUCCEEDED(hRet)) { /* Send the DBID_BANDINFOCHANGED command to update the band site */ hRet = IOleCommandTarget_Exec(pOct, &IID_IDeskBand, DBID_BANDINFOCHANGED, 0, NULL, NULL); IOleCommandTarget_Release(pOct); } return hRet; }
static VOID ITrayBandSiteImpl_BroadcastOleCommandExec(IN OUT ITrayBandSiteImpl *This, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) { IOleCommandTarget *pOct; DWORD dwBandID; UINT uBand = 0; /* Enumerate all bands */ while (SUCCEEDED(IBandSite_EnumBands(This->BandSite, uBand, &dwBandID))) { if (SUCCEEDED(IBandSite_GetBandObject(This->BandSite, dwBandID, &IID_IOleCommandTarget, (PVOID*)&pOct))) { /* Execute the command */ IOleCommandTarget_Exec(pOct, pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut); IOleCommandTarget_Release(pOct); } uBand++; } }
static void activate_plugin(PluginHost *host) { IClientSecurity *client_security; IQuickActivate *quick_activate; IOleObject *ole_obj = NULL; IOleCommandTarget *cmdtrg; IViewObjectEx *view_obj; IDispatchEx *dispex; IDispatch *disp; RECT rect; HRESULT hres; if(!host->plugin_unk) return; /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */ /* FIXME: call FreezeEvents(TRUE) */ hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IClientSecurity, (void**)&client_security); if(SUCCEEDED(hres)) { FIXME("Handle IClientSecurity\n"); IClientSecurity_Release(client_security); return; } hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IQuickActivate, (void**)&quick_activate); if(SUCCEEDED(hres)) { QACONTAINER container = {sizeof(container)}; QACONTROL control = {sizeof(control)}; TRACE("Using IQuickActivate\n"); container.pClientSite = &host->IOleClientSite_iface; container.dwAmbientFlags = QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE; container.pAdviseSink = &host->IAdviseSinkEx_iface; container.pPropertyNotifySink = &host->IPropertyNotifySink_iface; hres = IQuickActivate_QuickActivate(quick_activate, &container, &control); IQuickActivate_Release(quick_activate); if(FAILED(hres)) FIXME("QuickActivate failed: %08x\n", hres); }else { DWORD status = 0; hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IOleObject, (void**)&ole_obj); if(SUCCEEDED(hres)) { hres = IOleObject_GetMiscStatus(ole_obj, DVASPECT_CONTENT, &status); TRACE("GetMiscStatus returned %08x %x\n", hres, status); hres = IOleObject_SetClientSite(ole_obj, &host->IOleClientSite_iface); IOleObject_Release(ole_obj); if(FAILED(hres)) { FIXME("SetClientSite failed: %08x\n", hres); return; } }else { TRACE("Plugin does not support IOleObject\n"); } } load_plugin(host); if(ole_obj) { hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IViewObjectEx, (void**)&view_obj); if(SUCCEEDED(hres)) { DWORD view_status = 0; hres = IViewObjectEx_SetAdvise(view_obj, DVASPECT_CONTENT, 0, (IAdviseSink*)&host->IAdviseSinkEx_iface); if(FAILED(hres)) WARN("SetAdvise failed: %08x\n", hres); hres = IViewObjectEx_GetViewStatus(view_obj, &view_status); IViewObjectEx_Release(view_obj); TRACE("GetViewStatus returned %08x %x\n", hres, view_status); } } update_readystate(host); /* NOTE: Native QIs for IActiveScript, an undocumented IID, IOleControl and IRunnableObject */ hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { FIXME("Use IDispatchEx\n"); host->disp = (IDispatch*)dispex; }else { hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatch, (void**)&disp); if(SUCCEEDED(hres)) host->disp = disp; else TRACE("no IDispatch iface\n"); } hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { FIXME("Use IOleCommandTarget\n"); IOleCommandTarget_Release(cmdtrg); } hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IOleObject, (void**)&ole_obj); if(FAILED(hres)) { FIXME("Plugin does not support IOleObject\n"); return; } if(ole_obj) { get_pos_rect(host, &rect); hres = IOleObject_DoVerb(ole_obj, OLEIVERB_INPLACEACTIVATE, NULL, &host->IOleClientSite_iface, 0, host->hwnd, &rect); IOleObject_Release(ole_obj); if(FAILED(hres)) WARN("DoVerb failed: %08x\n", hres); } if(host->ip_object) { HWND hwnd; hres = IOleInPlaceObject_GetWindow(host->ip_object, &hwnd); if(SUCCEEDED(hres)) TRACE("hwnd %p\n", hwnd); } }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) { HTMLDocument *This = OLEOBJ_THIS(iface); IDocHostUIHandler *pDocHostUIHandler = NULL; IOleCommandTarget *cmdtrg = NULL; BOOL hostui_setup; VARIANT silent; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(pClientSite == This->doc_obj->client) return S_OK; if(This->doc_obj->client) { IOleClientSite_Release(This->doc_obj->client); This->doc_obj->client = NULL; This->doc_obj->usermode = UNKNOWN_USERMODE; } if(This->doc_obj->hostui) { IDocHostUIHandler_Release(This->doc_obj->hostui); This->doc_obj->hostui = NULL; } memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO)); if(!pClientSite) return S_OK; hostui_setup = This->doc_obj->hostui_setup; hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&pDocHostUIHandler); if(SUCCEEDED(hres)) { DOCHOSTUIINFO hostinfo; LPOLESTR key_path = NULL, override_key_path = NULL; IDocHostUIHandler2 *pDocHostUIHandler2; memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO)); hostinfo.cbSize = sizeof(DOCHOSTUIINFO); hres = IDocHostUIHandler_GetHostInfo(pDocHostUIHandler, &hostinfo); if(SUCCEEDED(hres)) { TRACE("hostinfo = {%u %08x %08x %s %s}\n", hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick, debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS)); update_hostinfo(This->doc_obj, &hostinfo); This->doc_obj->hostinfo = hostinfo; } if(!hostui_setup) { hres = IDocHostUIHandler_GetOptionKeyPath(pDocHostUIHandler, &key_path, 0); if(hres == S_OK && key_path) { if(key_path[0]) { /* FIXME: use key_path */ TRACE("key_path = %s\n", debugstr_w(key_path)); } CoTaskMemFree(key_path); } hres = IDocHostUIHandler_QueryInterface(pDocHostUIHandler, &IID_IDocHostUIHandler2, (void**)&pDocHostUIHandler2); if(SUCCEEDED(hres)) { hres = IDocHostUIHandler2_GetOverrideKeyPath(pDocHostUIHandler2, &override_key_path, 0); if(hres == S_OK && override_key_path && override_key_path[0]) { if(override_key_path[0]) { /*FIXME: use override_key_path */ TRACE("override_key_path = %s\n", debugstr_w(override_key_path)); } CoTaskMemFree(override_key_path); } IDocHostUIHandler2_Release(pDocHostUIHandler2); } This->doc_obj->hostui_setup = TRUE; } } /* Native calls here GetWindow. What is it for? * We don't have anything to do with it here (yet). */ if(pClientSite) { IOleWindow *pOleWindow = NULL; HWND hwnd; hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&pOleWindow); if(SUCCEEDED(hres)) { IOleWindow_GetWindow(pOleWindow, &hwnd); IOleWindow_Release(pOleWindow); } } hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var; OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0}; if(!hostui_setup) { V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window); IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL); } IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL); V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Release(cmdtrg); } IOleClientSite_AddRef(pClientSite); This->doc_obj->client = pClientSite; This->doc_obj->hostui = pDocHostUIHandler; if(This->doc_obj->usermode == UNKNOWN_USERMODE) IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERMODE); IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { if(V_VT(&silent) != VT_BOOL) WARN("V_VT(silent) = %d\n", V_VT(&silent)); else if(V_BOOL(&silent)) FIXME("silent == true\n"); } IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERAGENT); IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_PALETTE); return S_OK; }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite) { HTMLDocument *This = impl_from_IOleObject(iface); IOleCommandTarget *cmdtrg = NULL; IOleWindow *ole_window; IBrowserService *browser_service; BOOL hostui_setup; VARIANT silent; HWND hwnd; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(pClientSite == This->doc_obj->client) return S_OK; if(This->doc_obj->client) { IOleClientSite_Release(This->doc_obj->client); This->doc_obj->client = NULL; This->doc_obj->usermode = UNKNOWN_USERMODE; } if(This->doc_obj->client_cmdtrg) { IOleCommandTarget_Release(This->doc_obj->client_cmdtrg); This->doc_obj->client_cmdtrg = NULL; } if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) { IDocHostUIHandler_Release(This->doc_obj->hostui); This->doc_obj->hostui = NULL; } if(This->doc_obj->doc_object_service) { IDocObjectService_Release(This->doc_obj->doc_object_service); This->doc_obj->doc_object_service = NULL; } if(This->doc_obj->webbrowser) { IUnknown_Release(This->doc_obj->webbrowser); This->doc_obj->webbrowser = NULL; } if(This->doc_obj->browser_service) { IUnknown_Release(This->doc_obj->browser_service); This->doc_obj->browser_service = NULL; } if(This->doc_obj->travel_log) { ITravelLog_Release(This->doc_obj->travel_log); This->doc_obj->travel_log = NULL; } memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO)); if(!pClientSite) return S_OK; IOleClientSite_AddRef(pClientSite); This->doc_obj->client = pClientSite; hostui_setup = This->doc_obj->hostui_setup; if(!This->doc_obj->hostui) { IDocHostUIHandler *uihandler; This->doc_obj->custom_hostui = FALSE; hres = IOleClientSite_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler); if(SUCCEEDED(hres)) This->doc_obj->hostui = uihandler; } if(This->doc_obj->hostui) { DOCHOSTUIINFO hostinfo; LPOLESTR key_path = NULL, override_key_path = NULL; IDocHostUIHandler2 *uihandler2; memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO)); hostinfo.cbSize = sizeof(DOCHOSTUIINFO); hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo); if(SUCCEEDED(hres)) { TRACE("hostinfo = {%u %08x %08x %s %s}\n", hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick, debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS)); update_hostinfo(This->doc_obj, &hostinfo); This->doc_obj->hostinfo = hostinfo; } if(!hostui_setup) { hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0); if(hres == S_OK && key_path) { if(key_path[0]) { /* FIXME: use key_path */ FIXME("key_path = %s\n", debugstr_w(key_path)); } CoTaskMemFree(key_path); } hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2, (void**)&uihandler2); if(SUCCEEDED(hres)) { hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0); if(hres == S_OK && override_key_path) { if(override_key_path[0]) { /*FIXME: use override_key_path */ FIXME("override_key_path = %s\n", debugstr_w(override_key_path)); } CoTaskMemFree(override_key_path); } IDocHostUIHandler2_Release(uihandler2); } This->doc_obj->hostui_setup = TRUE; } } load_settings(This->doc_obj); /* Native calls here GetWindow. What is it for? * We don't have anything to do with it here (yet). */ hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window); if(SUCCEEDED(hres)) { IOleWindow_GetWindow(ole_window, &hwnd); IOleWindow_Release(ole_window); } hres = do_query_service((IUnknown*)pClientSite, &IID_IShellBrowser, &IID_IBrowserService, (void**)&browser_service); if(SUCCEEDED(hres)) { ITravelLog *travel_log; This->doc_obj->browser_service = (IUnknown*)browser_service; hres = IBrowserService_GetTravelLog(browser_service, &travel_log); if(SUCCEEDED(hres)) This->doc_obj->travel_log = travel_log; }else { browser_service = NULL; } hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var; OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0}; This->doc_obj->client_cmdtrg = cmdtrg; if(!hostui_setup) { IDocObjectService *doc_object_service; IWebBrowser2 *wb; set_document_navigation(This->doc_obj, TRUE); if(browser_service) { hres = IBrowserService_QueryInterface(browser_service, &IID_IDocObjectService, (void**)&doc_object_service); if(SUCCEEDED(hres)) { This->doc_obj->doc_object_service = doc_object_service; /* * Some embedding routines, esp. in regards to use of IDocObjectService, differ if * embedder supports IWebBrowserApp. */ hres = do_query_service((IUnknown*)pClientSite, &IID_IWebBrowserApp, &IID_IWebBrowser2, (void**)&wb); if(SUCCEEDED(hres)) This->doc_obj->webbrowser = (IUnknown*)wb; } } } call_docview_84(This->doc_obj); IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL); V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); } if(This->doc_obj->usermode == UNKNOWN_USERMODE) IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERMODE); IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED); hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { if(V_VT(&silent) != VT_BOOL) WARN("silent = %s\n", debugstr_variant(&silent)); else if(V_BOOL(&silent)) FIXME("silent == true\n"); } IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERAGENT); IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_PALETTE); return S_OK; }
static HRESULT activate_window(HTMLDocumentObj *This) { IOleInPlaceFrame *pIPFrame; IOleCommandTarget *cmdtrg; IOleInPlaceSiteEx *ipsiteex; RECT posrect, cliprect; OLEINPLACEFRAMEINFO frameinfo; HWND parent_hwnd; HRESULT hres; if(!serverwnd_class) register_serverwnd_class(); hres = IOleInPlaceSite_CanInPlaceActivate(This->ipsite); if(hres != S_OK) { WARN("CanInPlaceActivate returned: %08x\n", hres); return FAILED(hres) ? hres : E_FAIL; } hres = IOleInPlaceSite_GetWindowContext(This->ipsite, &pIPFrame, &This->ip_window, &posrect, &cliprect, &frameinfo); if(FAILED(hres)) { WARN("GetWindowContext failed: %08x\n", hres); return hres; } TRACE("got window context: %p %p {%d %d %d %d} {%d %d %d %d} {%d %x %p %p %d}\n", pIPFrame, This->ip_window, posrect.left, posrect.top, posrect.right, posrect.bottom, cliprect.left, cliprect.top, cliprect.right, cliprect.bottom, frameinfo.cb, frameinfo.fMDIApp, frameinfo.hwndFrame, frameinfo.haccel, frameinfo.cAccelEntries); hres = IOleInPlaceSite_GetWindow(This->ipsite, &parent_hwnd); if(FAILED(hres)) { WARN("GetWindow failed: %08x\n", hres); return hres; } TRACE("got parent window %p\n", parent_hwnd); if(This->hwnd) { if(GetParent(This->hwnd) != parent_hwnd) SetParent(This->hwnd, parent_hwnd); SetWindowPos(This->hwnd, HWND_TOP, posrect.left, posrect.top, posrect.right-posrect.left, posrect.bottom-posrect.top, SWP_NOACTIVATE | SWP_SHOWWINDOW); }else { CreateWindowExW(0, wszInternetExplorer_Server, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, posrect.left, posrect.top, posrect.right-posrect.left, posrect.bottom-posrect.top, parent_hwnd, NULL, hInst, This); TRACE("Created window %p\n", This->hwnd); SetWindowPos(This->hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_SHOWWINDOW); RedrawWindow(This->hwnd, NULL, NULL, RDW_INVALIDATE | RDW_NOERASE | RDW_ALLCHILDREN); /* NOTE: * Windows implementation calls: * RegisterWindowMessage("MSWHEEL_ROLLMSG"); */ SetTimer(This->hwnd, TIMER_ID, 100, NULL); } if(This->nscontainer) activate_gecko(This->nscontainer); This->in_place_active = TRUE; hres = IOleInPlaceSite_QueryInterface(This->ipsite, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex); if(SUCCEEDED(hres)) { BOOL redraw = FALSE; hres = IOleInPlaceSiteEx_OnInPlaceActivateEx(ipsiteex, &redraw, 0); IOleInPlaceSiteEx_Release(ipsiteex); if(redraw) FIXME("unsupported redraw\n"); }else{ hres = IOleInPlaceSite_OnInPlaceActivate(This->ipsite); } if(FAILED(hres)) { WARN("OnInPlaceActivate failed: %08x\n", hres); This->in_place_active = FALSE; return hres; } hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var; IOleInPlaceFrame_SetStatusText(pIPFrame, NULL); V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); IOleCommandTarget_Release(cmdtrg); } if(This->frame) IOleInPlaceFrame_Release(This->frame); This->frame = pIPFrame; if(!This->request_uiactivate) { hres = IOleInPlaceSite_QueryInterface(This->ipsite, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex); if(SUCCEEDED(hres)) { IOleInPlaceSiteEx_RequestUIActivate(ipsiteex); IOleInPlaceSiteEx_Release(ipsiteex); } } This->window_active = TRUE; return S_OK; }
HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannelBSC *async_bsc, BOOL set_download) { nsChannelBSC *bscallback; docobj_task_t *task; download_proc_task_t *download_task; nsWineURI *nsuri; LPOLESTR url; HRESULT hres; hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url); if(FAILED(hres)) { WARN("GetDiaplayName failed: %08x\n", hres); return hres; } TRACE("got url: %s\n", debugstr_w(url)); if(This->doc_obj->client) { VARIANT silent, offline; hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent); if(SUCCEEDED(hres)) { if(V_VT(&silent) != VT_BOOL) WARN("V_VT(silent) = %d\n", V_VT(&silent)); else if(V_BOOL(&silent)) FIXME("silent == true\n"); } hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline); if(SUCCEEDED(hres)) { if(V_VT(&offline) != VT_BOOL) WARN("V_VT(offline) = %d\n", V_VT(&offline)); else if(V_BOOL(&offline)) FIXME("offline == true\n"); } } if(This->window->mon) { update_doc(This, UPDATE_TITLE|UPDATE_UI); }else { update_doc(This, UPDATE_TITLE); set_current_mon(This->window, mon); } set_ready_state(This->window, READYSTATE_LOADING); if(This->doc_obj->client) { IOleCommandTarget *cmdtrg = NULL; hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg); if(SUCCEEDED(hres)) { VARIANT var, out; if(!async_bsc) { V_VT(&var) = VT_I4; V_I4(&var) = 0; IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL); }else { V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)&This->window->IHTMLWindow2_iface; V_VT(&out) = VT_EMPTY; hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out); if(SUCCEEDED(hres)) VariantClear(&out); } IOleCommandTarget_Release(cmdtrg); } } hres = create_doc_uri(This->window, url, &nsuri); if(SUCCEEDED(hres)) { if(async_bsc) { bscallback = async_bsc; }else { hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback); } } if(SUCCEEDED(hres)) { remove_target_tasks(This->task_magic); abort_document_bindings(This->doc_node); hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI); nsISupports_Release((nsISupports*)nsuri); /* FIXME */ if(SUCCEEDED(hres)) set_window_bscallback(This->window, bscallback); if(bscallback != async_bsc) IUnknown_Release((IUnknown*)bscallback); } if(FAILED(hres)) { CoTaskMemFree(url); return hres; } HTMLDocument_LockContainer(This->doc_obj, TRUE); if(This->doc_obj->frame) { task = heap_alloc(sizeof(docobj_task_t)); task->doc = This->doc_obj; push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic); } download_task = heap_alloc(sizeof(download_proc_task_t)); download_task->doc = This->doc_obj; download_task->set_download = set_download; download_task->url = url; push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic); return S_OK; }