/// <summary> /// Converts a Module to a ComponentGroup and adds all of its relevant elements to the main fragment. /// </summary> /// <param name="wix">The output object representing an unbound merge module.</param> private void ConvertModule(Wix.Wix wix) { Wix.Module module = GetModule(wix); foreach (Wix.ISchemaElement child in module.Children) { if (child is Wix.Directory) { bool isTargetDir = WalkDirectory((Wix.Directory)child); if (isTargetDir) { continue; } } else if (child is Wix.Dependency) { AddPropertyRef(((Wix.Dependency)child).RequiredId); continue; } else if (child is Wix.Package) { continue; } this.fragment.AddChild(child); } AddProperty(module.Id, this.id); wix.RemoveChild(module); wix.AddChild(this.fragment); this.fragment.AddChild(this.componentGroup); this.fragment.AddChild(this.primaryDirectoryRef); }
/// <summary> /// Mutate a Wix element. /// </summary> /// <param name="wix">The Wix element to mutate.</param> private void MutateWix(Wix.Wix wix) { if (TemplateType.Fragment != this.templateType) { if (null != this.rootElement || 0 != this.features.Count) { throw new Exception("The template option cannot be used with Feature, Product, or Module elements present."); } // create a package element although it won't always be used Wix.Package package = new Wix.Package(); if (TemplateType.Module == this.templateType) { package.Id = this.GetGuid(); } else { package.Compressed = Wix.YesNoType.yes; } package.InstallerVersion = 200; Wix.Directory targetDir = new Wix.Directory(); targetDir.Id = "TARGETDIR"; targetDir.Name = "SourceDir"; foreach (Wix.DirectoryRef directoryRef in this.directoryRefs) { if (String.Equals(directoryRef.Id, "TARGETDIR", StringComparison.OrdinalIgnoreCase)) { Wix.IParentElement parent = directoryRef.ParentElement as Wix.IParentElement; foreach (Wix.ISchemaElement element in directoryRef.Children) { targetDir.AddChild(element); } parent.RemoveChild(directoryRef); if (null != ((Wix.ISchemaElement)parent).ParentElement) { int i = 0; foreach (Wix.ISchemaElement element in parent.Children) { i++; } if (0 == i) { Wix.IParentElement supParent = (Wix.IParentElement)((Wix.ISchemaElement)parent).ParentElement; supParent.RemoveChild((Wix.ISchemaElement)parent); } } break; } } if (TemplateType.Module == this.templateType) { Wix.Module module = new Wix.Module(); module.Id = "PUT-MODULE-NAME-HERE"; module.Language = "1033"; module.Version = "1.0.0.0"; package.Manufacturer = "PUT-COMPANY-NAME-HERE"; module.AddChild(package); module.AddChild(targetDir); wix.AddChild(module); this.rootElement = module; } else // product { Wix.Product product = new Wix.Product(); product.Id = this.GetGuid(); product.Language = "1033"; product.Manufacturer = "PUT-COMPANY-NAME-HERE"; product.Name = "PUT-PRODUCT-NAME-HERE"; product.UpgradeCode = this.GetGuid(); product.Version = "1.0.0.0"; product.AddChild(package); product.AddChild(targetDir); Wix.Media media = new Wix.Media(); media.Id = "1"; media.Cabinet = "product.cab"; media.EmbedCab = Wix.YesNoType.yes; product.AddChild(media); Wix.Feature feature = new Wix.Feature(); feature.Id = "ProductFeature"; feature.Title = "PUT-FEATURE-TITLE-HERE"; feature.Level = 1; product.AddChild(feature); this.features.Add(feature); wix.AddChild(product); this.rootElement = product; } } }
public Wix.Wix Decompile(Output output) { if (null == output) { throw new ArgumentNullException("output"); } this.codepage = output.Codepage; this.outputType = output.Type; // collect the table definitions from the output this.tableDefinitions.Clear(); foreach (Table table in output.Tables) { this.tableDefinitions.Add(table.Definition); } // add any missing standard and wix-specific table definitions foreach (TableDefinition tableDefinition in Installer.GetTableDefinitions()) { if (!this.tableDefinitions.Contains(tableDefinition.Name)) { this.tableDefinitions.Add(tableDefinition); } } // add any missing extension table definitions foreach (WixExtension extension in this.extensions) { if (null != extension.TableDefinitions) { foreach (TableDefinition tableDefinition in extension.TableDefinitions) { if (!this.tableDefinitions.Contains(tableDefinition.Name)) { this.tableDefinitions.Add(tableDefinition); } } } } // if we don't have the temporary files object yet, get one if (null == this.tempFiles) { this.TempFilesLocation = null; } Directory.CreateDirectory(this.tempFiles.BasePath); // ensure the base path is there bool encounteredError = false; Wix.IParentElement rootElement; Wix.Wix wixElement = new Wix.Wix(); switch (this.outputType) { case OutputType.Module: rootElement = new Wix.Module(); break; case OutputType.PatchCreation: rootElement = new Wix.PatchCreation(); break; case OutputType.Product: rootElement = new Wix.Product(); break; default: throw new InvalidOperationException(WixStrings.EXP_UnknownOutputType); } wixElement.AddChild((Wix.ISchemaElement)rootElement); // try to decompile the database file try { this.core = new DecompilerCore(rootElement, this.Message); this.core.ShowPedanticMessages = this.showPedanticMessages; // stop processing if an error previously occurred if (this.core.EncounteredError) { return null; } // initialize the decompiler and its extensions foreach (WixExtension extension in this.extensions) { if (null != extension.DecompilerExtension) { extension.DecompilerExtension.Core = this.core; extension.DecompilerExtension.InitializeDecompile(output.Tables); } } this.InitializeDecompile(output.Tables); // stop processing if an error previously occurred if (this.core.EncounteredError) { return null; } // decompile the tables this.DecompileTables(output); // finalize the decompiler and its extensions this.FinalizeDecompile(output.Tables); foreach (WixExtension extension in this.extensions) { if (null != extension.DecompilerExtension) { extension.DecompilerExtension.FinalizeDecompile(output.Tables); } } } finally { encounteredError = this.core.EncounteredError; this.core = null; foreach (WixExtension extension in this.extensions) { if (null != extension.DecompilerExtension) { extension.DecompilerExtension.Core = null; } } } // return the root element only if decompilation completed successfully return (encounteredError ? null : wixElement); }
/// <summary> /// Mutate a Wix element. /// </summary> /// <param name="wix">The Wix element to mutate.</param> private void MutateWix(Wix.Wix wix) { if (TemplateType.Fragment != this.templateType) { if (null != this.rootElement || 0 != this.features.Count) { throw new Exception("The template option cannot be used with Feature, Product, or Module elements present."); } // create a package element although it won't always be used Wix.Package package = new Wix.Package(); if (TemplateType.Module == this.templateType) { package.Id = this.GetGuid(); } package.Compressed = Wix.YesNoType.yes; package.InstallerVersion = 200; // create the root directory Wix.Directory targetDir = new Wix.Directory(); targetDir.Id = "TARGETDIR"; targetDir.Name = "SourceDir"; // add all previous root directories to the root directory foreach (Wix.Directory directory in this.directories) { if (!(directory.ParentElement is Wix.Directory || directory.ParentElement is Wix.DirectoryRef)) { ((Wix.IParentElement)directory.ParentElement).RemoveChild(directory); targetDir.AddChild(directory); } } // add children of DirectoryRef/@Id="TARGETROOT" elements to the root directory foreach (Wix.DirectoryRef directoryRef in this.directoryRefs) { if ("TARGETDIR" == directoryRef.Id) { foreach (Wix.ISchemaElement element in directoryRef.Children) { targetDir.AddChild(element); } ((Wix.IParentElement)directoryRef.ParentElement).RemoveChild(directoryRef); } } this.directories.Add(targetDir); if (TemplateType.Module == this.templateType) { Wix.Module module = new Wix.Module(); module.Id = "PUT-MODULE-NAME-HERE"; module.Language = "1033"; module.Version = "1.0.0.0"; package.Manufacturer = "PUT-COMPANY-NAME-HERE"; module.AddChild(package); // add the authoring from the fragments directly into the module foreach (Wix.Fragment fragment in wix.Children) { foreach (Wix.ISchemaElement element in fragment.Children) { module.AddChild(element); } } foreach (Wix.Fragment fragment in wix.Children) { wix.RemoveChild(fragment); } module.AddChild(targetDir); wix.AddChild(module); this.rootElement = module; } else // product { Wix.Product product = new Wix.Product(); product.Id = this.GetGuid(); product.Language = "1033"; product.Manufacturer = "PUT-COMPANY-NAME-HERE"; product.Name = "PUT-PRODUCT-NAME-HERE"; product.UpgradeCode = this.GetGuid(); product.Version = "1.0.0.0"; product.AddChild(package); Wix.Media media = new Wix.Media(); media.Id = 1; media.Cabinet = "product.cab"; media.EmbedCab = Wix.YesNoType.yes; product.AddChild(media); Wix.Feature feature = new Wix.Feature(); feature.Id = "ProductFeature"; feature.Title = "PUT-FEATURE-TITLE-HERE"; feature.Level = 1; product.AddChild(feature); this.features.Add(feature); // add the authoring from the fragments directly into the product foreach (Wix.Fragment fragment in wix.Children) { foreach (Wix.ISchemaElement element in fragment.Children) { product.AddChild(element); } } foreach (Wix.Fragment fragment in wix.Children) { wix.RemoveChild(fragment); } product.AddChild(targetDir); wix.AddChild(product); this.rootElement = product; } } }