/// <summary> /// Removes rows from the Registry table that are generated by this extension. /// </summary> /// <param name="tables">The collection of tables.</param> private void FinalizeRegistryTable(TableIndexedCollection tables) { Table registryTable = tables["Registry"]; if (null != registryTable) { foreach (Row registryRow in registryTable.Rows) { // Check if the compiler writes this registry value; if so, it should be removed. if (this.registryValues.Contains(registryRow)) { Wix.ISchemaElement elem = this.Core.GetIndexedElement(registryRow); // If the registry row was found, remove it from its parent. if (null != elem && null != elem.ParentElement) { Wix.IParentElement elemParent = elem.ParentElement as Wix.IParentElement; if (null != elemParent) { elemParent.RemoveChild(elem); } } } } } }
/// <summary> /// Finalize decompilation by removing registry values that the compiler writes. /// </summary> /// <param name="tables">The collection of all tables.</param> public override void Finish(TableIndexedCollection tables) { // Remove generated registry rows. this.FinalizeRegistryTable(tables); // Remove extension properties. this.FinalizeProperties(); }
/// <summary> /// Called at the beginning of the decompilation of a database. /// </summary> /// <param name="tables">The collection of all tables.</param> public override void Initialize(TableIndexedCollection tables) { Table propertyTable = tables["Property"]; if (null != propertyTable) { foreach (Row row in propertyTable.Rows) { if ("SecureCustomProperties" == row[0].ToString()) { // if we've referenced any of the DirectX properties, add // a PropertyRef to pick up the CA from the extension and then remove // it from the SecureCustomExtensions property so we don't get duplicates StringBuilder remainingProperties = new StringBuilder(); string[] secureCustomProperties = row[1].ToString().Split(';'); foreach (string property in secureCustomProperties) { if (property.StartsWith("WIX_DIRECTX_")) { Wix.PropertyRef propertyRef = new Wix.PropertyRef(); propertyRef.Id = property; this.Core.RootElement.AddChild(propertyRef); } else { if (0 < remainingProperties.Length) { remainingProperties.Append(";"); } remainingProperties.Append(property); } } row[1] = remainingProperties.ToString(); break; } } } }
/// <summary> /// Called at the beginning of the decompilation of a database. /// </summary> /// <param name="tables">The collection of all tables.</param> public override void Initialize(TableIndexedCollection tables) { Table propertyTable = tables["Property"]; if (null != propertyTable) { foreach (Row row in propertyTable.Rows) { if ("WixUI_Mode" == (string)row[0]) { Wix.UIRef uiRef = new Wix.UIRef(); uiRef.Id = String.Concat("WixUI_", (string)row[1]); this.Core.RootElement.AddChild(uiRef); this.removeLibraryRows = true; break; } } } }
/// <summary> /// Finalize decompilation. /// </summary> /// <param name="tables">The collection of all tables.</param> public virtual void Finish(TableIndexedCollection tables) { }
/// <summary> /// Called at the beginning of the decompilation of a database. /// </summary> /// <param name="tables">The collection of all tables.</param> public virtual void Initialize(TableIndexedCollection tables) { }
/// <summary> /// Finalize decompilation. /// </summary> /// <param name="tables">The collection of all tables.</param> public override void Finish(TableIndexedCollection tables) { this.FinalizeSqlFileSpecTable(tables); this.FinalizeSqlScriptAndSqlStringTables(tables); }
/// <summary> /// Finalize the SqlScript table. /// </summary> /// <param name="tables">The collection of all tables.</param> /// <remarks> /// The SqlScript and SqlString tables contain a foreign key into the SqlDatabase /// and Component tables. Depending upon the parent of the SqlDatabase /// element, the SqlScript and SqlString elements are nested under either the /// SqlDatabase or the Component element. /// </remarks> private void FinalizeSqlScriptAndSqlStringTables(TableIndexedCollection tables) { Table sqlDatabaseTable = tables["SqlDatabase"]; Table sqlScriptTable = tables["SqlScript"]; Table sqlStringTable = tables["SqlString"]; Hashtable sqlDatabaseRows = new Hashtable(); // index each SqlDatabase row by its primary key if (null != sqlDatabaseTable) { foreach (Row row in sqlDatabaseTable.Rows) { sqlDatabaseRows.Add(row[0], row); } } if (null != sqlScriptTable) { foreach (Row row in sqlScriptTable.Rows) { Sql.SqlScript sqlScript = (Sql.SqlScript) this.Core.GetIndexedElement(row); Row sqlDatabaseRow = (Row)sqlDatabaseRows[row[1]]; string databaseComponent = (string)sqlDatabaseRow[4]; // determine if the SqlScript element should be nested under the database or another component if (null != databaseComponent && databaseComponent == (string)row[2]) { Sql.SqlDatabase sqlDatabase = (Sql.SqlDatabase) this.Core.GetIndexedElement(sqlDatabaseRow); sqlDatabase.AddChild(sqlScript); } else // nest under the component of the SqlDatabase row { Wix.Component component = (Wix.Component) this.Core.GetIndexedElement("Component", (string)row[2]); // set the Database value sqlScript.SqlDb = (string)row[1]; if (null != component) { component.AddChild(sqlScript); } else { this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, sqlScriptTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component")); } } } } if (null != sqlStringTable) { foreach (Row row in sqlStringTable.Rows) { Sql.SqlString sqlString = (Sql.SqlString) this.Core.GetIndexedElement(row); Row sqlDatabaseRow = (Row)sqlDatabaseRows[row[1]]; string databaseComponent = (string)sqlDatabaseRow[4]; // determine if the SqlScript element should be nested under the database or another component if (null != databaseComponent && databaseComponent == (string)row[2]) { Sql.SqlDatabase sqlDatabase = (Sql.SqlDatabase) this.Core.GetIndexedElement(sqlDatabaseRow); sqlDatabase.AddChild(sqlString); } else // nest under the component of the SqlDatabase row { Wix.Component component = (Wix.Component) this.Core.GetIndexedElement("Component", (string)row[2]); // set the Database value sqlString.SqlDb = (string)row[1]; if (null != component) { component.AddChild(sqlString); } else { this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, sqlStringTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component")); } } } } }
/// <summary> /// Finalize the SqlFileSpec table. /// </summary> /// <param name="tables">The collection of all tables.</param> /// <remarks> /// Since rows of the SqlFileSpec table are represented by either /// the SqlFileSpec or SqlLogFileSpec depending upon the context in /// which they are used in the SqlDatabase table, decompilation of this /// table must occur after the SqlDatbase parents are decompiled. /// </remarks> private void FinalizeSqlFileSpecTable(TableIndexedCollection tables) { Table sqlDatabaseTable = tables["SqlDatabase"]; Table sqlFileSpecTable = tables["SqlFileSpec"]; if (null != sqlDatabaseTable && null != sqlFileSpecTable) { Hashtable sqlFileSpecRows = new Hashtable(); // index each SqlFileSpec row by its primary key foreach (Row row in sqlFileSpecTable.Rows) { sqlFileSpecRows.Add(row[0], row); } // create the necessary SqlFileSpec and SqlLogFileSpec elements for each row foreach (Row row in sqlDatabaseTable.Rows) { Sql.SqlDatabase sqlDatabase = (Sql.SqlDatabase) this.Core.GetIndexedElement(row); if (null != row[6]) { Row sqlFileSpecRow = (Row)sqlFileSpecRows[row[6]]; if (null != sqlFileSpecRow) { Sql.SqlFileSpec sqlFileSpec = new Sql.SqlFileSpec(); sqlFileSpec.Id = (string)sqlFileSpecRow[0]; if (null != sqlFileSpecRow[1]) { sqlFileSpec.Name = (string)sqlFileSpecRow[1]; } sqlFileSpec.Filename = (string)sqlFileSpecRow[2]; if (null != sqlFileSpecRow[3]) { sqlFileSpec.Size = (string)sqlFileSpecRow[3]; } if (null != sqlFileSpecRow[4]) { sqlFileSpec.MaxSize = (string)sqlFileSpecRow[4]; } if (null != sqlFileSpecRow[5]) { sqlFileSpec.GrowthSize = (string)sqlFileSpecRow[5]; } sqlDatabase.AddChild(sqlFileSpec); } else { this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, sqlDatabaseTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "FileSpec_", (string)row[6], "SqlFileSpec")); } } if (null != row[7]) { Row sqlFileSpecRow = (Row)sqlFileSpecRows[row[7]]; if (null != sqlFileSpecRow) { Sql.SqlLogFileSpec sqlLogFileSpec = new Sql.SqlLogFileSpec(); sqlLogFileSpec.Id = (string)sqlFileSpecRow[0]; if (null != sqlFileSpecRow[1]) { sqlLogFileSpec.Name = (string)sqlFileSpecRow[1]; } sqlLogFileSpec.Filename = (string)sqlFileSpecRow[2]; if (null != sqlFileSpecRow[3]) { sqlLogFileSpec.Size = (string)sqlFileSpecRow[3]; } if (null != sqlFileSpecRow[4]) { sqlLogFileSpec.MaxSize = (string)sqlFileSpecRow[4]; } if (null != sqlFileSpecRow[5]) { sqlLogFileSpec.GrowthSize = (string)sqlFileSpecRow[5]; } sqlDatabase.AddChild(sqlLogFileSpec); } else { this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, sqlDatabaseTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "FileSpec_Log", (string)row[7], "SqlFileSpec")); } } } } }
public void TableExt() { TableIndexedCollection tables = new TableIndexedCollection(); Assert.Empty(tables["NotFound"].RowsAs <Row>()); }