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