[1/3] msi: COM cleanup for IActiveScriptSite

Nikolay Sivov nsivov at codeweavers.com
Thu Nov 15 01:45:54 CST 2012


COM cleanup for IActiveScriptSite
-------------- next part --------------
>From 215bc83d32e24bf5df0b9351e0e0ab9e637660d1 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 14 Nov 2012 17:08:14 -0500
Subject: [PATCH 1/3] COM cleanup for IActiveScriptSite

---
 dlls/msi/script.c |  321 ++++++++++++++++++++++++++---------------------------
 1 file changed, 160 insertions(+), 161 deletions(-)

diff --git a/dlls/msi/script.c b/dlls/msi/script.c
index 318191b..e885a2c 100644
--- a/dlls/msi/script.c
+++ b/dlls/msi/script.c
@@ -57,185 +57,54 @@ static const WCHAR szSession[] = {'S','e','s','s','i','o','n',0};
 /*
  * MsiActiveScriptSite - Our IActiveScriptSite implementation.
  */
-
 typedef struct {
-    IActiveScriptSite lpVtbl;
+    IActiveScriptSite IActiveScriptSite_iface;
     IDispatch *pInstaller;
     IDispatch *pSession;
     LONG ref;
 } MsiActiveScriptSite;
 
-static const struct IActiveScriptSiteVtbl ASS_Vtbl;
-
-static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
+static inline MsiActiveScriptSite *impl_from_IActiveScriptSite( IActiveScriptSite *iface )
 {
-    MsiActiveScriptSite* object;
-
-    TRACE("(%p,%p)\n", pUnkOuter, ppObj);
-
-    if( pUnkOuter )
-        return CLASS_E_NOAGGREGATION;
-
-    object = msi_alloc_zero( sizeof(MsiActiveScriptSite) );
-
-    object->lpVtbl.lpVtbl = &ASS_Vtbl;
-    object->ref = 1;
-    object->pInstaller = NULL;
-    object->pSession = NULL;
-
-    *ppObj = object;
-
-    return S_OK;
-}
-
-/*
- * Call a script.
- */
-DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action)
-{
-    HRESULT hr;
-    IActiveScript *pActiveScript = NULL;
-    IActiveScriptParse *pActiveScriptParse = NULL;
-    MsiActiveScriptSite *pActiveScriptSite = NULL;
-    IDispatch *pDispatch = NULL;
-    DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
-    DISPID dispid;
-    CLSID clsid;
-    VARIANT var;
-    DWORD ret = ERROR_INSTALL_FAILURE;
-
-    CoInitialize(NULL);
-
-    /* Create MsiActiveScriptSite object */
-    hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite);
-    if (hr != S_OK) goto done;
-
-    /* Create an installer object */
-    hr = create_msiserver(NULL, (LPVOID *)&pActiveScriptSite->pInstaller);
-    if (hr != S_OK) goto done;
-
-    /* Create a session object */
-    hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
-    if (hr != S_OK) goto done;
-
-    /* Create the scripting engine */
-    if ((type & 7) == msidbCustomActionTypeJScript)
-        hr = CLSIDFromProgID(szJScript, &clsid);
-    else if ((type & 7) == msidbCustomActionTypeVBScript)
-        hr = CLSIDFromProgID(szVBScript, &clsid);
-    else {
-        ERR("Unknown script type %d\n", type);
-        goto done;
-    }
-    if (FAILED(hr)) {
-        ERR("Could not find CLSID for Windows Script\n");
-        goto done;
-    }
-    hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IActiveScript, (void **)&pActiveScript);
-    if (FAILED(hr)) {
-        ERR("Could not instantiate class for Windows Script\n");
-        goto done;
-    }
-
-    hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse, (void **)&pActiveScriptParse);
-    if (FAILED(hr)) goto done;
-
-    hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
-    if (FAILED(hr)) goto done;
-
-    hr = IActiveScriptParse_InitNew(pActiveScriptParse);
-    if (FAILED(hr)) goto done;
-
-    hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_GLOBALMEMBERS|SCRIPTITEM_ISVISIBLE);
-    if (FAILED(hr)) goto done;
-
-    hr = IActiveScriptParse_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
-    if (FAILED(hr)) goto done;
-
-    hr = IActiveScript_SetScriptState(pActiveScript, SCRIPTSTATE_CONNECTED);
-    if (FAILED(hr)) goto done;
-
-    /* Call a function if necessary through the IDispatch interface */
-    if (function != NULL && strlenW(function) > 0) {
-        TRACE("Calling function %s\n", debugstr_w(function));
-
-        hr = IActiveScript_GetScriptDispatch(pActiveScript, NULL, &pDispatch);
-        if (FAILED(hr)) goto done;
-
-        hr = IDispatch_GetIDsOfNames(pDispatch, &IID_NULL, (WCHAR **)&function, 1,LOCALE_USER_DEFAULT, &dispid);
-        if (FAILED(hr)) goto done;
-
-        hr = IDispatch_Invoke(pDispatch, dispid, &IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, &var, NULL, NULL);
-        if (FAILED(hr)) goto done;
-
-        /* Check return value, if it's not IDOK we failed */
-        hr = VariantChangeType(&var, &var, 0, VT_I4);
-        if (FAILED(hr)) goto done;
-
-        if (V_I4(&var) == IDOK)
-            ret = ERROR_SUCCESS;
-        else ret = ERROR_INSTALL_FAILURE;
-
-        VariantClear(&var);
-    } else {
-        /* If no function to be called, MSI behavior is to succeed */
-        ret = ERROR_SUCCESS;
-    }
-
-done:
-
-    if (pDispatch) IDispatch_Release(pDispatch);
-    if (pActiveScript) IActiveScript_Release(pActiveScript);
-    if (pActiveScriptParse) IActiveScriptParse_Release(pActiveScriptParse);
-    if (pActiveScriptSite)
-    {
-        if (pActiveScriptSite->pSession) IDispatch_Release(pActiveScriptSite->pSession);
-        if (pActiveScriptSite->pInstaller) IDispatch_Release(pActiveScriptSite->pInstaller);
-        IActiveScriptSite_Release((IActiveScriptSite *)pActiveScriptSite);
-    }
-    CoUninitialize();    /* must call even if CoInitialize failed */
-    return ret;
+    return CONTAINING_RECORD(iface, MsiActiveScriptSite, IActiveScriptSite_iface);
 }
 
 /*
  * MsiActiveScriptSite
  */
