Module: wine Branch: refs/heads/master Commit: cf4f79e87739e6ced68d023228c7f0e62d3e98ce URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=cf4f79e87739e6ced68d0232...
Author: Mike McCormack mike@codeweavers.com Date: Wed Mar 22 13:42:52 2006 +0900
msi: Implement custom action type 17.
---
dlls/msi/custom.c | 56 +++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 2ed4b81..bab2a4e 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -67,6 +67,8 @@ static UINT HANDLE_CustomType1(MSIPACKAG LPCWSTR target, const INT type, LPCWSTR action); static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action); +static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, + LPCWSTR target, const INT type, LPCWSTR action); static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action); static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source, @@ -207,6 +209,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *pac case 19: /* Error that halts install */ rc = HANDLE_CustomType19(package,source,target,type,action); break; + case 17: + rc = HANDLE_CustomType17(package,source,target,type,action); + break; case 50: /*EXE file specified by a property value */ rc = HANDLE_CustomType50(package,source,target,type,action); break; @@ -437,13 +442,13 @@ static DWORD WINAPI ACTION_CallDllFuncti ERR("Handle for object %p not found\n", package ); } else - ERR("Cannot load functon\n"); + ERR("failed to resolve functon %s\n", debugstr_a(proc));
msi_free(proc); FreeLibrary(hModule); } else - ERR("Unable to load library\n"); + ERR("failed to load dll %s\n", debugstr_w(stuff->source)); msiobj_release( &stuff->package->hdr ); msi_free(stuff->source); msi_free(stuff->target); @@ -468,15 +473,26 @@ static DWORD WINAPI DllThread(LPVOID inf return rc; }
+static HANDLE do_msidbCustomActionTypeDll(MSIPACKAGE *package, LPCWSTR dll, LPCWSTR target) +{ + thread_struct *info; + + info = msi_alloc( sizeof(*info) ); + msiobj_addref( &package->hdr ); + info->package = package; + info->target = strdupW(target); + info->source = strdupW(dll); + + return CreateThread(NULL, 0, DllThread, info, 0, NULL); +} + static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { WCHAR tmp_file[MAX_PATH]; - thread_struct *info; - DWORD ThreadId; - HANDLE ThreadHandle; UINT rc = ERROR_SUCCESS; BOOL finished = FALSE; + HANDLE ThreadHandle;
store_binary_to_temp(package, source, tmp_file);
@@ -489,13 +505,7 @@ static UINT HANDLE_CustomType1(MSIPACKAG strcatW(tmp_file,dot); }
- info = msi_alloc( sizeof(*info) ); - msiobj_addref( &package->hdr ); - info->package = package; - info->target = strdupW(target); - info->source = strdupW(tmp_file); - - ThreadHandle = CreateThread(NULL,0,DllThread,(LPVOID)info,0,&ThreadId); + ThreadHandle = do_msidbCustomActionTypeDll( package, tmp_file, target );
rc = process_handle(package, type, ThreadHandle, NULL, action, &finished );
@@ -503,7 +513,7 @@ static UINT HANDLE_CustomType1(MSIPACKAG track_tempfile(package, tmp_file, tmp_file); else DeleteFileW(tmp_file); - + return rc; }
@@ -568,6 +578,26 @@ static UINT HANDLE_CustomType2(MSIPACKAG return prc; }
+static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, + LPCWSTR target, const INT type, LPCWSTR action) +{ + HANDLE hThread; + MSIFILE *file; + + TRACE("%s %s\n", debugstr_w(source), debugstr_w(target)); + + file = get_loaded_file( package, source ); + if (!file) + { + ERR("invalid file key %s\n", debugstr_w( source )); + return ERROR_FUNCTION_FAILED; + } + + hThread = do_msidbCustomActionTypeDll( package, file->TargetPath, target ); + + return process_handle(package, type, hThread, NULL, action, NULL ); +} + static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) {