private void CreateContainer(WixBundleContainerRow container, IEnumerable <WixBundlePayloadRow> containerPayloads, string manifestFile) { CreateContainerCommand command = new CreateContainerCommand(); command.DefaultCompressionLevel = this.DefaultCompressionLevel; command.Payloads = containerPayloads; command.ManifestFile = manifestFile; command.OutputPath = container.WorkingPath; command.Execute(); container.Hash = command.Hash; container.Size = command.Size; }
private void ParseCommand(string line) { if (string.IsNullOrEmpty(line)) { return; } //NOTE: Parse in ascending length order! if (line.Substring(0, 1).Equals("#")) { return; } if (line.Length < 4) { Warn("invalid command: {0}", line); return; } if (line.Substring(0, 4).ToLower().Equals("quit") || line.Substring(0, 4).ToLower().Equals("exit")) { return; } var idx = line.IndexOf(' '); string cmd; if (idx < 0) { idx = 0; cmd = line; } else { cmd = line.Substring(0, idx).ToLower(); } var args = idx == 0 ? string.Empty : line.Substring(idx + 1).Trim(); if (CR.abort.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new AbortCommand(); c.Execute(context); StopTimer(CR.abort + " " + args); return; } if (CR.addalias.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new AddAliasCommand(); c.Execute(context, args); StopTimer(CR.addalias + " " + args); return; } if (CR.addindex.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new AddIndexCommand(); c.Execute(context, args); StopTimer(CR.addindex + " " + args); return; } if (CR.close.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new CloseCommand(); c.Execute(context, args); StopTimer(CR.close + " " + args); return; } if (CR.commit.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new CommitCommand(); c.Execute(context, args); StopTimer(CR.commit + " " + args); return; } if (CR.compactcontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new CompactContainerCommand(); c.Execute(context, args); StopTimer(CR.compactcontainer + " " + args); return; } if (CR.contextquery.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new ContextQueryCommand(); c.Execute(context, args); StopTimer(CR.contextquery + " " + args); return; } if (CR.cquery.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new CQueryCommand(); c.Execute(context, args); StopTimer(CR.cquery + " " + args); return; } if (CR.createcontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new CreateContainerCommand(); c.Execute(context, args); StopTimer(CR.createcontainer + " " + args); return; } if (CR.delindex.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new DeleteIndexCommand(); c.Execute(context, args); StopTimer(CR.delindex + " " + args); return; } if (CR.echo.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { Msg(args); return; } if (CR.getdocuments.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new GetDocumentsCommand(); c.Execute(context, args); StopTimer(CR.getdocuments + " " + args); return; } if (CR.getmetadata.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new GetMetadataCommand(); c.Execute(context, args); StopTimer(CR.getmetadata + " " + args); return; } if (CR.help.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { var c = new HelpCommand(); c.Execute(args); return; } if (CR.info.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new InfoCommand(); c.Execute(context, args); StopTimer(CR.info + " " + args); return; } if (CR.listindexes.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new ListIndexesCommand(); c.Execute(context, args); StopTimer(CR.listindexes + " " + args); return; } if (CR.lookupedgeindex.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new LookupEdgeIndexCommand(); c.Execute(context, args); StopTimer(CR.lookupedgeindex + " " + args); return; } if (CR.lookupindex.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new LookupIndexCommand(); c.Execute(context, args); StopTimer(CR.lookupindex + " " + args); return; } if (CR.lookupstats.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new LookupStatisticsCommand(); c.Execute(context, args); StopTimer(CR.lookupstats + " " + args); return; } if (CR.opencontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new OpenContainerCommand(); c.Execute(context, args); StopTimer(CR.opencontainer + " " + args); return; } if (CR.preload.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new PreloadCommand(); c.Execute(context, args); StopTimer(CR.preload + " " + args); return; } if (CR.prepare.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new PrepareCommand(); c.Execute(context, args); StopTimer(CR.prepare + " " + args); return; } if (CR.print.IndexOf(cmd, 0, StringComparison.Ordinal) == 0 || cmd.ToLower().Equals("printnames")) { StartTimer(); var c = new PrintCommand(); c.Execute(context, cmd.Equals("printnames") ? "printnames " + args : args); StopTimer(cmd.Equals("printnames") ? "printNames" : CR.print); return; } if (CR.putdocuments.Equals(cmd)) { StartTimer(); var c = new PutDocumentsCommand(); c.Execute(context, args); StopTimer(CR.putdocuments + " " + args); return; } if (CR.putdocument.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new PutDocumentCommand(); c.Execute(context, args); StopTimer(CR.putdocument + " " + args); return; } if (CR.query.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new QueryCommand(); c.Execute(context, args); StopTimer(CR.query + " " + args); return; } if (CR.queryplan.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new QueryPlanCommand(); c.Execute(context, args); StopTimer(CR.queryplan + " " + args); return; } if (CR.reindexcontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new ReindexContainerCommand(); c.Execute(context, args); StopTimer(CR.reindexcontainer + " " + args); return; } if (CR.removealias.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new RemoveAliasCommand(); c.Execute(context, args); StopTimer(CR.removealias + " " + args); return; } if (CR.removecontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new RemoveContainerCommand(); c.Execute(context, args); StopTimer(CR.removecontainer + " " + args); return; } if (CR.removedocument.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new RemoveDocumentCommand(); c.Execute(context, args); StopTimer(CR.removedocument + " " + args); return; } if (CR.run.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { var c = new RunCommand(); c.Execute(context, args); var l2 = new List <string>(originalArgs) { "-s", c.Script }; StartTimer(); Main(l2.ToArray()); StopTimer(CR.run + " " + args); return; } if (CR.setautoindexing.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetAutoIndexingCommand(); c.Execute(context, args); StopTimer(CR.setautoindexing + " " + args); return; } if (CR.setbaseuri.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetBaseUriCommand(); c.Execute(context, args); StopTimer(CR.setbaseuri + " " + args); return; } if (CR.setignore.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { var c = new SetIgnoreCommand(); c.Execute(context, args); ignoreErrors = c.Ignore; return; } if (CR.setlazy.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetLazyCommand(); c.Execute(context, args); StopTimer(CR.setlazy + " " + args); return; } if (CR.setmetadata.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetMetadataCommand(); c.Execute(context, args); StopTimer(CR.setmetadata + " " + args); return; } if (CR.setnamespace.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetNamespaceCommand(); c.Execute(context, args); StopTimer(CR.setnamespace + " " + args); return; } if (CR.setprojection.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetProjectionCommand(); c.Execute(context, args); StopTimer(CR.setprojection + " " + args); return; } if (CR.setquerytimeout.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetQueryTimeoutCommand(); c.Execute(context, args); StopTimer(CR.setquerytimeout + " " + args); return; } if (CR.setvariable.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetVariableCommand(); c.Execute(context, args); StopTimer(CR.setvariable + " " + args); return; } if (CR.setverbose.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new SetVerboseCommand(); c.Execute(context, args); StopTimer(CR.setverbose + " " + args); return; } if (CR.sync.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); context.Sync(); StopTimer(CR.sync + " " + args); return; } if (CR.time.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { time = true; ParseCommand(args); return; } if (CR.transaction.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new TransactionCommand(); c.Execute(context, args); StopTimer(CR.transaction + " " + args); return; } if (CR.upgradecontainer.IndexOf(cmd, 0, StringComparison.Ordinal) == 0) { StartTimer(); var c = new UpgradeContainerCommand(); c.Execute(context, args); StopTimer(CR.upgradecontainer + " " + args); return; } Warn("Command not recognized: {0}", cmd); }
public void Execute() { var section = this.Output.Sections.Single(); var fileTransfers = new List <IFileTransfer>(); var trackedFiles = new List <ITrackedFile>(); // First look for data we expect to find... Chain, WixGroups, etc. // We shouldn't really get past the linker phase if there are // no group items... that means that there's no UX, no Chain, // *and* no Containers! var chainPackageSymbols = this.GetRequiredSymbols <WixBundlePackageSymbol>(); var wixGroupSymbols = this.GetRequiredSymbols <WixGroupSymbol>(); // Ensure there is one and only one WixBundleSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var bundleSymbol = this.GetSingleSymbol <WixBundleSymbol>(); bundleSymbol.ProviderKey = bundleSymbol.BundleId = Guid.NewGuid().ToString("B").ToUpperInvariant(); bundleSymbol.Attributes |= WixBundleAttributes.PerMachine; // default to per-machine but the first-per user package wil flip the bundle per-user. // Ensure there is one and only one WixBootstrapperApplicationDllSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var bundleApplicationDllSymbol = this.GetSingleSymbol <WixBootstrapperApplicationDllSymbol>(); // Ensure there is one and only one WixChainSymbol. // The compiler and linker behavior should have colluded to get // this behavior. var chainSymbol = this.GetSingleSymbol <WixChainSymbol>(); if (this.Messaging.EncounteredError) { return; } // If there are any fields to resolve later, create the cache to populate during bind. var variableCache = this.DelayedFields.Any() ? new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase) : null; IEnumerable <ISearchFacade> orderedSearches; IDictionary <string, IEnumerable <IntermediateSymbol> > extensionSearchSymbolsById; { var orderSearchesCommand = new OrderSearchesCommand(this.Messaging, section); orderSearchesCommand.Execute(); orderedSearches = orderSearchesCommand.OrderedSearchFacades; extensionSearchSymbolsById = orderSearchesCommand.ExtensionSearchSymbolsByExtensionId; } // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). { var extractedFiles = this.BackendHelper.ExtractEmbeddedFiles(this.ExpectedEmbeddedFiles); trackedFiles.AddRange(extractedFiles); } // Get the explicit payloads. var payloadSymbols = section.Symbols.OfType <WixBundlePayloadSymbol>().ToDictionary(t => t.Id.Id); var packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols); // Update explicitly authored payloads with their parent container // to make it easier to gather the payloads later. foreach (var groupSymbol in wixGroupSymbols) { if (ComplexReferenceChildType.Payload == groupSymbol.ChildType) { var payloadSymbol = payloadSymbols[groupSymbol.ChildId]; if (ComplexReferenceParentType.Container == groupSymbol.ParentType) { // TODO: v3 didn't warn if we overwrote the payload's container. // Should we warn now? payloadSymbol.ContainerRef = groupSymbol.ParentId; } else if (ComplexReferenceParentType.Layout == groupSymbol.ParentType) { payloadSymbol.LayoutOnly = true; } } } var layoutDirectory = Path.GetDirectoryName(this.OutputPath); // Process the explicitly authored payloads. ISet <string> processedPayloads; { var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); trackedFiles.AddRange(command.TrackedFiles); processedPayloads = new HashSet <string>(payloadSymbols.Keys); } IDictionary <string, PackageFacade> facades; { var command = new GetPackageFacadesCommand(this.Messaging, chainPackageSymbols, section); command.Execute(); facades = command.PackageFacades; } if (this.Messaging.EncounteredError) { return; } // Process each package facade. Note this is likely to add payloads and other symbols so // note that any indexes created above may be out of date now. foreach (var facade in facades.Values) { switch (facade.PackageSymbol.Type) { case WixBundlePackageType.Exe: { var command = new ProcessExePackageCommand(facade, payloadSymbols); command.Execute(); } break; case WixBundlePackageType.Msi: { var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]); command.Execute(); } break; case WixBundlePackageType.Msp: { var command = new ProcessMspPackageCommand(this.Messaging, section, facade, payloadSymbols); command.Execute(); } break; case WixBundlePackageType.Msu: { var command = new ProcessMsuPackageCommand(facade, payloadSymbols); command.Execute(); } break; } if (null != variableCache) { BindBundleCommand.PopulatePackageVariableCache(facade, variableCache); } } if (this.Messaging.EncounteredError) { return; } // Reindex the payloads now that all the payloads (minus the manifest payloads that will be created later) // are present. payloadSymbols = section.Symbols.OfType <WixBundlePayloadSymbol>().ToDictionary(t => t.Id.Id); wixGroupSymbols = this.GetRequiredSymbols <WixGroupSymbol>(); packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols); // Process the payloads that were added by processing the packages. { var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList(); var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory); command.Execute(); fileTransfers.AddRange(command.FileTransfers); trackedFiles.AddRange(command.TrackedFiles); processedPayloads = null; } // Set the package metadata from the payloads now that we have the complete payload information. { foreach (var facade in facades.Values) { facade.PackageSymbol.Size = 0; var packagePayloads = packagesPayloads[facade.PackageId]; foreach (var payload in packagePayloads.Values) { facade.PackageSymbol.Size += payload.FileSize.Value; } if (!facade.PackageSymbol.InstallSize.HasValue) { facade.PackageSymbol.InstallSize = facade.PackageSymbol.Size; } var packagePayload = payloadSymbols[facade.PackageSymbol.PayloadRef]; if (String.IsNullOrEmpty(facade.PackageSymbol.Description)) { facade.PackageSymbol.Description = packagePayload.Description; } if (String.IsNullOrEmpty(facade.PackageSymbol.DisplayName)) { facade.PackageSymbol.DisplayName = packagePayload.DisplayName; } } } // Give the UX payloads their embedded IDs... var uxPayloadIndex = 0; { foreach (var payload in payloadSymbols.Values.Where(p => BurnConstants.BurnUXContainerName == p.ContainerRef)) { // In theory, UX payloads could be embedded in the UX CAB, external to the bundle EXE, or even // downloaded. The current engine requires the UX to be fully present before any downloading starts, // so that rules out downloading. Also, the burn engine does not currently copy external UX payloads // into the temporary UX directory correctly, so we don't allow external either. if (PackagingType.Embedded != payload.Packaging) { this.Messaging.Write(WarningMessages.UxPayloadsOnlySupportEmbedding(payload.SourceLineNumbers, payload.SourceFile.Path)); payload.Packaging = PackagingType.Embedded; } payload.EmbeddedId = String.Format(CultureInfo.InvariantCulture, BurnCommon.BurnUXContainerEmbeddedIdFormat, uxPayloadIndex); ++uxPayloadIndex; } if (0 == uxPayloadIndex) { // If we didn't get any UX payloads, it's an error! throw new WixException(ErrorMessages.MissingBundleInformation("BootstrapperApplication")); } // Give the embedded payloads without an embedded id yet an embedded id. var payloadIndex = 0; foreach (var payload in payloadSymbols.Values) { Debug.Assert(PackagingType.Unknown != payload.Packaging); if (PackagingType.Embedded == payload.Packaging && String.IsNullOrEmpty(payload.EmbeddedId)) { payload.EmbeddedId = String.Format(CultureInfo.InvariantCulture, BurnCommon.BurnAttachedContainerEmbeddedIdFormat, payloadIndex); ++payloadIndex; } } } if (this.Messaging.EncounteredError) { return; } // Determine patches to automatically slipstream. { var command = new AutomaticallySlipstreamPatchesCommand(section, facades.Values); command.Execute(); } if (this.Messaging.EncounteredError) { return; } IEnumerable <PackageFacade> orderedFacades; IEnumerable <WixBundleRollbackBoundarySymbol> boundaries; { var command = new OrderPackagesAndRollbackBoundariesCommand(this.Messaging, section, facades); command.Execute(); orderedFacades = command.OrderedPackageFacades; boundaries = command.UsedRollbackBoundaries; } // Resolve any delayed fields before generating the manifest. if (this.DelayedFields.Any()) { this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache); } { var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades); command.Execute(); if (!String.IsNullOrEmpty(command.BundleProviderKey)) { bundleSymbol.ProviderKey = command.BundleProviderKey; // set the overridable bundle provider key. } } // Update the bundle per-machine/per-user scope based on the chained packages. this.ResolveBundleInstallScope(section, bundleSymbol, orderedFacades); var softwareTags = section.Symbols.OfType <WixBundleTagSymbol>().ToList(); if (softwareTags.Any()) { var command = new ProcessBundleSoftwareTagsCommand(section, softwareTags); command.Execute(); } this.DetectDuplicateCacheIds(facades); if (this.Messaging.EncounteredError) { return; } // Give the extension one last hook before generating the output files. foreach (var extension in this.BackendExtensions) { extension.SymbolsFinalized(section); } if (this.Messaging.EncounteredError) { return; } // Generate data for all manifests. { var command = new GenerateManifestDataFromIRCommand(this.Messaging, section, this.BackendExtensions, this.InternalBurnBackendHelper, extensionSearchSymbolsById); command.Execute(); } if (this.Messaging.EncounteredError) { return; } // Generate the core-defined BA manifest tables... string baManifestPath; { var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, packagesPayloads, this.IntermediateFolder, this.InternalBurnBackendHelper); command.Execute(); var baManifestPayload = command.BootstrapperApplicationManifestPayloadRow; baManifestPath = command.OutputPath; payloadSymbols.Add(baManifestPayload.Id.Id, baManifestPayload); ++uxPayloadIndex; trackedFiles.Add(this.BackendHelper.TrackFile(baManifestPath, TrackedFileType.Temporary)); } // Generate the bundle extension manifest... string bextManifestPath; { var command = new CreateBundleExtensionManifestCommand(section, bundleSymbol, uxPayloadIndex, this.IntermediateFolder, this.InternalBurnBackendHelper); command.Execute(); var bextManifestPayload = command.BundleExtensionManifestPayloadRow; bextManifestPath = command.OutputPath; payloadSymbols.Add(bextManifestPayload.Id.Id, bextManifestPayload); ++uxPayloadIndex; trackedFiles.Add(this.BackendHelper.TrackFile(bextManifestPath, TrackedFileType.Temporary)); } var containers = section.Symbols.OfType <WixBundleContainerSymbol>().ToDictionary(t => t.Id.Id); { var command = new DetectPayloadCollisionsCommand(this.Messaging, containers, facades.Values, payloadSymbols, packagesPayloads); command.Execute(); } if (this.Messaging.EncounteredError) { return; } // Create all the containers except the UX container first so the manifest (that goes in the UX container) // can contain all size and hash information about the non-UX containers. WixBundleContainerSymbol uxContainer; IEnumerable <WixBundlePayloadSymbol> uxPayloads; { var command = new CreateNonUXContainers(this.BackendHelper, section, bundleApplicationDllSymbol, containers.Values, payloadSymbols, this.IntermediateFolder, layoutDirectory, this.DefaultCompressionLevel); command.Execute(); fileTransfers.AddRange(command.FileTransfers); trackedFiles.AddRange(command.TrackedFiles); uxContainer = command.UXContainer; uxPayloads = command.UXContainerPayloads; } // Resolve the download URLs now that we have all of the containers and payloads calculated. { var command = new ResolveDownloadUrlsCommand(this.Messaging, this.BackendExtensions, containers.Values, payloadSymbols); command.Execute(); } // Create the bundle manifest. string manifestPath; { var executableName = Path.GetFileName(this.OutputPath); var command = new CreateBurnManifestCommand(executableName, section, bundleSymbol, containers.Values, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, packagesPayloads, orderedSearches, this.IntermediateFolder); command.Execute(); manifestPath = command.OutputPath; trackedFiles.Add(this.BackendHelper.TrackFile(manifestPath, TrackedFileType.Temporary)); } // Create the UX container. { var command = new CreateContainerCommand(manifestPath, uxPayloads, uxContainer.WorkingPath, this.DefaultCompressionLevel); command.Execute(); uxContainer.Hash = command.Hash; uxContainer.Size = command.Size; trackedFiles.Add(this.BackendHelper.TrackFile(uxContainer.WorkingPath, TrackedFileType.Temporary)); } { var command = new CreateBundleExeCommand(this.Messaging, this.BackendHelper, this.IntermediateFolder, this.OutputPath, bundleApplicationDllSymbol, bundleSymbol, uxContainer, containers.Values); command.Execute(); fileTransfers.Add(command.Transfer); trackedFiles.Add(this.BackendHelper.TrackFile(this.OutputPath, TrackedFileType.Final)); } #if TODO // does this need to come back, or do they only need to be in TrackedFiles? this.ContentFilePaths = payloadSymbols.Values.Where(p => p.ContentFile).Select(p => p.FullFileName).ToList(); #endif this.FileTransfers = fileTransfers; this.TrackedFiles = trackedFiles; this.Wixout = this.CreateWixout(trackedFiles, this.Output, manifestPath, baManifestPath, bextManifestPath); }