| /*============================================================================ |
| CMake - Cross Platform Makefile Generator |
| Copyright 2014-2015 Kitware, Inc. |
| |
| Distributed under the OSI-approved BSD License (the "License"); |
| see accompanying file Copyright.txt for details. |
| |
| This software is distributed WITHOUT ANY WARRANTY; without even the |
| implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the License for more information. |
| ============================================================================*/ |
| |
| #include "cmWIXFilesSourceWriter.h" |
| #include "cmWIXAccessControlList.h" |
| |
| #include <cmInstalledFile.h> |
| |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| |
| cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger, |
| std::string const& filename): |
| cmWIXSourceWriter(logger, filename) |
| { |
| |
| } |
| |
| void cmWIXFilesSourceWriter::EmitShortcut( |
| std::string const& id, |
| cmWIXShortcut const& shortcut, |
| std::string const& shortcutPrefix, |
| size_t shortcutIndex) |
| { |
| std::stringstream shortcutId; |
| shortcutId << shortcutPrefix << id; |
| |
| if(shortcutIndex > 0) |
| { |
| shortcutId << "_" << shortcutIndex; |
| } |
| |
| std::string fileId = std::string("CM_F") + id; |
| |
| BeginElement("Shortcut"); |
| AddAttribute("Id", shortcutId.str()); |
| AddAttribute("Name", shortcut.label); |
| std::string target = "[#" + fileId + "]"; |
| AddAttribute("Target", target); |
| AddAttribute("WorkingDirectory", shortcut.workingDirectoryId); |
| EndElement("Shortcut"); |
| } |
| |
| void cmWIXFilesSourceWriter::EmitRemoveFolder(std::string const& id) |
| { |
| BeginElement("RemoveFolder"); |
| AddAttribute("Id", id); |
| AddAttribute("On", "uninstall"); |
| EndElement("RemoveFolder"); |
| } |
| |
| void cmWIXFilesSourceWriter::EmitInstallRegistryValue( |
| std::string const& registryKey, |
| std::string const& cpackComponentName, |
| std::string const& suffix) |
| { |
| std::string valueName; |
| if(!cpackComponentName.empty()) |
| { |
| valueName = cpackComponentName + "_"; |
| } |
| |
| valueName += "installed"; |
| valueName += suffix; |
| |
| BeginElement("RegistryValue"); |
| AddAttribute("Root", "HKCU"); |
| AddAttribute("Key", registryKey); |
| AddAttribute("Name", valueName); |
| AddAttribute("Type", "integer"); |
| AddAttribute("Value", "1"); |
| AddAttribute("KeyPath", "yes"); |
| EndElement("RegistryValue"); |
| } |
| |
| void cmWIXFilesSourceWriter::EmitUninstallShortcut( |
| std::string const& packageName) |
| { |
| BeginElement("Shortcut"); |
| AddAttribute("Id", "UNINSTALL"); |
| AddAttribute("Name", "Uninstall " + packageName); |
| AddAttribute("Description", "Uninstalls " + packageName); |
| AddAttribute("Target", "[SystemFolder]msiexec.exe"); |
| AddAttribute("Arguments", "/x [ProductCode]"); |
| EndElement("Shortcut"); |
| } |
| |
| std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder( |
| std::string const& directoryId, |
| std::string const& guid, |
| cmInstalledFile const* installedFile) |
| { |
| std::string componentId = |
| std::string("CM_C_EMPTY_") + directoryId; |
| |
| BeginElement("DirectoryRef"); |
| AddAttribute("Id", directoryId); |
| |
| BeginElement("Component"); |
| AddAttribute("Id", componentId); |
| AddAttribute("Guid", guid); |
| |
| BeginElement("CreateFolder"); |
| |
| if(installedFile) |
| { |
| cmWIXAccessControlList acl(Logger, *installedFile, *this); |
| acl.Apply(); |
| } |
| |
| EndElement("CreateFolder"); |
| EndElement("Component"); |
| EndElement("DirectoryRef"); |
| |
| return componentId; |
| } |
| |
| std::string cmWIXFilesSourceWriter::EmitComponentFile( |
| std::string const& directoryId, |
| std::string const& id, |
| std::string const& filePath, |
| cmWIXPatch &patch, |
| cmInstalledFile const* installedFile) |
| { |
| std::string componentId = std::string("CM_C") + id; |
| std::string fileId = std::string("CM_F") + id; |
| |
| BeginElement("DirectoryRef"); |
| AddAttribute("Id", directoryId); |
| |
| BeginElement("Component"); |
| AddAttribute("Id", componentId); |
| AddAttribute("Guid", "*"); |
| |
| if(installedFile) |
| { |
| if(installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) |
| { |
| AddAttribute("NeverOverwrite", "yes"); |
| } |
| if(installedFile->GetPropertyAsBool("CPACK_PERMANENT")) |
| { |
| AddAttribute("Permanent", "yes"); |
| } |
| } |
| |
| BeginElement("File"); |
| AddAttribute("Id", fileId); |
| AddAttribute("Source", filePath); |
| AddAttribute("KeyPath", "yes"); |
| |
| mode_t fileMode = 0; |
| cmSystemTools::GetPermissions(filePath.c_str(), fileMode); |
| |
| if(!(fileMode & S_IWRITE)) |
| { |
| AddAttribute("ReadOnly", "yes"); |
| } |
| |
| if(installedFile) |
| { |
| cmWIXAccessControlList acl(Logger, *installedFile, *this); |
| acl.Apply(); |
| } |
| |
| patch.ApplyFragment(fileId, *this); |
| EndElement("File"); |
| |
| patch.ApplyFragment(componentId, *this); |
| EndElement("Component"); |
| EndElement("DirectoryRef"); |
| |
| return componentId; |
| } |