[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