Misha Koshelev : msi: automation: Store parent Installer object in Session.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 7 09:10:25 CDT 2007


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

Author: Misha Koshelev <mk144210 at bcm.edu>
Date:   Fri May  4 23:18:19 2007 -0500

msi: automation: Store parent Installer object in Session.

---

 dlls/msi/automation.c |   13 ++++++++++---
 dlls/msi/msipriv.h    |    2 +-
 dlls/msi/script.c     |   11 ++++++++++-
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 65639a0..07994e1 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -61,6 +61,9 @@ interface AutomationObject {
     /* The MSI handle of the current object */
     MSIHANDLE msiHandle;
 
+    /* The parent Installer object (only used in the Session object) */
+    IDispatch *pInstaller;
+
     /* A function that is called from AutomationObject::Invoke, specific to this type of object. */
     HRESULT (STDMETHODCALLTYPE *funcInvoke)(
         AutomationObject* This,
@@ -134,6 +137,7 @@ HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, LPVOI
     object->msiHandle = msiHandle;
     object->clsid = (LPCLSID)clsid;
     object->funcInvoke = funcInvoke;
+    object->pInstaller = NULL;
 
     /* Load our TypeInfo so we don't have to process GetIDsOfNames */
     object->iTypeInfo = NULL;
@@ -894,7 +898,7 @@ static HRESULT WINAPI InstallerImpl_Invoke(
                 V_VT(pVarResult) = VT_DISPATCH;
 		if ((ret = MsiOpenPackageExW(V_BSTR(&varg0), V_I4(&varg1), &msiHandle)) == ERROR_SUCCESS)
                 {
-                    if (SUCCEEDED(create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Session, SessionImpl_Invoke)))
+                    if (SUCCEEDED(create_session(msiHandle, (IDispatch *)This, &pDispatch)))
                     {
                         IDispatch_AddRef(pDispatch);
                         V_DISPATCH(pVarResult) = pDispatch;
@@ -922,7 +926,10 @@ HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj)
 }
 
 /* Wrapper around create_automation_object to create a session object. */
-HRESULT create_session(MSIHANDLE msiHandle, IDispatch **pDispatch)
+HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch)
 {
-    return create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke);
+    HRESULT hr = create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke);
+    if (SUCCEEDED(hr) && pDispatch && *pDispatch)
+        ((AutomationObject *)*pDispatch)->pInstaller = (IDispatch *)pInstaller;
+    return hr;
 }
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index de08aeb..a8d833f 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -793,7 +793,7 @@ extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event,
 
 /* OLE automation */
 extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj);
-extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch **pDispatch);
+extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch);
 extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid);
 
 /* Scripting */
diff --git a/dlls/msi/script.c b/dlls/msi/script.c
index 018b198..54d0ee8 100644
--- a/dlls/msi/script.c
+++ b/dlls/msi/script.c
@@ -46,6 +46,7 @@ static const WCHAR szSession[] = {'S','e','s','s','i','o','n',0};
 
 typedef struct {
     IActiveScriptSite lpVtbl;
+    IDispatch *pInstaller;
     IDispatch *pSession;
     LONG ref;
 } MsiActiveScriptSite;
@@ -65,6 +66,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
 
     object->lpVtbl.lpVtbl = &ASS_Vtbl;
     object->ref = 1;
+    object->pInstaller = NULL;
     object->pSession = NULL;
 
     *ppObj = object;
@@ -97,8 +99,13 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
     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;
+    IUnknown_AddRef((IUnknown *)pActiveScriptSite->pInstaller);
+
     /* Create a session object */
-    hr = create_session(hPackage, &pActiveScriptSite->pSession);
+    hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
     if (hr != S_OK) goto done;
     IUnknown_AddRef((IUnknown *)pActiveScriptSite->pSession);
 
@@ -181,6 +188,8 @@ done:
     if (pActiveScript) IActiveScriptSite_Release(pActiveScript);
     if (pActiveScriptSite &&
 	pActiveScriptSite->pSession) IUnknown_Release((IUnknown *)pActiveScriptSite->pSession);
+    if (pActiveScriptSite &&
+	pActiveScriptSite->pInstaller) IUnknown_Release((IUnknown *)pActiveScriptSite->pInstaller);
     if (pActiveScriptSite) IUnknown_Release((IUnknown *)pActiveScriptSite);
 
     CoUninitialize();    /* must call even if CoInitialize failed */




More information about the wine-cvs mailing list