mirror of
https://github.com/GerbilSoft/rom-properties.git
synced 2025-06-19 12:05:43 -04:00
[kde5] RpOverlayIconPlugin: New plugin (and forwarder) for overlay icons.
Currently returns "security-medium" for all URLs. TODO: - The JSON file is not currently used. Should use kcoreaddons_add_plugin() in CMake to make use of it. - Consolidate common code in the plugin forwarders into a templated class. (Or don't; it's not *that* much duplicated code...) - Actually check the RomData subclass for overlay icons.
This commit is contained in:
parent
78beb4b3a6
commit
79cffa4975
1
debian/rom-properties-kde5.install
vendored
1
debian/rom-properties-kde5.install
vendored
@ -1,3 +1,4 @@
|
||||
usr/lib/*/qt5/plugins/rom-properties-kde5.so
|
||||
usr/lib/*/qt5/plugins/kf5/kfilemetadata/kfilemetadata_rom-properties-kde5.so
|
||||
usr/lib/*/qt5/plugins/kf5/overlayicon/overlayiconplugin_rom-properties-kde5.so
|
||||
usr/share/kservices5/rom-properties-kde5.desktop
|
||||
|
@ -73,6 +73,7 @@ IF(ECM_MODULE_PATH AND ECM_KDE_MODULE_DIR)
|
||||
|
||||
# TODO: Can we get the subdirectory from KFileMetaData?
|
||||
SET(KFMD_PLUGIN_INSTALL_DIR "${PLUGIN_INSTALL_DIR}/kf5/kfilemetadata")
|
||||
SET(KFOV_PLUGIN_INSTALL_DIR "${PLUGIN_INSTALL_DIR}/kf5/overlayicon")
|
||||
ELSE()
|
||||
# Qt5 not found.
|
||||
SET(BUILD_KDE5 OFF CACHE "" INTERNAL FORCE)
|
||||
@ -91,11 +92,13 @@ STRING(REGEX REPLACE "([^;]+)" "../\\1" rom-properties-kde5_UIS "${rom-properti
|
||||
SET(rom-properties-kde5_SRCS
|
||||
${rom-properties-kde5_SRCS}
|
||||
RpExtractorPlugin.cpp
|
||||
RpOverlayIconPlugin.cpp
|
||||
RomPropertiesDialogPluginFactoryKDE5.cpp
|
||||
)
|
||||
SET(rom-properties-kde5_H
|
||||
${rom-properties-kde5_H}
|
||||
RpExtractorPlugin.hpp
|
||||
RpOverlayIconPlugin.hpp
|
||||
)
|
||||
|
||||
IF(COMMAND QT5_WRAP_UI)
|
||||
@ -152,12 +155,30 @@ IF(BUILD_KDE5)
|
||||
TARGET_COMPILE_DEFINITIONS(kfilemetadata_rom-properties-kde5
|
||||
PRIVATE PLUGIN_INSTALL_DIR=\"${PLUGIN_INSTALL_DIR}\"
|
||||
)
|
||||
|
||||
# Link in libdl if it's required for dlopen().
|
||||
IF(CMAKE_DL_LIBS)
|
||||
TARGET_LINK_LIBRARIES(kfilemetadata_rom-properties-kde5 ${CMAKE_DL_LIBS})
|
||||
ENDIF(CMAKE_DL_LIBS)
|
||||
|
||||
# RpOverlayIconPluginForwarder
|
||||
# TODO: Use kcoreaddons_add_plugin() for the JSON?
|
||||
# https://github.com/owncloud/client/blob/master/shell_integration/dolphin/CMakeLists.txt
|
||||
# TODO: Better name.
|
||||
ADD_LIBRARY(overlayiconplugin_rom-properties-kde5 MODULE
|
||||
RpOverlayIconPluginForwarder.cpp
|
||||
RpOverlayIconPluginForwarder.hpp
|
||||
)
|
||||
SET_TARGET_PROPERTIES(overlayiconplugin_rom-properties-kde5 PROPERTIES PREFIX "")
|
||||
DO_SPLIT_DEBUG(overlayiconplugin_rom-properties-kde5)
|
||||
TARGET_LINK_LIBRARIES(overlayiconplugin_rom-properties-kde5 KF5::KIOCore KF5::KIOWidgets)
|
||||
TARGET_COMPILE_DEFINITIONS(overlayiconplugin_rom-properties-kde5
|
||||
PRIVATE PLUGIN_INSTALL_DIR=\"${PLUGIN_INSTALL_DIR}\"
|
||||
)
|
||||
# Link in libdl if it's required for dlopen().
|
||||
IF(CMAKE_DL_LIBS)
|
||||
TARGET_LINK_LIBRARIES(overlayiconplugin_rom-properties-kde5 ${CMAKE_DL_LIBS})
|
||||
ENDIF(CMAKE_DL_LIBS)
|
||||
|
||||
# FIXME: Workaround for gcc-5.4.0 LTO bug.
|
||||
# Disabling LTO for the KDE5 build if using gcc-5.4.0 or earlier,
|
||||
# and decryption is enabled. (It crashes when compiling the moc
|
||||
@ -187,6 +208,10 @@ IF(BUILD_KDE5)
|
||||
LIBRARY DESTINATION "${KFMD_PLUGIN_INSTALL_DIR}"
|
||||
COMPONENT "plugin"
|
||||
)
|
||||
INSTALL(TARGETS overlayiconplugin_rom-properties-kde5
|
||||
LIBRARY DESTINATION "${KFOV_PLUGIN_INSTALL_DIR}"
|
||||
COMPONENT "plugin"
|
||||
)
|
||||
INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/rom-properties-kde5.desktop"
|
||||
DESTINATION "${SERVICES_INSTALL_DIR}"
|
||||
COMPONENT "plugin"
|
||||
@ -211,5 +236,13 @@ IF(BUILD_KDE5)
|
||||
COMPONENT "debug"
|
||||
)
|
||||
ENDIF(DEBUG_FILENAME)
|
||||
|
||||
GET_TARGET_PROPERTY(DEBUG_FILENAME overlayiconplugin_rom-properties-kde5 PDB)
|
||||
IF(DEBUG_FILENAME)
|
||||
INSTALL(FILES "${DEBUG_FILENAME}"
|
||||
DESTINATION "lib/debug/${CMAKE_INSTALL_PREFIX}/${KFOV_PLUGIN_INSTALL_DIR}"
|
||||
COMPONENT "debug"
|
||||
)
|
||||
ENDIF(DEBUG_FILENAME)
|
||||
ENDIF(INSTALL_DEBUG)
|
||||
ENDIF(BUILD_KDE5)
|
||||
|
91
src/kde/kde5/RpOverlayIconPlugin.cpp
Normal file
91
src/kde/kde5/RpOverlayIconPlugin.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
/***************************************************************************
|
||||
* ROM Properties Page shell extension. (KDE) *
|
||||
* RpOverlayIconPlugin.cpp: KOverlayIconPlugin. *
|
||||
* *
|
||||
* Qt's plugin system prevents a single shared library from exporting *
|
||||
* multiple plugins, so this file acts as a KOverlayIconPlugin, *
|
||||
* and then forwards the request to the main library. *
|
||||
* *
|
||||
* Copyright (c) 2018 by David Korth. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms of the GNU General Public License as published by the *
|
||||
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||
* option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "RpOverlayIconPlugin.hpp"
|
||||
|
||||
// librpbase
|
||||
#include "librpbase/RomData.hpp"
|
||||
#include "librpbase/file/RpFile.hpp"
|
||||
using LibRpBase::RomData;
|
||||
using LibRpBase::IRpFile;
|
||||
using LibRpBase::RpFile;
|
||||
|
||||
// libromdata
|
||||
#include "libromdata/RomDataFactory.hpp"
|
||||
using LibRomData::RomDataFactory;
|
||||
|
||||
// C includes. (C++ namespace)
|
||||
#include <cassert>
|
||||
|
||||
// C++ includes.
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::vector;
|
||||
|
||||
// Qt includes.
|
||||
#include <QtCore/QDateTime>
|
||||
|
||||
// KDE includes.
|
||||
#include <kfilemetadata/extractorplugin.h>
|
||||
#include <kfilemetadata/properties.h>
|
||||
using KFileMetaData::ExtractorPlugin;
|
||||
using KFileMetaData::ExtractionResult;
|
||||
using namespace KFileMetaData::Property;
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
|
||||
#include <kfileitem.h>
|
||||
|
||||
namespace RomPropertiesKDE {
|
||||
|
||||
/**
|
||||
* Factory method.
|
||||
* NOTE: Unlike the ThumbCreator version, this one is specific to
|
||||
* rom-properties, and is called by a forwarder library.
|
||||
*/
|
||||
extern "C" {
|
||||
Q_DECL_EXPORT RpOverlayIconPlugin *PFN_CREATEOVERLAYICONPLUGINKDE_FN(QObject *parent)
|
||||
{
|
||||
return new RpOverlayIconPlugin(parent);
|
||||
}
|
||||
}
|
||||
|
||||
RpOverlayIconPlugin::RpOverlayIconPlugin(QObject *parent)
|
||||
: super(parent)
|
||||
{ }
|
||||
|
||||
QStringList RpOverlayIconPlugin::getOverlays(const QUrl &item)
|
||||
{
|
||||
// TODO: Check the RomData object.
|
||||
QStringList sl;
|
||||
sl += QLatin1String("security-medium");
|
||||
return sl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif /* QT_VERSION >= QT_VERSION_CHECK(5,0,0) */
|
69
src/kde/kde5/RpOverlayIconPlugin.hpp
Normal file
69
src/kde/kde5/RpOverlayIconPlugin.hpp
Normal file
@ -0,0 +1,69 @@
|
||||
/***************************************************************************
|
||||
* ROM Properties Page shell extension. (KDE) *
|
||||
* RpOverlayIconPlugin.hpp: KOverlayIconPlugin. *
|
||||
* *
|
||||
* Qt's plugin system prevents a single shared library from exporting *
|
||||
* multiple plugins, so this file acts as a KOverlayIconPlugin, *
|
||||
* and then forwards the request to the main library. *
|
||||
* *
|
||||
* Copyright (c) 2018 by David Korth. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms of the GNU General Public License as published by the *
|
||||
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||
* option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __ROMPROPERTIES_KDE_RPOVERLAYICONPLUGIN_HPP__
|
||||
#define __ROMPROPERTIES_KDE_RPOVERLAYICONPLUGIN_HPP__
|
||||
|
||||
// FIXME: Test on KDE4.
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
|
||||
#include <KOverlayIconPlugin>
|
||||
|
||||
namespace RomPropertiesKDE {
|
||||
|
||||
class RpOverlayIconPlugin : public KOverlayIconPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
//Q_INTERFACES(KOverlayIconPlugin)
|
||||
|
||||
public:
|
||||
explicit RpOverlayIconPlugin(QObject *parent = nullptr);
|
||||
|
||||
private:
|
||||
typedef KOverlayIconPlugin super;
|
||||
Q_DISABLE_COPY(RpOverlayIconPlugin);
|
||||
|
||||
public:
|
||||
QStringList getOverlays(const QUrl &item) final;
|
||||
};
|
||||
|
||||
// Exported function pointer to create a new RpExtractorPlugin.
|
||||
typedef RpOverlayIconPlugin* (*pfn_createOverlayIconPluginKDE_t)(QObject *parent);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
|
||||
# error Qt6 is not supported.
|
||||
#elif QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
# define PFN_CREATEOVERLAYICONPLUGINKDE_FN createOverlayIconPluginKDE5
|
||||
# define PFN_CREATEOVERLAYICONPLUGINKDE_NAME "createOverlayIconPluginKDE5"
|
||||
#else /* QT_VERSION < QT_VERSION_CHECK(5,0,0) */
|
||||
# define PFN_CREATEOVERLAYICONPLUGINKDE_FN createOverlayIconPluginKDE4
|
||||
# define PFN_CREATEOVERLAYICONPLUGINKDE_NAME "createOverlayIconPluginKDE4"
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif /* QT_VERSION >= QT_VERSION_CHECK(5,0,0) */
|
||||
|
||||
#endif /* __ROMPROPERTIES_KDE_RPOVERLAYICONPLUGIN_HPP__ */
|
119
src/kde/kde5/RpOverlayIconPluginForwarder.cpp
Normal file
119
src/kde/kde5/RpOverlayIconPluginForwarder.cpp
Normal file
@ -0,0 +1,119 @@
|
||||
/***************************************************************************
|
||||
* ROM Properties Page shell extension. (KDE) *
|
||||
* RpOverlayIconPluginForwarder.cpp: KOverlayIconPlugin forwarder. *
|
||||
* *
|
||||
* Qt's plugin system prevents a single shared library from exporting *
|
||||
* multiple plugins, so this file acts as a KOverlayIconPlugin, *
|
||||
* and then forwards the request to the main library. *
|
||||
* *
|
||||
* Copyright (c) 2018 by David Korth. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms of the GNU General Public License as published by the *
|
||||
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||
* option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "RpOverlayIconPluginForwarder.hpp"
|
||||
#include "RpOverlayIconPlugin.hpp"
|
||||
|
||||
// C includes.
|
||||
#include <dlfcn.h>
|
||||
|
||||
// KDE includes.
|
||||
#include <KOverlayIconPlugin>
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
|
||||
#include <kfileitem.h>
|
||||
|
||||
namespace RomPropertiesKDE {
|
||||
|
||||
RpOverlayIconPluginForwarder::RpOverlayIconPluginForwarder(QObject *parent)
|
||||
: super(parent)
|
||||
, hRpKdeSo(nullptr)
|
||||
, fwd_plugin(nullptr)
|
||||
{
|
||||
#ifndef PLUGIN_INSTALL_DIR
|
||||
# error PLUGIN_INSTALL_DIR is not set.
|
||||
#endif
|
||||
// FIXME: Check the .desktop file?
|
||||
QString pluginPath(QString::fromUtf8(PLUGIN_INSTALL_DIR));
|
||||
pluginPath += QLatin1String("/rom-properties-kde5.so");
|
||||
|
||||
// Attempt to load the plugin.
|
||||
hRpKdeSo = dlopen(pluginPath.toUtf8().constData(), RTLD_LOCAL|RTLD_LAZY);
|
||||
if (!hRpKdeSo) {
|
||||
// Unable to open the plugin.
|
||||
// NOTE: We can't use mismatched plugins here.
|
||||
return;
|
||||
}
|
||||
|
||||
// Load the symbol.
|
||||
pfn_createOverlayIconPluginKDE_t pfn = reinterpret_cast<pfn_createOverlayIconPluginKDE_t>(
|
||||
dlsym(hRpKdeSo, PFN_CREATEOVERLAYICONPLUGINKDE_NAME));
|
||||
if (!pfn) {
|
||||
// Symbol not found.
|
||||
dlclose(hRpKdeSo);
|
||||
hRpKdeSo = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
// Create an RpOverlayIconPlugin object.
|
||||
fwd_plugin = pfn(this);
|
||||
if (!fwd_plugin) {
|
||||
// Unable to create an RpOverlayIconPlugin object.
|
||||
dlclose(hRpKdeSo);
|
||||
hRpKdeSo = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure we know if the OverlayPlugin gets deleted.
|
||||
// This *shouldn't* happen, but it's possible that our parent
|
||||
// object enumerates child objects and does weird things.
|
||||
connect(fwd_plugin, SIGNAL(destroyed(QObject*)),
|
||||
this, SLOT(fwd_plugin_destroyed(QObject*)));
|
||||
}
|
||||
|
||||
RpOverlayIconPluginForwarder::~RpOverlayIconPluginForwarder()
|
||||
{
|
||||
delete fwd_plugin;
|
||||
|
||||
// FIXME: What does dlclose(nullptr) do?
|
||||
if (hRpKdeSo) {
|
||||
dlclose(hRpKdeSo);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList RpOverlayIconPluginForwarder::getOverlays(const QUrl &item)
|
||||
{
|
||||
if (fwd_plugin) {
|
||||
return fwd_plugin->getOverlays(item);
|
||||
}
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
/**
|
||||
* fwd_plugin was destroyed.
|
||||
* @param obj
|
||||
*/
|
||||
void RpOverlayIconPluginForwarder::fwd_plugin_destroyed(QObject *obj)
|
||||
{
|
||||
if (obj == fwd_plugin) {
|
||||
// Object matches.
|
||||
// NULL it out so we don't have problems later.
|
||||
fwd_plugin = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif /* QT_VERSION >= QT_VERSION_CHECK(5,0,0) */
|
74
src/kde/kde5/RpOverlayIconPluginForwarder.hpp
Normal file
74
src/kde/kde5/RpOverlayIconPluginForwarder.hpp
Normal file
@ -0,0 +1,74 @@
|
||||
/***************************************************************************
|
||||
* ROM Properties Page shell extension. (KDE) *
|
||||
* RpOverlayIconPluginForwarder.hpp: KOverlayIconPlugin forwarder. *
|
||||
* *
|
||||
* Qt's plugin system prevents a single shared library from exporting *
|
||||
* multiple plugins, so this file acts as a KOverlayIconPlugin, *
|
||||
* and then forwards the request to the main library. *
|
||||
* *
|
||||
* Copyright (c) 2018 by David Korth. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms of the GNU General Public License as published by the *
|
||||
* Free Software Foundation; either version 2 of the License, or (at your *
|
||||
* option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __ROMPROPERTIES_KDE_OVERLAYICONPLUGINFORWARDER_HPP__
|
||||
#define __ROMPROPERTIES_KDE_OVERLAYICONPLUGINFORWARDER_HPP__
|
||||
|
||||
// FIXME: Test on KDE4.
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
|
||||
#include <KOverlayIconPlugin>
|
||||
|
||||
namespace RomPropertiesKDE {
|
||||
|
||||
class RpOverlayIconPluginForwarder : public KOverlayIconPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
// NOTE: KDE doesn't have a standard IID for KOverlayIconPlugin...
|
||||
Q_PLUGIN_METADATA(IID "com.gerbilsoft.rom-properties.KOverlayIconPlugin" FILE "RpOverlayIconPluginForwarder.json")
|
||||
//Q_INTERFACES(KOverlayIconPlugin)
|
||||
|
||||
public:
|
||||
explicit RpOverlayIconPluginForwarder(QObject *parent = nullptr);
|
||||
virtual ~RpOverlayIconPluginForwarder();
|
||||
|
||||
private:
|
||||
typedef KOverlayIconPlugin super;
|
||||
Q_DISABLE_COPY(RpOverlayIconPluginForwarder);
|
||||
|
||||
public:
|
||||
QStringList getOverlays(const QUrl &item) final;
|
||||
|
||||
private:
|
||||
// rom-properties-kde5.so handle.
|
||||
void *hRpKdeSo;
|
||||
|
||||
// Actual OverlayPlugin.
|
||||
KOverlayIconPlugin *fwd_plugin;
|
||||
|
||||
private slots:
|
||||
/**
|
||||
* fwd_plugin was destroyed.
|
||||
* @param obj
|
||||
*/
|
||||
void fwd_plugin_destroyed(QObject *obj = nullptr);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* QT_VERSION >= QT_VERSION_CHECK(5,0,0) */
|
||||
|
||||
#endif /* __ROMPROPERTIES_KDE_OVERLAYICONPLUGINFORWARDER_HPP__ */
|
8
src/kde/kde5/RpOverlayIconPluginForwarder.json
Normal file
8
src/kde/kde5/RpOverlayIconPluginForwarder.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"KPlugin": {
|
||||
"Description": "Overlay icon for rom-properties",
|
||||
"ServiceTypes": [
|
||||
"KOverlayIconPlugin"
|
||||
]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user