mshtml: Added support for custom DISPIDs.
authorJacek Caban <jacek@codeweavers.com>
Mon, 28 Apr 2008 23:38:09 +0000 (01:38 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 29 Apr 2008 10:38:25 +0000 (12:38 +0200)
dlls/mshtml/dispex.c
dlls/mshtml/htmldoc.c
dlls/mshtml/htmlelem.c
dlls/mshtml/htmltextnode.c
dlls/mshtml/htmlwindow.c
dlls/mshtml/mshtml_private.h
dlls/mshtml/omnavigator.c

index 153d864fc02dce4844c30135f1f7475d76df7f06..834f3b343ff20763fcae6dba79434b670e78f03f 100644 (file)
@@ -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;
index 425fb391426a226a19933fb3ab91e7e96072f42b..73e31f14f5262c5c3696b2629eedaf6df3b93887 100644 (file)
@@ -1491,6 +1491,7 @@ static const IDispatchExVtbl DocDispatchExVtbl = {
 };
 
 static dispex_static_data_t HTMLDocument_dispex = {
+    NULL,
     DispHTMLDocument_tid,
     NULL,
     {
index c44e2e56ae9ef9bcbf1c6dcd74727b6e4a56d081..faf888ca476206a52385db2ce103ce394988822e 100644 (file)
@@ -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,
     {
index fa6308efc6723275559f31d157fbc78b5a9634ad..b98821b89ab9c2c0cb56197d336b88b629af5fad 100644 (file)
@@ -186,6 +186,7 @@ static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = {
 };
 
 static dispex_static_data_t HTMLDOMTextNode_dispex = {
+    NULL,
     DispHTMLDOMTextNode_tid,
     0,
     {
index 82b03e697fb18f69a24af05f9adec9f3be1d0ab0..20731329eb6bd7678e48557b1fa8706cbc570e32 100644 (file)
@@ -1108,6 +1108,7 @@ static const IDispatchExVtbl WindowDispExVtbl = {
 };
 
 static dispex_static_data_t HTMLWindow_dispex = {
+    NULL,
     DispHTMLWindow2_tid,
     NULL,
     {
index 126bc2ec03ee65ec00537f5aa8e932ddbede5b84..42381b5e4988bf9deff52a1b935bd4c7b631a8b7 100644 (file)
@@ -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[];
index 742df19eb287c39a88f02d3ca6da1a7de5a2cdf4..74b2cfdb7e1035efad21d75c910f223a971f0c32 100644 (file)
@@ -301,6 +301,7 @@ static const IOmNavigatorVtbl OmNavigatorVtbl = {
 };
 
 static dispex_static_data_t OmNavigator_dispex = {
+    NULL,
     IOmNavigator_tid,
     NULL,
     {