Module: wine Branch: master Commit: a5d8ab57f6b84f318efee10c97558df5514c342d URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5d8ab57f6b84f318efee10c97...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Sep 3 15:41:09 2014 +0200
msi: Check transform validation flags.
---
dlls/msi/patch.c | 57 ++++++++++++++++++++++++++++-------------------------- include/msiquery.h | 15 ++++++++++++++ 2 files changed, 45 insertions(+), 27 deletions(-)
diff --git a/dlls/msi/patch.c b/dlls/msi/patch.c index d7eef7c..a3a8d32 100644 --- a/dlls/msi/patch.c +++ b/dlls/msi/patch.c @@ -46,54 +46,57 @@ static BOOL match_language( MSIPACKAGE *package, LANGID langid )
static UINT check_transform_applicable( MSIPACKAGE *package, IStorage *transform ) { - WCHAR *package_product, *transform_product, *template = NULL; - UINT ret = ERROR_FUNCTION_FAILED; + MSISUMMARYINFO *si = MSI_GetSummaryInformationW( transform, 0 ); + UINT valid_flags = 0, wanted_flags = 0; + + if (si) wanted_flags = msi_suminfo_get_int32( si, PID_CHARCOUNT ); + TRACE("validation flags %x\n", wanted_flags);
- package_product = msi_dup_property( package->db, szProductCode ); - transform_product = msi_get_suminfo_product( transform ); + if (wanted_flags & ~(MSITRANSFORM_VALIDATE_PRODUCT|MSITRANSFORM_VALIDATE_LANGUAGE)) + FIXME("unsupported validation flags %x\n", wanted_flags); + + if (wanted_flags & MSITRANSFORM_VALIDATE_PRODUCT) + { + WCHAR *package_product = msi_dup_property( package->db, szProductCode ); + WCHAR *transform_product = msi_get_suminfo_product( transform );
- TRACE("package = %s transform = %s\n", debugstr_w(package_product), debugstr_w(transform_product)); + TRACE("package = %s transform = %s\n", debugstr_w(package_product), debugstr_w(transform_product));
- if (!transform_product || strstrW( transform_product, package_product )) + if (!transform_product || strstrW( transform_product, package_product )) + { + valid_flags |= MSITRANSFORM_VALIDATE_PRODUCT; + } + msi_free( transform_product ); + msi_free( package_product ); + } + if (wanted_flags & MSITRANSFORM_VALIDATE_LANGUAGE) { - MSISUMMARYINFO *si; + WCHAR *template; const WCHAR *p;
- si = MSI_GetSummaryInformationW( transform, 0 ); if (!si) { ERR("no summary information!\n"); goto end; } - template = msi_suminfo_dup_string( si, PID_TEMPLATE ); - if (!template) + if (!(template = msi_suminfo_dup_string( si, PID_TEMPLATE ))) { ERR("no template property!\n"); - msiobj_release( &si->hdr ); - goto end; - } - if (!template[0]) - { - ret = ERROR_SUCCESS; - msiobj_release( &si->hdr ); goto end; } TRACE("template: %s\n", debugstr_w(template)); - p = strchrW( template, ';' ); - if (p && match_language( package, atoiW( p + 1 ) )) + if (!template[0] || ((p = strchrW( template, ';' )) && match_language( package, atoiW( p + 1 ) ))) { - TRACE("applicable transform\n"); - ret = ERROR_SUCCESS; + valid_flags |= MSITRANSFORM_VALIDATE_LANGUAGE; } - /* FIXME: check platform */ - msiobj_release( &si->hdr ); + msi_free( template ); }
end: - msi_free( transform_product ); - msi_free( package_product ); - msi_free( template ); - return ret; + msiobj_release( &si->hdr ); + if (valid_flags & ~wanted_flags) return ERROR_FUNCTION_FAILED; + TRACE("applicable transform\n"); + return ERROR_SUCCESS; }
static UINT apply_substorage_transform( MSIPACKAGE *package, MSIDATABASE *patch_db, LPCWSTR name ) diff --git a/include/msiquery.h b/include/msiquery.h index fbd4651..a1f3c6c 100644 --- a/include/msiquery.h +++ b/include/msiquery.h @@ -145,6 +145,21 @@ typedef enum tagMSIDBSTATE MSIDBSTATE_WRITE = 1 } MSIDBSTATE;
+typedef enum tagMSITRANSFORM_VALIDATE +{ + MSITRANSFORM_VALIDATE_LANGUAGE = 0x00000001, + MSITRANSFORM_VALIDATE_PRODUCT = 0x00000002, + MSITRANSFORM_VALIDATE_PLATFORM = 0x00000004, + MSITRANSFORM_VALIDATE_MAJORVERSION = 0x00000008, + MSITRANSFORM_VALIDATE_MINORVERSION = 0x00000010, + MSITRANSFORM_VALIDATE_UPDATEVERSION = 0x00000020, + MSITRANSFORM_VALIDATE_NEWLESSBASEVERSION = 0x00000040, + MSITRANSFORM_VALIDATE_NEWLESSEQUALBASEVERSION = 0x00000080, + MSITRANSFORM_VALIDATE_NEWEQUALBASEVERSION = 0x00000100, + MSITRANSFORM_VALIDATE_NEWGREATEREQUALBASEVERSION = 0x00000200, + MSITRANSFORM_VALIDATE_NEWGREATERBASEVERSION = 0x00000400, + MSITRANSFORM_VALIDATE_UPGRADECODE = 0x00000800 +} MSITRANSFORM_VALIDATE;
#ifdef __cplusplus extern "C" {