From 2bb37beda887d120a0ddabf874ad25357101faa1 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 1 Nov 2017 10:59:45 -0700 Subject: Update to WiX Intermediate Representation --- src/WixToolset.Data.WindowsInstaller/Pdb.cs | 163 ++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/WixToolset.Data.WindowsInstaller/Pdb.cs (limited to 'src/WixToolset.Data.WindowsInstaller/Pdb.cs') diff --git a/src/WixToolset.Data.WindowsInstaller/Pdb.cs b/src/WixToolset.Data.WindowsInstaller/Pdb.cs new file mode 100644 index 00000000..03c3ddbb --- /dev/null +++ b/src/WixToolset.Data.WindowsInstaller/Pdb.cs @@ -0,0 +1,163 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Data +{ + using System; + using System.IO; + using System.Xml; + + /// + /// Pdb generated by the binder. + /// + public sealed class Pdb + { + public const string XmlNamespaceUri = "http://wixtoolset.org/schemas/v4/wixpdb"; + private static readonly Version CurrentVersion = new Version("4.0.0.0"); + + /// + /// Creates a new empty pdb object. + /// + /// The source line information for the pdb. + public Pdb() + { + } + + /// + /// Gets or sets the output that is a part of this pdb. + /// + /// Type of the output. + public Output Output { get; set; } + + /// + /// Loads a pdb from a path on disk. + /// + /// Path to pdb file saved on disk. + /// Suppresses wix.dll version mismatch check. + /// Pdb pdb. + public static Pdb Load(string path, bool suppressVersionCheck) + { + using (FileStream stream = File.OpenRead(path)) + using (FileStructure fs = FileStructure.Read(stream)) + { + if (FileFormat.Wixpdb != fs.FileFormat) + { + throw new WixUnexpectedFileFormatException(path, FileFormat.Wixpdb, fs.FileFormat); + } + + Uri uri = new Uri(Path.GetFullPath(path)); + using (XmlReader reader = XmlReader.Create(fs.GetDataStream(), null, uri.AbsoluteUri)) + { + try + { + reader.MoveToContent(); + return Pdb.Read(reader, suppressVersionCheck); + } + catch (XmlException xe) + { + throw new WixCorruptFileException(path, fs.FileFormat, xe); + } + } + } + } + + /// + /// Saves a pdb to a path on disk. + /// + /// Path to save pdb file to on disk. + public void Save(string path) + { + Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))); + + using (FileStream stream = File.Create(path)) + using (FileStructure fs = FileStructure.Create(stream, FileFormat.Wixpdb, null)) + using (XmlWriter writer = XmlWriter.Create(fs.GetDataStream())) + { + writer.WriteStartDocument(); + this.Write(writer); + writer.WriteEndDocument(); + } + } + + /// + /// Processes an XmlReader and builds up the pdb object. + /// + /// Reader to get data from. + /// Suppresses wix.dll version mismatch check. + /// The Pdb represented by the Xml. + internal static Pdb Read(XmlReader reader, bool suppressVersionCheck) + { + if ("wixPdb" != reader.LocalName) + { + throw new XmlException(); + } + + bool empty = reader.IsEmptyElement; + Pdb pdb = new Pdb(); + Version version = null; + + while (reader.MoveToNextAttribute()) + { + switch (reader.LocalName) + { + case "version": + version = new Version(reader.Value); + break; + } + } + + if (!suppressVersionCheck && null != version && !Pdb.CurrentVersion.Equals(version)) + { + throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(reader.BaseURI), "wixPdb", version.ToString(), Pdb.CurrentVersion.ToString())); + } + + // loop through the rest of the pdb building up the Output object + if (!empty) + { + bool done = false; + + // loop through all the fields in a row + while (!done && reader.Read()) + { + switch (reader.NodeType) + { + case XmlNodeType.Element: + switch (reader.LocalName) + { + case "wixOutput": + pdb.Output = Output.Read(reader, suppressVersionCheck); + break; + default: + throw new XmlException(); + } + break; + case XmlNodeType.EndElement: + done = true; + break; + } + } + + if (!done) + { + throw new XmlException(); + } + } + + return pdb; + } + + /// + /// Persists a pdb in an XML format. + /// + /// XmlWriter where the Pdb should persist itself as XML. + internal void Write(XmlWriter writer) + { + writer.WriteStartElement("wixPdb", XmlNamespaceUri); + + writer.WriteAttributeString("version", Pdb.CurrentVersion.ToString()); + + this.Output.Write(writer); + + writer.WriteEndElement(); + } + } +} -- cgit v1.2.3-55-g6feb