-
-/*** IUnknown methods ***/
-static HRESULT WINAPI MsiActiveScriptSite_QueryInterface(IActiveScriptSite* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI MsiActiveScriptSite_QueryInterface(IActiveScriptSite* iface, REFIID riid, void** obj)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
 
-    TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj);
 
     if (IsEqualGUID(riid, &IID_IUnknown) ||
         IsEqualGUID(riid, &IID_IActiveScriptSite))
     {
         IActiveScriptSite_AddRef(iface);
-        *ppvObject = This;
+        *obj = iface;
         return S_OK;
     }
 
-    TRACE("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+    *obj = NULL;
 
     return E_NOINTERFACE;
 }
 
 static ULONG WINAPI MsiActiveScriptSite_AddRef(IActiveScriptSite* iface)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-
-    TRACE("(%p/%p)\n", iface, This);
-
-    return InterlockedIncrement(&This->ref);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p)->(%d)\n", This, ref);
+    return ref;
 }
 
 static ULONG WINAPI MsiActiveScriptSite_Release(IActiveScriptSite* iface)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
-    TRACE("(%p/%p)\n", iface, This);
+    TRACE("(%p)->(%d)\n", This, ref);
 
     if (!ref)
         msi_free(This);
@@ -243,18 +112,18 @@ static ULONG WINAPI MsiActiveScriptSite_Release(IActiveScriptSite* iface)
     return ref;
 }
 
-/*** IActiveScriptSite methods **/
 static HRESULT WINAPI MsiActiveScriptSite_GetLCID(IActiveScriptSite* iface, LCID* plcid)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)->(%p)\n", This, iface, plcid);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    TRACE("(%p)->(%p)\n", This, plcid);
     return E_NOTIMPL;  /* Script will use system-defined locale */
 }
 
 static HRESULT WINAPI MsiActiveScriptSite_GetItemInfo(IActiveScriptSite* iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown** ppiunkItem, ITypeInfo** ppti)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)->(%p,%d,%p,%p)\n", This, iface, pstrName, dwReturnMask, ppiunkItem, ppti);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+
