/// <summary>
        /// Gets the root directory for this application.
        /// </summary>
        /// <returns>WiX Directory element containing the root directory and all files.</returns>
        internal Wix.Directory GetApplicationRootDirectory()
        {
            if (null == this.source)
            {
                throw new ArgumentNullException("Source");
            }

            IsolatedMsiBuilder msiBuilder = new IsolatedMsiBuilder(this.Core);

            msiBuilder.Source = this.source;

            return(msiBuilder.GetRootDirectory(true));
        }
        /// <summary>
        /// Builds the setup package and feed.
        /// </summary>
        /// <param name="outputFeed">Path to the file where feed will be generated.</param>
        /// <returns>True if fabrication was successful, false if any failure occurs.</returns>
        public override bool Fabricate(string outputFeed)
        {
            this.VerifyRequiredInformation();

            try
            {
                this.Core = new FabricatorCore(this.MessageHandler);

                // Calculate the paths required to build the MSI.
                string localSetupFeed = outputFeed;
                Uri    urlSetupFeed   = new Uri(this.UpdateUrl, Path.GetFileName(localSetupFeed));
                string outputMsi      = Path.GetTempFileName();

                string previousPackagePath = null;

                // Create the feed builder and open the previous feed if it was provided.
                FeedBuilder feedBuilder = new FeedBuilder(this.Core);

                if (this.previousFeedUrl != null)
                {
                    feedBuilder.OpenPrevious(this.previousFeedUrl);
                    previousPackagePath = feedBuilder.GetPreviousAppItemPath();

                    if (String.Compare(Path.GetExtension(previousPackagePath), ".exe", true) == 0)
                    {
                        previousPackagePath = SetupExeBuilder.GetEmbeddedPackage(previousPackagePath);
                    }
                }

                // Create the MSI builder and open the previous package if there was one.
                IsolatedMsiBuilder msiBuilder = new IsolatedMsiBuilder(this.Core);

                if (previousPackagePath != null)
                {
                    msiBuilder.OpenPrevious(previousPackagePath);
                }

                // Build the MSI.
                msiBuilder.Description           = this.Description;
                msiBuilder.EntryFileRelativePath = this.EntryPoint;
                msiBuilder.Manufacturer          = this.Manufacturer;
                msiBuilder.Name        = this.Name;
                msiBuilder.Source      = this.Source;
                msiBuilder.UpdateUrl   = urlSetupFeed;
                msiBuilder.UpgradeCode = this.ApplicationId;
                msiBuilder.Version     = this.ApplicationVersion;
                if (!msiBuilder.Build(outputMsi, this.saveWxsPath))
                {
                    return(false);
                }

                // Calculate the paths required to build the setup.exe.
                string relativeSetupExe = Path.Combine(msiBuilder.Version.ToString(), "setup.exe");
                string localSetupExe    = Path.Combine(Path.GetDirectoryName(outputFeed), relativeSetupExe);

                // Build the setup.exe.
                SetupExeBuilder setupExeBuilder = new SetupExeBuilder(this.Core);
                setupExeBuilder.MsiPath = outputMsi;
                if (!setupExeBuilder.Build(localSetupExe))
                {
                    return(false);
                }

                // Calculate the paths required for the app feed.
                Uri urlSetupExe = new Uri(this.updateUrl, relativeSetupExe);

                // Build the application feed.  Note some values come from the MSI build because
                // they were updated there.
                feedBuilder.ApplicationId      = msiBuilder.ProductCode;
                feedBuilder.ApplicationName    = this.Name;
                feedBuilder.ApplicationVersion = msiBuilder.Version;
                feedBuilder.Description        = this.Description;
                feedBuilder.Generator          = "WiX Toolset's ClickThrough for Isolated Applications";
                feedBuilder.Id          = msiBuilder.UpgradeCode;
                feedBuilder.PackagePath = localSetupExe;
                feedBuilder.PackageUrl  = urlSetupExe;
                feedBuilder.TimeToLive  = this.updateRate;
                feedBuilder.Title       = String.Concat(this.Manufacturer, "'s ", this.Name);
                feedBuilder.Url         = this.UpdateUrl;
                return(feedBuilder.Build(localSetupFeed));
            }
            finally
            {
                this.Core = null;
            }
        }