MSI: move Install Features selection and evaluation into CostFinalize

Mike McCormack mike at codeweavers.com
Fri Dec 24 01:29:56 CST 2004


The last patch should have been attributed to Aric too.

Mike


ChangeLog:
<aric at codeweavers.com>
* move Install Features selection and evaluation into CostFinalize

-------------- next part --------------
--- dlls/msi/action.c.old	2004-12-24 16:26:57.000000000 +0900
+++ dlls/msi/action.c	2004-12-24 16:27:03.000000000 +0900
@@ -832,7 +832,7 @@
    'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ',
        '=',' ','%','i',0};
 
-    rc = ACTION_OpenQuery(package->db, &view, ExecSeqQuery, -1);
+    rc = ACTION_OpenQuery(package->db, &view, ExecSeqQuery, seq);
 
     if (rc == ERROR_SUCCESS)
     {
@@ -1832,7 +1832,7 @@
     sz = 96;       
     MSI_RecordGetStringW(row,6,package->components[index].KeyPath,&sz);
 
-    package->components[index].State = INSTALLSTATE_UNKNOWN;
+    package->components[index].State = INSTALLSTATE_ABSENT;
     package->components[index].Enabled = TRUE;
     package->components[index].FeatureState= FALSE;
 
@@ -1894,7 +1894,7 @@
         MSI_RecordGetStringW(row,7,package->features[index].Directory,&sz);
 
     package->features[index].Attributes= MSI_RecordGetInteger(row,8);
-    package->features[index].State = INSTALLSTATE_UNKNOWN;
+    package->features[index].State = INSTALLSTATE_ABSENT;
 
     /* load feature components */
 
@@ -2346,6 +2346,68 @@
     return path;
 }
 
+static UINT SetFeatureStates(MSIPACKAGE *package)
+{
+    LPWSTR level;
+    INT install_level;
+    DWORD i;
+    INT j;
+    LPWSTR override = NULL;
+    static const WCHAR all[]={'A','L','L',0};
+    static const WCHAR szlevel[] = {
+        'I','N','S','T','A','L','L','L','E','V','E','L',0};
+    static const WCHAR szAddLocal[] = {
+        'A','D','D','L','O','C','A','L',0};
+
+    /* I do not know if this is where it should happen.. but */
+
+    TRACE("Checking Install Level\n");
+
+    level = load_dynamic_property(package,szlevel,NULL);
+    if (level)
+    {
+        install_level = atoiW(level);
+        HeapFree(GetProcessHeap(), 0, level);
+    }
+    else
+        install_level = 1;
+
+    override = load_dynamic_property(package,szAddLocal,NULL);
+   
+    /*
+     * Components FeatureState defaults to FALSE. The idea is we want to 
+     * enable the component is ANY feature that uses it is enabled to install
+     */
+    for(i = 0; i < package->loaded_features; i++)
+    {
+        BOOL feature_state= ((package->features[i].Level > 0) &&
+                             (package->features[i].Level <= install_level));
+
+        if (override && (strcmpiW(override,all)==0 || 
+                         strstrW(override,package->features[i].Feature)))
+        {
+            TRACE("Override of install level found\n");
+            feature_state = TRUE;
+        }
+        package->features[i].Enabled = feature_state;
+
+        TRACE("Feature %s has a state of %i\n",
+               debugstr_w(package->features[i].Feature), feature_state);
+        for( j = 0; j < package->features[i].ComponentCount; j++)
+        {
+            package->components[package->features[i].Components[j]].FeatureState
+            |= feature_state;
+        }
+    } 
+    if (override)
+        HeapFree(GetProcessHeap(),0,override);
+    /* 
+     * So basically we ONLY want to install a component if its Enabled AND
+     * FeatureState are both TRUE 
+     */
+    return ERROR_SUCCESS;
+}
+
 /* 
  * Alot is done in this function aside from just the costing.
  * The costing needs to be implemented at some point but for now I am going
@@ -2576,7 +2638,9 @@
         MSI_SetPropertyW(package,szlevel, szOne);
     else
         HeapFree(GetProcessHeap(),0,level);
-    return ERROR_SUCCESS;
+
+    return SetFeatureStates(package);
+
 }
 
 /*
@@ -3490,66 +3554,10 @@
 
 static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
 {
-    LPWSTR level;
-    INT install_level;
-    DWORD i;
-    INT j;
-    LPWSTR override = NULL;
-    static const WCHAR all[]={'A','L','L',0};
-    static const WCHAR szlevel[] = {
-        'I','N','S','T','A','L','L','L','E','V','E','L',0};
-    static const WCHAR szAddLocal[] = {
-        'A','D','D','L','O','C','A','L',0};
-
-    /* I do not know if this is where it should happen.. but */
-
-    TRACE("Checking Install Level\n");
-
-    level = load_dynamic_property(package,szlevel,NULL);
-    if (level)
-    {
-        install_level = atoiW(level);
-        HeapFree(GetProcessHeap(), 0, level);
-    }
-    else
-        install_level = 1;
-
-    override = load_dynamic_property(package,szAddLocal,NULL);
-   
-    /*
-     * Components FeatureState defaults to FALSE. The idea is we want to 
-     * enable the component is ANY feature that uses it is enabled to install
-     */
-    for(i = 0; i < package->loaded_features; i++)
-    {
-        BOOL feature_state= ((package->features[i].Level > 0) &&
-                             (package->features[i].Level <= install_level));
-
-        if (override && (strcmpiW(override,all)==0 || 
-                         strstrW(override,package->features[i].Feature)))
-        {
-            TRACE("Override of install level found\n");
-            feature_state = TRUE;
-            package->features[i].Enabled = feature_state;
-        }
-
-        TRACE("Feature %s has a state of %i\n",
-               debugstr_w(package->features[i].Feature), feature_state);
-        for( j = 0; j < package->features[i].ComponentCount; j++)
-        {
-            package->components[package->features[i].Components[j]].FeatureState
-            |= feature_state;
-        }
-    } 
-    if (override)
-        HeapFree(GetProcessHeap(),0,override);
-    /* 
-     * So basically we ONLY want to install a component if its Enabled AND
-     * FeatureState are both TRUE 
-     */
     return ERROR_SUCCESS;
 }
 
+
 static UINT ACTION_InstallValidate(MSIPACKAGE *package)
 {
     DWORD progress = 0;
@@ -5056,8 +5064,9 @@
         if (package->features[index].Enabled)
             *piAction = INSTALLSTATE_LOCAL;
         else
-            *piAction = INSTALLSTATE_UNKNOWN;
+            *piAction = package->features[index].State;
     }
+    TRACE("returning %i %i\n",*piInstalled,*piAction);
 
     return ERROR_SUCCESS;
 }


More information about the wine-patches mailing list