Jacek Caban : mshtml: Added window IDispatchEx implementation.

Alexandre Julliard julliard at winehq.org
Mon Apr 21 07:45:48 CDT 2008


Module: wine
Branch: master
Commit: a5843056c5c77c522b803e8a6dcea01e725ec303
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a5843056c5c77c522b803e8a6dcea01e725ec303

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Apr 19 18:41:25 2008 +0200

mshtml: Added window IDispatchEx implementation.

---

 dlls/mshtml/dispex.c         |    2 +
 dlls/mshtml/htmlwindow.c     |  186 +++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/mshtml_private.h |    4 +
 3 files changed, 189 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 5cffe0a..06b495b 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -51,7 +51,9 @@ static struct list dispex_data_list = LIST_INIT(dispex_data_list);
 
 static REFIID tid_ids[] = {
     &IID_NULL,
+    &DIID_DispHTMLWindow2,
     &IID_IHTMLWindow2,
+    &IID_IHTMLWindow3,
     &IID_IOmNavigator
 };
 
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index e96e860..39d54d6 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -33,10 +33,10 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
-#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
-
 static struct list window_list = LIST_INIT(window_list);
 
+#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
+
 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
 {
     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
@@ -49,6 +49,9 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii
     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
         *ppv = HTMLWINDOW2(This);
+    }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
+        TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
+        *ppv = DISPATCHEX(This);
     }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
         TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
         *ppv = HTMLWINDOW2(This);
@@ -942,6 +945,180 @@ static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
     HTMLWindow3_showModelessDialog
 };
 
+#define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface)
+
+static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+}
+
+static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+}
+
+static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+}
+
+static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+
+    return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
+}
+
+static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
+                                               LCID lcid, ITypeInfo **ppTInfo)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+
+    return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
+}
+
+static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
+                                                 LPOLESTR *rgszNames, UINT cNames,
+                                                 LCID lcid, DISPID *rgDispId)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
+          lcid, rgDispId);
+
+    /* FIXME: Use script dispatch */
+
+    return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
+}
+
+static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
+                            REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+                            VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    /* FIXME: Use script dispatch */
+
+    return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
+                              pVarResult, pExcepInfo, puArgErr);
+}
+
+static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
+
+    return IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid);
+}
+
+static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
+        VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+
+    return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+}
+
+static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
+
+    return IDispatchEx_DeleteMemberByName(DISPATCHEX(&This->dispex), bstrName, grfdex);
+}
+
+static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%x)\n", This, id);
+
+    return IDispatchEx_DeleteMemberByDispID(DISPATCHEX(&This->dispex), id);
+}
+
+static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
+
+    return IDispatchEx_GetMemberProperties(DISPATCHEX(&This->dispex), id, grfdexFetch, pgrfdex);
+}
+
+static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
+
+    return IDispatchEx_GetMemberName(DISPATCHEX(&This->dispex), id, pbstrName);
+}
+
+static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
+
+    return IDispatchEx_GetNextDispID(DISPATCHEX(&This->dispex), grfdex, id, pid);
+}
+
+static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
+{
+    HTMLWindow *This = DISPEX_THIS(iface);
+
+    TRACE("(%p)->(%p)\n", This, ppunk);
+
+    return IDispatchEx_GetNameSpaceParent(DISPATCHEX(&This->dispex), ppunk);
+}
+
+#undef DISPEX_THIS
+
+static const IDispatchExVtbl WindowDispExVtbl = {
+    WindowDispEx_QueryInterface,
+    WindowDispEx_AddRef,
+    WindowDispEx_Release,
+    WindowDispEx_GetTypeInfoCount,
+    WindowDispEx_GetTypeInfo,
+    WindowDispEx_GetIDsOfNames,
+    WindowDispEx_Invoke,
+    WindowDispEx_GetDispID,
+    WindowDispEx_InvokeEx,
+    WindowDispEx_DeleteMemberByName,
+    WindowDispEx_DeleteMemberByDispID,
+    WindowDispEx_GetMemberProperties,
+    WindowDispEx_GetMemberName,
+    WindowDispEx_GetNextDispID,
+    WindowDispEx_GetNameSpaceParent
+};
+
+static dispex_static_data_t HTMLWindow_dispex = {
+    DispHTMLWindow2_tid,
+    NULL,
+    {
+        IHTMLWindow2_tid,
+        IHTMLWindow3_tid,
+        0
+    }
+};
+
 static const char wineConfig_func[] =
 "window.__defineGetter__(\"external\",function() {\n"
 "    return window.__wineWindow__.external;\n"
@@ -1046,13 +1223,16 @@ void setup_nswindow(HTMLWindow *This)
 
 HTMLWindow *HTMLWindow_Create(HTMLDocument *doc)
 {
-    HTMLWindow *ret = heap_alloc_zero(sizeof(HTMLWindow));
+    HTMLWindow *ret = heap_alloc(sizeof(HTMLWindow));
 
     ret->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl;
     ret->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl;
+    ret->lpIDispatchExVtbl = &WindowDispExVtbl;
     ret->ref = 1;
     ret->doc = doc;
 
+    init_dispex(&ret->dispex, (IUnknown*)HTMLWINDOW2(ret), &HTMLWindow_dispex);
+
     if(doc->nscontainer) {
         nsresult nsres;
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index e0f28c7..8bca848 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -61,7 +61,9 @@ typedef struct event_target_t event_target_t;
 /* NOTE: make sure to keep in sync with dispex.c */
 typedef enum {
     NULL_tid,
+    DispHTMLWindow2_tid,
     IHTMLWindow2_tid,
+    IHTMLWindow3_tid,
     IOmNavigator_tid,
     LAST_tid
 } tid_t;
@@ -85,8 +87,10 @@ typedef struct {
 void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
 
 typedef struct {
+    DispatchEx dispex;
     const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl;
     const IHTMLWindow3Vtbl *lpHTMLWindow3Vtbl;
+    const IDispatchExVtbl  *lpIDispatchExVtbl;
 
     LONG ref;
 




More information about the wine-cvs mailing list