James Hawkins : msi: Refactor the Installer. ProductInfo method into InstallerImpl_ProductInfo.

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


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

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

msi: Refactor the Installer.ProductInfo method into InstallerImpl_ProductInfo.

---

 dlls/msi/automation.c |   94 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 62 insertions(+), 32 deletions(-)

diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 9317ff4..7a5e355 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -2060,7 +2060,6 @@ static HRESULT InstallerImpl_ProductState(WORD wFlags,
     HRESULT hr;
     VARIANTARG varg0;
 
-
     if (!(wFlags & DISPATCH_PROPERTYGET))
         return DISP_E_MEMBERNOTFOUND;
 
@@ -2076,6 +2075,66 @@ static HRESULT InstallerImpl_ProductState(WORD wFlags,
     return S_OK;
 }
 
+static HRESULT InstallerImpl_ProductInfo(WORD wFlags,
+                                         DISPPARAMS* pDispParams,
+                                         VARIANT* pVarResult,
+                                         EXCEPINFO* pExcepInfo,
+                                         UINT* puArgErr)
+{
+    UINT ret;
+    HRESULT hr;
+    DWORD size;
+    LPWSTR str;
+    VARIANTARG varg0, varg1;
+
+    if (!(wFlags & DISPATCH_PROPERTYGET))
+        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_BSTR;
+    V_BSTR(pVarResult) = NULL;
+
+    ret = MsiGetProductInfoW(V_BSTR(&varg0), V_BSTR(&varg1), NULL, &size);
+    if (ret != ERROR_SUCCESS)
+    {
+        hr = DISP_E_EXCEPTION;
+        goto done;
+    }
+
+    str = msi_alloc(++size * sizeof(WCHAR));
+    if (!str)
+    {
+        hr = E_OUTOFMEMORY;
+        goto done;
+    }
+
+    ret = MsiGetProductInfoW(V_BSTR(&varg0), V_BSTR(&varg1), str, &size);
+    msi_free(str);
+
+    if (ret != ERROR_SUCCESS)
+    {
+        hr = DISP_E_EXCEPTION;
+        goto done;
+    }
+
+    V_BSTR(pVarResult) = SysAllocString(str);
+    hr = S_OK;
+
+done:
+    VariantClear(&varg0);
+    VariantClear(&varg1);
+    return hr;
+}
+
 static HRESULT WINAPI InstallerImpl_Invoke(
         AutomationObject* This,
         DISPID dispIdMember,
@@ -2091,8 +2150,6 @@ static HRESULT WINAPI InstallerImpl_Invoke(
     UINT ret;
     VARIANTARG varg0, varg1, varg2;
     HRESULT hr;
-    LPWSTR szString = NULL;
-    DWORD dwSize = 0;
 
     VariantInit(&varg0);
     VariantInit(&varg1);
@@ -2170,35 +2227,8 @@ static HRESULT WINAPI InstallerImpl_Invoke(
                                               pVarResult, pExcepInfo, puArgErr);
 
         case DISPID_INSTALLER_PRODUCTINFO:
-            if (wFlags & DISPATCH_PROPERTYGET) {
-                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_BSTR;
-                V_BSTR(pVarResult) = NULL;
-                if ((ret = MsiGetProductInfoW(V_BSTR(&varg0), V_BSTR(&varg1), NULL, &dwSize)) == ERROR_SUCCESS)
-                {
-                    if (!(szString = msi_alloc((++dwSize)*sizeof(WCHAR))))
-                        ERR("Out of memory\n");
-                    else if ((ret = MsiGetProductInfoW(V_BSTR(&varg0), V_BSTR(&varg1), szString, &dwSize)) == ERROR_SUCCESS)
-                        V_BSTR(pVarResult) = SysAllocString(szString);
-                    msi_free(szString);
-                }
-                if (ret != ERROR_SUCCESS)
-                {
-                    ERR("MsiGetProductInfo returned %d\n", ret);
-                    VariantClear(&varg1);
-                    VariantClear(&varg0);
-                    return DISP_E_EXCEPTION;
-                }
-            }
-            else return DISP_E_MEMBERNOTFOUND;
-            break;
+            return InstallerImpl_ProductInfo(wFlags, pDispParams,
+                                             pVarResult, pExcepInfo, puArgErr);
 
         case DISPID_INSTALLER_PRODUCTS:
             if (wFlags & DISPATCH_PROPERTYGET)




More information about the wine-cvs mailing list