Module: wine Branch: master Commit: 9bc12ade13d6ac69ecce7a40e5682516a36c2f1b URL: http://source.winehq.org/git/wine.git/?a=commit;h=9bc12ade13d6ac69ecce7a40e5...
Author: James Hawkins truiken@gmail.com Date: Thu Oct 19 15:49:54 2006 -0700
msi: Implement the InstallServices action.
---
dlls/msi/action.c | 102 ++++++++++++++++++++++++++++++++++++++++++--- dlls/msi/tests/install.c | 10 +---- 2 files changed, 97 insertions(+), 15 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index d893af2..e81fcb7 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -34,6 +34,7 @@ #include "windef.h" #include "winbase.h" #include "winerror.h" #include "winreg.h" +#include "winsvc.h" #include "wine/debug.h" #include "msidefs.h" #include "msipriv.h" @@ -4075,6 +4076,100 @@ static UINT ACTION_PublishComponents(MSI return rc; }
+static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param) +{ + MSIPACKAGE *package = (MSIPACKAGE*)param; + MSIRECORD *row; + MSIFILE *file; + SC_HANDLE hscm, service = NULL; + LPCWSTR name, disp, comp, depends, pass; + LPCWSTR load_order, serv_name, key; + DWORD serv_type, start_type; + DWORD err_control; + + static const WCHAR query[] = + {'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', + '`','C','o','m','p','o','n','e','n','t','`',' ', + 'W','H','E','R','E',' ', + '`','C','o','m','p','o','n','e','n','t','`',' ', + '=',''','%','s',''',0}; + + hscm = OpenSCManagerW(NULL, SERVICES_ACTIVE_DATABASEW, GENERIC_WRITE); + if (!hscm) + { + ERR("Failed to open the SC Manager!\n"); + goto done; + } + + start_type = MSI_RecordGetInteger(rec, 5); + if (start_type == SERVICE_BOOT_START || start_type == SERVICE_SYSTEM_START) + goto done; + + depends = MSI_RecordGetString(rec, 8); + if (depends && *depends) + FIXME("Dependency list unhandled!\n"); + + name = MSI_RecordGetString(rec, 2); + disp = MSI_RecordGetString(rec, 3); + serv_type = MSI_RecordGetInteger(rec, 4); + err_control = MSI_RecordGetInteger(rec, 6); + load_order = MSI_RecordGetString(rec, 7); + serv_name = MSI_RecordGetString(rec, 9); + pass = MSI_RecordGetString(rec, 10); + comp = MSI_RecordGetString(rec, 12); + + /* fetch the service path */ + row = MSI_QueryGetRecord(package->db, query, comp); + if (!row) + { + ERR("Control query failed!\n"); + goto done; + } + + key = MSI_RecordGetString(row, 6); + msiobj_release(&row->hdr); + + file = get_loaded_file(package, key); + if (!file) + { + ERR("Failed to load the service file\n"); + goto done; + } + + service = CreateServiceW(hscm, name, disp, GENERIC_ALL, serv_type, + start_type, err_control, file->TargetPath, + load_order, NULL, NULL, serv_name, pass); + if (!service) + { + if (GetLastError() != ERROR_SERVICE_EXISTS) + ERR("Failed to create service %s: %d\n", debugstr_w(name), GetLastError()); + } + +done: + CloseServiceHandle(service); + CloseServiceHandle(hscm); + + return ERROR_SUCCESS; +} + +static UINT ACTION_InstallServices( MSIPACKAGE *package ) +{ + UINT rc; + MSIQUERY * view; + static const WCHAR ExecSeqQuery[] = + {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'S','e','r','v','i','c','e','I','n','s','t','a','l','l',0}; + + rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + if (rc != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rc = MSI_IterateRecords(view, NULL, ITERATE_InstallService, package); + msiobj_release(&view->hdr); + + return rc; +} + static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, LPCSTR action, LPCWSTR table ) { @@ -4149,13 +4244,6 @@ static UINT ACTION_SelfUnregModules( MSI return msi_unimplemented_action_stub( package, "SelfUnregModules", table ); }
-static UINT ACTION_InstallServices( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { - 'S','e','r','v','i','c','e','I','n','s','t','a','l','l',0 }; - return msi_unimplemented_action_stub( package, "InstallServices", table ); -} - static UINT ACTION_StartServices( MSIPACKAGE *package ) { static const WCHAR table[] = { diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 36d9240..0c43dee 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -622,16 +622,10 @@ static void check_service_is_installed(v ok(scm != NULL, "Failed to open the SC Manager\n");
service = OpenService(scm, "TestService", SC_MANAGER_ALL_ACCESS); - todo_wine - { - ok(service != NULL, "Failed to open TestService\n"); - } + ok(service != NULL, "Failed to open TestService\n");
res = DeleteService(service); - todo_wine - { - ok(res, "Failed to delete TestService\n"); - } + ok(res, "Failed to delete TestService\n"); }
static void test_MsiInstallProduct(void)