private void AssignDirectoryUniqueId(WixTargetDirectory dir) { var readableId = dir.Id ?? MakeReadableId(dir.Name, MaxIdLength - 33); var guid = _guidProvider.Get(SwixGuidType.Directory, dir.GetFullTargetPath()); var finalId = $"{readableId}_{guid:N}"; dir.Id = finalId; _directories[finalId] = dir; }
private void VerifySubdirectoriesDontHaveRefOnlyAttributeSet(WixTargetDirectory dir) { foreach (var subDir in dir.Subdirectories) { if (subDir.RefOnly) { throw new SwixSemanticException(0, $"Directory {subDir.GetFullTargetPath()} is marked as refOnly and has parent. refOnly dirs can be only top-level"); } VerifySubdirectoriesDontHaveRefOnlyAttributeSet(subDir); } }
public ISemanticContext RootDirectory(string key, IAttributeContext itemContext) { try { var dir = WixTargetDirectory.FromAttributes(key, itemContext, _currentDir); _subdirs.Add(dir); return(new DirectoriesSection(CurrentLine, CurrentAttributeContext, dir)); } catch (SwixItemParsingException e) { throw new SwixSemanticException(CurrentLine, e.Message); } }
public static WixTargetDirectory FromAttributes(string key, IAttributeContext attributeContext, WixTargetDirectory parent) { var result = new WixTargetDirectory(key, parent); var id = attributeContext.GetInheritedAttribute("id"); if (id != null) { result.Id = id; } var refOnly = attributeContext.GetInheritedAttribute("refOnly"); if (refOnly != null && refOnly != "yes" && refOnly != "no") { throw new SwixItemParsingException("Attribute 'refOnly' should be either 'yes' or 'no'."); } result.RefOnly = refOnly == "yes"; var removeOnUninstall = attributeContext.GetInheritedAttribute("removeOnUninstall"); if (removeOnUninstall != null && removeOnUninstall != "yes" && removeOnUninstall != "no") { throw new SwixItemParsingException("Attribute 'removeOnUninstall' should be either 'yes' or 'no'."); } result.RemoveOnUninstall = removeOnUninstall == "yes"; var createOnInstall = attributeContext.GetInheritedAttribute("createOnInstall"); if (createOnInstall != null && createOnInstall != "yes" && createOnInstall != "no") { throw new SwixItemParsingException("Attribute 'createOnInstall' should be either 'yes' or 'no'."); } result.CreateOnInstall = createOnInstall == "yes"; var componentGroupRef = attributeContext.GetInheritedAttribute("componentGroupRef"); if (componentGroupRef != null) { result.ComponentGroupRef = componentGroupRef; } var multiInstance = attributeContext.GetInheritedAttribute("multiInstance"); if (multiInstance != "yes" && multiInstance != "no" && multiInstance != null) { throw new SwixItemParsingException("Optional 'multiInstance' attribute could be only 'yes' or 'no'"); } result.MultiInstance = multiInstance; return(result); }
private void WriteSubDirectories(XmlWriter doc, WixTargetDirectory rootDirectory) { foreach (var directory in rootDirectory.Subdirectories) { doc.WriteStartElement(directory.RefOnly ? "DirectoryRef" : "Directory"); doc.WriteAttributeString("Id", directory.Id); if (!directory.RefOnly) { doc.WriteAttributeString("Name", directory.Name); } WriteSubDirectories(doc, directory); doc.WriteEndElement(); } }
public WixTargetDirCustomization(WixTargetDirectory parent, string registryStorageKey, string wixPublicPropertyName) { Parent = parent; WixPublicPropertyName = wixPublicPropertyName; int idx = registryStorageKey.IndexOf('\\'); if (idx == -1) { throw new SwixItemParsingException("Invalid registry path"); } var regRootStr = registryStorageKey.Substring(0, idx); RegistryRoot regRoot; if (!Enum.TryParse(regRootStr, true, out regRoot)) { throw new SwixItemParsingException("Invalid registry root"); } RegistryRoot = regRoot; RegistryStorageKey = registryStorageKey.Substring(idx + 1); }
private string HandleInlineTargetDir(string targetDirRef, string targetDir) { var path = targetDir.Split('\\'); var dir = _directories[targetDirRef]; foreach (var nextDirName in path) { var nextDir = dir.Subdirectories.Find(subDir => subDir.Name == nextDirName); if (nextDir == null) { nextDir = new WixTargetDirectory(nextDirName, dir); AssignDirectoryUniqueId(nextDir); dir.Subdirectories.Add(nextDir); } dir = nextDir; } var resultingTargetDirRef = dir.Id; return(resultingTargetDirRef); }
private Guid GetCreateOnInstallComponentGuid(WixTargetDirectory createdDir) { return(_guidProvider.Get(SwixGuidType.CreateOnInstallComponent, createdDir.GetFullTargetPath())); }
private string GetCreateOnInstallComponentId(WixTargetDirectory createdDir) { var guid = GetCreateOnInstallComponentGuid(createdDir); return(MakeUniqueId(guid, "CreateOnInstall_" + createdDir.Name, MaxIdLength)); }
private Guid GetRemoveOnUninstallComponentGuid(WixTargetDirectory removedDir) { return(_guidProvider.Get(SwixGuidType.RemoveOnUninstallComponent, removedDir.GetFullTargetPath())); }
private string GetRemoveOnUninstallComponentId(WixTargetDirectory removedDir) { var guid = GetRemoveOnUninstallComponentGuid(removedDir); return(MakeUniqueId(guid, "RemoveOnUninstall_" + removedDir.Name, MaxIdLength)); }
private void VerifyDirectoriesMarkedAsCreateOnInstallOrRemoveOnUninstallOrCustomizedHaveComponentGroupRefSet(WixTargetDirectory root) { var invalidDirectories = TraverseDfs(root, d => d.Subdirectories) .Where(d => (d.RemoveOnUninstall || d.CreateOnInstall || d.Customization != null) && string.IsNullOrWhiteSpace(d.ComponentGroupRef)) .Select(d => d.GetFullTargetPath()) .ToArray(); if (invalidDirectories.Any()) { var dirList = string.Join(", ", invalidDirectories); throw new SwixSemanticException(0, $"Directories {dirList} are customized or marked as createOnInstall/removeOnUninstall but don't have valid ComponentGroupRef assigned"); } }
private void WriteDirectoryCustomizations(XmlWriter doc, WixTargetDirectory rootDirectory) { var customizations = TraverseDfs(rootDirectory, d => d.Subdirectories) .Where(d => d.Customization != null) .Select(d => d.Customization); _additionalComponentIdsByGroups = new Dictionary <string, HashSet <string> >(); foreach (var c in customizations) { // <Property> with RegistrySearch - getting saved value from registry if exists doc.WriteStartElement("Property"); doc.WriteAttributeString("Id", c.WixPublicPropertyName); doc.WriteAttributeString("Secure", "yes"); doc.WriteStartElement("RegistrySearch"); doc.WriteAttributeString("Id", c.WixPublicPropertyName); doc.WriteAttributeString("Root", c.RegistryRoot.ToString()); doc.WriteAttributeString("Key", c.RegistryStorageKey); doc.WriteAttributeString("Name", c.WixPublicPropertyName); doc.WriteAttributeString("Type", "raw"); doc.WriteEndElement(); doc.WriteEndElement(); // first <SetProperty> - setting default value if saved value in registry was not found // and no value was provided to public property explicitly (via command line) string setDefaultValueActionName = null; if (c.DefaultValue != null) { doc.WriteStartElement("SetProperty"); doc.WriteAttributeString("Id", c.Parent.Id); setDefaultValueActionName = GetTargetDirCustomizationActionUniqueName("Set" + c.Parent.Id); doc.WriteAttributeString("Action", setDefaultValueActionName); doc.WriteAttributeString("Before", "CostFinalize"); doc.WriteAttributeString("Sequence", "both"); doc.WriteAttributeString("Value", c.DefaultValue); doc.WriteValue("NOT " + c.WixPublicPropertyName); doc.WriteEndElement(); } // second <SetProperty> - setting public property to result value if it wasn't provided explicitly doc.WriteStartElement("SetProperty"); doc.WriteAttributeString("Id", c.WixPublicPropertyName); doc.WriteAttributeString("After", setDefaultValueActionName ?? "CostFinalize"); doc.WriteAttributeString("Sequence", "execute"); doc.WriteAttributeString("Value", "[" + c.Parent.Id + "]"); doc.WriteValue("NOT " + c.WixPublicPropertyName); doc.WriteEndElement(); // third <SetProperty> - setting result value to public property if it is specified explicitly doc.WriteStartElement("SetProperty"); doc.WriteAttributeString("Id", c.Parent.Id); var readableName = $"Set_{c.Parent.Id}_to_{c.WixPublicPropertyName}"; var resToPublicActionName = GetTargetDirCustomizationActionUniqueName(readableName); doc.WriteAttributeString("Action", resToPublicActionName); doc.WriteAttributeString("Before", "CostFinalize"); doc.WriteAttributeString("Sequence", "both"); doc.WriteAttributeString("Value", "[" + c.WixPublicPropertyName + "]"); doc.WriteValue(c.WixPublicPropertyName); doc.WriteEndElement(); // <DirectoryRef Id="TARGETDIR"> with component for saving value in Registry doc.WriteStartElement("DirectoryRef"); doc.WriteAttributeString("Id", "TARGETDIR"); doc.WriteStartElement("Component"); var componentName = c.WixPublicPropertyName + "_TargetDirCustomizationComponent"; var componentId = GetTargetDirCustomizationComponentId(componentName); doc.WriteAttributeString("Id", componentId); doc.WriteAttributeString("Guid", GetTargetDirCustomizationComponentGuid(componentName).ToString("B").ToUpperInvariant()); doc.WriteAttributeString("KeyPath", "yes"); if (c.Parent.MultiInstance != null) { doc.WriteAttributeString("MultiInstance", c.Parent.MultiInstance); } doc.WriteStartElement("RegistryValue"); doc.WriteAttributeString("Id", GetTargetDirCustomizationRegistryId(c.WixPublicPropertyName + "_RegistryId")); doc.WriteAttributeString("Root", c.RegistryRoot.ToString()); doc.WriteAttributeString("Key", c.RegistryStorageKey); doc.WriteAttributeString("Name", c.WixPublicPropertyName); doc.WriteAttributeString("Value", "[" + c.WixPublicPropertyName + "]"); doc.WriteAttributeString("Type", "string"); doc.WriteAttributeString("KeyPath", "no"); doc.WriteEndElement(); // <RegistryValue ...> doc.WriteEndElement(); // <Component ...> doc.WriteEndElement(); // <DirectoryRef ...> if (!_additionalComponentIdsByGroups.TryGetValue(c.Parent.ComponentGroupRef, out var additionalComponentIds)) { _additionalComponentIdsByGroups[c.Parent.ComponentGroupRef] = additionalComponentIds = new HashSet <string>(); } additionalComponentIds.Add(componentId); } }
public SwixModel() { CabFiles = new List <CabFile>(); RootDirectory = new WixTargetDirectory("root", null); Components = new List <WixComponent>(); }
public WixTargetDirectory(string name, WixTargetDirectory parent) { Name = name; Parent = parent; Subdirectories = new List <WixTargetDirectory>(); }
public DirectoriesSection(int line, IAttributeContext attributeContext, WixTargetDirectory currentDir) : base(line, attributeContext) { _currentDir = currentDir; }