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); }