Hans Leidekker : msi: Factor out common code to execute custom action commands.

Alexandre Julliard julliard at winehq.org
Tue Jun 7 12:02:35 CDT 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Jun  7 10:33:35 2011 +0200

msi: Factor out common code to execute custom action commands.

---

 dlls/msi/custom.c |  201 +++++++++++++----------------------------------------
 1 files changed, 50 insertions(+), 151 deletions(-)

diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 1a23175..1a1b052 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -972,55 +972,39 @@ static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
     return r;
 }
 
-static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source,
-                               LPCWSTR target, const INT type, LPCWSTR action)
+static HANDLE execute_command( const WCHAR *exe, WCHAR *arg, const WCHAR *dir )
 {
     STARTUPINFOW si;
     PROCESS_INFORMATION info;
-    BOOL rc;
-    INT len;
-    WCHAR *deformated = NULL;
-    WCHAR *cmd;
-    static const WCHAR spc[] = {' ',0};
-    MSIBINARY *binary;
-    UINT r;
-
-    memset(&si,0,sizeof(STARTUPINFOW));
-
-    if (!(binary = get_temp_binary( package, source, FALSE )))
-        return ERROR_FUNCTION_FAILED;
-
-    deformat_string(package,target,&deformated);
-
-    len = strlenW( binary->tmpfile ) + 2;
-    if (deformated)
-        len += strlenW(deformated);
+    BOOL ret;
 
-    cmd = msi_alloc(sizeof(WCHAR)*len);
-
-    strcpyW( cmd, binary->tmpfile );
-    if (deformated)
+    memset( &si, 0, sizeof(STARTUPINFOW) );
+    ret = CreateProcessW( exe, arg, NULL, NULL, FALSE, 0, NULL, dir, &si, &info );
+    if (!ret)
     {
-        strcatW(cmd,spc);
-        strcatW(cmd,deformated);
-        msi_free(deformated);
+        WARN("unable to execute command %u\n", GetLastError());
+        return INVALID_HANDLE_VALUE;
     }
+    CloseHandle( info.hThread );
+    return info.hProcess;
+}
 
-    TRACE("executing exe %s\n", debugstr_w(cmd));
+static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source,
+                               LPCWSTR target, const INT type, LPCWSTR action)
+{
+    MSIBINARY *binary;
+    HANDLE handle;
+    WCHAR *arg;
 
-    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, szCRoot, &si, &info);
-    msi_free(cmd);
+    if (!(binary = get_temp_binary( package, source, FALSE ))) return ERROR_FUNCTION_FAILED;
 
-    if ( !rc )
-    {
-        ERR("Unable to execute command %s\n", debugstr_w(cmd));
-        return ERROR_SUCCESS;
-    }
-    CloseHandle( info.hThread );
-
-    r = wait_process_handle(package, type, info.hProcess, action);
+    deformat_string( package, target, &arg );
+    TRACE("exe %s arg %s\n", debugstr_w(binary->tmpfile), debugstr_w(arg));
 
-    return r;
+    handle = execute_command( binary->tmpfile, arg, szCRoot );
+    msi_free( arg );
+    if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS;
+    return wait_process_handle( package, type, handle, action );
 }
 
 static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
@@ -1049,53 +1033,19 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
 static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source,
                                 LPCWSTR target, const INT type, LPCWSTR action)
 {
-    STARTUPINFOW si;
-    PROCESS_INFORMATION info;
-    BOOL rc;
-    WCHAR *deformated;
-    WCHAR *cmd;
-    INT len;
-    static const WCHAR spc[] = {' ',0};
     MSIFILE *file;
+    HANDLE handle;
+    WCHAR *arg;
 
-    memset(&si,0,sizeof(STARTUPINFOW));
-
-    file = msi_get_loaded_file(package, source);
-    if( !file )
-        return ERROR_FUNCTION_FAILED;
-
-    len = lstrlenW( file->TargetPath );
-
-    deformat_string(package,target,&deformated);
-    if (deformated)
-        len += strlenW(deformated);
-    len += 2;
-
-    cmd = msi_alloc(len * sizeof(WCHAR));
-
-    lstrcpyW( cmd, file->TargetPath);
-    if (deformated)
-    {
-        strcatW(cmd, spc);
-        strcatW(cmd, deformated);
-
-        msi_free(deformated);
-    }
-
-    TRACE("executing exe %s\n", debugstr_w(cmd));
-
-    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, szCRoot, &si, &info);
+    if (!(file = msi_get_loaded_file( package, source ))) return ERROR_FUNCTION_FAILED;
 
