summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-01-25 09:33:25 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2013-01-25 09:45:36 +0100
commit6722623d62a9bb0e13c427fd677a79368aeefe9a (patch)
tree109c9259be1ec48372ce99b420cddeaab8efcec6
parent42e457fb52a35893e4a63cce42774dbf6d2fb3d6 (diff)
downloadmsitools-6722623d62a9bb0e13c427fd677a79368aeefe9a.tar.gz
msitools-6722623d62a9bb0e13c427fd677a79368aeefe9a.tar.xz
msitools-6722623d62a9bb0e13c427fd677a79368aeefe9a.zip
wixl: reorganize full_path, add the key element to the stable UUID
Call the resolver from the override of WixElementRef. Override in WixComponent, making it look at the key component. Add a new method to fetch the name part from a <File> or <RegistryValue> element.
-rw-r--r--tests/wixl.at6
-rw-r--r--tools/wixl/wix.vala38
2 files changed, 31 insertions, 13 deletions
diff --git a/tests/wixl.at b/tests/wixl.at
index c28cc78..a773d13 100644
--- a/tests/wixl.at
+++ b/tests/wixl.at
@@ -35,9 +35,9 @@ AT_WIXLDATA([Manual.pdf])
AT_CHECK_WIXL([-o out.msi ComponentGUID.wxs], [0], [ignore], [ignore])
# FIXME: add tons of tests on out.msi
AT_CHECK([msiinfo export -s out.msi Component | sort | grep INSERT], [0],
-[INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('MainExecutable', '{8C320F7C-C521-5B19-A3C5-AF2B2ECEE71E}', 'INSTALLDIR', 0, 'FoobarEXE')
-INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('Manual', '{BAEE488E-70FF-566B-8A74-FE3107FDBDE2}', 'INSTALLDIR', 0, 'Manual')
-INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('ProgramMenuDir', '{F9F7F81C-5E64-5B7C-8018-FAF096969B88}', 'ProgramMenuDir', 4, 'reg5453B5C95074EA6F633E6D36318AFBF7')
+[INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('MainExecutable', '{E92F36A4-7332-5803-B56D-B30AED211451}', 'INSTALLDIR', 0, 'FoobarEXE')
+INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('Manual', '{E44FE0D4-A612-50BF-B231-0662EB694E2F}', 'INSTALLDIR', 0, 'Manual')
+INSERT INTO `Component` (`Component`, `ComponentId`, `Directory_`, `Attributes`, `KeyPath`) VALUES ('ProgramMenuDir', '{6B979E1B-8F32-5150-AA04-6D7B8BCB1614}', 'ProgramMenuDir', 4, 'reg5453B5C95074EA6F633E6D36318AFBF7')
])
AT_CLEANUP
diff --git a/tools/wixl/wix.vala b/tools/wixl/wix.vala
index a7cf3c9..a041996 100644
--- a/tools/wixl/wix.vala
+++ b/tools/wixl/wix.vala
@@ -149,16 +149,9 @@ namespace Wixl {
return array;
}
- public string full_path (WixResolver r) throws GLib.Error {
- WixDirectory dir = null;
-
- if (parent != null && parent is WixDirectory)
- dir = this.parent as WixDirectory;
- else if (parent != null && parent is WixDirectoryRef)
- dir = r.resolve<WixDirectory> (this.parent);
-
- if (dir != null)
- return dir.full_path (r) + "/" + this.Id;
+ public virtual string full_path (WixResolver r) throws GLib.Error {
+ if (parent != null && (parent is WixDirectory || parent is WixDirectoryRef))
+ return parent.full_path (r) + "/" + this.Id;
else
return this.Id;
}
@@ -398,6 +391,10 @@ namespace Wixl {
public abstract class WixKeyElement: WixElement {
public string KeyPath { get; set; }
+
+ public virtual string path_name () throws GLib.Error {
+ throw new Wixl.Error.FAILED("this key path does not support generating a component GUID");
+ }
}
public class WixFile: WixKeyElement {
@@ -413,6 +410,10 @@ namespace Wixl {
public File file;
+ public override string path_name () throws GLib.Error {
+ return Name;
+ }
+
public override void accept (WixNodeVisitor visitor) throws GLib.Error {
base.accept (visitor);
visitor.visit_file (this);
@@ -430,6 +431,10 @@ namespace Wixl {
public string Value { get; set; }
public string Name { get; set; }
+ public override string path_name () throws GLib.Error {
+ return Root + "/" + Key;
+ }
+
public override void accept (WixNodeVisitor visitor) throws GLib.Error {
visitor.visit_registry_value (this);
}
@@ -999,6 +1004,14 @@ namespace Wixl {
base.accept (visitor);
visitor.visit_component (this, VisitState.LEAVE);
}
+
+ public override string full_path (WixResolver r) throws GLib.Error {
+ if (key == null)
+ throw new Wixl.Error.FAILED("a child is needed to generate a component GUID");
+
+ return parent.full_path (r) + "/" + key.path_name ();
+ }
+
}
public class WixDirectory: WixElement {
@@ -1027,6 +1040,11 @@ namespace Wixl {
// // FIXME vala: class init/construct fails, construct fails...
// ref_type = typeof (G);
// }
+
+ public override string full_path (WixResolver r) throws GLib.Error {
+ return (r.resolve<G> (this) as WixElement).full_path (r);
+ }
+
}
public class WixDirectoryRef: WixElementRef<WixDirectory> {