+    TRACE("(%p)->(%p, %d, %p, %p)\n", This, pstrName, dwReturnMask, ppiunkItem, ppti);
 
     /* Determine the kind of pointer that is requested, and make sure placeholder is valid */
     if (dwReturnMask & SCRIPTINFO_ITYPEINFO) {
@@ -285,15 +154,15 @@ static HRESULT WINAPI MsiActiveScriptSite_GetItemInfo(IActiveScriptSite* iface,
 
 static HRESULT WINAPI MsiActiveScriptSite_GetDocVersionString(IActiveScriptSite* iface, BSTR* pbstrVersion)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)->(%p)\n", This, iface, pbstrVersion);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    TRACE("(%p)->(%p)\n", This, pbstrVersion);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI MsiActiveScriptSite_OnScriptTerminate(IActiveScriptSite* iface, const VARIANT* pvarResult, const EXCEPINFO* pexcepinfo)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, pvarResult, pexcepinfo);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    TRACE("(%p)->(%p, %p)\n", This, pvarResult, pexcepinfo);
     return S_OK;
 }
 
@@ -334,11 +203,11 @@ static HRESULT WINAPI MsiActiveScriptSite_OnStateChange(IActiveScriptSite* iface
 
 static HRESULT WINAPI MsiActiveScriptSite_OnScriptError(IActiveScriptSite* iface, IActiveScriptError* pscripterror)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
     EXCEPINFO exception;
     HRESULT hr;
 
-    TRACE("(%p/%p)->(%p)\n", This, iface, pscripterror);
+    TRACE("(%p)->(%p)\n", This, pscripterror);
 
     memset(&exception, 0, sizeof(EXCEPINFO));
     hr = IActiveScriptError_GetExceptionInfo(pscripterror, &exception);
@@ -355,19 +224,19 @@ static HRESULT WINAPI MsiActiveScriptSite_OnScriptError(IActiveScriptSite* iface
 
 static HRESULT WINAPI MsiActiveScriptSite_OnEnterScript(IActiveScriptSite* iface)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)\n", This, iface);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    TRACE("(%p)\n", This);
     return S_OK;
 }
 
 static HRESULT WINAPI MsiActiveScriptSite_OnLeaveScript(IActiveScriptSite* iface)
 {
-    MsiActiveScriptSite *This = (MsiActiveScriptSite *)iface;
-    TRACE("(%p/%p)\n", This, iface);
+    MsiActiveScriptSite *This = impl_from_IActiveScriptSite(iface);
+    TRACE("(%p)\n", This);
     return S_OK;
 }
 
-static const struct IActiveScriptSiteVtbl ASS_Vtbl =
+static const struct IActiveScriptSiteVtbl activescriptsitevtbl =
 {
     MsiActiveScriptSite_QueryInterface,
     MsiActiveScriptSite_AddRef,
@@ -381,3 +250,133 @@ static const struct IActiveScriptSiteVtbl ASS_Vtbl =
     MsiActiveScriptSite_OnEnterScript,
     MsiActiveScriptSite_OnLeaveScript
 };
