| /* |
| * Copyright 2010 Jacek Caban for CodeWeavers |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include <stdarg.h> |
| #include <assert.h> |
| |
| #define COBJMACROS |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "winuser.h" |
| #include "winreg.h" |
| #include "ole2.h" |
| |
| #include "wine/debug.h" |
| |
| #include "mshtml_private.h" |
| #include "pluginhost.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(mshtml); |
| |
| struct HTMLObjectElement { |
| HTMLPluginContainer plugin_container; |
| |
| IHTMLObjectElement IHTMLObjectElement_iface; |
| IHTMLObjectElement2 IHTMLObjectElement2_iface; |
| |
| nsIDOMHTMLObjectElement *nsobject; |
| }; |
| |
| static inline HTMLObjectElement *impl_from_IHTMLObjectElement(IHTMLObjectElement *iface) |
| { |
| return CONTAINING_RECORD(iface, HTMLObjectElement, IHTMLObjectElement_iface); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_QueryInterface(IHTMLObjectElement *iface, |
| REFIID riid, void **ppv) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| return IHTMLDOMNode_QueryInterface(&This->plugin_container.element.node.IHTMLDOMNode_iface, |
| riid, ppv); |
| } |
| |
| static ULONG WINAPI HTMLObjectElement_AddRef(IHTMLObjectElement *iface) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| return IHTMLDOMNode_AddRef(&This->plugin_container.element.node.IHTMLDOMNode_iface); |
| } |
| |
| static ULONG WINAPI HTMLObjectElement_Release(IHTMLObjectElement *iface) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| return IHTMLDOMNode_Release(&This->plugin_container.element.node.IHTMLDOMNode_iface); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_GetTypeInfoCount(IHTMLObjectElement *iface, UINT *pctinfo) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| return IDispatchEx_GetTypeInfoCount(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| pctinfo); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_GetTypeInfo(IHTMLObjectElement *iface, UINT iTInfo, |
| LCID lcid, ITypeInfo **ppTInfo) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| return IDispatchEx_GetTypeInfo(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| iTInfo, lcid, ppTInfo); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_GetIDsOfNames(IHTMLObjectElement *iface, REFIID riid, |
| LPOLESTR *rgszNames, UINT cNames, |
| LCID lcid, DISPID *rgDispId) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| return IDispatchEx_GetIDsOfNames(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| riid, rgszNames, cNames, lcid, rgDispId); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_Invoke(IHTMLObjectElement *iface, DISPID dispIdMember, |
| REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, |
| VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| return IDispatchEx_Invoke(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_object(IHTMLObjectElement *iface, IDispatch **p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| return get_plugin_disp(&This->plugin_container, p); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_classid(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| return IHTMLObjectElement2_get_classid(&This->IHTMLObjectElement2_iface, p); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_data(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| return IHTMLObjectElement2_get_data(&This->IHTMLObjectElement2_iface, p); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_recordset(IHTMLObjectElement *iface, IDispatch *v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, v); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_recordset(IHTMLObjectElement *iface, IDispatch **p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_align(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_align(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_name(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString nsstr; |
| nsresult nsres; |
| |
| TRACE("(%p)->(%s)\n", This, debugstr_w(v)); |
| |
| nsAString_InitDepend(&nsstr, v); |
| nsres = nsIDOMHTMLObjectElement_SetName(This->nsobject, &nsstr); |
| nsAString_Finish(&nsstr); |
| return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_name(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString nsstr; |
| nsresult nsres; |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| nsAString_Init(&nsstr, NULL); |
| nsres = nsIDOMHTMLObjectElement_GetName(This->nsobject, &nsstr); |
| return return_nsstr(nsres, &nsstr, p); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_codeBase(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_codeBase(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_codeType(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_codeType(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_code(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_code(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_BaseHref(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_type(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_type(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_form(IHTMLObjectElement *iface, IHTMLFormElement **p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_width(IHTMLObjectElement *iface, VARIANT v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString width_str; |
| PRUnichar buf[12]; |
| nsresult nsres; |
| |
| TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); |
| |
| switch(V_VT(&v)) { |
| case VT_I4: { |
| static const WCHAR formatW[] = {'%','d',0}; |
| sprintfW(buf, formatW, V_I4(&v)); |
| break; |
| } |
| default: |
| FIXME("unimplemented for arg %s\n", debugstr_variant(&v)); |
| return E_NOTIMPL; |
| } |
| |
| nsAString_InitDepend(&width_str, buf); |
| nsres = nsIDOMHTMLObjectElement_SetWidth(This->nsobject, &width_str); |
| nsAString_Finish(&width_str); |
| if(NS_FAILED(nsres)) { |
| FIXME("SetWidth failed: %08x\n", nsres); |
| return E_FAIL; |
| } |
| |
| notif_container_change(&This->plugin_container, DISPID_UNKNOWN); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_width(IHTMLObjectElement *iface, VARIANT *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString width_str; |
| nsresult nsres; |
| HRESULT hres; |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| nsAString_Init(&width_str, NULL); |
| nsres = nsIDOMHTMLObjectElement_GetWidth(This->nsobject, &width_str); |
| if(NS_SUCCEEDED(nsres)) { |
| const PRUnichar *width; |
| |
| nsAString_GetData(&width_str, &width); |
| V_VT(p) = VT_BSTR; |
| V_BSTR(p) = SysAllocString(width); |
| hres = V_BSTR(p) ? S_OK : E_OUTOFMEMORY; |
| }else { |
| ERR("GetWidth failed: %08x\n", nsres); |
| hres = E_FAIL; |
| } |
| |
| nsAString_Finish(&width_str); |
| return hres; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_height(IHTMLObjectElement *iface, VARIANT v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString height_str; |
| PRUnichar buf[12]; |
| nsresult nsres; |
| |
| TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); |
| |
| switch(V_VT(&v)) { |
| case VT_I4: { |
| static const WCHAR formatW[] = {'%','d',0}; |
| sprintfW(buf, formatW, V_I4(&v)); |
| break; |
| } |
| default: |
| FIXME("unimplemented for arg %s\n", debugstr_variant(&v)); |
| return E_NOTIMPL; |
| } |
| |
| nsAString_InitDepend(&height_str, buf); |
| nsres = nsIDOMHTMLObjectElement_SetHeight(This->nsobject, &height_str); |
| nsAString_Finish(&height_str); |
| if(NS_FAILED(nsres)) { |
| FIXME("SetHeight failed: %08x\n", nsres); |
| return E_FAIL; |
| } |
| |
| notif_container_change(&This->plugin_container, DISPID_UNKNOWN); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_height(IHTMLObjectElement *iface, VARIANT *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsAString height_str; |
| nsresult nsres; |
| HRESULT hres; |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| nsAString_Init(&height_str, NULL); |
| nsres = nsIDOMHTMLObjectElement_GetHeight(This->nsobject, &height_str); |
| if(NS_SUCCEEDED(nsres)) { |
| const PRUnichar *height; |
| |
| nsAString_GetData(&height_str, &height); |
| V_VT(p) = VT_BSTR; |
| V_BSTR(p) = SysAllocString(height); |
| hres = V_BSTR(p) ? S_OK : E_OUTOFMEMORY; |
| }else { |
| ERR("GetHeight failed: %08x\n", nsres); |
| hres = E_FAIL; |
| } |
| |
| nsAString_Finish(&height_str); |
| return hres; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_readyState(IHTMLObjectElement *iface, LONG *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_onreadystatechange(IHTMLObjectElement *iface, VARIANT v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_onreadystatechange(IHTMLObjectElement *iface, VARIANT *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_onerror(IHTMLObjectElement *iface, VARIANT v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_onerror(IHTMLObjectElement *iface, VARIANT *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_altHtml(IHTMLObjectElement *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_altHtml(IHTMLObjectElement *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_vspace(IHTMLObjectElement *iface, LONG v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%d)\n", This, v); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_vspace(IHTMLObjectElement *iface, LONG *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| nsresult nsres; |
| |
| TRACE("(%p)->(%p)\n", This, p); |
| |
| nsres = nsIDOMHTMLObjectElement_GetVspace(This->nsobject, p); |
| if(NS_FAILED(nsres)) { |
| ERR("GetVspace failed: %08x\n", nsres); |
| return E_FAIL; |
| } |
| |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_put_hspace(IHTMLObjectElement *iface, LONG v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%d)\n", This, v); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement_get_hspace(IHTMLObjectElement *iface, LONG *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static const IHTMLObjectElementVtbl HTMLObjectElementVtbl = { |
| HTMLObjectElement_QueryInterface, |
| HTMLObjectElement_AddRef, |
| HTMLObjectElement_Release, |
| HTMLObjectElement_GetTypeInfoCount, |
| HTMLObjectElement_GetTypeInfo, |
| HTMLObjectElement_GetIDsOfNames, |
| HTMLObjectElement_Invoke, |
| HTMLObjectElement_get_object, |
| HTMLObjectElement_get_classid, |
| HTMLObjectElement_get_data, |
| HTMLObjectElement_put_recordset, |
| HTMLObjectElement_get_recordset, |
| HTMLObjectElement_put_align, |
| HTMLObjectElement_get_align, |
| HTMLObjectElement_put_name, |
| HTMLObjectElement_get_name, |
| HTMLObjectElement_put_codeBase, |
| HTMLObjectElement_get_codeBase, |
| HTMLObjectElement_put_codeType, |
| HTMLObjectElement_get_codeType, |
| HTMLObjectElement_put_code, |
| HTMLObjectElement_get_code, |
| HTMLObjectElement_get_BaseHref, |
| HTMLObjectElement_put_type, |
| HTMLObjectElement_get_type, |
| HTMLObjectElement_get_form, |
| HTMLObjectElement_put_width, |
| HTMLObjectElement_get_width, |
| HTMLObjectElement_put_height, |
| HTMLObjectElement_get_height, |
| HTMLObjectElement_get_readyState, |
| HTMLObjectElement_put_onreadystatechange, |
| HTMLObjectElement_get_onreadystatechange, |
| HTMLObjectElement_put_onerror, |
| HTMLObjectElement_get_onerror, |
| HTMLObjectElement_put_altHtml, |
| HTMLObjectElement_get_altHtml, |
| HTMLObjectElement_put_vspace, |
| HTMLObjectElement_get_vspace, |
| HTMLObjectElement_put_hspace, |
| HTMLObjectElement_get_hspace |
| }; |
| |
| static inline HTMLObjectElement *impl_from_IHTMLObjectElement2(IHTMLObjectElement2 *iface) |
| { |
| return CONTAINING_RECORD(iface, HTMLObjectElement, IHTMLObjectElement2_iface); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_QueryInterface(IHTMLObjectElement2 *iface, |
| REFIID riid, void **ppv) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| |
| return IHTMLDOMNode_QueryInterface(&This->plugin_container.element.node.IHTMLDOMNode_iface, |
| riid, ppv); |
| } |
| |
| static ULONG WINAPI HTMLObjectElement2_AddRef(IHTMLObjectElement2 *iface) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| |
| return IHTMLDOMNode_AddRef(&This->plugin_container.element.node.IHTMLDOMNode_iface); |
| } |
| |
| static ULONG WINAPI HTMLObjectElement2_Release(IHTMLObjectElement2 *iface) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| |
| return IHTMLDOMNode_Release(&This->plugin_container.element.node.IHTMLDOMNode_iface); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_GetTypeInfoCount(IHTMLObjectElement2 *iface, UINT *pctinfo) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| return IDispatchEx_GetTypeInfoCount(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| pctinfo); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_GetTypeInfo(IHTMLObjectElement2 *iface, UINT iTInfo, |
| LCID lcid, ITypeInfo **ppTInfo) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| return IDispatchEx_GetTypeInfo(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| iTInfo, lcid, ppTInfo); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_GetIDsOfNames(IHTMLObjectElement2 *iface, REFIID riid, |
| LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| return IDispatchEx_GetIDsOfNames(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| riid, rgszNames, cNames, lcid, rgDispId); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_Invoke(IHTMLObjectElement2 *iface, DISPID dispIdMember, |
| REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, |
| EXCEPINFO *pExcepInfo, UINT *puArgErr) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| return IDispatchEx_Invoke(&This->plugin_container.element.node.event_target.dispex.IDispatchEx_iface, |
| dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_namedRecordset(IHTMLObjectElement2 *iface, BSTR dataMember, |
| VARIANT *hierarchy, IDispatch **ppRecordset) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(dataMember), hierarchy, ppRecordset); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_put_classid(IHTMLObjectElement2 *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| HRESULT hres; |
| |
| static const WCHAR classidW[] = {'c','l','a','s','s','i','d',0}; |
| |
| FIXME("(%p)->(%s) semi-stub\n", This, debugstr_w(v)); |
| |
| hres = elem_string_attr_setter(&This->plugin_container.element, classidW, v); |
| if(FAILED(hres)) |
| return hres; |
| |
| if(This->plugin_container.plugin_host) { |
| FIXME("Host already associated.\n"); |
| return E_NOTIMPL; |
| } |
| |
| /* |
| * NOTE: |
| * If the element is not yet in DOM tree, we should embed it as soon as it's added. |
| * However, Gecko for some reason decides not to create NP plugin in this case, |
| * so this won't work. |
| */ |
| |
| return create_plugin_host(This->plugin_container.element.node.doc, &This->plugin_container); |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_get_classid(IHTMLObjectElement2 *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_put_data(IHTMLObjectElement2 *iface, BSTR v) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| FIXME("(%p)->(%s)\n", This, debugstr_w(v)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI HTMLObjectElement2_get_data(IHTMLObjectElement2 *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static const IHTMLObjectElement2Vtbl HTMLObjectElement2Vtbl = { |
| HTMLObjectElement2_QueryInterface, |
| HTMLObjectElement2_AddRef, |
| HTMLObjectElement2_Release, |
| HTMLObjectElement2_GetTypeInfoCount, |
| HTMLObjectElement2_GetTypeInfo, |
| HTMLObjectElement2_GetIDsOfNames, |
| HTMLObjectElement2_Invoke, |
| HTMLObjectElement2_namedRecordset, |
| HTMLObjectElement2_put_classid, |
| HTMLObjectElement2_get_classid, |
| HTMLObjectElement2_put_data, |
| HTMLObjectElement2_get_data |
| }; |
| |
| static inline HTMLObjectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) |
| { |
| return CONTAINING_RECORD(iface, HTMLObjectElement, plugin_container.element.node); |
| } |
| |
| static HRESULT HTMLObjectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| *ppv = &This->IHTMLObjectElement_iface; |
| }else if(IsEqualGUID(&IID_IDispatch, riid)) { |
| *ppv = &This->IHTMLObjectElement_iface; |
| }else if(IsEqualGUID(&IID_IHTMLObjectElement, riid)) { |
| *ppv = &This->IHTMLObjectElement_iface; |
| }else if(IsEqualGUID(&IID_IHTMLObjectElement2, riid)) { |
| *ppv = &This->IHTMLObjectElement2_iface; |
| }else if(IsEqualGUID(&IID_HTMLPluginContainer, riid)) { |
| /* Special pseudo-interface returning HTMLPluginContainse struct. */ |
| *ppv = &This->plugin_container; |
| node_addref(&This->plugin_container.element.node); |
| return S_OK; |
| }else { |
| HRESULT hres; |
| |
| hres = HTMLElement_QI(&This->plugin_container.element.node, riid, ppv); |
| if(hres == E_NOINTERFACE && This->plugin_container.plugin_host && This->plugin_container.plugin_host->plugin_unk) { |
| IUnknown *plugin_iface, *ret; |
| |
| hres = IUnknown_QueryInterface(This->plugin_container.plugin_host->plugin_unk, riid, (void**)&plugin_iface); |
| if(hres == S_OK) { |
| hres = wrap_iface(plugin_iface, (IUnknown*)&This->IHTMLObjectElement_iface, &ret); |
| IUnknown_Release(plugin_iface); |
| if(FAILED(hres)) |
| return hres; |
| |
| TRACE("returning plugin iface %p wrapped to %p\n", plugin_iface, ret); |
| *ppv = ret; |
| return S_OK; |
| } |
| } |
| |
| return hres; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static void HTMLObjectElement_destructor(HTMLDOMNode *iface) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| if(This->plugin_container.plugin_host) |
| detach_plugin_host(This->plugin_container.plugin_host); |
| |
| HTMLElement_destructor(&This->plugin_container.element.node); |
| } |
| |
| static HRESULT HTMLObjectElement_get_readystate(HTMLDOMNode *iface, BSTR *p) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| FIXME("(%p)->(%p)\n", This, p); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT HTMLObjectElement_get_dispid(HTMLDOMNode *iface, BSTR name, |
| DWORD grfdex, DISPID *pid) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(name), grfdex, pid); |
| |
| return get_plugin_dispid(&This->plugin_container, name, pid); |
| } |
| |
| static HRESULT HTMLObjectElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, |
| WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| TRACE("(%p)->(%d)\n", This, id); |
| |
| return invoke_plugin_prop(&This->plugin_container, id, lcid, flags, params, res, ei); |
| } |
| |
| static void HTMLObjectElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| if(This->nsobject) |
| note_cc_edge((nsISupports*)This->nsobject, "This->nsobject", cb); |
| } |
| |
| static void HTMLObjectElement_unlink(HTMLDOMNode *iface) |
| { |
| HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); |
| |
| if(This->nsobject) { |
| nsIDOMHTMLObjectElement *nsobject = This->nsobject; |
| |
| This->nsobject = NULL; |
| nsIDOMHTMLObjectElement_Release(nsobject); |
| } |
| } |
| |
| static const NodeImplVtbl HTMLObjectElementImplVtbl = { |
| &CLSID_HTMLObjectElement, |
| HTMLObjectElement_QI, |
| HTMLObjectElement_destructor, |
| HTMLElement_cpc, |
| HTMLElement_clone, |
| HTMLElement_handle_event, |
| HTMLElement_get_attr_col, |
| NULL, |
| NULL, |
| NULL, |
| NULL, |
| NULL, |
| HTMLObjectElement_get_readystate, |
| HTMLObjectElement_get_dispid, |
| HTMLObjectElement_invoke, |
| NULL, |
| HTMLObjectElement_traverse, |
| HTMLObjectElement_unlink |
| }; |
| |
| static const tid_t HTMLObjectElement_iface_tids[] = { |
| IHTMLObjectElement2_tid, |
| IHTMLObjectElement_tid, |
| HTMLELEMENT_TIDS, |
| 0 |
| }; |
| static dispex_static_data_t HTMLObjectElement_dispex = { |
| NULL, |
| DispHTMLObjectElement_tid, |
| HTMLObjectElement_iface_tids, |
| HTMLElement_init_dispex_info |
| }; |
| |
| HRESULT HTMLObjectElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem) |
| { |
| HTMLObjectElement *ret; |
| nsresult nsres; |
| |
| ret = heap_alloc_zero(sizeof(*ret)); |
| if(!ret) |
| return E_OUTOFMEMORY; |
| |
| ret->IHTMLObjectElement_iface.lpVtbl = &HTMLObjectElementVtbl; |
| ret->IHTMLObjectElement2_iface.lpVtbl = &HTMLObjectElement2Vtbl; |
| ret->plugin_container.element.node.vtbl = &HTMLObjectElementImplVtbl; |
| |
| HTMLElement_Init(&ret->plugin_container.element, doc, nselem, &HTMLObjectElement_dispex); |
| |
| nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLObjectElement, (void**)&ret->nsobject); |
| assert(nsres == NS_OK); |
| |
| *elem = &ret->plugin_container.element; |
| return S_OK; |
| } |