msi: Check transform validation flags.

Hans Leidekker hans at codeweavers.com
Wed Sep 3 08:41:09 CDT 2014


---
 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" {
-- 
2.1.0





More information about the wine-patches mailing list