From 279ef15646910c7da633be6f939600987ffa7140 Mon Sep 17 00:00:00 2001 From: Mike McCormack <mike@codeweavers.com> Date: Thu, 27 Jan 2005 11:12:16 +0000 Subject: [PATCH] - implement MsiOpenPackageEx, and forward MsiOpenPackage there - make a MSI_CreatePackage function and use it in MSI_OpenPackage - move MsiOpenPackageA down with the rest of the API functions --- dlls/msi/package.c | 133 ++++++++++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 56 deletions(-) diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 23f9858d846..428b87303ce 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -58,29 +58,6 @@ void MSI_FreePackage( MSIOBJECTHDR *arg) msiobj_release( &package->db->hdr ); } -UINT WINAPI MsiOpenPackageA(LPCSTR szPackage, MSIHANDLE *phPackage) -{ - LPWSTR szwPack = NULL; - UINT len, ret; - - TRACE("%s %p\n",debugstr_a(szPackage), phPackage); - - if( szPackage ) - { - len = MultiByteToWideChar( CP_ACP, 0, szPackage, -1, NULL, 0 ); - szwPack = HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) ); - if( szwPack ) - MultiByteToWideChar( CP_ACP, 0, szPackage, -1, szwPack, len ); - } - - ret = MsiOpenPackageW( szwPack, phPackage ); - - HeapFree( GetProcessHeap(), 0, szwPack ); - - return ret; -} - - static const UINT clone_properties(MSIDATABASE *db) { MSIQUERY * view = NULL; @@ -375,39 +352,19 @@ Privileged ReleaseDC(0, dc); } -UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) +UINT MSI_CreatePackage(MSIDATABASE *db, MSIPACKAGE **pPackage) { - UINT rc; - MSIDATABASE *db = NULL; + static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 }; + static const WCHAR szpi[] = {'%','i',0}; MSIPACKAGE *package = NULL; WCHAR uilevel[10]; UINT ret = ERROR_FUNCTION_FAILED; - static const WCHAR OriginalDatabase[] = -{'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0}; - static const WCHAR Database[] = -{'D','A','T','A','B','A','S','E',0}; - static const WCHAR szpi[] = {'%','i',0}; - static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 }; - - TRACE("%s %p\n",debugstr_w(szPackage), pPackage); - - if (szPackage[0] == '#') - { - INT handle = atoiW(&szPackage[1]); - db = msihandle2msiinfo( handle , MSIHANDLETYPE_DATABASE); - } - else - { - rc = MSI_OpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db); - if (rc != ERROR_SUCCESS) - return ERROR_FUNCTION_FAILED; - } + TRACE("%p %p\n", db, pPackage); package = alloc_msiobject( MSIHANDLETYPE_PACKAGE, sizeof (MSIPACKAGE), MSI_FreePackage ); - - if (package) + if( package ) { msiobj_addref( &db->hdr ); @@ -428,8 +385,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) clone_properties(db); set_installer_properties(package); - MSI_SetPropertyW(package, OriginalDatabase, szPackage); - MSI_SetPropertyW(package, Database, szPackage); sprintfW(uilevel,szpi,gUILevel); MSI_SetPropertyW(package, szLevel, uilevel); @@ -440,17 +395,65 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if( package ) msiobj_release( &package->hdr ); + + return ret; +} + +UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) +{ + MSIDATABASE *db = NULL; + UINT ret = ERROR_FUNCTION_FAILED; + MSIHANDLE handle; + + TRACE("%s %p\n", debugstr_w(szPackage), pPackage); + + if( szPackage[0] == '#' ) + { + handle = atoiW(&szPackage[1]); + db = msihandle2msiinfo( handle, MSIHANDLETYPE_DATABASE ); + if( !db ) + return ERROR_INVALID_HANDLE; + } + else + { + ret = MSI_OpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db); + if( ret != ERROR_SUCCESS ) + return ret; + } + + ret = MSI_CreatePackage( db, pPackage ); + + /* + * FIXME: I don't think this is right. Maybe we should be storing the + * name of the database in the MSIDATABASE structure and fetching this + * info from there, or maybe this is only relevant to cached databases. + */ + if( ret == ERROR_SUCCESS && szPackage[0] != '#' ) + { + static const WCHAR OriginalDatabase[] = + {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0}; + static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0}; + + MSI_SetPropertyW(*pPackage, OriginalDatabase, szPackage); + MSI_SetPropertyW(*pPackage, Database, szPackage); + } + if( db ) msiobj_release( &db->hdr ); return ret; } -UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage) +UINT WINAPI MsiOpenPackageExW(LPCWSTR szPackage, DWORD dwOptions, MSIHANDLE *phPackage) { MSIPACKAGE *package = NULL; UINT ret; + TRACE("%s %08lx %p\n",debugstr_w(szPackage), dwOptions, phPackage); + + if( dwOptions ) + FIXME("dwOptions %08lx not supported\n", dwOptions); + ret = MSI_OpenPackageW( szPackage, &package); if( ret == ERROR_SUCCESS ) { @@ -460,16 +463,34 @@ UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage) return ret; } +UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage) +{ + return MsiOpenPackageExW( szPackage, 0, phPackage ); +} + UINT WINAPI MsiOpenPackageExA(LPCSTR szPackage, DWORD dwOptions, MSIHANDLE *phPackage) { - FIXME("%s 0x%08lx %p\n",debugstr_a(szPackage), dwOptions, phPackage); - return ERROR_CALL_NOT_IMPLEMENTED; + LPWSTR szwPack = NULL; + UINT len, ret; + + if( szPackage ) + { + len = MultiByteToWideChar( CP_ACP, 0, szPackage, -1, NULL, 0 ); + szwPack = HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) ); + if( szwPack ) + MultiByteToWideChar( CP_ACP, 0, szPackage, -1, szwPack, len ); + } + + ret = MsiOpenPackageExW( szwPack, dwOptions, phPackage ); + + HeapFree( GetProcessHeap(), 0, szwPack ); + + return ret; } -UINT WINAPI MsiOpenPackageExW(LPCWSTR szPackage, DWORD dwOptions, MSIHANDLE *phPackage) +UINT WINAPI MsiOpenPackageA(LPCSTR szPackage, MSIHANDLE *phPackage) { - FIXME("%s 0x%08lx %p\n",debugstr_w(szPackage), dwOptions, phPackage); - return ERROR_CALL_NOT_IMPLEMENTED; + return MsiOpenPackageExA( szPackage, 0, phPackage ); } MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall) -- GitLab