public static BakeMetadata ReadBakeFile(string bakeSrc)
        {
            var xdoc = XDocument.Load(bakeSrc);
            var metadata = new BakeMetadata();

            try
            {
                var root = xdoc.Element("metadata");

                // ReSharper disable PossibleNullReferenceException
                var company_name = root.Element("company_name").Value;
                var icon_name = root.Element("icon_name").Value;
                var executable_display_name = root.Element("executable_display_name").Value;
                var executable_source = root.Element("executable_source").Value;
                var manufacturer = root.Element("manufacturer").Value;
                var product_name = root.Element("product_name").Value;
                var upgrade_code = root.Element("upgrade_code").Value;
                var add_license = Convert.ToBoolean(root.Element("add_license").Value);
                var add_banner = Convert.ToBoolean(root.Element("add_banner").Value);

                metadata.ItsCompanyName = company_name;
                metadata.ItsIconName = icon_name;
                metadata.ItsMainExecutableDisplayName = executable_display_name;
                metadata.ItsMainExecutableSource = executable_source;
                metadata.ItsManufacturer = manufacturer;
                metadata.ItsProductName = product_name;
                metadata.ItsUpgradeCode = new Guid(upgrade_code);
                metadata.ItsAddLicenseFlag = add_license;
                metadata.ItsAddBannerFlag = add_banner;

                var executableCompElem = root.Element("executable_component");
                var guid = new Guid(executableCompElem.Attribute("Guid").Value);
                metadata.ItsMainExecutableComponent = new BakeComponent(executableCompElem.Attribute("Id").Value, guid);

                var programMenuElem = root.Element("program_menu_dir");
                guid = new Guid(programMenuElem.Attribute("Guid").Value);
                metadata.ItsProgramMenuComponent = new BakeComponent(programMenuElem.Attribute("Id").Value, guid);

                // read subdirectories and files
                var directories = root.Elements("Directory");

                var list = new List<BakeDirectory>();
                foreach (var directory in directories)
                {
                    var id = directory.Attribute("Id").Value;
                    var name = directory.Attribute("Name").Value;
                    var bakeDir = new BakeDirectory(id, name);

                    var component = directory.Element("Component");
                    id = component.Attribute("Id").Value;
                    guid = new Guid(component.Attribute("Guid").Value);

                    var bakeComp = new BakeComponent(id, guid);

                    var files = component.Elements("File");
                    foreach (var file in files)
                    {
                        id = file.Attribute("Id").Value;
                        var src = file.Attribute("Source").Value;
                        var bakeFile = new BakeFile(id, src, bakeComp);
                        bakeComp.ItsBakeFiles.Add(bakeFile);
                    }
                    bakeDir.ItsComponent = bakeComp;
                }

                metadata.ItsSubDirectories = list;

                var main_component_files = root.Element("main_component_files").Elements("File");

                var fileList = new List<BakeFile>();
                foreach (var file in main_component_files)
                {
                    fileList.Add(new BakeFile(file.Attribute("Id").Value, file.Attribute("Source").Value, metadata.ItsMainExecutableComponent));
                }

                metadata.ItsMainExecutableComponent.ItsBakeFiles = fileList;
                // ReSharper restore PossibleNullReferenceException
                return metadata;
            }
            catch (NullReferenceException)
            {
                return null;
            }
        }
 private static void AddSubDirectoryFiles(BakeMetadata metadata, XElement parent)
 {
     foreach (var bakeDirectory in metadata.ItsSubDirectories)
     {
         var directory = new XElement(xn + "Directory", new XAttribute("Id", string.Format("{0}Dir", bakeDirectory.ItsName)), new XAttribute("Name", bakeDirectory.ItsName));
         var component = new XElement(xn + "Component", new XAttribute("Id", bakeDirectory.ItsComponent.ItsId),
                                  new XAttribute("Guid", bakeDirectory.ItsComponent.ItsGuid));
         AddFileElements(bakeDirectory.ItsComponent, component, xn);
         directory.Add(component);
         parent.Add(directory);
     }
 }
 private static void AddWixMainComponentFiles(BakeMetadata metadata, XElement parent)
 {
     var mainExecutableComponent = new XElement("main_component_files");
     AddFileElements(metadata.ItsMainExecutableComponent, mainExecutableComponent, "");
     parent.Add(mainExecutableComponent);
 }
 private static void AddCompleteInstallFeature(BakeMetadata metadata, XElement parent)
 {
     var feature = new XElement(xn + "Feature", new XAttribute("Id", "CompleteInstall"),
                                new XAttribute("Title", metadata.ItsProductName),
                                new XAttribute("Description", "Install all the components"),
                                new XAttribute("Display", "expand"), new XAttribute("Level", "1"),
                                new XAttribute("ConfigurableDirectory", "INSTALLDIR"));
     AddComponentRef("ProgramMenuDir", feature);
     AddComponentRef(metadata.ItsMainExecutableComponent.ItsId, feature, true);
     foreach (var directory in metadata.ItsSubDirectories)
       AddComponentRef(directory.ItsId, feature);
     parent.Add(feature);
 }
        private static void AddMainComponentFiles(BakeMetadata metadata, XElement parent)
        {
            var mainExecutableComponent = new XElement(xn + "Component", new XAttribute("Id", metadata.ItsMainExecutableComponent.ItsId),
                                         new XAttribute("Guid", metadata.ItsMainExecutableComponent.ItsGuid.ToString()));
            #region SHORTCUTS

                var suffix = string.Format(VersionSuffix, Path.GetFileNameWithoutExtension(metadata.ItsMainExecutableDisplayName));
                var shortcutFile = new XElement(xn + "File", new XAttribute("Id", suffix),
                                                new XAttribute("Name", metadata.ItsMainExecutableDisplayName),
                                                new XAttribute("DiskId", "1"), new XAttribute("KeyPath", "yes"),
                                                new XAttribute("Source", metadata.ItsMainExecutableSource));

                var startmenuShortcut = new XElement(xn + "Shortcut", new XAttribute("Id", "startmenu"), new XAttribute("Directory", "ProgramMenuDir"),
                                                     new XAttribute("Name", metadata.ItsProductName), new XAttribute("WorkingDirectory", "INSTALLDIR"),
                                                     new XAttribute("Icon", "Icon.ico"), new XAttribute("Show", "normal"), new XAttribute("Advertise", "yes"));
                var desktopShortcut = new XElement(xn + "Shortcut", new XAttribute("Id", "desktop"), new XAttribute("Directory", "DesktopFolder"),
                                                     new XAttribute("Name", metadata.ItsProductName), new XAttribute("WorkingDirectory", "INSTALLDIR"),
                                                     new XAttribute("Icon", "Icon.ico"), new XAttribute("Advertise", "yes"));
                shortcutFile.Add(startmenuShortcut);
                shortcutFile.Add(desktopShortcut);

                #endregion

            mainExecutableComponent.Add(shortcutFile);
            AddFileElements(metadata.ItsMainExecutableComponent, mainExecutableComponent, xn);
            parent.Add(mainExecutableComponent);
        }
        public static void WriteWixFile(BakeMetadata metadata, string wixfile)
        {
            using (var fs = File.Create(wixfile))
            {
                // ReSharper disable PossibleNullReferenceException
                var xdoc = new XDocument();
                var suffix = string.Format(VersionSuffix, Path.GetFileNameWithoutExtension(metadata.ItsMainExecutableDisplayName));

                var wix = new XElement(xn + "Wix");
                var product = new XElement(xn + "Product", new XAttribute("Id", "*"), new XAttribute("Name", metadata.ItsProductName),
                                           new XAttribute("Language", "1033"), new XAttribute("Version", string.Format(VersionFormat, suffix)),
                                           new XAttribute("Manufacturer", metadata.ItsManufacturer),
                                           new XAttribute("UpgradeCode", metadata.ItsUpgradeCode.ToString())
                    );

                var package = new XElement(xn+"Package", new XAttribute("Id", "*"), new XAttribute("Languages", "1033"),
                                           new XAttribute("Manufacturer", metadata.ItsCompanyName),
                                           new XAttribute("Platform", "x86"), new XAttribute("InstallerVersion", "200"),
                                           new XAttribute("Compressed", "yes"));

                var customTable = XElement.Parse(CustomTableXml).Elements();

                var alluserProp = new XElement(xn + "Property", new XAttribute("Id", "ALLUSERS"), new XAttribute("Value", "1"));
                var applicationFolderName = new XElement(xn + "Property", new XAttribute("Id", "ApplicationFolderName"), new XAttribute("Value", string.Format("{0}\\{1}", metadata.ItsManufacturer, metadata.ItsProductName)));
                var installUi = XElement.Parse(InstallUiXml).Elements();

                var license = new XElement(xn + "WixVariable", new XAttribute("Id", "WixUILicenseRtf"), new XAttribute("Value", "License.rtf"));
                var banner = new XElement(xn + "WixVariable", new XAttribute("Id", "WixUIBannerBmp"), new XAttribute("Value", "banner.bmp"));

                var media = new XElement(xn + "Media", new XAttribute("Id", "1"), new XAttribute("Cabinet", "media1.cab"), new XAttribute("EmbedCab", "yes"));
                var icon = new XElement(xn + "Icon", new XAttribute("Id", "Icon.ico"), new XAttribute("SourceFile", metadata.ItsIconName));
                var iconProp = new XElement(xn + "Property", new XAttribute("Id", "ARPPRODUCTICON"), new XAttribute("Value", "Icon.ico"));

                var targetDir = new XElement(xn + "Directory", new XAttribute("Id", "TARGETDIR"),
                                             new XAttribute("Name", "SourceDir"));

                var desktopFolder = new XElement(xn + "Directory", new XAttribute("Id", "DesktopFolder"),
                                                 new XAttribute("Name", "Desktop"));

                var programFilesFolder = new XElement(xn + "Directory", new XAttribute("Id", "ProgramFilesFolder"),
                                                      new XAttribute("Name", "PFiles"));

                var programOutputFolder = new XElement(xn + "Directory", new XAttribute("Id", "ProgramOutputFolder"),
                                                       new XAttribute("Name", metadata.ItsManufacturer));

                var installDir = new XElement(xn + "Directory", new XAttribute("Id", "INSTALLDIR"),
                                              new XAttribute("Name", metadata.ItsProductName));

                #region SHORTCUT INTO START

                var programMenuFolder = new XElement(xn + "Directory", new XAttribute("Id", "ProgramMenuFolder"),
                                                     new XAttribute("Name", "Programs"));

                var programMenuDir = new XElement(xn + "Directory", new XAttribute("Id", "ProgramMenuDir"),
                                                  new XAttribute("Name", metadata.ItsManufacturer));

                var programMenuComponent = new XElement(xn + "Component", new XAttribute("Id", metadata.ItsProgramMenuComponent.ItsId),
                                                         new XAttribute("Guid", metadata.ItsProgramMenuComponent.ItsGuid.ToString()));

                var createFolder = new XElement(xn + "CreateFolder", new XAttribute("Directory", "ProgramMenuDir"));

                var registryValue = new XElement(xn + "RegistryValue", new XAttribute("Root", "HKCU"),
                                                 new XAttribute("Key", string.Format(RegistryKeyFormat, metadata.ItsProgramMenuComponent.ItsGuid)),
                                                 new XAttribute("Name", "ProgramMenuFolder"),
                                                 new XAttribute("Value", "[ProgramMenuFolder]"),
                                                 new XAttribute("Type", "string"),
                                                 new XAttribute("KeyPath", "yes")
                    );

                var removeFoler = new XElement(xn + "RemoveFolder", new XAttribute("Id", "ProgramMenuDir"),
                                               new XAttribute("On", "uninstall"));

                programMenuComponent.Add(createFolder);
                programMenuComponent.Add(registryValue);
                programMenuComponent.Add(removeFoler);

                programMenuDir.Add(programMenuComponent);
                programMenuFolder.Add(programMenuDir);

                #endregion

                #region MAIN FILES

                installDir.Add(programMenuFolder);
                AddMainComponentFiles(metadata, installDir);
                AddSubDirectoryFiles(metadata, installDir);

                programOutputFolder.Add(installDir);
                programFilesFolder.Add(programOutputFolder);
                targetDir.Add(desktopFolder);
                targetDir.Add(programFilesFolder);

                // TODO: Add feature

                product.Add(package);
                product.Add(customTable);
                product.Add(alluserProp);
                product.Add(applicationFolderName);
                product.Add(installUi);
                if(metadata.ItsAddLicenseFlag)
                  product.Add(license);

                if(metadata.ItsAddBannerFlag)
                  product.Add(banner);
                product.Add(media);
                product.Add(icon);
                product.Add(iconProp);
                product.Add(targetDir);

                AddCompleteInstallFeature(metadata, product);

                wix.Add(product);
                xdoc.Add(wix);
                xdoc.Save(fs);
                #endregion

                // ReSharper restore PossibleNullReferenceException
            }
        }
        public static void WriteBakeFile(Stream vf, BakeMetadata data)
        {
            var xdoc = new XDocument();
            var metadata = new XElement("metadata");
            metadata.Add(new XElement("company_name", data.ItsCompanyName));
            metadata.Add(new XElement("icon_name", data.ItsIconName));
            metadata.Add(new XElement("executable_display_name", data.ItsMainExecutableDisplayName));
            metadata.Add(new XElement("executable_source", data.ItsMainExecutableSource));
            metadata.Add(new XElement("manufacturer", data.ItsManufacturer));
            metadata.Add(new XElement("add_license", data.ItsAddLicenseFlag));
            metadata.Add(new XElement("add_banner", data.ItsAddBannerFlag));
            metadata.Add(new XElement("product_name", data.ItsProductName));
            metadata.Add(new XElement("upgrade_code", data.ItsUpgradeCode.ToString()));
            metadata.Add(new XElement("executable_component", new XAttribute("Id", data.ItsMainExecutableComponent.ItsId), new XAttribute("Guid", data.ItsMainExecutableComponent.ItsGuid.ToString())));
            metadata.Add(new XElement("program_menu_dir", new XAttribute("Id", data.ItsProgramMenuComponent.ItsId), new XAttribute("Guid", data.ItsProgramMenuComponent.ItsGuid.ToString())));

            AddWixMainComponentFiles(data, metadata);
            xdoc.Add(metadata);
            xdoc.Save(vf);
        }
 public static void UpdateBakeFile(BakeMetadata data, string path)
 {
     // ReSharper disable PossibleNullReferenceException
     var root = XElement.Load(path);
     root.SetElementValue("company_name", data.ItsCompanyName);
     root.SetElementValue("icon_name", data.ItsIconName);
     root.SetElementValue("executable_display_name", data.ItsMainExecutableDisplayName);
     root.SetElementValue("executable_source", data.ItsMainExecutableSource);
     root.SetElementValue("manufacturer", data.ItsManufacturer);
     root.SetElementValue("add_license", data.ItsAddLicenseFlag);
     root.SetElementValue("add_banner", data.ItsAddBannerFlag);
     root.SetElementValue("product_name", data.ItsProductName);
     var executable_component = root.Element("main_component_files");
     executable_component.Remove();
     AddWixMainComponentFiles(data, root);
     root.Save(path);
     // ReSharper restore PossibleNullReferenceException
 }
        private void BakeMetadataAvailableEventHandler(object sender, SingleEventArgs<BakeMetadata> e)
        {
            _bakeMetadata = e.ItsValue;
            if (_bakeMetadata == null)
                return;

            var comp = _bakeMetadata.ItsMainExecutableComponent;
            foreach (var file in comp.ItsBakeFiles)
            {
                var p1 = ItsInstallerProjectManagementService.ItsInstallerProjectInfo.ItsProjectPaths.ItsRootPath;
                var fileinfo = new FileInfo(Path.Combine(p1, file.ItsSource));

                var fileEntry = new FileEntry
                                    {
                                        DisplayTitle = Path.GetFileName(file.ItsSource),
                                        FullPath = file.ItsSource,
                                        SizeInfo = new StorageSizeInfo(fileinfo.Length)
                                    };
                ItsIncludedFileEntriesDict.Add(fileEntry.GetHashCode(), fileEntry);
            }
            RaiseRegistryUpdateEvent();
        }
        private void InitializeBakeFile(Project project)
        {
            ItsInstallerProjectName = project.Name;
            var paths = Utilities.GetOutputPath(project);
            ItsInstallerProjectInfo = new ProjectInfo(project.Name, paths);
            ItsBakeFile = Path.Combine(paths.ItsRootPath, BakeOutputFileName);
            ItsWixFile = Path.Combine(paths.ItsRootPath, WixOutputFileName);
            BakeMetadata metadata;

            if (!File.Exists(ItsBakeFile))
            {
                using (var vf = File.Create(ItsBakeFile))
                {
                    var mainProjectFile = Path.GetFileNameWithoutExtension(((object[])(_currentSolution.SolutionBuild.StartupProjects))[0].ToString());
                    metadata = new BakeMetadata
                                   {
                                           ItsCompanyName = "MetaGeek, LLC",
                                           ItsIconName = "icon.ico",
                                           ItsMainExecutableDisplayName = string.Format("{0}.exe", mainProjectFile),
                                           ItsMainExecutableSource = string.Format(InitialOutputFile, mainProjectFile),
                                           ItsManufacturer = "MetaGeek",
                                           ItsProductName = mainProjectFile,
                                           ItsUpgradeCode = Guid.NewGuid(),
                                           ItsMainExecutableComponent = new BakeComponent("MainExecutable", Guid.NewGuid()),
                                           ItsProgramMenuComponent = new BakeComponent("ProgramMenuDir", Guid.NewGuid()),
                                           ItsSubDirectories = new List<BakeDirectory>()
                                       };

                    XmlFileParserService.WriteBakeFile(vf, metadata);
                }
            }
            else
            {
                metadata = XmlFileParserService.ReadBakeFile(ItsBakeFile);
            }

            _bakeMetadata = metadata;
            XmlFileParserService.WriteWixFile(metadata, ItsWixFile);
            _eventAggregator.BakeMetadataAvailable.Raise(this, metadata);
        }