msi [1/10]: Implement MsiSourceListGetInfoA

James Hawkins truiken at gmail.com
Thu Jun 28 23:41:52 CDT 2007


Hi,

Correctly handled pcchValue.

Changelog:
* Implement MsiSourceListGetInfoA.

 dlls/msi/msi.spec |    2 +-
 dlls/msi/source.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 2 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec
index c419ee7..6aa8957 100644
--- a/dlls/msi/msi.spec
+++ b/dlls/msi/msi.spec
@@ -258,7 +258,7 @@
 262 stub MsiSourceListForceResolutionExW
 263 stub MsiSourceListEnumSourcesA
 264 stub MsiSourceListEnumSourcesW
-265 stub MsiSourceListGetInfoA
+265 stdcall MsiSourceListGetInfoA(str str long long str ptr ptr)
 266 stub MsiSourceListGetInfoW
 267 stub MsiSourceListSetInfoA
 268 stub MsiSourceListSetInfoW
diff --git a/dlls/msi/source.c b/dlls/msi/source.c
index 3b3e47f..49b7e4e 100644
--- a/dlls/msi/source.c
+++ b/dlls/msi/source.c
@@ -150,6 +150,58 @@ static UINT find_given_source(HKEY key, 
 }
 
 /******************************************************************
+ *  MsiSourceListGetInfoA   (MSI.@)
+ */
+UINT WINAPI MsiSourceListGetInfoA( LPCSTR szProduct, LPCSTR szUserSid,
+                                   MSIINSTALLCONTEXT dwContext, DWORD dwOptions,
+                                   LPCSTR szProperty, LPSTR szValue,
+                                   LPDWORD pcchValue)
+{
+    UINT ret;
+    LPWSTR product = NULL;
+    LPWSTR usersid = NULL;
+    LPWSTR property = NULL;
+    LPWSTR value = NULL;
+    DWORD len = 0;
+
+    if (szValue && !pcchValue)
+        return ERROR_INVALID_PARAMETER;
+
+    if (szProduct) product = strdupAtoW(szProduct);
+    if (szUserSid) usersid = strdupAtoW(szUserSid);
+    if (szProperty) property = strdupAtoW(szProperty);
+
+    ret = MsiSourceListGetInfoW(product, usersid, dwContext, dwOptions,
+                                property, NULL, &len);
+    if (ret != ERROR_SUCCESS)
+        goto done;
+
+    value = msi_alloc(++len * sizeof(WCHAR));
+    if (!value)
+        return ERROR_OUTOFMEMORY;
+
+    ret = MsiSourceListGetInfoW(product, usersid, dwContext, dwOptions,
+                                property, value, &len);
+    if (ret != ERROR_SUCCESS)
+        goto done;
+
+    len = WideCharToMultiByte(CP_ACP, 0, value, -1, NULL, 0, NULL, NULL);
+    if (*pcchValue >= len)
+        WideCharToMultiByte(CP_ACP, 0, value, -1, szValue, len, NULL, NULL);
+    else if (szValue)
+        ret = ERROR_MORE_DATA;
+
+    *pcchValue = len - 1;
+
+done:
+    msi_free(product);
+    msi_free(usersid);
+    msi_free(property);
+    msi_free(value);
+    return ret;
+}
+
+/******************************************************************
  *  MsiSourceListGetInfoW   (MSI.@)
  */
 UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
@@ -173,7 +225,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWS
         FIXME("Unhandled options MSICODE_PATCH\n");
         return ERROR_FUNCTION_FAILED;
     }
-    
+
     if (szUserSid)
         FIXME("Unhandled UserSid %s\n",debugstr_w(szUserSid));
 
-- 
1.4.1


More information about the wine-patches mailing list