/// <summary> /// Instantiate a new Library. /// </summary> public Library() { this.localizations = new Hashtable(); this.sections = new SectionCollection(); }
/// <summary> /// Recursive helper function to resolve all references of passed in section. /// </summary> /// <param name="section">Section with references to resolve.</param> /// <param name="outputType">Parent output type that will get the resolved section collection.</param> /// <param name="allSymbols">All symbols that can be used to resolve section's references.</param> /// <param name="sections">Collection to add sections to during processing.</param> /// <param name="referencedSymbols">Collection populated during resolution of all symbols referenced during linking.</param> /// <param name="unresolvedReferences">Collection populated during resolution of all references that are left unresolved.</param> /// <param name="messageHandler">Message handler to report any duplicate symbols that may be tripped across.</param> /// <remarks>Note: recursive function.</remarks> private static void RecursivelyResolveReferences( Section section, OutputType outputType, SymbolCollection allSymbols, SectionCollection sections, StringCollection referencedSymbols, ArrayList unresolvedReferences, IMessageHandler messageHandler) { // if we already have this section bail if (sections.Contains(section)) { return; } // add the passed in section to the collection of sections sections.Add(section); // process all of the references contained in this section using the collection of // symbols provided. Then recursively call this method to process the // located symbol's section. All in all this is a very simple depth-first // search of the references per-section Table wixSimpleReferenceTable = section.Tables["WixSimpleReference"]; if (null != wixSimpleReferenceTable) { foreach (WixSimpleReferenceRow wixSimpleReferenceRow in wixSimpleReferenceTable.Rows) { // If we're building a Merge Module, ignore all references to the Media table // because Merge Modules don't have Media tables. if (OutputType.Module == outputType && "Media" == wixSimpleReferenceRow.TableName) { continue; } if ("WixAction" == wixSimpleReferenceRow.TableName) { Symbol[] symbols = allSymbols.GetSymbolsForSimpleReference(wixSimpleReferenceRow); if (0 == symbols.Length) { if (null != unresolvedReferences) { unresolvedReferences.Add(new SimpleReferenceSection(section, wixSimpleReferenceRow)); } } else { foreach (Symbol symbol in symbols) { if (null != symbol.Section) { // components are indexed in ResolveComplexReferences if (null != referencedSymbols && null != symbol.Row.TableDefinition.Name && "Component" != symbol.Row.TableDefinition.Name && !referencedSymbols.Contains(symbol.Name)) { referencedSymbols.Add(symbol.Name); } RecursivelyResolveReferences(symbol.Section, outputType, allSymbols, sections, referencedSymbols, unresolvedReferences, messageHandler); } } } } else { Symbol symbol = allSymbols.GetSymbolForSimpleReference(wixSimpleReferenceRow, messageHandler); if (null == symbol) { if (null != unresolvedReferences) { unresolvedReferences.Add(new SimpleReferenceSection(section, wixSimpleReferenceRow)); } } else { // components are indexed in ResolveComplexReferences if (null != referencedSymbols && null != symbol.Row.TableDefinition.Name && "Component" != symbol.Row.TableDefinition.Name && !referencedSymbols.Contains(symbol.Name)) { referencedSymbols.Add(symbol.Name); } RecursivelyResolveReferences(symbol.Section, outputType, allSymbols, sections, referencedSymbols, unresolvedReferences, messageHandler); } } } } }
/// <summary> /// Instantiate a new Intermediate. /// </summary> public Intermediate() { this.sections = new SectionCollection(); }