Jacek Caban : mshtml: Added support for custom DISPIDs.
Alexandre Julliard
julliard at winehq.org
Tue Apr 29 08:54:34 CDT 2008
Module: wine
Branch: master
Commit: ef4200fcf78159e1b7f1d5f87f98b054d15dbf75
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef4200fcf78159e1b7f1d5f87f98b054d15dbf75
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Apr 29 01:38:09 2008 +0200
mshtml: Added support for custom DISPIDs.
---
dlls/mshtml/dispex.c | 16 ++++++++++++++++
dlls/mshtml/htmldoc.c | 1 +
dlls/mshtml/htmlelem.c | 2 ++
dlls/mshtml/htmltextnode.c | 1 +
dlls/mshtml/htmlwindow.c | 1 +
dlls/mshtml/mshtml_private.h | 11 ++++++++++-
dlls/mshtml/omnavigator.c | 1 +
7 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 153d864..834f3b3 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -277,6 +277,11 @@ void call_disp_func(HTMLDocument *doc, IDispatch *disp)
VariantClear(&res);
}
+static inline BOOL is_custom_dispid(DISPID id)
+{
+ return MSHTML_DISPID_CUSTOM_MIN <= id && id <= MSHTML_DISPID_CUSTOM_MAX;
+}
+
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
@@ -395,6 +400,14 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
min = n+1;
}
+ if(This->data->vtbl && This->data->vtbl->get_dispid) {
+ HRESULT hres;
+
+ hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid);
+ if(hres != DISP_E_UNKNOWNNAME)
+ return hres;
+ }
+
TRACE("not found %s\n", debugstr_w(bstrName));
return DISP_E_UNKNOWNNAME;
}
@@ -412,6 +425,9 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+ if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke)
+ return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+
if(wFlags == DISPATCH_CONSTRUCT) {
FIXME("DISPATCH_CONSTRUCT not implemented\n");
return E_NOTIMPL;
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 425fb39..73e31f1 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1491,6 +1491,7 @@ static const IDispatchExVtbl DocDispatchExVtbl = {
};
static dispex_static_data_t HTMLDocument_dispex = {
+ NULL,
DispHTMLDocument_tid,
NULL,
{
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index c44e2e5..faf888c 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1283,6 +1283,7 @@ static const NodeImplVtbl HTMLElementImplVtbl = {
};
static dispex_static_data_t HTMLElement_dispex = {
+ NULL,
DispHTMLUnknownElement_tid,
NULL,
{
@@ -1669,6 +1670,7 @@ static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = {
};
static dispex_static_data_t HTMLElementCollection_dispex = {
+ NULL,
DispHTMLElementCollection_tid,
NULL,
{
diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c
index fa6308e..b98821b 100644
--- a/dlls/mshtml/htmltextnode.c
+++ b/dlls/mshtml/htmltextnode.c
@@ -186,6 +186,7 @@ static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = {
};
static dispex_static_data_t HTMLDOMTextNode_dispex = {
+ NULL,
DispHTMLDOMTextNode_tid,
0,
{
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 82b03e6..2073132 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -1108,6 +1108,7 @@ static const IDispatchExVtbl WindowDispExVtbl = {
};
static dispex_static_data_t HTMLWindow_dispex = {
+ NULL,
DispHTMLWindow2_tid,
NULL,
{
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 126bc2e..42381b5 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2006 Jacek Caban for CodeWeavers
+ * Copyright 2005-2008 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
@@ -84,7 +84,16 @@ typedef enum {
typedef struct dispex_data_t dispex_data_t;
+#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
+#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
+
+typedef struct {
+ HRESULT (*get_dispid)(IUnknown*,BSTR,DWORD,DISPID*);
+ HRESULT (*invoke)(IUnknown*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
+} dispex_static_data_vtbl_t;
+
typedef struct {
+ const dispex_static_data_vtbl_t *vtbl;
const tid_t disp_tid;
dispex_data_t *data;
const tid_t iface_tids[];
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c
index 742df19..74b2cfd 100644
--- a/dlls/mshtml/omnavigator.c
+++ b/dlls/mshtml/omnavigator.c
@@ -301,6 +301,7 @@ static const IOmNavigatorVtbl OmNavigatorVtbl = {
};
static dispex_static_data_t OmNavigator_dispex = {
+ NULL,
IOmNavigator_tid,
NULL,
{
More information about the wine-cvs
mailing list