James Hawkins : msi: Implement MsiEnumPatchesW.

Alexandre Julliard julliard at winehq.org
Tue Dec 9 06:24:42 CST 2008


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

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Tue Dec  9 00:21:28 2008 -0600

msi: Implement MsiEnumPatchesW.

---

 dlls/msi/registry.c |  156 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 114 insertions(+), 42 deletions(-)

diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index e7b093c..db9ec65 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1714,7 +1714,7 @@ done:
 static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
         MSIINSTALLCONTEXT context, DWORD filter, DWORD index, DWORD *idx,
         LPWSTR patch, LPWSTR targetprod, MSIINSTALLCONTEXT *targetctx,
-        LPWSTR targetsid, DWORD *sidsize)
+        LPWSTR targetsid, DWORD *sidsize, LPWSTR *transforms)
 {
     MSIPATCHSTATE state;
     LPWSTR ptr, patches = NULL;
@@ -1770,6 +1770,21 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
         if (res != ERROR_SUCCESS)
             continue;
 
+        if (transforms)
+        {
+            *transforms = msi_alloc(size);
+            if (!*transforms)
+            {
+                r = ERROR_OUTOFMEMORY;
+                goto done;
+            }
+
+            res = RegGetValueW(prod, szPatches, ptr, RRF_RT_REG_SZ,
+                               &type, *transforms, &size);
+            if (res != ERROR_SUCCESS)
+                continue;
+        }
+
         if (context == MSIINSTALLCONTEXT_USERMANAGED)
         {
             if (!(filter & MSIPATCHSTATE_APPLIED))
@@ -1838,7 +1853,8 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid,
         }
 
         r = ERROR_SUCCESS;
-        lstrcpyW(targetprod, prodcode);
+        if (targetprod)
+            lstrcpyW(targetprod, prodcode);
 
         if (targetctx)
             *targetctx = context;
@@ -1865,6 +1881,54 @@ done:
     return r;
 }
 
+static UINT msi_enum_patches(LPCWSTR szProductCode, LPCWSTR szUserSid,
+        DWORD dwContext, DWORD dwFilter, DWORD dwIndex, DWORD *idx,
+        LPWSTR szPatchCode, LPWSTR szTargetProductCode,
+        MSIINSTALLCONTEXT *pdwTargetProductContext, LPWSTR szTargetUserSid,
+        LPDWORD pcchTargetUserSid, LPWSTR *szTransforms)
+{
+    UINT r;
+
+    if (dwContext & MSIINSTALLCONTEXT_USERMANAGED)
+    {
+        r = msi_check_product_patches(szProductCode, szUserSid,
+                                      MSIINSTALLCONTEXT_USERMANAGED, dwFilter,
+                                      dwIndex, idx, szPatchCode,
+                                      szTargetProductCode,
+                                      pdwTargetProductContext, szTargetUserSid,
+                                      pcchTargetUserSid, szTransforms);
+        if (r != ERROR_NO_MORE_ITEMS)
+            goto done;
+    }
+
+    if (dwContext & MSIINSTALLCONTEXT_USERUNMANAGED)
+    {
+        r = msi_check_product_patches(szProductCode, szUserSid,
+                                      MSIINSTALLCONTEXT_USERUNMANAGED, dwFilter,
+                                      dwIndex, idx, szPatchCode,
+                                      szTargetProductCode,
+                                      pdwTargetProductContext, szTargetUserSid,
+                                      pcchTargetUserSid, szTransforms);
+        if (r != ERROR_NO_MORE_ITEMS)
+            goto done;
+    }
+
+    if (dwContext & MSIINSTALLCONTEXT_MACHINE)
+    {
+        r = msi_check_product_patches(szProductCode, szUserSid,
+                                      MSIINSTALLCONTEXT_MACHINE, dwFilter,
+                                      dwIndex, idx, szPatchCode,
+                                      szTargetProductCode,
+                                      pdwTargetProductContext, szTargetUserSid,
+                                      pcchTargetUserSid, szTransforms);
+        if (r != ERROR_NO_MORE_ITEMS)
+            goto done;
+    }
+
+done:
+    return r;
+}
+
 /***********************************************************************
  * MsiEnumPatchesExW            [MSI.@]
  */
@@ -1906,43 +1970,11 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
     if (dwIndex == 0)
         last_index = 0;
 
