From 886d64819cb0b686b097b9a05cec9dd9f566e37a Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Thu, 3 Jan 2013 11:21:48 +0100 Subject: Populate Media table --- src/builder.vala | 4 ++++ src/msi.vala | 21 ++++++++++++++++++++- src/wix.vala | 20 ++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/builder.vala b/src/builder.vala index 439447b..151c79a 100644 --- a/src/builder.vala +++ b/src/builder.vala @@ -39,6 +39,10 @@ namespace Wixl { public override void visit_property (WixProperty prop) throws GLib.Error { db.table_property.add (prop.Id, prop.Value); } + + public override void visit_media (WixMedia media) throws GLib.Error { + db.table_media.add (media.Id, media.EmbedCab, media.DiskPrompt, "#" + media.Cabinet); + } } } // Wixl diff --git a/src/msi.vala b/src/msi.vala index f9920ee..24090be 100644 --- a/src/msi.vala +++ b/src/msi.vala @@ -240,9 +240,26 @@ namespace Wixl { name = "Media"; } + public void add (string DiskId, string LastSequence, string DiskPrompt, string Cabinet) throws GLib.Error { + var rec = new Libmsi.Record (4); + + if (!rec.set_int (1, int.parse (DiskId)) || + !rec.set_int (2, int.parse (LastSequence)) || + !rec.set_string (3, DiskPrompt) || + !rec.set_string (4, Cabinet)) + 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 `Media` (`DiskId` INT NOT NULL, `LastSequence` LONG NOT NULL, `DiskPrompt` CHAR(64) LOCALIZABLE, `Cabinet` CHAR(255), `VolumeLabel` CHAR(32), `Source` CHAR(72) PRIMARY KEY `DiskId`)"); query.execute (null); + + query = new Libmsi.Query (db, "INSERT INTO `Media` (`DiskId`, `LastSequence`, `DiskPrompt`, `Cabinet`) VALUES (?, ?, ?, ?)"); + foreach (var r in records) + query.execute (r); } } @@ -335,6 +352,7 @@ namespace Wixl { public MsiSummaryInfo info; public MsiTableProperty table_property; public MsiTableIcon table_icon; + public MsiTableMedia table_media; HashTable tables; @@ -359,6 +377,7 @@ namespace Wixl { tables = new HashTable (str_hash, str_equal); table_property = new MsiTableProperty (); table_icon = new MsiTableIcon (); + table_media = new MsiTableMedia (); foreach (var t in new MsiTable[] { new MsiTableAdminExecuteSequence (), @@ -368,7 +387,7 @@ namespace Wixl { new MsiTableFile (), new MsiTableInstallExecuteSequence (), new MsiTableInstallUISequence (), - new MsiTableMedia (), + table_media, table_property, table_icon, new MsiTable_Validation () diff --git a/src/wix.vala b/src/wix.vala index ec98688..1de68d0 100644 --- a/src/wix.vala +++ b/src/wix.vala @@ -5,6 +5,7 @@ namespace Wixl { public abstract void visit_icon (WixIcon icon) throws GLib.Error; public abstract void visit_package (WixPackage package) throws GLib.Error; public abstract void visit_property (WixProperty prop) throws GLib.Error; + public abstract void visit_media (WixMedia media) throws GLib.Error; } public abstract class WixElement: Object { @@ -175,6 +176,11 @@ namespace Wixl { prop.load (child); add_child (prop); continue; + case "Media": + var media = new WixMedia (); + media.load (child); + add_child (media); + continue; } break; } @@ -188,6 +194,20 @@ namespace Wixl { } } + public class WixMedia: WixElement { + static construct { + name = "Media"; + } + + public string Cabinet { get; set; } + public string EmbedCab { get; set; } + public string DiskPrompt { get; set; } + + public override void accept (WixElementVisitor visitor) throws GLib.Error { + visitor.visit_media (this); + } + } + class WixRoot: WixElement { static construct { name = "Wix"; -- cgit