From c0010742bbeb52a2a03d50d82d5842228c39305c Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Tue, 30 Jul 2019 13:41:18 -0500 Subject: [PATCH 1/4] Add support to register AppImage With Additional Actions to the IntegrationManager --- .../desktop_integration/IntegrationManager.h | 22 +++++++++++++ .../IntegrationManager.cpp | 15 +++++++++ .../integrator/DesktopEntryEditor.cpp | 32 ++++++++++++++++++ .../integrator/DesktopEntryEditor.h | 23 +++++++++++++ .../integrator/Integrator.cpp | 9 +++++ .../integrator/Integrator.h | 2 ++ .../TestIntegrationManager.cpp | 33 +++++++++++++++++++ .../integrator/TestDesktopEntryEditor.cpp | 26 +++++++++++++++ 8 files changed, 162 insertions(+) diff --git a/include/appimage/desktop_integration/IntegrationManager.h b/include/appimage/desktop_integration/IntegrationManager.h index 0edcd9c7..55c7018d 100644 --- a/include/appimage/desktop_integration/IntegrationManager.h +++ b/include/appimage/desktop_integration/IntegrationManager.h @@ -51,6 +51,28 @@ namespace appimage { */ void registerAppImage(const core::AppImage& appImage) const; + /** + * @brief Register an AppImage in the system adding custom desktop entry actions + * + * Extract the application main desktop entry, icons and mime type packages. Modifies their content to + * properly match the AppImage file location and deploy them into the use XDG_DATA_HOME appending a + * prefix to each file. Such prefix is composed as "__" + * + * The desktop entry actions must follow the specification for additional application actions at https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s11.html. + * The map key should be the action identifier and the value the action fields in a plain string i.e.: + * + * ``` + * std::map additionalApplicationActions = {{"Remove", + * "[Desktop Action Remove]\n" + * "Name=\"Remove application\"\n" + * "Icon=remove\n" + * "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + *``` + * @param appImage + * @param additionalApplicationActions desktop entry actions to be added. + */ + void registerAppImage(const core::AppImage& appImage, std::map additionalApplicationActions) const; + /** * @brief Unregister an AppImage in the system * diff --git a/src/libappimage/desktop_integration/IntegrationManager.cpp b/src/libappimage/desktop_integration/IntegrationManager.cpp index bd098a6f..db5c1a21 100644 --- a/src/libappimage/desktop_integration/IntegrationManager.cpp +++ b/src/libappimage/desktop_integration/IntegrationManager.cpp @@ -79,6 +79,21 @@ namespace appimage { } } + void IntegrationManager::registerAppImage(const core::AppImage &appImage, + std::map additionalApplicationActions) const { + try { + integrator::Integrator i(appImage, d->xdgDataHome); + i.setAdditionalApplicationActions(additionalApplicationActions); + i.integrate(); + } catch (...) { + // Remove any file created during the integration process + unregisterAppImage(appImage.getPath()); + + // Rethrow + throw; + } + } + bool IntegrationManager::isARegisteredAppImage(const std::string& appImagePath) const { // Generate AppImage Id const auto& appImageId = d->generateAppImageId(appImagePath); diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp index 71728a51..426131d0 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include // local #include "DesktopEntryEditor.h" @@ -36,6 +38,8 @@ namespace appimage { appendVersionToName(desktopEntry); + appendApplicationActions(desktopEntry); + // set identifier desktopEntry.set("Desktop Entry/X-AppImage-Identifier", identifier); } @@ -114,6 +118,10 @@ namespace appimage { } } + void DesktopEntryEditor::setAdditionalApplicationActions(std::map additionalApplicationActions) { + DesktopEntryEditor::additionalApplicationActions = std::move(additionalApplicationActions); + } + void DesktopEntryEditor::setExecPaths(XdgUtils::DesktopEntry::DesktopEntry& desktopEntry) { // Edit "Desktop Entry/Exec" DesktopEntryExecValue execValue(desktopEntry.get("Desktop Entry/Exec")); @@ -133,6 +141,30 @@ namespace appimage { desktopEntry.set(keyPath, actionExecValue.dump()); } } + + void DesktopEntryEditor::appendApplicationActions(XdgUtils::DesktopEntry::DesktopEntry &entry) { + for (auto itr = additionalApplicationActions.begin(); itr != additionalApplicationActions.end(); ++itr) { + try { + // validate correctness of the action specification + std::stringstream stringstream(itr->second); + XdgUtils::DesktopEntry::DesktopEntry action(stringstream); + + // Add action + std::string actionsString = static_cast(entry["Desktop Entry/Actions"]); + DesktopEntryStringsValue actions(actionsString); + + actions.append(itr->first); + entry.set("Desktop Entry/Actions", actions.dump()); + + // Add action definition + for (const auto &path: action.paths()) + entry[path] = action.get(path); + + } catch (const DesktopEntryError &error) { + throw DesktopEntryEditError(std::string("Malformed action: ") + error.what()); + } + } + } } } } diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h index 33a499fc..eee93d43 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h @@ -39,6 +39,12 @@ namespace appimage { */ void setIdentifier(const std::string& uuid); + /** + * Set the application actions that must be appended to the desktop entry on edit. + * @param additionalApplicationActions + */ + void setAdditionalApplicationActions(std::map additionalApplicationActions); + /** * Modifies the Desktop Entry according to the set parameters. * @param desktopEntry @@ -50,6 +56,7 @@ namespace appimage { std::string vendorPrefix; std::string appImagePath; std::string appImageVersion; + std::map additionalApplicationActions; /** * Set Exec and TryExec entries in the 'Desktop Entry' and 'Desktop Action' groups pointing to the @@ -71,6 +78,22 @@ namespace appimage { * If none of both options are valid the names will remain unchanged. */ void appendVersionToName(XdgUtils::DesktopEntry::DesktopEntry& entry); + + /** + * @brief Append the additionalApplicationActions to + * The desktop entry actions must follow the specification for additional application actions at https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s11.html. + * The map key should be the action identifier and the value the action fields in a plain string i.e.: + * + * std::map applicationActions = {{"Remove", + * "[Desktop Action Remove]\n" + * "Name=\"Remove application\"\n" + * "Icon=remove\n" + * "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + * + * + * @param entry + */ + void appendApplicationActions(XdgUtils::DesktopEntry::DesktopEntry& entry); }; } diff --git a/src/libappimage/desktop_integration/integrator/Integrator.cpp b/src/libappimage/desktop_integration/integrator/Integrator.cpp index 86ca32b8..895f5a2e 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.cpp +++ b/src/libappimage/desktop_integration/integrator/Integrator.cpp @@ -47,6 +47,7 @@ namespace appimage { core::AppImage appImage; bf::path xdgDataHome; std::string appImageId; + std::map additionalApplicationActions; ResourcesExtractor resourcesExtractor; DesktopEntry desktopEntry; @@ -151,6 +152,10 @@ namespace appimage { editor.setAppImagePath(appImage.getPath()); // Set the identifier to be used while prefixing the icon files editor.setIdentifier(md5str); + + // Set the additional applications actions to be appended + editor.setAdditionalApplicationActions(additionalApplicationActions); + // Apply changes to the desktop entry editor.edit(entry); } @@ -302,6 +307,10 @@ namespace appimage { d->deployMimeTypePackages(); d->setExecutionPermission(); } + + void Integrator::setAdditionalApplicationActions(std::map additionalApplicationActions) { + d->additionalApplicationActions = std::move(additionalApplicationActions); + } } } } diff --git a/src/libappimage/desktop_integration/integrator/Integrator.h b/src/libappimage/desktop_integration/integrator/Integrator.h index 835c40ae..a46e5220 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.h +++ b/src/libappimage/desktop_integration/integrator/Integrator.h @@ -42,6 +42,8 @@ namespace appimage { */ void integrate(); + void setAdditionalApplicationActions(std::map additionalApplicationActions); + private: class Priv; std::unique_ptr d; // opaque pointer diff --git a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp index 54762213..6ef13d7d 100644 --- a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp +++ b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp @@ -4,6 +4,7 @@ // library headers #include #include +#include // local #include "appimage/desktop_integration/exceptions.h" @@ -52,6 +53,38 @@ TEST_F(TestIntegrationManager, registerAppImage) { ASSERT_TRUE(bf::exists(expectedIconFilePath)); } +TEST_F(TestIntegrationManager, registerAppImageWithAdditionalActions) { + std::string appImagePath = TEST_DATA_DIR "Echo-x86_64.AppImage"; + IntegrationManager manager(userDirPath.string()); + appimage::core::AppImage appImage(appImagePath); + std::map applicationActions = {{"Remove", + "[Desktop Action Remove]\n" + "Name=\"Remove application\"\n" + "Name[es]=\"Eliminar aplicación\"\n" + "Icon=remove\n" + "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + + manager.registerAppImage(appImage, applicationActions); + + std::string md5 = appimage::utils::hashPath(appImagePath.c_str()); + + bf::path expectedDesktopFilePath = userDirPath / ("applications/appimagekit_" + md5 + "-Echo.desktop"); + ASSERT_TRUE(bf::exists(expectedDesktopFilePath)); + + bf::path expectedIconFilePath = + userDirPath / ("icons/hicolor/scalable/apps/appimagekit_" + md5 + "_utilities-terminal.svg"); + ASSERT_TRUE(bf::exists(expectedIconFilePath)); + + std::ifstream fin(expectedDesktopFilePath.string()); + XdgUtils::DesktopEntry::DesktopEntry entry(fin); + + ASSERT_EQ(std::string("Remove;"), entry.get("Desktop Entry/Actions")); + ASSERT_EQ(std::string("\"Remove application\""), entry.get("Desktop Action Remove/Name")); + ASSERT_EQ(std::string("\"Eliminar aplicación\""), entry.get("Desktop Action Remove/Name[es]")); + ASSERT_EQ(std::string("remove"), entry.get("Desktop Action Remove/Icon")); + ASSERT_EQ(std::string("remove-appimage-helper /path/to/the/AppImage"), entry.get("Desktop Action Remove/Exec")); +} + TEST_F(TestIntegrationManager, isARegisteredAppImage) { std::string appImagePath = TEST_DATA_DIR "Echo-x86_64.AppImage"; IntegrationManager manager(userDirPath.string()); diff --git a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp index 55bf533e..64cd8eaf 100644 --- a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp +++ b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp @@ -110,3 +110,29 @@ TEST_F(DesktopEntryEditorTests, setIdentifier) { ASSERT_EQ(entry.get("Desktop Entry/X-AppImage-Identifier"), "uuid"); } + +TEST_F(DesktopEntryEditorTests, setAdditionalApplicationActions) { + XdgUtils::DesktopEntry::DesktopEntry entry(originalData); + + DesktopEntryEditor editor; + editor.setVendorPrefix("prefix"); + editor.setIdentifier("uuid"); + editor.setAppImageVersion("0.1.1"); + std::map applicationActions = {{"Remove", + "[Desktop Action Remove]\n" + "Name=\"Remove application\"\n" + "Name[es]=\"Eliminar aplicación\"\n" + "Icon=remove\n" + "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + + editor.setAdditionalApplicationActions(applicationActions); + editor.edit(entry); + + ASSERT_EQ(entry.get("Desktop Entry/X-AppImage-Identifier"), "uuid"); + + ASSERT_EQ(std::string("Gallery;Create;Remove;"), entry.get("Desktop Entry/Actions")); + ASSERT_EQ(std::string("\"Remove application\""), entry.get("Desktop Action Remove/Name")); + ASSERT_EQ(std::string("\"Eliminar aplicación\""), entry.get("Desktop Action Remove/Name[es]")); + ASSERT_EQ(std::string("remove"), entry.get("Desktop Action Remove/Icon")); + ASSERT_EQ(std::string("remove-appimage-helper /path/to/the/AppImage"), entry.get("Desktop Action Remove/Exec")); +} \ No newline at end of file From 390a4eb24a98096af3c2d1f058db1ac2987490dc Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Sun, 4 Aug 2019 19:57:26 -0500 Subject: [PATCH 2/4] Add new line at the end of the file --- .../desktop_integration/integrator/TestDesktopEntryEditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp index 64cd8eaf..bf015fda 100644 --- a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp +++ b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp @@ -135,4 +135,4 @@ TEST_F(DesktopEntryEditorTests, setAdditionalApplicationActions) { ASSERT_EQ(std::string("\"Eliminar aplicación\""), entry.get("Desktop Action Remove/Name[es]")); ASSERT_EQ(std::string("remove"), entry.get("Desktop Action Remove/Icon")); ASSERT_EQ(std::string("remove-appimage-helper /path/to/the/AppImage"), entry.get("Desktop Action Remove/Exec")); -} \ No newline at end of file +} From 4ea9eb0895d3dcf22763a16d5dfc7749c3d5551d Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Sun, 4 Aug 2019 20:20:49 -0500 Subject: [PATCH 3/4] Use std::vector> to hold the application actions on the registerAppImage method --- .../desktop_integration/IntegrationManager.h | 10 ++++++++-- .../desktop_integration/IntegrationManager.cpp | 2 +- .../integrator/DesktopEntryEditor.cpp | 2 +- .../integrator/DesktopEntryEditor.h | 5 +++-- .../desktop_integration/integrator/Integrator.cpp | 5 +++-- .../desktop_integration/integrator/Integrator.h | 3 ++- .../desktop_integration/TestIntegrationManager.cpp | 14 +++++++------- .../integrator/TestDesktopEntryEditor.cpp | 12 ++++++------ 8 files changed, 31 insertions(+), 22 deletions(-) diff --git a/include/appimage/desktop_integration/IntegrationManager.h b/include/appimage/desktop_integration/IntegrationManager.h index 55c7018d..a7bb4238 100644 --- a/include/appimage/desktop_integration/IntegrationManager.h +++ b/include/appimage/desktop_integration/IntegrationManager.h @@ -12,6 +12,12 @@ namespace appimage { namespace desktop_integration { + /** + * Hold actions to be added to the Desktop Entries while being registered in the system. + * The first value must hold the _action name_ and the second value the _whole action section_ + */ + typedef std::vector> ApplicationActionList; + class IntegrationManager { public: /** @@ -62,7 +68,7 @@ namespace appimage { * The map key should be the action identifier and the value the action fields in a plain string i.e.: * * ``` - * std::map additionalApplicationActions = {{"Remove", + * ApplicationActionList additionalApplicationActions = {{"Remove", * "[Desktop Action Remove]\n" * "Name=\"Remove application\"\n" * "Icon=remove\n" @@ -71,7 +77,7 @@ namespace appimage { * @param appImage * @param additionalApplicationActions desktop entry actions to be added. */ - void registerAppImage(const core::AppImage& appImage, std::map additionalApplicationActions) const; + void registerAppImage(const core::AppImage& appImage, ApplicationActionList additionalApplicationActions) const; /** * @brief Unregister an AppImage in the system diff --git a/src/libappimage/desktop_integration/IntegrationManager.cpp b/src/libappimage/desktop_integration/IntegrationManager.cpp index db5c1a21..cf9626ad 100644 --- a/src/libappimage/desktop_integration/IntegrationManager.cpp +++ b/src/libappimage/desktop_integration/IntegrationManager.cpp @@ -80,7 +80,7 @@ namespace appimage { } void IntegrationManager::registerAppImage(const core::AppImage &appImage, - std::map additionalApplicationActions) const { + ApplicationActionList additionalApplicationActions) const { try { integrator::Integrator i(appImage, d->xdgDataHome); i.setAdditionalApplicationActions(additionalApplicationActions); diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp index 426131d0..fe6eb13a 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp @@ -118,7 +118,7 @@ namespace appimage { } } - void DesktopEntryEditor::setAdditionalApplicationActions(std::map additionalApplicationActions) { + void DesktopEntryEditor::setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions) { DesktopEntryEditor::additionalApplicationActions = std::move(additionalApplicationActions); } diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h index eee93d43..80acce2b 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h @@ -6,6 +6,7 @@ // local #include +#include namespace appimage { namespace desktop_integration { @@ -43,7 +44,7 @@ namespace appimage { * Set the application actions that must be appended to the desktop entry on edit. * @param additionalApplicationActions */ - void setAdditionalApplicationActions(std::map additionalApplicationActions); + void setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions); /** * Modifies the Desktop Entry according to the set parameters. @@ -56,7 +57,7 @@ namespace appimage { std::string vendorPrefix; std::string appImagePath; std::string appImageVersion; - std::map additionalApplicationActions; + ApplicationActionList additionalApplicationActions; /** * Set Exec and TryExec entries in the 'Desktop Entry' and 'Desktop Action' groups pointing to the diff --git a/src/libappimage/desktop_integration/integrator/Integrator.cpp b/src/libappimage/desktop_integration/integrator/Integrator.cpp index 895f5a2e..51169d97 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.cpp +++ b/src/libappimage/desktop_integration/integrator/Integrator.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "utils/Logger.h" #include "utils/hashlib.h" @@ -47,7 +48,7 @@ namespace appimage { core::AppImage appImage; bf::path xdgDataHome; std::string appImageId; - std::map additionalApplicationActions; + ApplicationActionList additionalApplicationActions; ResourcesExtractor resourcesExtractor; DesktopEntry desktopEntry; @@ -308,7 +309,7 @@ namespace appimage { d->setExecutionPermission(); } - void Integrator::setAdditionalApplicationActions(std::map additionalApplicationActions) { + void Integrator::setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions) { d->additionalApplicationActions = std::move(additionalApplicationActions); } } diff --git a/src/libappimage/desktop_integration/integrator/Integrator.h b/src/libappimage/desktop_integration/integrator/Integrator.h index a46e5220..3dec2ebb 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.h +++ b/src/libappimage/desktop_integration/integrator/Integrator.h @@ -6,6 +6,7 @@ // local #include +#include #include "constants.h" namespace appimage { @@ -42,7 +43,7 @@ namespace appimage { */ void integrate(); - void setAdditionalApplicationActions(std::map additionalApplicationActions); + void setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions); private: class Priv; diff --git a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp index 6ef13d7d..5fa2a468 100644 --- a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp +++ b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp @@ -30,7 +30,7 @@ class TestIntegrationManager : public ::testing::Test { bf::remove_all(userDirPath); } - void createStubFile(const bf::path& path, const std::string& content = "") { + void createStubFile(const bf::path &path, const std::string &content = "") { bf::create_directories(path.parent_path()); bf::ofstream f(path); f << content; @@ -57,12 +57,12 @@ TEST_F(TestIntegrationManager, registerAppImageWithAdditionalActions) { std::string appImagePath = TEST_DATA_DIR "Echo-x86_64.AppImage"; IntegrationManager manager(userDirPath.string()); appimage::core::AppImage appImage(appImagePath); - std::map applicationActions = {{"Remove", - "[Desktop Action Remove]\n" - "Name=\"Remove application\"\n" - "Name[es]=\"Eliminar aplicación\"\n" - "Icon=remove\n" - "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + ApplicationActionList applicationActions = {{"Remove", + "[Desktop Action Remove]\n" + "Name=\"Remove application\"\n" + "Name[es]=\"Eliminar aplicación\"\n" + "Icon=remove\n" + "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; manager.registerAppImage(appImage, applicationActions); diff --git a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp index bf015fda..608bc5d7 100644 --- a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp +++ b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp @@ -118,12 +118,12 @@ TEST_F(DesktopEntryEditorTests, setAdditionalApplicationActions) { editor.setVendorPrefix("prefix"); editor.setIdentifier("uuid"); editor.setAppImageVersion("0.1.1"); - std::map applicationActions = {{"Remove", - "[Desktop Action Remove]\n" - "Name=\"Remove application\"\n" - "Name[es]=\"Eliminar aplicación\"\n" - "Icon=remove\n" - "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + appimage::desktop_integration::ApplicationActionList applicationActions = {{"Remove", + "[Desktop Action Remove]\n" + "Name=\"Remove application\"\n" + "Name[es]=\"Eliminar aplicación\"\n" + "Icon=remove\n" + "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; editor.setAdditionalApplicationActions(applicationActions); editor.edit(entry); From a9a17c5ba2b4c1fca8f53773f390b5908c5d9c08 Mon Sep 17 00:00:00 2001 From: Alexis Lopez Zubieta Date: Mon, 5 Aug 2019 12:53:47 -0500 Subject: [PATCH 4/4] Use std::unordered_map for application actions --- .../desktop_integration/IntegrationManager.h | 12 ++++-------- .../desktop_integration/IntegrationManager.cpp | 2 +- .../integrator/DesktopEntryEditor.cpp | 2 +- .../integrator/DesktopEntryEditor.h | 4 ++-- .../desktop_integration/integrator/Integrator.cpp | 4 ++-- .../desktop_integration/integrator/Integrator.h | 8 ++++++-- .../desktop_integration/TestIntegrationManager.cpp | 11 +++++++---- .../integrator/TestDesktopEntryEditor.cpp | 12 ++++++------ 8 files changed, 29 insertions(+), 26 deletions(-) diff --git a/include/appimage/desktop_integration/IntegrationManager.h b/include/appimage/desktop_integration/IntegrationManager.h index a7bb4238..a845f7e8 100644 --- a/include/appimage/desktop_integration/IntegrationManager.h +++ b/include/appimage/desktop_integration/IntegrationManager.h @@ -4,20 +4,16 @@ #include #include #include +#include // local #include #include #include + namespace appimage { namespace desktop_integration { - /** - * Hold actions to be added to the Desktop Entries while being registered in the system. - * The first value must hold the _action name_ and the second value the _whole action section_ - */ - typedef std::vector> ApplicationActionList; - class IntegrationManager { public: /** @@ -68,7 +64,7 @@ namespace appimage { * The map key should be the action identifier and the value the action fields in a plain string i.e.: * * ``` - * ApplicationActionList additionalApplicationActions = {{"Remove", + * std::unordered_map additionalApplicationActions = {{"Remove", * "[Desktop Action Remove]\n" * "Name=\"Remove application\"\n" * "Icon=remove\n" @@ -77,7 +73,7 @@ namespace appimage { * @param appImage * @param additionalApplicationActions desktop entry actions to be added. */ - void registerAppImage(const core::AppImage& appImage, ApplicationActionList additionalApplicationActions) const; + void registerAppImage(const core::AppImage& appImage, std::unordered_map additionalApplicationActions) const; /** * @brief Unregister an AppImage in the system diff --git a/src/libappimage/desktop_integration/IntegrationManager.cpp b/src/libappimage/desktop_integration/IntegrationManager.cpp index cf9626ad..24c5edc7 100644 --- a/src/libappimage/desktop_integration/IntegrationManager.cpp +++ b/src/libappimage/desktop_integration/IntegrationManager.cpp @@ -80,7 +80,7 @@ namespace appimage { } void IntegrationManager::registerAppImage(const core::AppImage &appImage, - ApplicationActionList additionalApplicationActions) const { + std::unordered_map additionalApplicationActions) const { try { integrator::Integrator i(appImage, d->xdgDataHome); i.setAdditionalApplicationActions(additionalApplicationActions); diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp index fe6eb13a..ab2c123d 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.cpp @@ -118,7 +118,7 @@ namespace appimage { } } - void DesktopEntryEditor::setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions) { + void DesktopEntryEditor::setAdditionalApplicationActions(std::unordered_map additionalApplicationActions) { DesktopEntryEditor::additionalApplicationActions = std::move(additionalApplicationActions); } diff --git a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h index 80acce2b..e186e8af 100644 --- a/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h +++ b/src/libappimage/desktop_integration/integrator/DesktopEntryEditor.h @@ -44,7 +44,7 @@ namespace appimage { * Set the application actions that must be appended to the desktop entry on edit. * @param additionalApplicationActions */ - void setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions); + void setAdditionalApplicationActions(std::unordered_map additionalApplicationActions); /** * Modifies the Desktop Entry according to the set parameters. @@ -57,7 +57,7 @@ namespace appimage { std::string vendorPrefix; std::string appImagePath; std::string appImageVersion; - ApplicationActionList additionalApplicationActions; + std::unordered_map additionalApplicationActions; /** * Set Exec and TryExec entries in the 'Desktop Entry' and 'Desktop Action' groups pointing to the diff --git a/src/libappimage/desktop_integration/integrator/Integrator.cpp b/src/libappimage/desktop_integration/integrator/Integrator.cpp index 51169d97..26dfbad3 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.cpp +++ b/src/libappimage/desktop_integration/integrator/Integrator.cpp @@ -48,7 +48,7 @@ namespace appimage { core::AppImage appImage; bf::path xdgDataHome; std::string appImageId; - ApplicationActionList additionalApplicationActions; + std::unordered_map additionalApplicationActions; ResourcesExtractor resourcesExtractor; DesktopEntry desktopEntry; @@ -309,7 +309,7 @@ namespace appimage { d->setExecutionPermission(); } - void Integrator::setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions) { + void Integrator::setAdditionalApplicationActions(std::unordered_map additionalApplicationActions) { d->additionalApplicationActions = std::move(additionalApplicationActions); } } diff --git a/src/libappimage/desktop_integration/integrator/Integrator.h b/src/libappimage/desktop_integration/integrator/Integrator.h index 3dec2ebb..8a593c63 100644 --- a/src/libappimage/desktop_integration/integrator/Integrator.h +++ b/src/libappimage/desktop_integration/integrator/Integrator.h @@ -34,6 +34,12 @@ namespace appimage { virtual ~Integrator(); + /** + * Sets to be added to the application desktop entry. + * @param additionalApplicationActions + */ + void setAdditionalApplicationActions(std::unordered_map additionalApplicationActions); + /** * @brief Perform the AppImage integration into the Desktop Environment * @@ -43,8 +49,6 @@ namespace appimage { */ void integrate(); - void setAdditionalApplicationActions(ApplicationActionList additionalApplicationActions); - private: class Priv; std::unique_ptr d; // opaque pointer diff --git a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp index 5fa2a468..7cbbe43a 100644 --- a/tests/libappimage/desktop_integration/TestIntegrationManager.cpp +++ b/tests/libappimage/desktop_integration/TestIntegrationManager.cpp @@ -57,7 +57,7 @@ TEST_F(TestIntegrationManager, registerAppImageWithAdditionalActions) { std::string appImagePath = TEST_DATA_DIR "Echo-x86_64.AppImage"; IntegrationManager manager(userDirPath.string()); appimage::core::AppImage appImage(appImagePath); - ApplicationActionList applicationActions = {{"Remove", + std::unordered_map applicationActions = {{"Remove", "[Desktop Action Remove]\n" "Name=\"Remove application\"\n" "Name[es]=\"Eliminar aplicación\"\n" @@ -107,11 +107,14 @@ TEST_F(TestIntegrationManager, shallAppImageBeRegistered) { IntegrationManager manager; ASSERT_TRUE(manager.shallAppImageBeRegistered( - appimage::core::AppImage(TEST_DATA_DIR "Echo-x86_64.AppImage"))); + appimage::core::AppImage(TEST_DATA_DIR + "Echo-x86_64.AppImage"))); ASSERT_FALSE(manager.shallAppImageBeRegistered( - appimage::core::AppImage(TEST_DATA_DIR "Echo-no-integrate-x86_64.AppImage"))); + appimage::core::AppImage(TEST_DATA_DIR + "Echo-no-integrate-x86_64.AppImage"))); ASSERT_THROW(manager.shallAppImageBeRegistered( - appimage::core::AppImage(TEST_DATA_DIR "elffile")), appimage::core::AppImageError); + appimage::core::AppImage(TEST_DATA_DIR + "elffile")), appimage::core::AppImageError); } diff --git a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp index 608bc5d7..887290d2 100644 --- a/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp +++ b/tests/libappimage/desktop_integration/integrator/TestDesktopEntryEditor.cpp @@ -118,12 +118,12 @@ TEST_F(DesktopEntryEditorTests, setAdditionalApplicationActions) { editor.setVendorPrefix("prefix"); editor.setIdentifier("uuid"); editor.setAppImageVersion("0.1.1"); - appimage::desktop_integration::ApplicationActionList applicationActions = {{"Remove", - "[Desktop Action Remove]\n" - "Name=\"Remove application\"\n" - "Name[es]=\"Eliminar aplicación\"\n" - "Icon=remove\n" - "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; + std::unordered_map applicationActions = {{"Remove", + "[Desktop Action Remove]\n" + "Name=\"Remove application\"\n" + "Name[es]=\"Eliminar aplicación\"\n" + "Icon=remove\n" + "Exec=remove-appimage-helper /path/to/the/AppImage\n"}}; editor.setAdditionalApplicationActions(applicationActions); editor.edit(entry);