From d43a0c5613c3c88a845fdf183ed403bd95072cf4 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Thu, 3 Jan 2013 16:19:25 +0100 Subject: Populate RemoveFile table --- src/builder.vala | 15 +++++++++++++++ src/msi.vala | 29 +++++++++++++++++++++++++++++ src/util.vala | 11 +++++++++++ src/wix.vala | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+) (limited to 'src') diff --git a/src/builder.vala b/src/builder.vala index e4f9a0a..6544d61 100644 --- a/src/builder.vala +++ b/src/builder.vala @@ -75,6 +75,21 @@ namespace Wixl { } else warning ("unhandled parent type %s", @ref.parent.name); } + + enum RemoveFileInstallMode { + INSTALL = 1, + UNINSTALL, + BOTH + } + + public override void visit_remove_folder (WixRemoveFolder rm) throws GLib.Error { + var on = enum_from_string (typeof (RemoveFileInstallMode), rm.On); + var comp = rm.parent as WixComponent; + var dir = comp.parent as WixDirectory; + + db.table_remove_file.add (rm.Id, comp.Id, dir.Id, on); + } + } } // Wixl diff --git a/src/msi.vala b/src/msi.vala index 915c4b1..56f4206 100644 --- a/src/msi.vala +++ b/src/msi.vala @@ -363,6 +363,32 @@ namespace Wixl { } } + class MsiTableRemoveFile: MsiTable { + construct { + name = "RemoveFile"; + } + + public void add (string FileKey, string Component, string DirProperty, int InstallMode) throws GLib.Error { + var rec = new Libmsi.Record (4); + if (!rec.set_string (1, FileKey) || + !rec.set_string (2, Component) || + !rec.set_string (3, DirProperty) || + !rec.set_int (4, InstallMode)) + throw new Wixl.Error.FAILED ("failed to add record"); + + records.append (rec); + } + + public override void create (Libmsi.Database db) throws GLib.Error { + var query = new Libmsi.Query (db, "CREATE TABLE `RemoveFile` (`FileKey` CHAR(72) NOT NULL, `Component_` CHAR(72) NOT NULL, `FileName` CHAR(255) LOCALIZABLE, `DirProperty` CHAR(72) NOT NULL, `InstallMode` INT NOT NULL PRIMARY KEY `FileKey`)"); + query.execute (null); + + query = new Libmsi.Query (db, "INSERT INTO `RemoveFile` (`FileKey`, `Component_`, `DirProperty`, `InstallMode`) VALUES (?, ?, ?, ?)"); + foreach (var r in records) + query.execute (r); + } + } + class MsiTableFeature: MsiTable { construct { name = "Feature"; @@ -458,6 +484,7 @@ namespace Wixl { public MsiTableComponent table_component; public MsiTableFeature table_feature; public MsiTableFeatureComponents table_feature_components; + public MsiTableRemoveFile table_remove_file; HashTable tables; @@ -487,6 +514,7 @@ namespace Wixl { table_component = new MsiTableComponent (); table_feature = new MsiTableFeature (); table_feature_components = new MsiTableFeatureComponents (); + table_remove_file = new MsiTableRemoveFile (); foreach (var t in new MsiTable[] { new MsiTableAdminExecuteSequence (), @@ -503,6 +531,7 @@ namespace Wixl { table_component, table_feature, table_feature_components, + table_remove_file, new MsiTable_Validation () }) { tables.insert (t.name, t); diff --git a/src/util.vala b/src/util.vala index d9a12cc..0dfdd36 100644 --- a/src/util.vala +++ b/src/util.vala @@ -22,9 +22,20 @@ namespace Wixl { return (string) udn; } + + int enum_from_string (Type t, string str) throws GLib.Error { + var k = (EnumClass)t.class_ref (); + var v = k.get_value_by_nick (str); + + if (v == null) + throw new Wixl.Error.FAILED ("Can't convert string to enum"); + return v.value; + } + string add_braces (string str) { return "{" + str + "}"; } + long now () { var tv = TimeVal (); tv.get_current_time (); diff --git a/src/wix.vala b/src/wix.vala index 6711a58..97cc137 100644 --- a/src/wix.vala +++ b/src/wix.vala @@ -10,6 +10,7 @@ namespace Wixl { public abstract void visit_component (WixComponent comp) throws GLib.Error; public abstract void visit_feature (WixFeature feature) throws GLib.Error; public abstract void visit_component_ref (WixComponentRef ref) throws GLib.Error; + public abstract void visit_remove_folder (WixRemoveFolder rm) throws GLib.Error; } public abstract class WixElement: Object { @@ -129,6 +130,18 @@ namespace Wixl { } } + public class WixRemoveFolder: WixElement { + static construct { + name = "RemoveFolder"; + } + + public string On { get; set; } + + public override void accept (WixElementVisitor visitor) throws GLib.Error { + visitor.visit_remove_folder (this); + } + } + public class WixFeature: WixElement { static construct { name = "Feature"; @@ -265,10 +278,30 @@ namespace Wixl { public override void load (Xml.Node *node) throws Wixl.Error { base.load (node); + + for (var child = node->children; child != null; child = child->next) { + switch (child->type) { + case Xml.ElementType.COMMENT_NODE: + case Xml.ElementType.TEXT_NODE: + continue; + case Xml.ElementType.ELEMENT_NODE: + switch (child->name) { + case "RemoveFolder": + var rm = new WixRemoveFolder (); + rm.load (child); + add_child (rm); + continue; + } + break; + } + debug ("unhandled node %s", child->name); + } } public override void accept (WixElementVisitor visitor) throws GLib.Error { visitor.visit_component (this); + + base.accept (visitor); } } -- cgit