Gabriel Ivăncescu : msscript.ocx: Add IScriptProcedureCollection stub implementation.

Alexandre Julliard julliard at winehq.org
Tue Aug 11 16:26:51 CDT 2020


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Mon Aug 10 17:57:56 2020 +0300

msscript.ocx: Add IScriptProcedureCollection stub implementation.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msscript.ocx/msscript.c | 203 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 195 insertions(+), 8 deletions(-)

diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index 3fc4aca2e9..e98601438c 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -51,6 +51,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msscript);
 
 struct ScriptControl;
 typedef struct ConnectionPoint ConnectionPoint;
+typedef struct ScriptProcedureCollection ScriptProcedureCollection;
 typedef struct ScriptHost ScriptHost;
 
 struct ConnectionPoint {
@@ -82,8 +83,17 @@ typedef struct {
     BSTR name;
     ScriptHost *host;
     IDispatch *script_dispatch;
+
+    ScriptProcedureCollection *procedures;
 } ScriptModule;
 
+struct ScriptProcedureCollection {
+    IScriptProcedureCollection IScriptProcedureCollection_iface;
+    LONG ref;
+
+    ScriptModule *module;
+};
+
 struct ScriptHost {
     IActiveScriptSite IActiveScriptSite_iface;
     IActiveScriptSiteWindow IActiveScriptSiteWindow_iface;
@@ -137,6 +147,7 @@ typedef enum tid_t {
     IScriptControl_tid,
     IScriptModuleCollection_tid,
     IScriptModule_tid,
+    IScriptProcedureCollection_tid,
     LAST_tid
 } tid_t;
 
@@ -146,7 +157,8 @@ static ITypeInfo *typeinfos[LAST_tid];
 static REFIID tid_ids[] = {
     &IID_IScriptControl,
     &IID_IScriptModuleCollection,
-    &IID_IScriptModule
+    &IID_IScriptModule,
+    &IID_IScriptProcedureCollection,
 };
 
 static HRESULT load_typelib(void)
@@ -404,6 +416,11 @@ static inline ScriptControl *impl_from_IConnectionPointContainer(IConnectionPoin
     return CONTAINING_RECORD(iface, ScriptControl, IConnectionPointContainer_iface);
 }
 
+static inline ScriptProcedureCollection *impl_from_IScriptProcedureCollection(IScriptProcedureCollection *iface)
+{
+    return CONTAINING_RECORD(iface, ScriptProcedureCollection, IScriptProcedureCollection_iface);
+}
+
 static inline ScriptControl *impl_from_IScriptModuleCollection(IScriptModuleCollection *iface)
 {
     return CONTAINING_RECORD(iface, ScriptControl, IScriptModuleCollection_iface);
@@ -674,6 +691,154 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
     ServiceProvider_QueryService
 };
 
+static HRESULT WINAPI ScriptProcedureCollection_QueryInterface(IScriptProcedureCollection *iface, REFIID riid, void **ppv)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    if (IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IUnknown, riid) ||
+        IsEqualGUID(&IID_IScriptProcedureCollection, riid))
+    {
+        *ppv = &This->IScriptProcedureCollection_iface;
+    }
+    else
+    {
+        WARN("unsupported interface: (%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI ScriptProcedureCollection_AddRef(IScriptProcedureCollection *iface)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI ScriptProcedureCollection_Release(IScriptProcedureCollection *iface)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if (!ref)
+    {
+        This->module->procedures = NULL;
+        IScriptModule_Release(&This->module->IScriptModule_iface);
+        heap_free(This);
+    }
+    return ref;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_GetTypeInfoCount(IScriptProcedureCollection *iface, UINT *pctinfo)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_GetTypeInfo(IScriptProcedureCollection *iface, UINT iTInfo,
+        LCID lcid, ITypeInfo **ppTInfo)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+
+    return get_typeinfo(IScriptProcedureCollection_tid, ppTInfo);
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_GetIDsOfNames(IScriptProcedureCollection *iface, REFIID riid,
+        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+
+    hr = get_typeinfo(IScriptProcedureCollection_tid, &typeinfo);
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_Invoke(IScriptProcedureCollection *iface, DISPID dispIdMember,
+        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IScriptProcedureCollection_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
+                              pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_get__NewEnum(IScriptProcedureCollection *iface, IUnknown **ppenumProcedures)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    FIXME("(%p)->(%p)\n", This, ppenumProcedures);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_get_Item(IScriptProcedureCollection *iface, VARIANT index,
+        IScriptProcedure **ppdispProcedure)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    FIXME("(%p)->(%s %p)\n", This, wine_dbgstr_variant(&index), ppdispProcedure);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ScriptProcedureCollection_get_Count(IScriptProcedureCollection *iface, LONG *plCount)
+{
+    ScriptProcedureCollection *This = impl_from_IScriptProcedureCollection(iface);
+
+    FIXME("(%p)->(%p)\n", This, plCount);
+
+    return E_NOTIMPL;
+}
+
+static const IScriptProcedureCollectionVtbl ScriptProcedureCollectionVtbl = {
+    ScriptProcedureCollection_QueryInterface,
+    ScriptProcedureCollection_AddRef,
+    ScriptProcedureCollection_Release,
+    ScriptProcedureCollection_GetTypeInfoCount,
+    ScriptProcedureCollection_GetTypeInfo,
+    ScriptProcedureCollection_GetIDsOfNames,
+    ScriptProcedureCollection_Invoke,
+    ScriptProcedureCollection_get__NewEnum,
+    ScriptProcedureCollection_get_Item,
+    ScriptProcedureCollection_get_Count
+};
+
 static void detach_script_host(ScriptHost *host)
 {
     if (--host->module_count)
@@ -848,9 +1013,29 @@ static HRESULT WINAPI ScriptModule_get_Procedures(IScriptModule *iface, IScriptP
 {
     ScriptModule *This = impl_from_IScriptModule(iface);
 
-    FIXME("(%p)->(%p)\n", This, ppdispProcedures);
+    TRACE("(%p)->(%p)\n", This, ppdispProcedures);
 
-    return E_NOTIMPL;
+    if (!This->host)
+        return E_FAIL;
+
+    if (This->procedures)
+        IScriptProcedureCollection_AddRef(&This->procedures->IScriptProcedureCollection_iface);
+    else
+    {
+        ScriptProcedureCollection *procs;
+
+        if (!(procs = heap_alloc(sizeof(*procs))))
+            return E_OUTOFMEMORY;
+
+        procs->IScriptProcedureCollection_iface.lpVtbl = &ScriptProcedureCollectionVtbl;
+        procs->ref = 1;
+        procs->module = This;
+        This->procedures = procs;
+        IScriptModule_AddRef(&This->IScriptModule_iface);
+    }
+
+    *ppdispProcedures = &This->procedures->IScriptProcedureCollection_iface;
+    return S_OK;
 }
 
 static HRESULT WINAPI ScriptModule_AddCode(IScriptModule *iface, BSTR code)
@@ -1060,18 +1245,16 @@ static ScriptModule *create_module(ScriptHost *host, BSTR name)
 {
     ScriptModule *module;
 
-    if (!(module = heap_alloc(sizeof(*module)))) return NULL;
+    if (!(module = heap_alloc_zero(sizeof(*module)))) return NULL;
 
     module->IScriptModule_iface.lpVtbl = &ScriptModuleVtbl;
     module->ref = 1;
-    module->name = NULL;
     if (name && !(module->name = SysAllocString(name)))
     {
         heap_free(module);
         return NULL;
     }
     module->host = host;
-    module->script_dispatch = NULL;
     IActiveScriptSite_AddRef(&host->IActiveScriptSite_iface);
     return module;
 }
@@ -1771,8 +1954,12 @@ static HRESULT WINAPI ScriptControl_get_CodeObject(IScriptControl *iface, IDispa
 static HRESULT WINAPI ScriptControl_get_Procedures(IScriptControl *iface, IScriptProcedureCollection **p)
 {
     ScriptControl *This = impl_from_IScriptControl(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if (!This->host) return E_FAIL;
+
+    return IScriptModule_get_Procedures(&This->modules[0]->IScriptModule_iface, p);
 }
 
 static HRESULT WINAPI ScriptControl__AboutBox(IScriptControl *iface)




More information about the wine-cvs mailing list