+
+static HRESULT create_ActiveScriptSite(IUnknown *outer, void **obj)
+{
+    MsiActiveScriptSite* object;
+
+    TRACE("(%p,%p)\n", outer, obj);
+
+    if( outer )
+        return CLASS_E_NOAGGREGATION;
+
+    object = msi_alloc_zero( sizeof(MsiActiveScriptSite) );
+
+    object->IActiveScriptSite_iface.lpVtbl = &activescriptsitevtbl;
+    object->ref = 1;
+    object->pInstaller = NULL;
+    object->pSession = NULL;
+
+    *obj = &object->IActiveScriptSite_iface;
+
+    return S_OK;
+}
+
+/*
+ * Call a script.
+ */
+DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action)
+{
+    HRESULT hr;
+    IActiveScript *pActiveScript = NULL;
+    IActiveScriptParse *pActiveScriptParse = NULL;
+    MsiActiveScriptSite *pActiveScriptSite = NULL;
+    IDispatch *pDispatch = NULL;
+    DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
+    DISPID dispid;
+    CLSID clsid;
+    VARIANT var;
+    DWORD ret = ERROR_INSTALL_FAILURE;
+
+    CoInitialize(NULL);
+
+    /* Create MsiActiveScriptSite object */
+    hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite);
+    if (hr != S_OK) goto done;
+
+    /* Create an installer object */
+    hr = create_msiserver(NULL, (LPVOID *)&pActiveScriptSite->pInstaller);
+    if (hr != S_OK) goto done;
+
+    /* Create a session object */
+    hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
+    if (hr != S_OK) goto done;
+
+    /* Create the scripting engine */
+    if ((type & 7) == msidbCustomActionTypeJScript)
+        hr = CLSIDFromProgID(szJScript, &clsid);
+    else if ((type & 7) == msidbCustomActionTypeVBScript)
+        hr = CLSIDFromProgID(szVBScript, &clsid);
+    else {
+        ERR("Unknown script type %d\n", type);
+        goto done;
+    }
+    if (FAILED(hr)) {
+        ERR("Could not find CLSID for Windows Script\n");
+        goto done;
+    }
+    hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IActiveScript, (void **)&pActiveScript);
+    if (FAILED(hr)) {
+        ERR("Could not instantiate class for Windows Script\n");
+        goto done;
+    }
+
+    hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse, (void **)&pActiveScriptParse);
+    if (FAILED(hr)) goto done;
+
+    hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
+    if (FAILED(hr)) goto done;
+
+    hr = IActiveScriptParse_InitNew(pActiveScriptParse);
+    if (FAILED(hr)) goto done;
+
+    hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_GLOBALMEMBERS|SCRIPTITEM_ISVISIBLE);
+    if (FAILED(hr)) goto done;
+
+    hr = IActiveScriptParse_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
+    if (FAILED(hr)) goto done;
+
+    hr = IActiveScript_SetScriptState(pActiveScript, SCRIPTSTATE_CONNECTED);
+    if (FAILED(hr)) goto done;
+
+    /* Call a function if necessary through the IDispatch interface */
+    if (function != NULL && strlenW(function) > 0) {
+        TRACE("Calling function %s\n", debugstr_w(function));
+
+        hr = IActiveScript_GetScriptDispatch(pActiveScript, NULL, &pDispatch);
+        if (FAILED(hr)) goto done;
+
+        hr = IDispatch_GetIDsOfNames(pDispatch, &IID_NULL, (WCHAR **)&function, 1,LOCALE_USER_DEFAULT, &dispid);
+        if (FAILED(hr)) goto done;
+
+        hr = IDispatch_Invoke(pDispatch, dispid, &IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, &var, NULL, NULL);
+        if (FAILED(hr)) goto done;
+
+        /* Check return value, if it's not IDOK we failed */
+        hr = VariantChangeType(&var, &var, 0, VT_I4);
+        if (FAILED(hr)) goto done;
+
+        if (V_I4(&var) == IDOK)
+            ret = ERROR_SUCCESS;
+        else ret = ERROR_INSTALL_FAILURE;
+
+        VariantClear(&var);
+    } else {
+        /* If no function to be called, MSI behavior is to succeed */
+        ret = ERROR_SUCCESS;
+    }
+
+done:
+
+    if (pDispatch) IDispatch_Release(pDispatch);
+    if (pActiveScript) IActiveScript_Release(pActiveScript);
+    if (pActiveScriptParse) IActiveScriptParse_Release(pActiveScriptParse);
+    if (pActiveScriptSite)
+    {
+        if (pActiveScriptSite->pSession) IDispatch_Release(pActiveScriptSite->pSession);
+        if (pActiveScriptSite->pInstaller) IDispatch_Release(pActiveScriptSite->pInstaller);
+        IActiveScriptSite_Release((IActiveScriptSite *)pActiveScriptSite);
+    }
+    CoUninitialize();    /* must call even if CoInitialize failed */
+    return ret;
+}
-- 
1.7.10.4




More information about the wine-patches mailing list