Mike McCormack : msi: Use awstring to return strings from MsiGetProductInfo .

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 14 10:50:50 CDT 2006


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

Author: Mike McCormack <mike at codeweavers.com>
Date:   Fri Jul 14 15:21:10 2006 +0900

msi: Use awstring to return strings from MsiGetProductInfo.

---

 dlls/msi/msi.c |  148 ++++++++++++++++++++++++++------------------------------
 1 files changed, 68 insertions(+), 80 deletions(-)

diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index bb30415..5d29a11 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -457,81 +457,23 @@ UINT WINAPI MsiGetProductCodeW(LPCWSTR s
     return ERROR_SUCCESS;
 }
 
-UINT WINAPI MsiGetProductInfoA(LPCSTR szProduct, LPCSTR szAttribute,
-                 LPSTR szBuffer, DWORD *pcchValueBuf)
-{
-    LPWSTR szwProduct = NULL, szwAttribute = NULL, szwBuffer = NULL;
-    UINT r = ERROR_OUTOFMEMORY;
-    DWORD pcchwValueBuf = 0;
-
-    TRACE("%s %s %p %p\n", debugstr_a(szProduct), debugstr_a(szAttribute),
-          szBuffer, pcchValueBuf);
-
-    if( szProduct )
-    {
-        szwProduct = strdupAtoW( szProduct );
-        if( !szwProduct )
-            goto end;
-    }
-    
-    if( szAttribute )
-    {
-        szwAttribute = strdupAtoW( szAttribute );
-        if( !szwAttribute )
-            goto end;
-    }
-
-    if( szBuffer )
-    {
-        szwBuffer = msi_alloc( (*pcchValueBuf) * sizeof(WCHAR) );
-        pcchwValueBuf = *pcchValueBuf;
-        if( !szwBuffer )     
-            goto end;
-    }
-
-    r = MsiGetProductInfoW( szwProduct, szwAttribute, szwBuffer, 
-                            &pcchwValueBuf );
-
-    if( ERROR_SUCCESS == r )
-    {
-        INT old_len = *pcchValueBuf;
-        *pcchValueBuf = WideCharToMultiByte(CP_ACP, 0, szwBuffer, pcchwValueBuf,
-                        szBuffer, *pcchValueBuf, NULL, NULL);
-        if (old_len > *pcchValueBuf)
-            szBuffer[*pcchValueBuf]=0;
-    }
-
-end:
-    msi_free( szwProduct );
-    msi_free( szwAttribute );
-    msi_free( szwBuffer );
-
-    return r;
-}
-
-UINT WINAPI MsiGetProductInfoW(LPCWSTR szProduct, LPCWSTR szAttribute,
-                LPWSTR szBuffer, DWORD *pcchValueBuf)
+UINT WINAPI MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
+                               awstring *szValue, DWORD *pcchValueBuf)
 {
     UINT r;
     HKEY hkey;
     LPWSTR val = NULL;
 
-    FIXME("%s %s %p %p\n",debugstr_w(szProduct), debugstr_w(szAttribute),
-          szBuffer, pcchValueBuf);
+    TRACE("%s %s %p %p\n", debugstr_w(szProduct),
+          debugstr_w(szAttribute), szValue, pcchValueBuf);
 
-    /* 
-     * FIXME:
-     *
-     * We should use msi_strcpy_to_awstring to return strings.
-     *
-     * The values seem scattered/dupicated in the registry.  Is there a system?
+    /*
+     * FIXME: Values seem scattered/duplicated in the registry. Is there a system?
      */
 
-    if (NULL != szBuffer && NULL == pcchValueBuf)
+    if ((szValue && !pcchValueBuf) || !szProduct || !szAttribute)
         return ERROR_INVALID_PARAMETER;
-    if (NULL == szProduct || NULL == szAttribute)
-        return ERROR_INVALID_PARAMETER;
-    
+
     /* check for special properties */
     if (!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGECODEW))
     {
@@ -595,10 +537,13 @@ UINT WINAPI MsiGetProductInfoW(LPCWSTR s
         static const WCHAR szDisplayVersion[] = {
             'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0 };
 
-        if (!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONSTRINGW))
+        FIXME("%s\n", debugstr_w(szAttribute));
+        /* FIXME: some attribute values not tested... */
+
+        if (!lstrcmpW( szAttribute, INSTALLPROPERTY_VERSIONSTRINGW ))
             szAttribute = szDisplayVersion;
 
-        r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
+        r = MSIREG_OpenUninstallKey( szProduct, &hkey, FALSE );
         if (r != ERROR_SUCCESS)
             return ERROR_UNKNOWN_PRODUCT;
 
@@ -612,14 +557,57 @@ UINT WINAPI MsiGetProductInfoW(LPCWSTR s
     if (!val)
         return ERROR_UNKNOWN_PROPERTY;
 
-    if (lstrlenW(val) > *pcchValueBuf)
-        return ERROR_MORE_DATA;
-
-    lstrcpyW(szBuffer, val);
+    r = msi_strcpy_to_awstring( val, szValue, pcchValueBuf );
 
     HeapFree(GetProcessHeap(), 0, val);
 
-    return ERROR_SUCCESS;
+    return r;
+}
+
+UINT WINAPI MsiGetProductInfoA(LPCSTR szProduct, LPCSTR szAttribute,
+                               LPSTR szBuffer, DWORD *pcchValueBuf)
+{
+    LPWSTR szwProduct, szwAttribute = NULL;
+    UINT r = ERROR_OUTOFMEMORY;
+    awstring buffer;
+
+    TRACE("%s %s %p %p\n", debugstr_a(szProduct), debugstr_a(szAttribute),
+          szBuffer, pcchValueBuf);
+
+    szwProduct = strdupAtoW( szProduct );
+    if( szProduct && !szwProduct )
+        goto end;
+
+    szwAttribute = strdupAtoW( szAttribute );
+    if( szAttribute && !szwAttribute )
+        goto end;
+
+    buffer.unicode = FALSE;
+    buffer.str.a = szBuffer;
+
+    r = MSI_GetProductInfo( szwProduct, szwAttribute,
+                            &buffer, pcchValueBuf );
+
+end:
+    msi_free( szwProduct );
+    msi_free( szwAttribute );
+
+    return r;
+}
+
+UINT WINAPI MsiGetProductInfoW(LPCWSTR szProduct, LPCWSTR szAttribute,
+                               LPWSTR szBuffer, DWORD *pcchValueBuf)
+{
+    awstring buffer;
+
+    TRACE("%s %s %p %p\n", debugstr_w(szProduct), debugstr_w(szAttribute),
+          szBuffer, pcchValueBuf);
+
+    buffer.unicode = TRUE;
+    buffer.str.w = szBuffer;
+
+    return MSI_GetProductInfo( szProduct, szAttribute,
+                               &buffer, pcchValueBuf );
 }
 
 UINT WINAPI MsiEnableLogA(DWORD dwLogMode, LPCSTR szLogFile, DWORD attributes)
@@ -1567,7 +1555,7 @@ UINT WINAPI MsiProvideQualifiedComponent
     TRACE("%s %s %li %s %li %li %p %p\n", debugstr_w(szComponent),
           debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct),
           Unused1, Unused2, lpPathBuf, pcchPathBuf);
-   
+
     rc = MSIREG_OpenUserComponentsKey(szComponent, &hkey, FALSE);
     if (rc != ERROR_SUCCESS)
         return ERROR_INDEX_ABSENT;
@@ -1590,18 +1578,18 @@ UINT WINAPI MsiProvideQualifiedComponent
     }
 
     MsiDecomposeDescriptorW(info, product, feature, component, &sz);
-    
+
     if (!szProduct)
         rc = MsiGetComponentPathW(product, component, lpPathBuf, pcchPathBuf);
     else
         rc = MsiGetComponentPathW(szProduct, component, lpPathBuf, pcchPathBuf);
-   
+
     RegCloseKey(hkey);
     msi_free(info);
 
     if (rc == INSTALLSTATE_LOCAL)
         return ERROR_SUCCESS;
-    else 
+    else
         return ERROR_FILE_NOT_FOUND;
 }
 
@@ -1721,7 +1709,7 @@ USERINFOSTATE WINAPI MsiGetUserInfoW(LPC
     }
     if (pcchSerialBuf)
         *pcchSerialBuf = sz / sizeof(WCHAR);
-    
+
     RegCloseKey(hkey);
     return USERINFOSTATE_PRESENT;
 }
@@ -1969,7 +1957,7 @@ UINT WINAPI MsiReinstallFeatureW( LPCWST
         return r;
 
     MSI_SetPropertyW(package,REINSTALLMODE,reinstallmode);
-    
+
     sz = lstrlenW(szInstalled);
     sz += lstrlenW(fmt);
     sz += lstrlenW(szFeature);
@@ -2002,7 +1990,7 @@ UINT WINAPI MsiReinstallFeatureA( LPCSTR
     wszFeature = strdupAtoW(szFeature);
 
     rc = MsiReinstallFeatureW(wszProduct, wszFeature, dwReinstallMode);
-    
+
     msi_free(wszProduct);
     msi_free(wszFeature);
     return rc;




More information about the wine-cvs mailing list