James Hawkins : msi: Forward MsiEnumPatchesExA to MsiEnumPatchesExW.

Alexandre Julliard julliard at winehq.org
Mon Dec 8 09:46:21 CST 2008


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

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Mon Dec  8 03:14:00 2008 -0600

msi: Forward MsiEnumPatchesExA to MsiEnumPatchesExW.

---

 dlls/msi/registry.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/dlls/msi/registry.c b/dlls/msi/registry.c
index d0ba4d3..f4046c0 100644
--- a/dlls/msi/registry.c
+++ b/dlls/msi/registry.c
@@ -1656,11 +1656,75 @@ UINT WINAPI MsiEnumPatchesExA(LPCSTR szProductCode, LPCSTR szUserSid,
         LPSTR szTargetProductCode, MSIINSTALLCONTEXT *pdwTargetProductContext,
         LPSTR szTargetUserSid, LPDWORD pcchTargetUserSid)
 {
-    FIXME("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p) stub!\n",
+    LPWSTR prodcode = NULL;
+    LPWSTR usersid = NULL;
+    LPWSTR targsid = NULL;
+    WCHAR patch[GUID_SIZE];
+    WCHAR targprod[GUID_SIZE];
+    DWORD len;
+    UINT r;
+
+    TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p)\n",
           debugstr_a(szProductCode), debugstr_a(szUserSid), dwContext, dwFilter,
           dwIndex, szPatchCode, szTargetProductCode, pdwTargetProductContext,
           szTargetUserSid, pcchTargetUserSid);
-    return ERROR_NO_MORE_ITEMS;
+
+    if (szTargetUserSid && !pcchTargetUserSid)
+        return ERROR_INVALID_PARAMETER;
+
+    if (szProductCode) prodcode = strdupAtoW(szProductCode);
+    if (szUserSid) usersid = strdupAtoW(szUserSid);
+
+    r = MsiEnumPatchesExW(prodcode, usersid, dwContext, dwFilter, dwIndex,
+                          patch, targprod, pdwTargetProductContext,
+                          NULL, &len);
+    if (r != ERROR_SUCCESS)
+        goto done;
+
+    WideCharToMultiByte(CP_ACP, 0, patch, -1, szPatchCode,
+                        GUID_SIZE, NULL, NULL);
+    WideCharToMultiByte(CP_ACP, 0, targprod, -1, szTargetProductCode,
+                        GUID_SIZE, NULL, NULL);
+
+    if (!szTargetUserSid)
+    {
+        if (pcchTargetUserSid)
+            *pcchTargetUserSid = len;
+
+        goto done;
+    }
+
+    targsid = msi_alloc(++len * sizeof(WCHAR));
+    if (!targsid)
+    {
+        r = ERROR_OUTOFMEMORY;
+        goto done;
+    }
+
+    r = MsiEnumPatchesExW(prodcode, usersid, dwContext, dwFilter, dwIndex,
+                          patch, targprod, pdwTargetProductContext,
+                          targsid, &len);
+    if (r != ERROR_SUCCESS || !szTargetUserSid)
+        goto done;
+
+    WideCharToMultiByte(CP_ACP, 0, targsid, -1, szTargetUserSid,
+                        *pcchTargetUserSid, NULL, NULL);
+
+    len = lstrlenW(targsid);
+    if (*pcchTargetUserSid < len + 1)
+    {
+        r = ERROR_MORE_DATA;
+        *pcchTargetUserSid = len * sizeof(WCHAR);
+    }
+    else
+        *pcchTargetUserSid = len;
+
+done:
+    msi_free(prodcode);
+    msi_free(usersid);
+    msi_free(targsid);
+
+    return r;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list