James Hawkins : msi: Refactor Installer.OpenProduct and Installer. OpenDatabase into respective functions.

Alexandre Julliard julliard at winehq.org
Fri Dec 11 11:04:46 CST 2009


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

Author: James Hawkins <truiken at gmail.com>
Date:   Thu Dec 10 17:02:08 2009 -0800

msi: Refactor Installer.OpenProduct and Installer.OpenDatabase into respective functions.

---

 dlls/msi/automation.c |  114 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 74 insertions(+), 40 deletions(-)

diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 61c6221..30cdc54 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -1626,6 +1626,76 @@ done:
     return hr;
 }
 
+static HRESULT InstallerImpl_OpenProduct(WORD wFlags,
+                                         DISPPARAMS* pDispParams,
+                                         VARIANT* pVarResult,
+                                         EXCEPINFO* pExcepInfo,
+                                         UINT* puArgErr)
+{
+    HRESULT hr;
+    VARIANTARG varg0;
+
+    if (!(wFlags & DISPATCH_METHOD))
+        return DISP_E_MEMBERNOTFOUND;
+
+    VariantInit(&varg0);
+    hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr);
+    if (FAILED(hr))
+        return hr;
+
+    FIXME("%s\n", debugstr_w(V_BSTR(&varg0)));
+
+    VariantInit(pVarResult);
+
+    VariantClear(&varg0);
+    return S_OK;
+}
+
+static HRESULT InstallerImpl_OpenDatabase(WORD wFlags,
+                                          DISPPARAMS* pDispParams,
+                                          VARIANT* pVarResult,
+                                          EXCEPINFO* pExcepInfo,
+                                          UINT* puArgErr)
+{
+    UINT ret;
+    HRESULT hr;
+    MSIHANDLE hdb;
+    IDispatch* dispatch;
+    VARIANTARG varg0, varg1;
+
+    if (!(wFlags & DISPATCH_METHOD))
+        return DISP_E_MEMBERNOTFOUND;
+
+    VariantInit(&varg0);
+    hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr);
+    if (FAILED(hr))
+        return hr;
+
+    VariantInit(&varg1);
+    hr = DispGetParam(pDispParams, 1, VT_BSTR, &varg1, puArgErr);
+    if (FAILED(hr))
+        goto done;
+
+    V_VT(pVarResult) = VT_DISPATCH;
+
+    ret = MsiOpenDatabaseW(V_BSTR(&varg0), V_BSTR(&varg1), &hdb);
+    if (ret != ERROR_SUCCESS)
+    {
+        hr = DISP_E_EXCEPTION;
+        goto done;
+    }
+
+    hr = create_automation_object(hdb, NULL, (LPVOID *)&dispatch,
+                                  &DIID_Database, DatabaseImpl_Invoke, NULL, 0);
+    if (SUCCEEDED(hr))
+        V_DISPATCH(pVarResult) = dispatch;
+
+done:
+    VariantClear(&varg0);
+    VariantClear(&varg1);
+    return hr;
+}
+
 static HRESULT WINAPI InstallerImpl_Invoke(
         AutomationObject* This,
         DISPID dispIdMember,
@@ -1637,7 +1707,6 @@ static HRESULT WINAPI InstallerImpl_Invoke(
         EXCEPINFO* pExcepInfo,
         UINT* puArgErr)
 {
-    MSIHANDLE msiHandle;
     IDispatch *pDispatch = NULL;
     UINT ret;
     VARIANTARG varg0, varg1, varg2;
@@ -1661,47 +1730,12 @@ static HRESULT WINAPI InstallerImpl_Invoke(
                                              pVarResult, pExcepInfo, puArgErr);
 
         case DISPID_INSTALLER_OPENPRODUCT:
-            if (wFlags & DISPATCH_METHOD)
-            {
-                VariantInit(pVarResult);
-                FIXME("Unhandled method: OpenProduct");
-            }
-            else return DISP_E_MEMBERNOTFOUND;
-            break;
+            return InstallerImpl_OpenProduct(wFlags, pDispParams,
+                                             pVarResult, pExcepInfo, puArgErr);
 
         case DISPID_INSTALLER_OPENDATABASE:
-            if (wFlags & DISPATCH_METHOD)
-            {
-                hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr);
-                if (FAILED(hr)) return hr;
-
-                hr = DispGetParam(pDispParams, 1, VT_BSTR, &varg1, puArgErr);
-                if (FAILED(hr))
-                {
-                    VariantClear(&varg0);
-                    return hr;
-                }
-
-                V_VT(pVarResult) = VT_DISPATCH;
-                if ((ret = MsiOpenDatabaseW(V_BSTR(&varg0), V_BSTR(&varg1), &msiHandle)) == ERROR_SUCCESS)
-                {
-                    hr = create_automation_object(msiHandle, NULL, (LPVOID *)&pDispatch,
-                                                  &DIID_Database, DatabaseImpl_Invoke, NULL, 0);
-                    if (SUCCEEDED(hr))
-                        V_DISPATCH(pVarResult) = pDispatch;
-                    else
-                        ERR("Failed to create Database object: 0x%08x\n", hr);
-                }
-                else
-                {
-                    VariantClear(&varg0);
-                    VariantClear(&varg1);
-                    ERR("MsiOpenDatabase returned %d\n", ret);
-                    return DISP_E_EXCEPTION;
-                }
-            }
-            else return DISP_E_MEMBERNOTFOUND;
-            break;
+            return InstallerImpl_OpenDatabase(wFlags, pDispParams,
+                                              pVarResult, pExcepInfo, puArgErr);
 
         case DISPID_INSTALLER_SUMMARYINFORMATION:
             if (wFlags & DISPATCH_METHOD)




More information about the wine-cvs mailing list