Update of /cvsroot/wix/wix/src/wix In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14145/src/wix Modified Files: Binder.cs Common.cs Compiler.cs CompilerCore.cs ComplexReference.cs Decompiler.cs DecompilerExtension.cs Library.cs Linker.cs RowCollection.cs WixExtension.cs wix.csproj wixdll.build Added Files: AssemblyDefaultWixExtensionAttribute.cs Removed Files: ExtensionMessages.cs IExtensionMessageHandler.cs LinkerExtension.cs Log Message: DerekC: Support a shorter syntax for specifying wix extensions on the command line. SBonev: Make PropertyRef extensible. DerekC: Update all internal WiX extensions to the latest "standards". DerekC: Lots of decompiler-related bug fixes: - warn when a table is decompiled as a custom table - Add decompiler support for the SecureObjects, ServiceConfig, ServiceControl, ServiceInstall, and XmlFile tables (and turn on the corresponding decompilation qtests) - Fix a canonicalization bug when extracting embedded cabinet files - Fix a dark and light bug related to showing the path to the temp working directory when binder or decompiler construction doesn't occur - Fix a problem with all extensions whereby each call to get a particular extension-type (like a CompilerExtension) would return a new instance of that extension instead of one - Move the User, UserGroup, and Group table definitions over to the sca extension where they belong (from the WiX core) - Setup the infrastructure for the ScaDecompiler extension - Rename the ScaExt project to ScaExtension to match other extensions - Fix an error message in the compilation of CustomTables - Remove unused code from the compilation of the ServiceInstall elements - Fix a bug in the linker related to handing of null values in the CustomTable support DerekC: Random decompiler and light fixes: - Fix decompilation of sequence tables when there are sequence number collisions - Read the dark option for suppressing relative action sequencing from the "sras" option instead of the "srs" option - Fix a decompilation bug with ensuring empty custom tables - Fix a binder bug with setting different compression levels on multiple cabinet files - Fix a binder bug with honoring the supress assemblies and suppress gathering file hash/version/language/size information options - Simplify the fix for the notidy option in light and dark - Implement decompilation for the ExecuteAction and InstallAdminPackage actions - Make the decompiler switch to absolute sequencing mode when it detect any action that will require absolute sequencing (this ensures that absolutely sequenced actions will always be in the proper locations in the final output). In real usage, this means that the AppSearch action will often trigger absolute sequencing mode - but its better to be safe then try to minimize authoring DerekC: Implement decompiler support for patch creation (pcp) files. DerekC: Embed the serverca binary wixlib file inside its extension (and add the necessary functionality to the WiX toolset to support completely self-contained extensions). DerekC: Stop nesting the Binary element inside the serverca schema and fix a recent regression with serverca error messages throwing an exception. DerekC: Add decompiler support for the remaining merge module tables ModuleAdvtUISequence, ModuleConfiguration, ModuleDependency, ModuleIgnoreTable, and ModuleSubstitution. Add compiler support for the ModuleIgnoreTable table. Fix a bug in the compiler for parsing of the ModuleDependency table. DerekC: Add support for hard-coding the Feature.Display column's value. Don't allow features to be simultaneously nested under a Product element and another element since a feature can only have one parent feature (or none). RGustin: Add MMC Snap-In registration extension. Move Compiler.GenerateIdentifier to CompilerCore.GenerateIdentifier to make it available to extensions. RobMen: Allow MsiAssembly table to be suppressed using -sma switch to light. BobArnso: Add back the ProgressText (ActionText) and Error loc strings; enabled their use by adding UIRef/@Id="WixUI_ErrorProgressText" to your source. ScotK: 4 ServerCA related fixes: - Fixing compiler support for rollback actions on SqlScript and SqlStrings. - Cleaning up usage of defines from Server CAs. - Adding support for RollbackOnReinstall support to compiler since CAs already supported it. - BREAKING CHANGE: Changed casing of ExecuteOnReInstall to ExecuteOnReinstall for SqlScript and SqlString. RobMen: Generate caerr.wxi Index: CompilerCore.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/CompilerCore.cs,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** CompilerCore.cs 7 Dec 2005 07:29:25 -0000 1.13 --- CompilerCore.cs 26 Dec 2005 12:06:07 -0000 1.14 *************** *** 24,27 **** --- 24,29 ---- using System.Diagnostics; using System.Globalization; + using System.Security.Cryptography; + using System.Text; using System.Text.RegularExpressions; using System.Xml; *************** *** 226,229 **** --- 228,269 ---- /// <summary> + /// Generate an identifier by hashing data from the row. + /// </summary> + /// <param name="elementLocalName">Local name of the element.</param> + /// <param name="args">Information to hash.</param> + /// <returns>The generated identifier.</returns> + public static string GenerateIdentifier(string elementLocalName, params string[] args) + { + // hash the data + MD5 md5 = new MD5CryptoServiceProvider(); + string stringData = String.Concat(args); + byte[] data = Encoding.Unicode.GetBytes(stringData); + byte[] hash = md5.ComputeHash(data); + + // select a prefix based on the element localname + string prefix = null; + switch (elementLocalName) + { + case "Registry": + prefix = "reg"; + break; + default: + Debug.Assert(true, "Invalid element localname passed into GenerateIdentifier."); + break; + } + Debug.Assert(3 >= prefix.Length, "Prefix for generated identifiers must be 3 characters long or less."); + + // build up the identifier + StringBuilder identifier = new StringBuilder(35, 35); + identifier.Append(prefix); + for (int i = 0; i < hash.Length; i++) + { + identifier.Append(hash[i].ToString("X2", CultureInfo.InvariantCulture.NumberFormat)); + } + + return identifier.ToString(); + } + + /// <summary> /// Adds a valid reference to the active section. /// </summary> Index: wix.csproj =================================================================== RCS file: /cvsroot/wix/wix/src/wix/wix.csproj,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** wix.csproj 8 Dec 2005 01:02:35 -0000 1.11 --- wix.csproj 26 Dec 2005 12:06:07 -0000 1.12 *************** *** 87,90 **** --- 87,91 ---- <SubType>Code</SubType> </Compile> + <Compile Include="AssemblyDefaultWixExtensionAttribute.cs" /> <Compile Include="AssemblyInfo.cs"> <SubType>Code</SubType> *************** *** 359,364 **** <EmbeddedResource Include="Xsd\actions.xsd" /> <EmbeddedResource Include="Xsd\libraries.xsd" /> ! <EmbeddedResource Include="Xsd\objects.xsd" /> ! <EmbeddedResource Include="Xsd\outputs.xsd" /> <EmbeddedResource Include="Xsd\tables.xsd"> <CustomToolNamespace>Microsoft.</CustomToolNamespace> --- 360,369 ---- <EmbeddedResource Include="Xsd\actions.xsd" /> <EmbeddedResource Include="Xsd\libraries.xsd" /> ! <EmbeddedResource Include="Xsd\objects.xsd"> ! <SubType>Designer</SubType> ! </EmbeddedResource> ! <EmbeddedResource Include="Xsd\outputs.xsd"> ! <SubType>Designer</SubType> ! </EmbeddedResource> <EmbeddedResource Include="Xsd\tables.xsd"> <CustomToolNamespace>Microsoft.</CustomToolNamespace> Index: Common.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/Common.cs,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** Common.cs 5 Dec 2005 22:52:44 -0000 1.17 --- Common.cs 26 Dec 2005 12:06:06 -0000 1.18 *************** *** 200,204 **** } ! return tableDefinitions; } --- 200,204 ---- } ! return tableDefinitions.Clone(); } Index: DecompilerExtension.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/DecompilerExtension.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** DecompilerExtension.cs 8 Dec 2005 01:02:35 -0000 1.4 --- DecompilerExtension.cs 26 Dec 2005 12:06:07 -0000 1.5 *************** *** 54,63 **** public virtual void DecompileTable(Table table) { ! //this.Core.OnMessage(WixErrors.UnhandledTable(table.Name)); } /// <summary> ! /// Called at the end of the decompilation of a database. /// </summary> public virtual void FinalizeDecompile(TableCollection tables) { --- 54,64 ---- public virtual void DecompileTable(Table table) { ! this.Core.OnMessage(WixErrors.TableDecompilationUnimplemented(this.Core.SourceLineNumbers, table.Name)); } /// <summary> ! /// Finalize decompilation. /// </summary> + /// <param name="tables">The collection of all tables.</param> public virtual void FinalizeDecompile(TableCollection tables) { Index: ComplexReference.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/ComplexReference.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ComplexReference.cs 7 Nov 2005 22:47:34 -0000 1.5 --- ComplexReference.cs 26 Dec 2005 12:06:07 -0000 1.6 *************** *** 38,42 **** /// <summary>Module parent of complex reference.</summary> ! Module } --- 38,45 ---- /// <summary>Module parent of complex reference.</summary> ! Module, ! ! /// <summary>Product parent of complex reference.</summary> ! Product } *************** *** 234,237 **** --- 237,243 ---- parentType = ComplexReferenceParentType.Module; break; + case "product": + parentType = ComplexReferenceParentType.Product; + break; default: throw new WixException(WixErrors.IllegalAttributeValue(SourceLineNumberCollection.FromUri(reader.BaseURI), "complexReference", reader.Name, reader.Value, "componentGroup", "feature", "module")); *************** *** 297,300 **** --- 303,309 ---- writer.WriteAttributeString("parentType", "module"); break; + case ComplexReferenceParentType.Product: + writer.WriteAttributeString("parentType", "product"); + break; case ComplexReferenceParentType.Unknown: writer.WriteAttributeString("parentType", "unknown"); Index: Decompiler.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/Decompiler.cs,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** Decompiler.cs 8 Dec 2005 01:02:34 -0000 1.28 --- Decompiler.cs 26 Dec 2005 12:06:07 -0000 1.29 *************** *** 35,38 **** --- 35,40 ---- public class Decompiler { + private static readonly Regex NullSplitter = new Regex(@"\[~]"); + private int codepage; private DecompilerCore core; *************** *** 44,47 **** --- 46,50 ---- [...4582 lines suppressed...] + permission.Write = Wix.YesNoType.yes; + break; + case "WriteAttributes": + permission.WriteAttributes = Wix.YesNoType.yes; + break; + case "WriteExtendedAttributes": + permission.WriteExtendedAttributes = Wix.YesNoType.yes; + break; + default: + Debug.Fail(String.Format("Unknown permission '{0}'.", name)); + break; + } + } + } + } + } + + /// <summary> /// Set the primary feature for a component. /// </summary> Index: wixdll.build =================================================================== RCS file: /cvsroot/wix/wix/src/wix/wixdll.build,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** wixdll.build 8 Dec 2005 01:02:35 -0000 1.3 --- wixdll.build 26 Dec 2005 12:06:07 -0000 1.4 *************** *** 128,131 **** --- 128,132 ---- <include name="ActionRow.cs" /> <include name="ActionRowCollection.cs" /> + <include name="AssemblyDefaultWixExtensionAttribute.cs" /> <include name="AssemblyInfo.cs" /> <include name="BBControlRow.cs" /> Index: WixExtension.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/WixExtension.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** WixExtension.cs 8 Dec 2005 01:02:35 -0000 1.1 --- WixExtension.cs 26 Dec 2005 12:06:07 -0000 1.2 *************** *** 81,89 **** public static WixExtension Load(string extension) { ! Type extensionType = Type.GetType(extension); ! if (null == extensionType) { ! throw new WixException(WixErrors.InvalidExtension(extension)); } --- 81,109 ---- public static WixExtension Load(string extension) { ! Type extensionType; ! if (2 == extension.Split(',').Length) { ! extensionType = Type.GetType(extension); ! ! if (null == extensionType) ! { ! throw new WixException(WixErrors.InvalidExtension(extension)); ! } ! } ! else ! { ! try ! { ! Assembly extensionAssembly = Assembly.Load(extension); ! ! AssemblyDefaultWixExtensionAttribute extensionAttribute = (AssemblyDefaultWixExtensionAttribute)Attribute.GetCustomAttribute(extensionAssembly, typeof(AssemblyDefaultWixExtensionAttribute)); ! ! extensionType = extensionAttribute.ExtensionType; ! } ! catch ! { ! throw new WixException(WixErrors.InvalidExtension(extension)); ! } } *************** *** 99,102 **** --- 119,151 ---- /// <summary> + /// Gets the library associated with this extension. + /// </summary> + /// <param name="tableDefinitions">The table definitions to use while loading the library.</param> + public virtual Library GetLibrary(TableDefinitionCollection tableDefinitions) + { + return null; + } + + /// <summary> + /// Help for loading a library from an embedded resource. + /// </summary> + /// <param name="assembly">The assembly containing the embedded resource.</param> + /// <param name="resourceName">The name of the embedded resource being requested.</param> + /// <param name="tableDefinitions">The table definitions to use while loading the library.</param> + /// <returns>The loaded library.</returns> + protected static Library LoadLibraryHelper(Assembly assembly, string resourceName, TableDefinitionCollection tableDefinitions) + { + using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName)) + { + UriBuilder uriBuilder = new UriBuilder(); + uriBuilder.Scheme = "embeddedresource"; + uriBuilder.Path = assembly.Location; + uriBuilder.Fragment = resourceName; + + return Library.Load(resourceStream, uriBuilder.Uri, tableDefinitions, false, true); + } + } + + /// <summary> /// Helper for loading table definitions from an embedded resource. /// </summary> Index: Library.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/Library.cs,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Library.cs 8 Dec 2005 01:02:35 -0000 1.8 --- Library.cs 26 Dec 2005 12:06:07 -0000 1.9 *************** *** 67,129 **** public static Library Load(string path, TableDefinitionCollection tableDefinitions, bool suppressVersionCheck, bool suppressSchema) { - XmlReader reader = null; - using (FileStream stream = File.OpenRead(path)) { ! // look for the Microsoft cabinet file header and skip past the cabinet data if found ! if ('M' == stream.ReadByte() && 'S' == stream.ReadByte() && 'C' == stream.ReadByte() && 'F' == stream.ReadByte()) ! { ! long offset = 0; ! byte[] offsetBuffer = new byte[4]; ! ! // skip the header checksum ! stream.Seek(4, SeekOrigin.Current); ! // read the cabinet file size ! stream.Read(offsetBuffer, 0, 4); ! offset = BitConverter.ToInt32(offsetBuffer, 0); ! // seek past the cabinet file to the xml ! stream.Seek(offset, SeekOrigin.Begin); ! } ! else // plain xml file - start reading xml at the beginning of the stream ! { ! stream.Seek(0, SeekOrigin.Begin); ! } ! // read the xml ! try ! { ! reader = new XmlTextReader(new Uri(Path.GetFullPath(path)).AbsoluteUri, stream); ! if (!suppressSchema) ! { ! reader = new XmlValidatingReader(reader); ! ((XmlValidatingReader)reader).Schemas.Add(GetSchemas()); ! } ! reader.MoveToContent(); ! if ("wixLibrary" != reader.LocalName) ! { ! throw new WixNotLibraryException(WixErrors.InvalidDocumentElement(SourceLineNumberCollection.FromUri(reader.BaseURI), reader.Name, "library", "wixLibrary")); ! } ! return Parse(reader, tableDefinitions, suppressVersionCheck); ! } ! catch (XmlException xe) { ! throw new WixException(WixErrors.InvalidXml(SourceLineNumberCollection.FromUri(reader.BaseURI), "object", xe.Message)); } ! catch (XmlSchemaException xse) { ! throw new WixException(WixErrors.SchemaValidationFailed(SourceLineNumberCollection.FromUri(reader.BaseURI), xse.Message)); } ! finally { ! if (null != reader) ! { ! reader.Close(); ! } } } --- 67,144 ---- public static Library Load(string path, TableDefinitionCollection tableDefinitions, bool suppressVersionCheck, bool suppressSchema) { using (FileStream stream = File.OpenRead(path)) { ! return Load(stream, new Uri(Path.GetFullPath(path)), tableDefinitions, suppressVersionCheck, suppressSchema); ! } ! } ! /// <summary> ! /// Loads a library from a path on disk. ! /// </summary> ! /// <param name="stream">Stream containing the library file.</param> ! /// <param name="uri">Uri for finding this stream.</param> ! /// <param name="tableDefinitions">Collection containing TableDefinitions to use when reconstituting the intermediates.</param> ! /// <param name="suppressVersionCheck">Suppresses wix.dll version mismatch check.</param> ! /// <param name="suppressSchema">Suppress xml schema validation while loading.</param> ! /// <returns>Returns the loaded library.</returns> ! /// <remarks>This method will set the Path and SourcePath properties to the appropriate values on successful load.</remarks> ! internal static Library Load(Stream stream, Uri uri, TableDefinitionCollection tableDefinitions, bool suppressVersionCheck, bool suppressSchema) ! { ! XmlReader reader = null; ! // look for the Microsoft cabinet file header and skip past the cabinet data if found ! if ('M' == stream.ReadByte() && 'S' == stream.ReadByte() && 'C' == stream.ReadByte() && 'F' == stream.ReadByte()) ! { ! long offset = 0; ! byte[] offsetBuffer = new byte[4]; ! // skip the header checksum ! stream.Seek(4, SeekOrigin.Current); ! // read the cabinet file size ! stream.Read(offsetBuffer, 0, 4); ! offset = BitConverter.ToInt32(offsetBuffer, 0); ! // seek past the cabinet file to the xml ! stream.Seek(offset, SeekOrigin.Begin); ! } ! else // plain xml file - start reading xml at the beginning of the stream ! { ! stream.Seek(0, SeekOrigin.Begin); ! } ! // read the xml ! try ! { ! reader = new XmlTextReader(uri.AbsoluteUri, stream); ! if (!suppressSchema) { ! reader = new XmlValidatingReader(reader); ! ((XmlValidatingReader)reader).Schemas.Add(GetSchemas()); } ! ! reader.MoveToContent(); ! ! if ("wixLibrary" != reader.LocalName) { ! throw new WixNotLibraryException(WixErrors.InvalidDocumentElement(SourceLineNumberCollection.FromUri(reader.BaseURI), reader.Name, "library", "wixLibrary")); } ! ! return Parse(reader, tableDefinitions, suppressVersionCheck); ! } ! catch (XmlException xe) ! { ! throw new WixException(WixErrors.InvalidXml(SourceLineNumberCollection.FromUri(reader.BaseURI), "object", xe.Message)); ! } ! catch (XmlSchemaException xse) ! { ! throw new WixException(WixErrors.SchemaValidationFailed(SourceLineNumberCollection.FromUri(reader.BaseURI), xse.Message)); ! } ! finally ! { ! if (null != reader) { ! reader.Close(); } } Index: RowCollection.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/RowCollection.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** RowCollection.cs 7 Nov 2005 22:47:34 -0000 1.2 --- RowCollection.cs 26 Dec 2005 12:06:07 -0000 1.3 *************** *** 101,104 **** --- 101,117 ---- /// <summary> + /// Clone the RowCollection. + /// </summary> + /// <returns>The cloned RowCollection.</returns> + public RowCollection Clone() + { + RowCollection rowCollection = new RowCollection(); + + rowCollection.collection.AddRange(this.collection); + + return rowCollection; + } + + /// <summary> /// Copies the collection into an array. /// </summary> Index: Linker.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/Linker.cs,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** Linker.cs 8 Dec 2005 01:02:35 -0000 1.24 --- Linker.cs 26 Dec 2005 12:06:07 -0000 1.25 *************** *** 40,47 **** --- 40,49 ---- private bool allowIdenticalRows; private bool allowUnresolvedReferences; + private ArrayList extensions; private bool sectionIdOnTuples; private bool suppressAdminSequence; private bool suppressAdvertiseSequence; private bool suppressDroppingUnrealTables; + private bool suppressMsiAssemblyTable; private bool suppressUISequence; private Localizer localizer; *************** *** 58,61 **** --- 60,65 ---- this.standardActions = Common.GetStandardActions(); this.tableDefinitions = Common.GetTableDefinitions(); + + this.extensions = new ArrayList(); } *************** *** 157,160 **** --- 161,173 ---- /// <summary> + /// Sets the option to suppress the MsiAssembly table. + /// </summary> + /// <value>The option to supress processing the MsiAssembly table.</value> + public bool SuppressMsiAssemblyTable + { + set { this.suppressMsiAssemblyTable = value; } + } + + /// <summary> /// Sets the option to suppress UI sequence actions. /// </summary> *************** *** 194,197 **** --- 207,214 ---- } } + + // keep track of extensions so the libraries can be loaded later once all the table definitions + // are loaded; this will allow extensions to have cross table definition dependencies + this.extensions.Add(extension); } } *************** *** 235,238 **** --- 252,266 ---- RowCollection customRows = new RowCollection(); + // add in the extension sections + foreach (WixExtension extension in this.extensions) + { + Library library = extension.GetLibrary(this.tableDefinitions); + + if (null != library) + { + sections.AddRange(library.Sections); + } + } + // first find the entry section and create the symbols hash for all the sections Common.FindEntrySectionAndLoadSymbols(sections, this.allowIdenticalRows, this, out entrySection, out allSymbols); *************** *** 598,602 **** // if we have an assembly, insert the MsiAssembly row and assembly actions ! if (FileAssemblyType.NotAnAssembly != row.AssemblyType) { string feature; --- 626,630 ---- // if we have an assembly, insert the MsiAssembly row and assembly actions ! if (!this.suppressMsiAssemblyTable && FileAssemblyType.NotAnAssembly != row.AssemblyType) { string feature; *************** *** 901,911 **** if (customRow.Fields[j].Column.Name == item[0]) { ! if (ColumnType.Number == customRow.Fields[j].Column.Type) ! { ! customRow.Fields[j].Data = Convert.ToInt32(item[1], CultureInfo.InvariantCulture); ! } ! else { ! customRow.Fields[j].Data = item[1]; } foundColumn = true; --- 929,942 ---- if (customRow.Fields[j].Column.Name == item[0]) { ! if (0 < item[1].Length) { ! if (ColumnType.Number == customRow.Fields[j].Column.Type) ! { ! customRow.Fields[j].Data = Convert.ToInt32(item[1], CultureInfo.InvariantCulture); ! } ! else ! { ! customRow.Fields[j].Data = item[1]; ! } } foundColumn = true; *************** *** 1086,1249 **** { case ComplexReferenceParentType.ComponentGroup: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! componentsToComponentGroupsComplexReferences.Add(cref); ! break; ! default: ! throw new InvalidOperationException("Unexpected complex reference child type."); ! } break; case ComplexReferenceParentType.Feature: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! connection = componentsToFeatures[cref.ChildId]; ! if (null == connection) ! { ! componentsToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentId, connection.PrimaryFeature)); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); // move the guessed primary feature to the list of connects ! connection.PrimaryFeature = cref.ParentId; // set the new primary feature ! connection.IsExplicitPrimaryFeature = true; // and make sure we remember that we set it so we can fail if we try to set it again ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! // add a row to the FeatureComponents table ! Table featureComponentsTable = output.EnsureTable(this.tableDefinitions["FeatureComponents"]); ! Row row = featureComponentsTable.CreateRow(null); ! if (this.sectionIdOnTuples) ! { ! row.SectionId = section.Id; ! } ! row[0] = cref.ParentId; ! row[1] = cref.ChildId; ! // index the component for finding orphaned records ! string symbolName = String.Concat("Component:", cref.ChildId); ! if (!referencedSymbols.Contains(symbolName)) ! { ! referencedSymbols.Add(symbolName); ! } ! break; ! case ComplexReferenceChildType.ComponentGroup: ! connection = componentGroupsToFeatures[cref.ChildId]; ! if (null == connection) ! { ! componentGroupsToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentId, connection.PrimaryFeature)); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); ! connection.PrimaryFeature = cref.ParentId; ! connection.IsExplicitPrimaryFeature = true; ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! break; ! case ComplexReferenceChildType.Feature: ! connection = featuresToFeatures[cref.ChildId]; ! if (null != connection) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentId, connection.PrimaryFeature)); ! continue; ! } ! featuresToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! break; ! case ComplexReferenceChildType.Module: ! connection = output.ModulesToFeatures[cref.ChildId]; ! if (null == connection) ! { ! output.ModulesToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentId, connection.PrimaryFeature)); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); // move the guessed primary feature to the list of connects ! connection.PrimaryFeature = cref.ParentId; // set the new primary feature ! connection.IsExplicitPrimaryFeature = true; // and make sure we remember that we set it so we can fail if we try to set it again ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! break; ! default: ! throw new InvalidOperationException("Unexpected complex reference child type"); ! } break; case ComplexReferenceParentType.Module: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! if (componentsToModules.ContainsKey(cref.ChildId)) ! { ! this.OnMessage(WixErrors.ComponentReferencedTwice(section.SourceLineNumbers, cref.ChildId)); ! continue; ! } ! else ! { ! componentsToModules.Add(cref.ChildId, cref); // should always be new ! // add a row to the ModuleComponents table ! Table moduleComponentsTable = output.EnsureTable(this.tableDefinitions["ModuleComponents"]); ! Row row = moduleComponentsTable.CreateRow(null); ! if (this.sectionIdOnTuples) { ! row.SectionId = section.Id; } - row[0] = cref.ChildId; - row[1] = cref.ParentId; - row[2] = cref.ParentLanguage; - } ! // index the component for finding orphaned records ! string componentSymbolName = String.Concat("Component:", cref.ChildId); ! if (!referencedSymbols.Contains(componentSymbolName)) ! { ! referencedSymbols.Add(componentSymbolName); ! } ! break; ! case ComplexReferenceChildType.ComponentGroup: ! ConnectToModule moduleConnection = componentGroupsToModules[cref.ChildId]; ! if (null == moduleConnection) ! { ! componentGroupsToModules.Add(new ConnectToModule(cref.ChildId, cref.ParentId, cref.ParentLanguage)); ! } ! break; ! default: ! throw new InvalidOperationException("Unexpected complex reference child type"); ! } break; } } --- 1117,1302 ---- { case ComplexReferenceParentType.ComponentGroup: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! componentsToComponentGroupsComplexReferences.Add(cref); ! break; ! default: ! throw new InvalidOperationException(String.Format("Unexpected complex reference child type: {0}", Enum.GetName(typeof(ComplexReferenceChildType), cref.ChildType))); ! } break; + case ComplexReferenceParentType.Feature: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! connection = componentsToFeatures[cref.ChildId]; ! if (null == connection) ! { ! componentsToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, (null != connection.PrimaryFeature ? "Feature" : "Product"), (null != connection.PrimaryFeature ? connection.PrimaryFeature : this.activeOutput.EntrySection.Id))); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); // move the guessed primary feature to the list of connects ! connection.PrimaryFeature = cref.ParentId; // set the new primary feature ! connection.IsExplicitPrimaryFeature = true; // and make sure we remember that we set it so we can fail if we try to set it again ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! // add a row to the FeatureComponents table ! Table featureComponentsTable = output.EnsureTable(this.tableDefinitions["FeatureComponents"]); ! Row row = featureComponentsTable.CreateRow(null); ! if (this.sectionIdOnTuples) ! { ! row.SectionId = section.Id; ! } ! row[0] = cref.ParentId; ! row[1] = cref.ChildId; ! // index the component for finding orphaned records ! string symbolName = String.Concat("Component:", cref.ChildId); ! if (!referencedSymbols.Contains(symbolName)) ! { ! referencedSymbols.Add(symbolName); ! } ! break; ! case ComplexReferenceChildType.ComponentGroup: ! connection = componentGroupsToFeatures[cref.ChildId]; ! if (null == connection) ! { ! componentGroupsToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, (null != connection.PrimaryFeature ? "Feature" : "Product"), (null != connection.PrimaryFeature ? connection.PrimaryFeature : this.activeOutput.EntrySection.Id))); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); ! connection.PrimaryFeature = cref.ParentId; ! connection.IsExplicitPrimaryFeature = true; ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! break; ! case ComplexReferenceChildType.Feature: ! connection = featuresToFeatures[cref.ChildId]; ! if (null != connection) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, (null != connection.PrimaryFeature ? "Feature" : "Product"), (null != connection.PrimaryFeature ? connection.PrimaryFeature : this.activeOutput.EntrySection.Id))); ! continue; ! } ! featuresToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! break; ! case ComplexReferenceChildType.Module: ! connection = output.ModulesToFeatures[cref.ChildId]; ! if (null == connection) ! { ! output.ModulesToFeatures.Add(new ConnectToFeature(section, cref.ChildId, cref.ParentId, cref.IsPrimary)); ! } ! else if (cref.IsPrimary && connection.IsExplicitPrimaryFeature) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, (null != connection.PrimaryFeature ? "Feature" : "Product"), (null != connection.PrimaryFeature ? connection.PrimaryFeature : this.activeOutput.EntrySection.Id))); ! continue; ! } ! else if (cref.IsPrimary) ! { ! connection.ConnectFeatures.Add(connection.PrimaryFeature); // move the guessed primary feature to the list of connects ! connection.PrimaryFeature = cref.ParentId; // set the new primary feature ! connection.IsExplicitPrimaryFeature = true; // and make sure we remember that we set it so we can fail if we try to set it again ! } ! else ! { ! connection.ConnectFeatures.Add(cref.ParentId); ! } ! break; ! default: ! throw new InvalidOperationException(String.Format("Unexpected complex reference child type: {0}", Enum.GetName(typeof(ComplexReferenceChildType), cref.ChildType))); ! } break; case ComplexReferenceParentType.Module: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Component: ! if (componentsToModules.ContainsKey(cref.ChildId)) ! { ! this.OnMessage(WixErrors.ComponentReferencedTwice(section.SourceLineNumbers, cref.ChildId)); ! continue; ! } ! else ! { ! componentsToModules.Add(cref.ChildId, cref); // should always be new ! // add a row to the ModuleComponents table ! Table moduleComponentsTable = output.EnsureTable(this.tableDefinitions["ModuleComponents"]); ! Row row = moduleComponentsTable.CreateRow(null); ! if (this.sectionIdOnTuples) ! { ! row.SectionId = section.Id; ! } ! row[0] = cref.ChildId; ! row[1] = cref.ParentId; ! row[2] = cref.ParentLanguage; ! } ! ! // index the component for finding orphaned records ! string componentSymbolName = String.Concat("Component:", cref.ChildId); ! if (!referencedSymbols.Contains(componentSymbolName)) { ! referencedSymbols.Add(componentSymbolName); } ! break; ! case ComplexReferenceChildType.ComponentGroup: ! ConnectToModule moduleConnection = componentGroupsToModules[cref.ChildId]; ! if (null == moduleConnection) ! { ! componentGroupsToModules.Add(new ConnectToModule(cref.ChildId, cref.ParentId, cref.ParentLanguage)); ! } ! break; ! default: ! throw new InvalidOperationException(String.Format("Unexpected complex reference child type: {0}", Enum.GetName(typeof(ComplexReferenceChildType), cref.ChildType))); ! } ! break; ! case ComplexReferenceParentType.Product: ! switch (cref.ChildType) ! { ! case ComplexReferenceChildType.Feature: ! connection = featuresToFeatures[cref.ChildId]; ! if (null != connection) ! { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, (null != connection.PrimaryFeature ? "Feature" : "Product"), (null != connection.PrimaryFeature ? connection.PrimaryFeature : this.activeOutput.EntrySection.Id))); ! continue; ! } ! ! featuresToFeatures.Add(new ConnectToFeature(section, cref.ChildId, null, cref.IsPrimary)); ! break; ! default: ! throw new InvalidOperationException(String.Format("Unexpected complex reference child type: {0}", Enum.GetName(typeof(ComplexReferenceChildType), cref.ChildType))); ! } break; + + default: + throw new InvalidOperationException(String.Format("Unexpected complex reference parent type: {0}", Enum.GetName(typeof(ComplexReferenceParentType), cref.ParentType))); } } *************** *** 1412,1416 **** else if (isExplicitPrimaryFeature && connectComponentToFeature.IsExplicitPrimaryFeature && feature != connectComponentToFeature.PrimaryFeature) { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(connectComponentToFeature.Section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentId, feature)); continue; } --- 1465,1469 ---- else if (isExplicitPrimaryFeature && connectComponentToFeature.IsExplicitPrimaryFeature && feature != connectComponentToFeature.PrimaryFeature) { ! this.OnMessage(WixErrors.MultiplePrimaryReferences(connectComponentToFeature.Section.SourceLineNumbers, cref.ChildType.ToString(), cref.ChildId, cref.ParentType.ToString(), cref.ParentId, "Feature", feature)); continue; } --- NEW FILE: AssemblyDefaultWixExtensionAttribute.cs --- //------------------------------------------------------------------------------------------------- // <copyright file="AssemblyDefaultWixExtensionAttribute.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // // The use and distribution terms for this software are covered by the // Common Public License 1.0 (http://opensource.org/licenses/cpl.php) // which can be found in the file CPL.TXT at the root of this distribution. // By using this software in any fashion, you are agreeing to be bound by // the terms of this license. // // You must not remove this notice, or any other, from this software. // </copyright> // // <summary> // Represents a custom attribute for declaring the type to use // as the default WiX extension in an assembly. // </summary> //------------------------------------------------------------------------------------------------- namespace Microsoft.Tools.WindowsInstallerXml { using System; /// <summary> /// Represents a custom attribute for declaring the type to use /// as the default WiX extension in an assembly. /// </summary> public class AssemblyDefaultWixExtensionAttribute : Attribute { private readonly Type extensionType; /// <summary> /// Instantiate a new AssemblyDefaultWixExtensionAttribute. /// </summary> /// <param name="extensionType">The type of the default WiX extension in an assembly.</param> public AssemblyDefaultWixExtensionAttribute(Type extensionType) { this.extensionType = extensionType; } /// <summary> /// Gets the type of the default WiX extension in an assembly. /// </summary> /// <value>The type of the default WiX extension in an assembly.</value> public Type ExtensionType { get { return this.extensionType; } } } } --- IExtensionMessageHandler.cs DELETED --- --- ExtensionMessages.cs DELETED --- --- LinkerExtension.cs DELETED --- Index: Compiler.cs =================================================================== RCS file: /cvsroot/wix/wix/src/wix/Compiler.cs,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** Compiler.cs 8 Dec 2005 01:02:34 -0000 1.37 --- Compiler.cs 26 Dec 2005 12:06:06 -0000 1.38 *************** *** 27,31 **** using System.Globalization; using System.Reflection; - using System.Security.Cryptography; using System.Xml; using System.Xml.Schema; --- 27,30 ---- *************** *** 245,286 **** /// <summary> - /// Generate an identifier by hashing data from the row. - /// </summary> - /// <param name="elementLocalName">Local name of the element.</param> - /// <param name="args">Information to hash.</param> - /// <returns>The generated identifier.</returns> - private static string GenerateIdentifier(string elementLocalName, params string[] args) - { - // hash the data - MD5 md5 = new MD5CryptoServiceProvider(); - string stringData = String.Concat(args); - byte[] data = Encoding.Unicode.GetBytes(stringData); - byte[] hash = md5.ComputeHash(data); - - // select a prefix based on the element localname - string prefix = null; - switch (elementLocalName) - { - case "Registry": - prefix = "reg"; - break; - default: - Debug.Assert(true, "Invalid element localname passed into GenerateIdentifier."); - break; - } - Debug.Assert(3 >= prefix.Length, "Prefix for generated identifiers must be 3 characters long or less."); - - // build up the identifier - StringBuilder identifier = new StringBuilder(35, 35); - identifier.Append(prefix); - for (int i = 0; i < hash.Length; i++) - { - identifier.Append(hash[i].ToString("X2", CultureInfo.InvariantCulture.NumberFormat)); - } - - return identifier.ToString(); - } - - /// <summary> /// Uppercases the first character of a string. /// </summary> --- 244,247 ---- *************** *** 381,385 **** if (null == id) { ! id = GenerateIdentifier("Registry", componentId, root.ToString(CultureInfo.InvariantCulture.NumberFormat), key, name); } --- 342,346 ---- if (null == id) { ! id = CompilerCore.GenerateIdentifier("Registry", componentId, root.ToString(CultureInfo.InvariantCulture.NumberFormat), key, name); } *************** *** 3237,3241 **** if (2 != width && 4 != width) { ! this.core.OnMessage(WixErrors.CustomTableIllegalColumnWidth(sourceLineNumbers, node.Name, "Width", width)); } columnType = String.Concat(nullable ? "I" : "i", width); --- 3198,3202 ---- if (2 != width && 4 != width) { ! this.core.OnMessage(WixErrors.CustomTableIllegalColumnWidth(sourceLineNumbers, child.Name, "Width", width)); } columnType = String.Concat(nullable ? "I" : "i", width); *************** *** 3833,3840 **** /// </summary> /// <param name="node">Element to parse.</param> /// <param name="parentId">Optional identifer for parent feature.</param> /// <param name="lastDisplay">Di... [truncated message content] |