Commit 7d2d8c7e authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Move iface_wrapper_t IUnknown implementation to htmlobject.c.

And build ifacewrap.c as x86-64 code on ARM64EC.
parent 8c1da99e
......@@ -632,6 +632,58 @@ static const IHTMLObjectElement2Vtbl HTMLObjectElement2Vtbl = {
HTMLObjectElement2_get_data
};
/*
* This object wraps any unrecognized interface overriding its IUnknown methods, allowing
* us to return external interface from our QI implementation preserving COM rules.
* This can't be done right and it seems to be broken by design.
*/
typedef struct {
IUnknown IUnknown_iface;
IUnknown *iface;
IUnknown *ref_unk;
LONG ref;
} iface_wrapper_t;
static inline iface_wrapper_t *impl_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, iface_wrapper_t, IUnknown_iface);
}
HRESULT WINAPI wrapper_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
return IUnknown_QueryInterface(This->ref_unk, riid, ppv);
}
ULONG WINAPI wrapper_AddRef(IUnknown *iface)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
return ref;
}
ULONG WINAPI wrapper_Release(IUnknown *iface)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
if(!ref) {
IUnknown_Release(This->iface);
IUnknown_Release(This->ref_unk);
free(This);
}
return ref;
}
static inline HTMLObjectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
{
return CONTAINING_RECORD(iface, HTMLObjectElement, plugin_container.element.node);
......@@ -665,19 +717,25 @@ static void *HTMLObjectElement_query_interface(DispatchEx *dispex, REFIID riid)
elem_iface = HTMLElement_query_interface(&This->plugin_container.element.node.event_target.dispex, riid);
if(!elem_iface && This->plugin_container.plugin_host && This->plugin_container.plugin_host->plugin_unk) {
IUnknown *plugin_iface, *ret;
IUnknown *plugin_iface;
HRESULT 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)) {
ERR("wrap_iface failed: %08lx\n", hres);
iface_wrapper_t *wrapper = malloc(sizeof(*wrapper));
if(!wrapper) {
IUnknown_Release(plugin_iface);
return NULL;
}
TRACE("returning plugin iface %p wrapped to %p\n", plugin_iface, ret);
return ret;
wrapper->IUnknown_iface.lpVtbl = (const IUnknownVtbl *)iface_wrapper_vtbl;
wrapper->ref = 1;
wrapper->iface = plugin_iface;
IUnknown_AddRef(wrapper->iface);
wrapper->ref_unk = (IUnknown*)&This->IHTMLObjectElement_iface;
IUnknown_Release(plugin_iface);
TRACE("returning plugin iface %p wrapped to %p\n", plugin_iface, wrapper);
return &wrapper->IUnknown_iface;
}
}
......
......@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#if 0
#pragma makedep arm64ec_x64
#endif
#include <stdarg.h>
#define COBJMACROS
......@@ -30,60 +34,6 @@
#include "mshtml_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
/*
* This object wraps any unrecognized interface overriding its IUnknown methods, allowing
* us to return external interface from our QI implementation preserving COM rules.
* This can't be done right and it seems to be broken by design.
*/
typedef struct {
IUnknown IUnknown_iface;
IUnknown *iface;
IUnknown *ref_unk;
LONG ref;
} iface_wrapper_t;
static inline iface_wrapper_t *impl_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, iface_wrapper_t, IUnknown_iface);
}
static HRESULT WINAPI wrapper_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
return IUnknown_QueryInterface(This->ref_unk, riid, ppv);
}
static ULONG WINAPI wrapper_AddRef(IUnknown *iface)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
return ref;
}
static ULONG WINAPI wrapper_Release(IUnknown *iface)
{
iface_wrapper_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
if(!ref) {
IUnknown_Release(This->iface);
IUnknown_Release(This->ref_unk);
free(This);
}
return ref;
}
#ifdef __i386__
#define DEFINE_WRAPPER_FUNC(n, off, x) \
......@@ -106,6 +56,8 @@ static ULONG WINAPI wrapper_Release(IUnknown *iface)
#else
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define DEFINE_WRAPPER_FUNC(n, x, off) \
static HRESULT WINAPI wrapper_func_##n(IUnknown *iface) { \
ERR("Not implemented for this architecture\n"); \
......@@ -214,132 +166,105 @@ DEFINE_WRAPPER_FUNC(98, 392, 784)
DEFINE_WRAPPER_FUNC(99, 396, 792)
/* The size was found by testing when calls start crashing. It looks like MS wraps up to 100 functions. */
static const struct {
IUnknownVtbl unk_vtbl;
const void *wrappers[97];
} wrapper_vtbl = {
{
wrapper_QueryInterface,
wrapper_AddRef,
wrapper_Release
}, {
wrapper_func_3,
wrapper_func_4,
wrapper_func_5,
wrapper_func_6,
wrapper_func_7,
wrapper_func_8,
wrapper_func_9,
wrapper_func_10,
wrapper_func_11,
wrapper_func_12,
wrapper_func_13,
wrapper_func_14,
wrapper_func_15,
wrapper_func_16,
wrapper_func_17,
wrapper_func_18,
wrapper_func_19,
wrapper_func_20,
wrapper_func_21,
wrapper_func_22,
wrapper_func_23,
wrapper_func_24,
wrapper_func_25,
wrapper_func_26,
wrapper_func_27,
wrapper_func_28,
wrapper_func_29,
wrapper_func_30,
wrapper_func_31,
wrapper_func_32,
wrapper_func_33,
wrapper_func_34,
wrapper_func_35,
wrapper_func_36,
wrapper_func_37,
wrapper_func_38,
wrapper_func_39,
wrapper_func_40,
wrapper_func_41,
wrapper_func_42,
wrapper_func_43,
wrapper_func_44,
wrapper_func_45,
wrapper_func_46,
wrapper_func_47,
wrapper_func_48,
wrapper_func_49,
wrapper_func_50,
wrapper_func_51,
wrapper_func_52,
wrapper_func_53,
wrapper_func_54,
wrapper_func_55,
wrapper_func_56,
wrapper_func_57,
wrapper_func_58,
wrapper_func_59,
wrapper_func_60,
wrapper_func_61,
wrapper_func_62,
wrapper_func_63,
wrapper_func_64,
wrapper_func_65,
wrapper_func_66,
wrapper_func_67,
wrapper_func_68,
wrapper_func_69,
wrapper_func_70,
wrapper_func_71,
wrapper_func_72,
wrapper_func_73,
wrapper_func_74,
wrapper_func_75,
wrapper_func_76,
wrapper_func_77,
wrapper_func_78,
wrapper_func_79,
wrapper_func_80,
wrapper_func_81,
wrapper_func_82,
wrapper_func_83,
wrapper_func_84,
wrapper_func_85,
wrapper_func_86,
wrapper_func_87,
wrapper_func_88,
wrapper_func_89,
wrapper_func_90,
wrapper_func_91,
wrapper_func_92,
wrapper_func_93,
wrapper_func_94,
wrapper_func_95,
wrapper_func_96,
wrapper_func_97,
wrapper_func_98,
wrapper_func_99
}
const void *iface_wrapper_vtbl[] = {
wrapper_QueryInterface,
wrapper_AddRef,
wrapper_Release,
wrapper_func_3,
wrapper_func_4,
wrapper_func_5,
wrapper_func_6,
wrapper_func_7,
wrapper_func_8,
wrapper_func_9,
wrapper_func_10,
wrapper_func_11,
wrapper_func_12,
wrapper_func_13,
wrapper_func_14,
wrapper_func_15,
wrapper_func_16,
wrapper_func_17,
wrapper_func_18,
wrapper_func_19,
wrapper_func_20,
wrapper_func_21,
wrapper_func_22,
wrapper_func_23,
wrapper_func_24,
wrapper_func_25,
wrapper_func_26,
wrapper_func_27,
wrapper_func_28,
wrapper_func_29,
wrapper_func_30,
wrapper_func_31,
wrapper_func_32,
wrapper_func_33,
wrapper_func_34,
wrapper_func_35,
wrapper_func_36,
wrapper_func_37,
wrapper_func_38,
wrapper_func_39,
wrapper_func_40,
wrapper_func_41,
wrapper_func_42,
wrapper_func_43,
wrapper_func_44,
wrapper_func_45,
wrapper_func_46,
wrapper_func_47,
wrapper_func_48,
wrapper_func_49,
wrapper_func_50,
wrapper_func_51,
wrapper_func_52,
wrapper_func_53,
wrapper_func_54,
wrapper_func_55,
wrapper_func_56,
wrapper_func_57,
wrapper_func_58,
wrapper_func_59,
wrapper_func_60,
wrapper_func_61,
wrapper_func_62,
wrapper_func_63,
wrapper_func_64,
wrapper_func_65,
wrapper_func_66,
wrapper_func_67,
wrapper_func_68,
wrapper_func_69,
wrapper_func_70,
wrapper_func_71,
wrapper_func_72,
wrapper_func_73,
wrapper_func_74,
wrapper_func_75,
wrapper_func_76,
wrapper_func_77,
wrapper_func_78,
wrapper_func_79,
wrapper_func_80,
wrapper_func_81,
wrapper_func_82,
wrapper_func_83,
wrapper_func_84,
wrapper_func_85,
wrapper_func_86,
wrapper_func_87,
wrapper_func_88,
wrapper_func_89,
wrapper_func_90,
wrapper_func_91,
wrapper_func_92,
wrapper_func_93,
wrapper_func_94,
wrapper_func_95,
wrapper_func_96,
wrapper_func_97,
wrapper_func_98,
wrapper_func_99
};
HRESULT wrap_iface(IUnknown *iface, IUnknown *ref_unk, IUnknown **ret)
{
iface_wrapper_t *wrapper;
wrapper = malloc(sizeof(*wrapper));
if(!wrapper)
return E_OUTOFMEMORY;
wrapper->IUnknown_iface.lpVtbl = &wrapper_vtbl.unk_vtbl;
wrapper->ref = 1;
IUnknown_AddRef(iface);
wrapper->iface = iface;
/* Caller AddRefs */
wrapper->ref_unk = ref_unk;
*ret = &wrapper->IUnknown_iface;
return S_OK;
}
......@@ -1224,7 +1224,10 @@ HRESULT get_doc_elem_by_id(HTMLDocumentNode*,const WCHAR*,HTMLElement**);
HTMLOuterWindow *get_target_window(HTMLOuterWindow*,nsAString*,BOOL*);
HRESULT handle_link_click_event(HTMLElement*,nsAString*,nsAString*,nsIDOMEvent*,BOOL*);
HRESULT wrap_iface(IUnknown*,IUnknown*,IUnknown**);
HRESULT WINAPI wrapper_QueryInterface(IUnknown *iface, REFIID riid, void **ppv);
ULONG WINAPI wrapper_AddRef(IUnknown *iface);
ULONG WINAPI wrapper_Release(IUnknown *iface);
extern const void *iface_wrapper_vtbl[];
IHTMLElementCollection *create_all_collection(HTMLDOMNode*,BOOL);
IHTMLElementCollection *create_collection_from_nodelist(nsIDOMNodeList*,compat_mode_t);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment