Mike McCormack : msi: Use msi_strcpy_to_awstring to return the string in MsiComponentGetPath.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 6 10:44:01 CDT 2006


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

Author: Mike McCormack <mike at codeweavers.com>
Date:   Thu Jul  6 19:00:45 2006 +0900

msi: Use msi_strcpy_to_awstring to return the string in MsiComponentGetPath.

---

 dlls/msi/msi.c |  149 ++++++++++++++++++++++++++------------------------------
 1 files changed, 70 insertions(+), 79 deletions(-)

diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 119a4f9..d3c2179 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -974,58 +974,8 @@ UINT WINAPI MsiVerifyPackageW( LPCWSTR s
     return r;
 }
 
-INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent,
-                                         LPSTR lpPathBuf, DWORD* pcchBuf)
-{
-    LPWSTR szwProduct = NULL, szwComponent = NULL, lpwPathBuf= NULL;
-    INSTALLSTATE rc;
-    UINT incoming_len;
-
-    if( szProduct )
-    {
-        szwProduct = strdupAtoW( szProduct );
-        if( !szwProduct)
-            return ERROR_OUTOFMEMORY;
-    }
-
-    if( szComponent )
-    {
-        szwComponent = strdupAtoW( szComponent );
-        if( !szwComponent )
-        {
-            msi_free( szwProduct);
-            return ERROR_OUTOFMEMORY;
-        }
-    }
-
-    if( pcchBuf && *pcchBuf > 0 )
-    {
-        lpwPathBuf = msi_alloc( *pcchBuf * sizeof(WCHAR));
-        incoming_len = *pcchBuf;
-    }
-    else
-    {
-        lpwPathBuf = NULL;
-        incoming_len = 0;
-    }
-
-    rc = MsiGetComponentPathW(szwProduct, szwComponent, lpwPathBuf, pcchBuf);
-
-    msi_free( szwProduct);
-    msi_free( szwComponent);
-    if (lpwPathBuf)
-    {
-        if (rc != INSTALLSTATE_UNKNOWN)
-            WideCharToMultiByte(CP_ACP, 0, lpwPathBuf, incoming_len,
-                            lpPathBuf, incoming_len, NULL, NULL);
-        msi_free( lpwPathBuf);
-    }
-
-    return rc;
-}
-
-INSTALLSTATE WINAPI MsiGetComponentPathW(LPCWSTR szProduct, LPCWSTR szComponent,
-                                         LPWSTR lpPathBuf, DWORD* pcchBuf)
+INSTALLSTATE WINAPI MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent,
+                                         awstring* lpPathBuf, DWORD* pcchBuf)
 {
     WCHAR squished_pc[GUID_SIZE];
     UINT rc;
@@ -1042,38 +992,44 @@ INSTALLSTATE WINAPI MsiGetComponentPathW
     if( lpPathBuf && !pcchBuf )
         return INSTALLSTATE_INVALIDARG;
 
-    squash_guid(szProduct,squished_pc);
+    squash_guid( szProduct, squished_pc );
 
     rc = MSIREG_OpenProductsKey( szProduct, &hkey, FALSE);
     if( rc != ERROR_SUCCESS )
-        goto end;
+        return INSTALLSTATE_UNKNOWN;
 
     RegCloseKey(hkey);
 
     rc = MSIREG_OpenComponentsKey( szComponent, &hkey, FALSE);
     if( rc != ERROR_SUCCESS )
-        goto end;
+        return INSTALLSTATE_UNKNOWN;
 
     sz = 0;
     type = 0;
     rc = RegQueryValueExW( hkey, squished_pc, NULL, &type, NULL, &sz );
-    if( rc != ERROR_SUCCESS )
-        goto end;
-    if( type != REG_SZ )
-        goto end;
-
-    sz += sizeof(WCHAR);
-    path = msi_alloc( sz );
-    if( !path )
-        goto end;
-
-    rc = RegQueryValueExW( hkey, squished_pc, NULL, NULL, (LPVOID) path, &sz );
-    if( rc != ERROR_SUCCESS )
-        goto end;
+    if( rc == ERROR_SUCCESS && type == REG_SZ )
+    {
+        sz += sizeof(WCHAR);
+        path = msi_alloc( sz );
+        if( path )
+        {
+            path[0] = 0;
+            rc = RegQueryValueExW( hkey, squished_pc, NULL, NULL, (LPVOID) path, &sz );
+            if( rc != ERROR_SUCCESS )
+            {
+                msi_free( path );
+                path = NULL;
+            }
+        }
+    }
+    RegCloseKey(hkey);
 
     TRACE("found path of (%s:%s)(%s)\n", debugstr_w(szComponent),
            debugstr_w(szProduct), debugstr_w(path));
 
+    if (!path)
+        return INSTALLSTATE_UNKNOWN;
+
     if (path[0]=='0')
     {
         FIXME("Registry entry.. check entry\n");
@@ -1081,28 +1037,63 @@ INSTALLSTATE WINAPI MsiGetComponentPathW
     }
     else
     {
-        /* PROBABLY a file */
         if ( GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES )
             rrc = INSTALLSTATE_LOCAL;
         else
             rrc = INSTALLSTATE_ABSENT;
     }
 
-    if( pcchBuf )
-    {
-        sz = sz / sizeof(WCHAR);
-        if( *pcchBuf >= sz )
-            lstrcpyW( lpPathBuf, path );
-        *pcchBuf = sz;
-    }
+    msi_strcpy_to_awstring( path, lpPathBuf, pcchBuf );
 
-end:
-    msi_free(path );
-    RegCloseKey(hkey);
+    msi_free( path );
     return rrc;
 }
 
 /******************************************************************
+ * MsiGetComponentPathW      [MSI.@]
+ */
+INSTALLSTATE WINAPI MsiGetComponentPathW(LPCWSTR szProduct, LPCWSTR szComponent,
+                                         LPWSTR lpPathBuf, DWORD* pcchBuf)
+{
+    awstring path;
+
+    path.unicode = TRUE;
+    path.str.w = lpPathBuf;
+
+    return MSI_GetComponentPath( szProduct, szComponent, &path, pcchBuf );
+}
+
+/******************************************************************
+ * MsiGetComponentPathA      [MSI.@]
+ */
+INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent,
+                                         LPSTR lpPathBuf, DWORD* pcchBuf)
+{
+    LPWSTR szwProduct, szwComponent = NULL;
+    INSTALLSTATE r = INSTALLSTATE_UNKNOWN;
+    awstring path;
+
+    szwProduct = strdupAtoW( szProduct );
+    if( szProduct && !szwProduct)
+        goto end;
+
+    szwComponent = strdupAtoW( szComponent );
+    if( szComponent && !szwComponent )
+        goto end;
+
+    path.unicode = FALSE;
+    path.str.a = lpPathBuf;
+
+    r = MSI_GetComponentPath( szwProduct, szwComponent, &path, pcchBuf );
+
+end:
+    msi_free( szwProduct );
+    msi_free( szwComponent );
+
+    return r;
+}
+
+/******************************************************************
  * MsiQueryFeatureStateA      [MSI.@]
  */
 INSTALLSTATE WINAPI MsiQueryFeatureStateA(LPCSTR szProduct, LPCSTR szFeature)




More information about the wine-cvs mailing list