Module: wine Branch: master Commit: 07be9f0585c59da2aa521e7ac494d34ff9d1baa3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=07be9f0585c59da2aa521e7ac4...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Jan 31 15:11:38 2013 +0100
msi: Improve parsing of the supported platforms string.
---
dlls/msi/msipriv.h | 1 + dlls/msi/package.c | 31 ++++++++++++++++++++----------- dlls/msi/tests/install.c | 8 ++++++++ 3 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index f709bac..c477405 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -338,6 +338,7 @@ typedef struct msi_dialog_tag msi_dialog;
enum platform { + PLATFORM_UNKNOWN, PLATFORM_INTEL, PLATFORM_INTEL64, PLATFORM_X64, diff --git a/dlls/msi/package.c b/dlls/msi/package.c index db0ec25..385000c 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -1269,9 +1269,18 @@ UINT msi_create_empty_local_file( LPWSTR path, LPCWSTR suffix ) return ERROR_SUCCESS; }
+static enum platform parse_platform( WCHAR *str ) +{ + if (!str[0] || !strcmpW( str, szIntel )) return PLATFORM_INTEL; + else if (!strcmpW( str, szIntel64 )) return PLATFORM_INTEL64; + else if (!strcmpW( str, szX64 ) || !strcmpW( str, szAMD64 )) return PLATFORM_X64; + else if (!strcmpW( str, szARM )) return PLATFORM_ARM; + return PLATFORM_UNKNOWN; +} + static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) { - WCHAR *template, *p, *q; + WCHAR *template, *p, *q, *platform; DWORD i, count;
package->version = msi_suminfo_get_int32( si, PID_PAGECOUNT ); @@ -1291,16 +1300,16 @@ static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) return ERROR_PATCH_PACKAGE_INVALID; } *p = 0; - if ((q = strchrW( template, ',' ))) *q = 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 ) || !strcmpW( template, szAMD64 )) - package->platform = PLATFORM_X64; - else if (!strcmpW( template, szARM )) - package->platform = PLATFORM_ARM; - else + platform = template; + if ((q = strchrW( platform, ',' ))) *q = 0; + package->platform = parse_platform( platform ); + while (package->platform == PLATFORM_UNKNOWN && q) + { + platform = q + 1; + if ((q = strchrW( platform, ',' ))) *q = 0; + package->platform = parse_platform( platform ); + } + if (package->platform == PLATFORM_UNKNOWN) { WARN("unknown platform %s\n", debugstr_w(template)); msi_free( template ); diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 0cf9347..e063a87 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -6295,6 +6295,14 @@ static void test_package_validation(void) ok(delete_pf("msitest", FALSE), "directory does not exist\n");
DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Alpha,Beta,Intel;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0");
r = MsiInstallProductA(msifile, NULL);