From a0ebe951b626dab459b911dc17e384f368cd45bc Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 17 Sep 2010 15:20:26 +0200 Subject: [PATCH] msi: Read supported platform and language ids from the summary information stream. --- dlls/msi/msipriv.h | 13 +++++++++ dlls/msi/package.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++-- dlls/msi/tests/db.c | 8 +++--- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 94bac5d5b0f..99486ecbd75 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -304,10 +304,20 @@ struct tagMSIVIEW struct msi_dialog_tag; typedef struct msi_dialog_tag msi_dialog; +enum platform +{ + PLATFORM_INTEL, + PLATFORM_INTEL64, + PLATFORM_X64 +}; + typedef struct tagMSIPACKAGE { MSIOBJECTHDR hdr; MSIDATABASE *db; + enum platform platform; + UINT num_langids; + LANGID *langids; struct list patches; struct list components; struct list features; @@ -1127,6 +1137,9 @@ static const WCHAR szLocalPackage[] = {'L','o','c','a','l','P','a','c','k','a',' static const WCHAR szOriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0}; static const WCHAR szUpgradeCode[] = {'U','p','g','r','a','d','e','C','o','d','e',0}; static const WCHAR szAdminUser[] = {'A','d','m','i','n','U','s','e','r',0}; +static const WCHAR szIntel[] = {'I','n','t','e','l',0}; +static const WCHAR szIntel64[] = {'I','n','t','e','l','6','4',0}; +static const WCHAR szX64[] = {'x','6','4',0}; /* memory allocation macro functions */ static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 4e7692f894f..9ca344a4de3 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -280,6 +280,7 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( package->ProductCode ); msi_free( package->ActionFormat ); msi_free( package->LastAction ); + msi_free( package->langids ); /* cleanup control event subscriptions */ ControlEvent_CleanupSubscriptions( package ); @@ -681,7 +682,6 @@ static VOID set_installer_properties(MSIPACKAGE *package) static const WCHAR szScreenY[] = {'S','c','r','e','e','n','Y',0}; static const WCHAR szColorBits[] = {'C','o','l','o','r','B','i','t','s',0}; static const WCHAR szIntFormat[] = {'%','d',0}; - static const WCHAR szIntel[] = { 'I','n','t','e','l',0 }; static const WCHAR szMsiAMD64[] = { 'M','s','i','A','M','D','6','4',0 }; static const WCHAR szMsix64[] = { 'M','s','i','x','6','4',0 }; static const WCHAR szSystem64Folder[] = { 'S','y','s','t','e','m','6','4','F','o','l','d','e','r',0 }; @@ -1271,6 +1271,64 @@ static UINT apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) return r; } +static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) +{ + WCHAR *template, *p, *q; + DWORD i, count; + + template = msi_suminfo_dup_string( si, PID_TEMPLATE ); + if (!template) + return ERROR_SUCCESS; /* native accepts missing template property */ + + TRACE("template: %s\n", debugstr_w(template)); + + p = strchrW( template, ';' ); + if (!p) + { + WARN("invalid template string %s\n", debugstr_w(template)); + msi_free( template ); + return ERROR_PATCH_PACKAGE_INVALID; + } + *p = 0; + if (!template[0] || !strcmpW( template, szIntel )) + package->platform = PLATFORM_INTEL; + else if (!strcmpW( template, szIntel64 )) + package->platform = PLATFORM_INTEL64; + else if (!strcmpW( template, szX64 )) + package->platform = PLATFORM_X64; + else + { + WARN("unknown platform %s\n", debugstr_w(template)); + msi_free( template ); + return ERROR_PATCH_PACKAGE_INVALID; + } + + count = 1; + for (q = ++p; (q = strchrW( q, ',' )); q++) count++; + + package->langids = msi_alloc( count * sizeof(LANGID) ); + if (!package->langids) + { + msi_free( template ); + return ERROR_OUTOFMEMORY; + } + + i = 0; + while (*p) + { + q = strchrW( p, ',' ); + if (q) *q = 0; + package->langids[i] = atoiW( p ); + if (!q) break; + p = q + 1; + i++; + } + package->num_langids = i + 1; + + msi_free( template ); + return ERROR_SUCCESS; +} + UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) { static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0}; @@ -1283,6 +1341,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) WCHAR temppath[MAX_PATH], localfile[MAX_PATH], cachefile[MAX_PATH]; LPCWSTR file = szPackage; DWORD index = 0; + MSISUMMARYINFO *si; TRACE("%s %p\n", debugstr_w(szPackage), pPackage); @@ -1382,6 +1441,23 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if( file != szPackage ) track_tempfile( package, file ); + si = MSI_GetSummaryInformationW( db->storage, 0 ); + if (!si) + { + WARN("failed to load summary info %u\n", r); + msiobj_release( &package->hdr ); + return ERROR_INSTALL_PACKAGE_INVALID; + } + + r = msi_parse_summary( si, package ); + msiobj_release( &si->hdr ); + if (r != ERROR_SUCCESS) + { + WARN("failed to parse summary info %u\n", r); + msiobj_release( &package->hdr ); + return r; + } + msi_set_property( package->db, Database, db->path ); if( UrlIsW( szPackage, URLIS_URL ) ) @@ -1412,7 +1488,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if (r != ERROR_SUCCESS) { ERR("registered patch failed to apply %u\n", r); - MSI_FreePackage( (MSIOBJECTHDR *)package ); + msiobj_release( &package->hdr ); return r; } diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 5c87e3fb91c..b3fe3b85306 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -1998,7 +1998,7 @@ static const CHAR suminfo[] = "PropertyId\tValue\n" "4\tWineHQ\n" "5\tInstaller\n" "6\tInstaller comments\n" - "7\tIntel;1033\n" + "7\tIntel;1033,2057\n" "9\t{12345678-1234-1234-1234-123456789012}\n" "12\t2009/04/12 15:46:11\n" "13\t2009/04/12 15:46:11\n" @@ -2107,8 +2107,8 @@ static void test_suminfo_import(void) r = MsiSummaryInfoGetPropertyA(hsi, PID_TEMPLATE, &type, NULL, NULL, str_value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type); - ok(!strcmp(str_value, "Intel;1033"), - "Expected \"Intel;1033\", got %s\n", str_value); + ok(!strcmp(str_value, "Intel;1033,2057"), + "Expected \"Intel;1033,2057\", got %s\n", str_value); size = sizeof(str_value); r = MsiSummaryInfoGetPropertyA(hsi, PID_REVNUMBER, &type, NULL, NULL, str_value, &size); @@ -2877,7 +2877,7 @@ static UINT set_summary_info(MSIHANDLE hdb) ok( res == ERROR_SUCCESS , "Failed to set summary info\n" ); res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL, - ";1033"); + ";1033,2057"); ok( res == ERROR_SUCCESS , "Failed to set summary info\n" ); res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL, -- 2.11.4.GIT