Example #1
0
        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;
        }
Example #2
0
 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);
     }
 }
Example #3
0
 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);
     }
 }
Example #4
0
        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);
        }
Example #5
0
 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();
     }
 }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
 private Guid GetCreateOnInstallComponentGuid(WixTargetDirectory createdDir)
 {
     return(_guidProvider.Get(SwixGuidType.CreateOnInstallComponent, createdDir.GetFullTargetPath()));
 }
Example #9
0
        private string GetCreateOnInstallComponentId(WixTargetDirectory createdDir)
        {
            var guid = GetCreateOnInstallComponentGuid(createdDir);

            return(MakeUniqueId(guid, "CreateOnInstall_" + createdDir.Name, MaxIdLength));
        }
Example #10
0
 private Guid GetRemoveOnUninstallComponentGuid(WixTargetDirectory removedDir)
 {
     return(_guidProvider.Get(SwixGuidType.RemoveOnUninstallComponent, removedDir.GetFullTargetPath()));
 }
Example #11
0
        private string GetRemoveOnUninstallComponentId(WixTargetDirectory removedDir)
        {
            var guid = GetRemoveOnUninstallComponentGuid(removedDir);

            return(MakeUniqueId(guid, "RemoveOnUninstall_" + removedDir.Name, MaxIdLength));
        }
Example #12
0
        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");
            }
        }
Example #13
0
        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);
            }
        }
Example #14
0
 public SwixModel()
 {
     CabFiles      = new List <CabFile>();
     RootDirectory = new WixTargetDirectory("root", null);
     Components    = new List <WixComponent>();
 }
Example #15
0
 public WixTargetDirectory(string name, WixTargetDirectory parent)
 {
     Name           = name;
     Parent         = parent;
     Subdirectories = new List <WixTargetDirectory>();
 }
Example #16
0
 public DirectoriesSection(int line, IAttributeContext attributeContext, WixTargetDirectory currentDir)
     : base(line, attributeContext)
 {
     _currentDir = currentDir;
 }