-    if (dwContext & MSIINSTALLCONTEXT_USERMANAGED)
-    {
-        r = msi_check_product_patches(szProductCode, szUserSid,
-                                      MSIINSTALLCONTEXT_USERMANAGED, dwFilter,
-                                      dwIndex, &idx, szPatchCode,
-                                      szTargetProductCode,
-                                      pdwTargetProductContext,
-                                      szTargetUserSid, pcchTargetUserSid);
-        if (r != ERROR_NO_MORE_ITEMS)
-            goto done;
-    }
-
-    if (dwContext & MSIINSTALLCONTEXT_USERUNMANAGED)
-    {
-        r = msi_check_product_patches(szProductCode, szUserSid,
-                                      MSIINSTALLCONTEXT_USERUNMANAGED, dwFilter,
-                                      dwIndex, &idx, szPatchCode,
-                                      szTargetProductCode,
-                                      pdwTargetProductContext,
-                                      szTargetUserSid, pcchTargetUserSid);
-        if (r != ERROR_NO_MORE_ITEMS)
-            goto done;
-    }
-
-    if (dwContext & MSIINSTALLCONTEXT_MACHINE)
-    {
-        r = msi_check_product_patches(szProductCode, szUserSid,
-                                      MSIINSTALLCONTEXT_MACHINE, dwFilter,
-                                      dwIndex, &idx, szPatchCode,
-                                      szTargetProductCode,
-                                      pdwTargetProductContext,
-                                      szTargetUserSid, pcchTargetUserSid);
-        if (r != ERROR_NO_MORE_ITEMS)
-            goto done;
-    }
+    r = msi_enum_patches(szProductCode, szUserSid, dwContext, dwFilter,
+                         dwIndex, &idx, szPatchCode, szTargetProductCode,
+                         pdwTargetProductContext, szTargetUserSid,
+                         pcchTargetUserSid, NULL);
 
-done:
     if (r == ERROR_SUCCESS)
         last_index = dwIndex;
 
@@ -2012,12 +2044,52 @@ done:
 /***********************************************************************
  * MsiEnumPatchesW            [MSI.@]
  */
-UINT WINAPI MsiEnumPatchesW( LPCWSTR szProduct, DWORD iPatchIndex,
+UINT WINAPI MsiEnumPatchesW(LPCWSTR szProduct, DWORD iPatchIndex,
         LPWSTR lpPatchBuf, LPWSTR lpTransformsBuf, LPDWORD pcchTransformsBuf)
 {
-    FIXME("%s %d %p %p %p\n", debugstr_w(szProduct),
-          iPatchIndex, lpPatchBuf, lpTransformsBuf, pcchTransformsBuf);
-    return ERROR_NO_MORE_ITEMS;
+    WCHAR squished_pc[GUID_SIZE];
+    LPWSTR transforms = NULL;
+    HKEY prod;
+    DWORD idx = 0;
+    UINT r;
+
+    TRACE("(%s %d %p %p %p)\n", debugstr_w(szProduct), iPatchIndex,
+          lpPatchBuf, lpTransformsBuf, pcchTransformsBuf);
+
+    if (!szProduct || !squash_guid(szProduct, squished_pc))
+        return ERROR_INVALID_PARAMETER;
+
+    if (!lpPatchBuf || !lpTransformsBuf || !pcchTransformsBuf)
+        return ERROR_INVALID_PARAMETER;
+
+    if (MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERMANAGED,
+                              &prod, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_USERUNMANAGED,
+                              &prod, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenProductKey(szProduct, MSIINSTALLCONTEXT_MACHINE,
+                              &prod, FALSE) != ERROR_SUCCESS)
+        return ERROR_UNKNOWN_PRODUCT;
+
+    RegCloseKey(prod);
+
+    r = msi_enum_patches(szProduct, NULL, MSIINSTALLCONTEXT_ALL,
+                         MSIPATCHSTATE_ALL, iPatchIndex, &idx, lpPatchBuf,
+                         NULL, NULL, NULL, NULL, &transforms);
+    if (r != ERROR_SUCCESS)
+        goto done;
+
+    lstrcpynW(lpTransformsBuf, transforms, *pcchTransformsBuf);
+    if (*pcchTransformsBuf <= lstrlenW(transforms))
+    {
+        r = ERROR_MORE_DATA;
+        *pcchTransformsBuf = lstrlenW(transforms) * sizeof(WCHAR);
+    }
+    else
+        *pcchTransformsBuf = lstrlenW(transforms);
+
+done:
+    msi_free(transforms);
+    return r;
 }
 
 UINT WINAPI MsiEnumProductsExA( LPCSTR szProductCode, LPCSTR szUserSid,




More information about the wine-cvs mailing list