[PATCH resend 11/13] msscript.ocx: Implement ScriptModuleCollection_Add.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Tue May 26 07:42:05 CDT 2020
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/msscript.ocx/msscript.c | 42 ++++++++++++++++++++++++++++++++++--
1 file changed, 40 insertions(+), 2 deletions(-)
diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index e3b7b86..f0a4853 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -197,6 +197,11 @@ static void release_typelib(void)
ITypeLib_Release(typelib);
}
+static inline BOOL is_power_of_2(unsigned x)
+{
+ return !(x & (x - 1));
+}
+
static void clear_named_items(ScriptHost *host)
{
struct named_item *item, *item1;
@@ -1096,10 +1101,43 @@ static HRESULT WINAPI ScriptModuleCollection_Add(IScriptModuleCollection *iface,
VARIANT *object, IScriptModule **ppmod)
{
ScriptControl *This = impl_from_IScriptModuleCollection(iface);
+ ScriptModule *mod, **mods;
+ HRESULT hr;
- FIXME("(%p)->(%s %s %p)\n", This, wine_dbgstr_w(name), wine_dbgstr_variant(object), ppmod);
+ TRACE("(%p)->(%s %s %p)\n", This, wine_dbgstr_w(name), wine_dbgstr_variant(object), ppmod);
- return E_NOTIMPL;
+ if (!ppmod) return E_POINTER;
+ if (!name || V_VT(object) != VT_DISPATCH || find_module(This, name) != ~0)
+ return E_INVALIDARG;
+ if (!This->host) return E_FAIL;
+
+ /* See if we need to grow the array */
+ if (is_power_of_2(This->num_modules))
+ {
+ mods = heap_realloc(This->modules, This->num_modules * 2 * sizeof(*This->modules));
+ if (!mods) return E_OUTOFMEMORY;
+ This->modules = mods;
+ }
+
+ mod = alloc_module(This, name);
+ if (!mod) return E_OUTOFMEMORY;
+
+ /* If no object, Windows only calls AddNamedItem without adding a NULL object */
+ if (V_DISPATCH(object))
+ hr = add_script_object(This->host, name, V_DISPATCH(object), 0);
+ else
+ hr = IActiveScript_AddNamedItem(This->host->script, name, SCRIPTITEM_CODEONLY);
+
+ if (FAILED(hr))
+ {
+ destroy_module(mod);
+ return hr;
+ }
+ This->modules[This->num_modules++] = mod;
+
+ *ppmod = &mod->IScriptModule_iface;
+ IScriptModule_AddRef(*ppmod);
+ return S_OK;
}
static const IScriptModuleCollectionVtbl ScriptModuleCollectionVtbl = {
--
2.21.0
More information about the wine-devel
mailing list