/// <summary> /// Generates a WiX serialization object tree for a product that consumes the /// given unit tests. /// </summary> /// <param name="unitTestIds">List of unit test ids.</param> private void GenerateTestSource(IEnumerable <string> unitTestIds) { Wix.Product product = new Wix.Product(); product.Id = "*"; product.Language = "1033"; product.Manufacturer = "Lux"; product.Name = Path.GetFileNameWithoutExtension(this.outputFile) + " Lux test project"; product.Version = "1.0"; product.UpgradeCode = "{FBBDFC60-6EFF-427E-8B6B-7696A3C7066B}"; Wix.Package package = new Wix.Package(); package.Compressed = Wix.YesNoType.yes; package.InstallScope = Wix.Package.InstallScopeType.perUser; product.AddChild(package); foreach (string unitTestId in unitTestIds) { WixLux.UnitTestRef unitTestRef = new WixLux.UnitTestRef(); unitTestRef.Id = unitTestId; product.AddChild(unitTestRef); } Wix.Wix wix = new Wix.Wix(); wix.AddChild(product); // now write to the file XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; this.OnMessage(LuxBuildVerboses.GeneratingConsumer(this.outputFile, unitTestIds.Count())); using (XmlWriter writer = XmlWriter.Create(this.outputFile, settings)) { writer.WriteStartDocument(); wix.OutputXml(writer); writer.WriteEndDocument(); } }
/// <summary> /// Main running method for the application. /// </summary> /// <param name="args">Commandline arguments to the application.</param> /// <returns>Returns the application error code.</returns> private int Run(string[] args) { StringCollection extensionList = new StringCollection(); heatCore = new HeatCore(); HarvesterCore harvesterCore = new HarvesterCore(); heatCore.Harvester.Core = harvesterCore; heatCore.Mutator.Core = harvesterCore; try { // read the configuration file (heat.exe.config) AppCommon.ReadConfiguration(extensionList); // load any extensions foreach (string extensionType in extensionList) { this.LoadExtension(extensionType); } // exit if there was an error loading an extension if (Messaging.Instance.EncounteredError) { return(Messaging.Instance.LastErrorNumber); } // parse the command line this.ParseCommandLine(args); if (this.showHelp) { return(this.DisplayHelp()); } // exit if there was an error parsing the core command line if (Messaging.Instance.EncounteredError) { return(Messaging.Instance.LastErrorNumber); } if (this.showLogo) { AppCommon.DisplayToolHeader(); } // set the extension argument for use by all extensions harvesterCore.ExtensionArgument = this.extensionArgument; // parse the extension's command line arguments string[] extensionOptionsArray = new string[this.extensionOptions.Count]; this.extensionOptions.CopyTo(extensionOptionsArray, 0); foreach (HeatExtension heatExtension in this.extensions) { heatExtension.ParseOptions(this.extensionType, extensionOptionsArray); } // exit if there was an error parsing the command line (otherwise the logo appears after error messages) if (Messaging.Instance.EncounteredError) { return(Messaging.Instance.LastErrorNumber); } // harvest the output Wix.Wix wix = heatCore.Harvester.Harvest(this.extensionArgument); if (null == wix) { return(Messaging.Instance.LastErrorNumber); } // mutate the output if (!heatCore.Mutator.Mutate(wix)) { return(Messaging.Instance.LastErrorNumber); } XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Indent = true; xmlSettings.IndentChars = new string(' ', this.indent); xmlSettings.OmitXmlDeclaration = true; string wixString; using (StringWriter stringWriter = new StringWriter()) { using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, xmlSettings)) { wix.OutputXml(xmlWriter); } wixString = stringWriter.ToString(); } string mutatedWixString = heatCore.Mutator.Mutate(wixString); if (String.IsNullOrEmpty(mutatedWixString)) { return(Messaging.Instance.LastErrorNumber); } Directory.CreateDirectory(Path.GetDirectoryName(this.outputFile)); using (StreamWriter streamWriter = new StreamWriter(this.outputFile, false, System.Text.Encoding.UTF8)) { xmlSettings.OmitXmlDeclaration = false; xmlSettings.Encoding = System.Text.Encoding.UTF8; using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, xmlSettings)) { xmlWriter.WriteStartDocument(); xmlWriter.Flush(); } streamWriter.WriteLine(); streamWriter.Write(mutatedWixString); } } catch (WixException we) { Messaging.Instance.OnMessage(we.Error); } catch (Exception e) { Messaging.Instance.OnMessage(WixErrors.UnexpectedException(e.Message, e.GetType().ToString(), e.StackTrace)); if (e is NullReferenceException || e is SEHException) { throw; } } return(Messaging.Instance.LastErrorNumber); }
public int Execute() { try { if (String.IsNullOrEmpty(this.ExtensionArgument)) { this.Messaging.Write(ErrorMessages.HarvestSourceNotSpecified()); } else if (String.IsNullOrEmpty(this.OutputFile)) { this.Messaging.Write(ErrorMessages.OutputTargetNotSpecified()); } // exit if there was an error parsing the core command line if (this.Messaging.EncounteredError) { return(this.Messaging.LastErrorNumber); } if (this.ShowLogo) { HelpCommand.DisplayToolHeader(); } var heatCore = new HeatCore(this.ServiceProvider, this.ExtensionArgument, this.RunningInMsBuild); // parse the extension's command line arguments var extensionOptionsArray = this.ExtensionOptions.ToArray(); foreach (var heatExtension in this.Extensions) { heatExtension.Core = heatCore; heatExtension.ParseOptions(this.ExtensionType, extensionOptionsArray); } // exit if there was an error parsing the command line (otherwise the logo appears after error messages) if (this.Messaging.EncounteredError) { return(this.Messaging.LastErrorNumber); } // harvest the output Wix.Wix wix = heatCore.Harvester.Harvest(this.ExtensionArgument); if (null == wix) { return(this.Messaging.LastErrorNumber); } // mutate the output if (!heatCore.Mutator.Mutate(wix)) { return(this.Messaging.LastErrorNumber); } XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Indent = true; xmlSettings.IndentChars = new string(' ', this.Indent); xmlSettings.OmitXmlDeclaration = true; string wixString; using (StringWriter stringWriter = new StringWriter()) { using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, xmlSettings)) { wix.OutputXml(xmlWriter); } wixString = stringWriter.ToString(); } string mutatedWixString = heatCore.Mutator.Mutate(wixString); if (String.IsNullOrEmpty(mutatedWixString)) { return(this.Messaging.LastErrorNumber); } Directory.CreateDirectory(Path.GetDirectoryName(this.OutputFile)); using (StreamWriter streamWriter = new StreamWriter(this.OutputFile, false, System.Text.Encoding.UTF8)) { xmlSettings.OmitXmlDeclaration = false; xmlSettings.Encoding = System.Text.Encoding.UTF8; using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, xmlSettings)) { xmlWriter.WriteStartDocument(); xmlWriter.Flush(); } streamWriter.WriteLine(); streamWriter.Write(mutatedWixString); } } catch (WixException we) { this.Messaging.Write(we.Error); } catch (Exception e) { this.Messaging.Write(ErrorMessages.UnexpectedException(e.Message, e.GetType().ToString(), e.StackTrace)); if (e is NullReferenceException || e is SEHException) { throw; } } return(this.Messaging.LastErrorNumber); }
/// <summary> /// Main running method for the application. /// </summary> /// <param name="args">Commandline arguments to the application.</param> /// <returns>Returns the application error code.</returns> private int Run(string[] args) { Decompiler decompiler = null; Mutator mutator = null; Unbinder unbinder = null; try { // parse the command line this.ParseCommandLine(args); // exit if there was an error parsing the command line (otherwise the logo appears after error messages) if (Messaging.Instance.EncounteredError) { return(Messaging.Instance.LastErrorNumber); } if (null == this.inputFile) { this.showHelp = true; } else if (null == this.outputFile) { if (null == this.outputDirectory) { this.outputFile = Path.ChangeExtension(Path.GetFileName(this.inputFile), ".wxs"); } else { this.outputFile = Path.Combine(this.outputDirectory, Path.ChangeExtension(Path.GetFileName(this.inputFile), ".wxs")); } } if (this.showLogo) { AppCommon.DisplayToolHeader(); } if (this.showHelp) { Console.WriteLine(DarkStrings.HelpMessage); AppCommon.DisplayToolFooter(); return(Messaging.Instance.LastErrorNumber); } foreach (string parameter in this.invalidArgs) { Messaging.Instance.OnMessage(WixWarnings.UnsupportedCommandLineArgument(parameter)); } this.invalidArgs = null; // create the decompiler and mutator decompiler = new Decompiler(); mutator = new Mutator(); mutator.Core = new HarvesterCore(); unbinder = new Unbinder(); // read the configuration file (dark.exe.config) AppCommon.ReadConfiguration(this.extensionList); // load all extensions ExtensionManager extensionManager = new ExtensionManager(); foreach (string extension in this.extensionList) { extensionManager.Load(extension); } foreach (IDecompilerExtension extension in extensionManager.Create <IDecompilerExtension>()) { decompiler.AddExtension(extension); } foreach (IUnbinderExtension extension in extensionManager.Create <IUnbinderExtension>()) { unbinder.AddExtension(extension); } // set options decompiler.SuppressCustomTables = this.suppressCustomTables; decompiler.SuppressDroppingEmptyTables = this.suppressDroppingEmptyTables; decompiler.SuppressRelativeActionSequencing = this.suppressRelativeActionSequencing; decompiler.SuppressUI = this.suppressUI; decompiler.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); if (!String.IsNullOrEmpty(this.exportBasePath)) { decompiler.ExportFilePath = this.exportBasePath; } unbinder.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); // print friendly message saying what file is being decompiled Console.WriteLine(Path.GetFileName(this.inputFile)); // unbind // TODO: passing a bundle to the decompiler without the /x parameter specified stumbles here // as the exportBasePath will be null. Need a design decision whether to throw an // message below or throw a message here Output output = unbinder.Unbind(this.inputFile, this.outputType, this.exportBasePath); if (null != output) { if (OutputType.Patch == this.outputType || OutputType.Transform == this.outputType || this.outputXml) { output.Save(this.outputFile); } else // decompile { Wix.Wix wix = decompiler.Decompile(output); // output if (null != wix) { XmlTextWriter writer = null; // mutate the Wix document if (!mutator.Mutate(wix)) { return(Messaging.Instance.LastErrorNumber); } try { Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(this.outputFile))); writer = new XmlTextWriter(this.outputFile, System.Text.Encoding.UTF8); writer.Indentation = 4; writer.IndentChar = ' '; writer.QuoteChar = '"'; writer.Formatting = Formatting.Indented; writer.WriteStartDocument(); wix.OutputXml(writer); writer.WriteEndDocument(); } catch (Exception e) { Messaging.Instance.OnMessage(WixErrors.FileWriteError(this.outputFile, e.Message)); return(Messaging.Instance.LastErrorNumber); } finally { if (null != writer) { writer.Close(); } } } } } } catch (WixException we) { Messaging.Instance.OnMessage(we.Error); } catch (Exception e) { Messaging.Instance.OnMessage(WixErrors.UnexpectedException(e.Message, e.GetType().ToString(), e.StackTrace)); if (e is NullReferenceException || e is SEHException) { throw; } } finally { if (null != decompiler) { if (this.tidy) { if (!decompiler.DeleteTempFiles()) { Console.Error.WriteLine(DarkStrings.WAR_FailedToDeleteTempDir, decompiler.TempFilesLocation); } } else { Console.WriteLine(DarkStrings.INF_TempDirLocatedAt, decompiler.TempFilesLocation); } } if (null != unbinder) { if (this.tidy) { if (!unbinder.DeleteTempFiles()) { Console.Error.WriteLine(DarkStrings.WAR_FailedToDeleteTempDir, unbinder.TempFilesLocation); } } else { Console.WriteLine(DarkStrings.INF_TempDirLocatedAt, unbinder.TempFilesLocation); } } } return(Messaging.Instance.LastErrorNumber); }
/// <summary> /// Extracts files from a merge module and creates corresponding ComponentGroup WiX authoring. /// </summary> private void MeltModule() { Decompiler decompiler = null; Unbinder unbinder = null; Melter melter = null; try { // create the decompiler, unbinder, and melter decompiler = new Decompiler(); unbinder = new Unbinder(); melter = new Melter(decompiler, id); // read the configuration file (melt.exe.config) AppCommon.ReadConfiguration(this.extensionList); // load all extensions ExtensionManager extensionManager = new ExtensionManager(); foreach (string extension in this.extensionList) { extensionManager.Load(extension); } foreach (IDecompilerExtension extension in extensionManager.Create <IDecompilerExtension>()) { decompiler.AddExtension(extension); } foreach (IUnbinderExtension extension in extensionManager.Create <IUnbinderExtension>()) { unbinder.AddExtension(extension); } // set options decompiler.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); unbinder.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); unbinder.SuppressDemodularization = true; // print friendly message saying what file is being decompiled Console.WriteLine(Path.GetFileName(this.inputFile)); // unbind Output output = unbinder.Unbind(this.inputFile, this.outputType, this.exportBasePath); if (null != output) { Wix.Wix wix = melter.Melt(output); if (null != wix) { XmlTextWriter writer = null; try { writer = new XmlTextWriter(this.outputFile, System.Text.Encoding.UTF8); writer.Indentation = 4; writer.IndentChar = ' '; writer.QuoteChar = '"'; writer.Formatting = Formatting.Indented; writer.WriteStartDocument(); wix.OutputXml(writer); writer.WriteEndDocument(); } finally { if (null != writer) { writer.Close(); } } } } } finally { if (null != decompiler) { if (this.tidy) { if (!decompiler.DeleteTempFiles()) { Console.Error.WriteLine(MeltStrings.WAR_FailedToDeleteTempDir, decompiler.TempFilesLocation); } } else { Console.WriteLine(MeltStrings.INF_TempDirLocatedAt, decompiler.TempFilesLocation); } } if (null != unbinder) { if (this.tidy) { if (!unbinder.DeleteTempFiles()) { Console.Error.WriteLine(MeltStrings.WAR_FailedToDeleteTempDir, unbinder.TempFilesLocation); } } else { Console.WriteLine(MeltStrings.INF_TempDirLocatedAt, unbinder.TempFilesLocation); } } } }