-    if ( !rc )
-    {
-        ERR("Unable to execute command %s\n", debugstr_w(cmd));
-        msi_free(cmd);
-        return ERROR_SUCCESS;
-    }
-    msi_free(cmd);
-    CloseHandle( info.hThread );
+    deformat_string( package, target, &arg );
+    TRACE("exe %s arg %s\n", debugstr_w(file->TargetPath), debugstr_w(arg));
 
-    return wait_process_handle(package, type, info.hProcess, action);
+    handle = execute_command( file->TargetPath, arg, szCRoot );
+    msi_free( arg );
+    if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS;
+    return wait_process_handle( package, type, handle, action );
 }
 
 static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source,
@@ -1132,90 +1082,39 @@ static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source,
 static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
                                 LPCWSTR target, const INT type, LPCWSTR action)
 {
-    STARTUPINFOW si;
-    PROCESS_INFORMATION info;
-    WCHAR *prop;
-    BOOL rc;
-    WCHAR *deformated;
-    WCHAR *cmd;
-    INT len;
-    static const WCHAR spc[] = {' ',0};
-
-    memset(&si,0,sizeof(STARTUPINFOW));
-    memset(&info,0,sizeof(PROCESS_INFORMATION));
-
-    prop = msi_dup_property( package->db, source );
-    if (!prop)
-        return ERROR_SUCCESS;
-
-    deformat_string(package,target,&deformated);
-    len = strlenW(prop) + 2;
-    if (deformated)
-         len += strlenW(deformated);
-
-    cmd = msi_alloc(sizeof(WCHAR)*len);
-
-    strcpyW(cmd,prop);
-    if (deformated)
-    {
-        strcatW(cmd,spc);
-        strcatW(cmd,deformated);
-
-        msi_free(deformated);
-    }
-    msi_free(prop);
-
-    TRACE("executing exe %s\n", debugstr_w(cmd));
-
-    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, szCRoot, &si, &info);
+    WCHAR *exe, *arg;
+    HANDLE handle;
 
-    if ( !rc )
-    {
-        ERR("Unable to execute command %s\n", debugstr_w(cmd));
-        msi_free(cmd);
-        return ERROR_SUCCESS;
-    }
-    msi_free(cmd);
+    if (!(exe = msi_dup_property( package->db, source ))) return ERROR_SUCCESS;
 
-    CloseHandle( info.hThread );
+    deformat_string( package, target, &arg );
+    TRACE("exe %s arg %s\n", debugstr_w(exe), debugstr_w(arg));
 
-    return wait_process_handle(package, type, info.hProcess, action);
+    handle = execute_command( exe, arg, szCRoot );
+    msi_free( arg );
+    if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS;
+    return wait_process_handle( package, type, handle, action );
 }
 
 static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
                                 LPCWSTR target, const INT type, LPCWSTR action)
 {
-    LPWSTR filename;
     const WCHAR *workingdir;
-    STARTUPINFOW si;
-    PROCESS_INFORMATION info;
-    BOOL rc;
-
-    memset(&si, 0, sizeof(STARTUPINFOW));
+    HANDLE handle;
+    WCHAR *cmd;
 
     workingdir = msi_get_target_folder( package, source );
     if (!workingdir) return ERROR_FUNCTION_FAILED;
 
-    deformat_string(package, target, &filename);
-    if (!filename) return ERROR_FUNCTION_FAILED;
-
-    TRACE("executing exe %s with working directory %s\n",
-          debugstr_w(filename), debugstr_w(workingdir));
-
-    rc = CreateProcessW(NULL, filename, NULL, NULL, FALSE, 0, NULL,
-                        workingdir, &si, &info);
+    deformat_string( package, target, &cmd );
+    if (!cmd) return ERROR_FUNCTION_FAILED;
 
-    if ( !rc )
-    {
-        ERR("Unable to execute command %s with working directory %s\n",
-            debugstr_w(filename), debugstr_w(workingdir));
-        msi_free(filename);
-        return ERROR_SUCCESS;
-    }
-    msi_free(filename);
-    CloseHandle( info.hThread );
+    TRACE("cmd %s dir %s\n", debugstr_w(cmd), debugstr_w(workingdir));
 
-    return wait_process_handle(package, type, info.hProcess, action);
+    handle = execute_command( NULL, cmd, workingdir );
+    msi_free( cmd );
+    if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS;
+    return wait_process_handle( package, type, handle, action );
 }
 
 static DWORD ACTION_CallScript( const GUID *guid )




More information about the wine-cvs mailing list