CPackWIX: Add installed file properties for the creation of shortcuts.

This commit is contained in:
Nils Gladitz 2015-02-21 17:30:31 +01:00
parent 53d7daffac
commit 279605f560
9 changed files with 83 additions and 12 deletions

View File

@ -320,8 +320,10 @@ Properties on Installed Files
.. toctree::
:maxdepth: 1
/prop_inst/CPACK_DESKTOP_SHORTCUTS.rst
/prop_inst/CPACK_NEVER_OVERWRITE.rst
/prop_inst/CPACK_PERMANENT.rst
/prop_inst/CPACK_START_MENU_SHORTCUTS.rst
/prop_inst/CPACK_WIX_ACL.rst

View File

@ -0,0 +1,7 @@
CPACK_DESKTOP_SHORTCUTS
-----------------------
Species a list of shortcut names that should be created on the Desktop
for this file.
The property is currently only supported by the WIX generator.

View File

@ -0,0 +1,7 @@
CPACK_START_MENU_SHORTCUTS
--------------------------
Species a list of shortcut names that should be created in the Start Menu
for this file.
The property is currently only supported by the WIX generator.

View File

@ -856,8 +856,8 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
cmWIXDirectoriesSourceWriter& directoryDefinitions,
cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFeaturesSourceWriter& featureDefinitions,
const std::vector<std::string>& packageExecutables,
const std::vector<std::string>& desktopExecutables,
std::vector<std::string> const& packageExecutables,
std::vector<std::string> const& desktopExecutables,
cmWIXShortcuts& shortcuts)
{
cmsys::Directory dir;
@ -943,6 +943,11 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
cmInstalledFile const* installedFile =
this->GetInstalledFile(relativePath);
if(installedFile)
{
shortcuts.CreateFromProperties(id, directoryId, *installedFile);
}
std::string componentId = fileDefinitions.EmitComponentFile(
directoryId, id, fullPath, *(this->Patch), installedFile);

View File

@ -136,7 +136,7 @@ private:
cmWIXDirectoriesSourceWriter& directoryDefinitions,
cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFeaturesSourceWriter& featureDefinitions,
std::vector<std::string> const& pkgExecutables,
std::vector<std::string> const& packageExecutables,
std::vector<std::string> const& desktopExecutables,
cmWIXShortcuts& shortcuts);

View File

@ -28,16 +28,21 @@ cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger,
void cmWIXFilesSourceWriter::EmitShortcut(
std::string const& id,
cmWIXShortcut const& shortcut,
std::string const& shortcutPrefix)
std::string const& shortcutPrefix,
size_t shortcutIndex)
{
std::string shortcutId = shortcutPrefix;
std::stringstream shortcutId;
shortcutId << shortcutPrefix << id;
shortcutId += id;
if(shortcutIndex > 0)
{
shortcutId << "_" << shortcutIndex;
}
std::string fileId = std::string("CM_F") + id;
BeginElement("Shortcut");
AddAttribute("Id", shortcutId);
AddAttribute("Id", shortcutId.str());
AddAttribute("Name", shortcut.label);
std::string target = "[#" + fileId + "]";
AddAttribute("Target", target);

View File

@ -31,7 +31,8 @@ public:
void EmitShortcut(
std::string const& id,
cmWIXShortcut const& shortcut,
std::string const& shortcutPrefix);
std::string const& shortcutPrefix,
size_t shortcutIndex);
void EmitRemoveFolder(std::string const& id);

View File

@ -62,11 +62,12 @@ bool cmWIXShortcuts::EmitShortcuts(
std::string const& id = j->first;
shortcut_list_t const& shortcutList = j->second;
for(shortcut_list_t::const_iterator k = shortcutList.begin();
k != shortcutList.end(); ++k)
for(size_t shortcutListIndex = 0;
shortcutListIndex < shortcutList.size(); ++shortcutListIndex)
{
cmWIXShortcut const& shortcut = *k;
fileDefinitions.EmitShortcut(id, shortcut, shortcutPrefix);
cmWIXShortcut const& shortcut = shortcutList[shortcutListIndex];
fileDefinitions.EmitShortcut(id, shortcut,
shortcutPrefix, shortcutListIndex);
}
}
@ -84,3 +85,34 @@ void cmWIXShortcuts::AddShortcutTypes(std::set<Type>& types)
types.insert(i->first);
}
}
void cmWIXShortcuts::CreateFromProperties(
std::string const& id,
std::string const& directoryId,
cmInstalledFile const& installedFile)
{
CreateFromProperty("CPACK_START_MENU_SHORTCUTS",
START_MENU, id, directoryId, installedFile);
CreateFromProperty("CPACK_DESKTOP_SHORTCUTS",
DESKTOP, id, directoryId, installedFile);
}
void cmWIXShortcuts::CreateFromProperty(
std::string const& propertyName,
Type type,
std::string const& id,
std::string const& directoryId,
cmInstalledFile const& installedFile)
{
std::vector<std::string> list;
installedFile.GetPropertyAsList(propertyName, list);
for(size_t i = 0; i < list.size(); ++i)
{
cmWIXShortcut shortcut;
shortcut.label = list[i];
shortcut.workingDirectoryId = directoryId;
insert(type, id, shortcut);
}
}

View File

@ -18,6 +18,8 @@
#include <set>
#include <vector>
#include <cmInstalledFile.h>
class cmWIXFilesSourceWriter;
struct cmWIXShortcut
@ -50,9 +52,19 @@ public:
void AddShortcutTypes(std::set<Type>& types);
void CreateFromProperties(std::string const& id,
std::string const& directoryId, cmInstalledFile const& installedFile);
private:
typedef std::map<Type, shortcut_id_map_t> shortcut_type_map_t;
void CreateFromProperty(
std::string const& propertyName,
Type type,
std::string const& id,
std::string const& directoryId,
cmInstalledFile const& installedFile);
shortcut_type_map_t Shortcuts;
shortcut_id_map_t EmptyIdMap;
};