Krita Source Code Documentation
Loading...
Searching...
No Matches
KoJsonTrader Class Reference

#include <KoJsonTrader.h>

Classes

struct  Plugin
 
struct  PluginCacheEntry
 

Public Member Functions

 KoJsonTrader ()
 
QList< Pluginquery (const QString &servicetype, const QString &mimetype)
 
 ~KoJsonTrader ()
 

Static Public Member Functions

static KoJsonTraderinstance ()
 

Private Member Functions

void initializePluginLoaderCache ()
 

Private Attributes

QMutex m_mutex
 
QList< PluginCacheEntrym_pluginLoaderCache
 
QString m_pluginPath
 

Detailed Description

Support class to fetch a list of relevant plugins

Static singleton

Definition at line 25 of file KoJsonTrader.h.

Constructor & Destructor Documentation

◆ KoJsonTrader()

KoJsonTrader::KoJsonTrader ( )

Definition at line 33 of file KoJsonTrader.cpp.

34{
35 // Allow a command line variable KRITA_PLUGIN_PATH to override the automatic search
36 m_pluginPath = QProcessEnvironment::systemEnvironment().value("KRITA_PLUGIN_PATH");
37
38 if (m_pluginPath.isEmpty() ||
39 !(QFileInfo(m_pluginPath).exists() && QFileInfo(m_pluginPath).isDir())) {
40
41 QList<QDir> searchDirs;
42
43 QDir appDir(qApp->applicationDirPath());
44 appDir.cdUp();
45#ifdef Q_OS_MACOS
46 // Help Krita run without deployment
47 QDir d(appDir);
48 d.cd("../../../");
49 searchDirs << d;
50#endif
51
52#ifdef Q_OS_ANDROID
53 appDir.cdUp();
54#endif
55 searchDirs << appDir;
56
57 Q_FOREACH (const QDir& dir, searchDirs) {
58 const QStringList nameFilters = {
59#ifdef Q_OS_MACOS
60 "*PlugIns*",
61#endif
62 "lib*",
63 };
64 Q_FOREACH (const QFileInfo &info, dir.entryInfoList(nameFilters, QDir::Dirs | QDir::NoDotAndDotDot)) {
65#ifdef Q_OS_MACOS
66 if (info.fileName().contains("PlugIns")) {
67 m_pluginPath = info.absoluteFilePath();
68 break;
69 }
70 else if (info.fileName().contains("lib")) {
71#else
72 if (info.fileName().contains("lib")) {
73#endif
74 QDir libDir(info.absoluteFilePath());
75
76#ifdef Q_OS_ANDROID
77#if defined(Q_PROCESSOR_ARM_64)
78 libDir.cd("arm64-v8a");
79#elif defined(Q_PROCESSOR_ARM)
80 libDir.cd("armeabi-v7a");
81#elif defined(Q_PROCESSOR_X86_64)
82 libDir.cd("x86_64");
83#elif defined(Q_PROCESSOR_x86)
84 libDir.cd("x86");
85#endif
86 m_pluginPath = libDir.absolutePath();
87 break;
88#else
89 // on many systems this will be the actual lib dir (and krita subdir contains plugins)
90 if (libDir.cd("kritaplugins")) {
91 m_pluginPath = libDir.absolutePath();
92 break;
93 }
94
95 // on debian at least the actual libdir is a subdir named like "lib/x86_64-linux-gnu"
96 // so search there for the Krita subdir which will contain our plugins
97 // FIXME: what are the chances of there being more than one Krita install with different arch and compiler ABI?
98 Q_FOREACH (const QFileInfo &subInfo, libDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
99 QDir subDir(subInfo.absoluteFilePath());
100 if (subDir.cd("kritaplugins")) {
101 m_pluginPath = subDir.absolutePath();
102 break; // will only break inner loop so we need the extra check below
103 }
104 }
105
106 if (!m_pluginPath.isEmpty()) {
107 break;
108 }
109#endif
110 }
111 }
112
113 if (!m_pluginPath.isEmpty()) {
114 break;
115 }
116 }
117 dbgPlugins << "KoJsonTrader will load its plugins from" << m_pluginPath;
118 }
119
121}
void initializePluginLoaderCache()
QString m_pluginPath
#define dbgPlugins
Definition kis_debug.h:51

References dbgPlugins, initializePluginLoaderCache(), and m_pluginPath.

◆ ~KoJsonTrader()

KoJsonTrader::~KoJsonTrader ( )

Definition at line 123 of file KoJsonTrader.cpp.

124{
125}

Member Function Documentation

◆ initializePluginLoaderCache()

void KoJsonTrader::initializePluginLoaderCache ( )
private

Definition at line 135 of file KoJsonTrader.cpp.

136{
137 QMutexLocker l(&m_mutex);
138
140
142 QDirIterator dirIter(m_pluginPath, QDirIterator::Subdirectories);
143 while (dirIter.hasNext()) {
144 dirIter.next();
145#ifdef Q_OS_ANDROID
146 // files starting with lib_krita are plugins, it is needed because of the loading rules in NDK
147 if (dirIter.fileInfo().isFile() && dirIter.fileName().startsWith("lib_krita")) {
148#elif defined(_MSC_VER)
149 if (dirIter.fileInfo().isFile() && dirIter.fileName().startsWith("krita") && !dirIter.fileName().endsWith(".pdb") && !dirIter.fileName().endsWith(".lib")) {
150#else
151 if (dirIter.fileInfo().isFile() && dirIter.fileName().startsWith("krita") && !dirIter.fileName().endsWith(".debug")) {
152#endif
153
154 dbgPlugins << dirIter.fileName();
155 std::unique_ptr<QPluginLoader> loader(new QPluginLoader(dirIter.filePath()));
156 QJsonObject json = loader->metaData().value("MetaData").toObject();
157
158 dbgPlugins << json << json.value("X-KDE-ServiceTypes");
159
160 if (json.isEmpty()) {
161 qWarning() << dirIter.filePath() << "has no json!";
162 continue;
163 } else {
164 QJsonArray serviceTypes = json.value("X-KDE-ServiceTypes").toArray();
165 if (serviceTypes.isEmpty()) {
166 qWarning() << dirIter.fileName() << "has no X-KDE-ServiceTypes";
167 continue;
168 }
169
170 QStringList mimeTypes = json.value("X-KDE-ExtraNativeMimeTypes").toString().split(',');
171 mimeTypes += json.value("MimeType").toString().split(';');
172 mimeTypes += json.value("X-KDE-NativeMimeType").toString();
173
174 PluginCacheEntry cacheEntry;
175 cacheEntry.filePath = dirIter.filePath();
176 cacheEntry.serviceTypes = serviceTypes;
177 cacheEntry.mimeTypes = mimeTypes;
178 cacheEntry.loader = toQShared(loader.release());
179 m_pluginLoaderCache << cacheEntry;
180 }
181 }
182 }
183}
QList< PluginCacheEntry > m_pluginLoaderCache
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
QSharedPointer< T > toQShared(T *ptr)

References dbgPlugins, KoJsonTrader::PluginCacheEntry::filePath, KIS_SAFE_ASSERT_RECOVER_RETURN, KoJsonTrader::PluginCacheEntry::loader, m_mutex, m_pluginLoaderCache, m_pluginPath, KoJsonTrader::PluginCacheEntry::mimeTypes, KoJsonTrader::PluginCacheEntry::serviceTypes, and toQShared().

◆ instance()

KoJsonTrader * KoJsonTrader::instance ( )
static

Returns the instance of this class.

Definition at line 130 of file KoJsonTrader.cpp.

131{
132 return s_instance;
133}

◆ query()

QList< KoJsonTrader::Plugin > KoJsonTrader::query ( const QString & servicetype,
const QString & mimetype )

The main function in the KoJsonTrader class. It tries to automatically locate the base path containing Krita plugins. It attempts to do so in the current application directory qApp->applicationDirPath().

The environment variable KRITA_PLUGIN_PATH overrides the automatic search path when the algorithm is insufficient. Try setting this if the "LittleCMS color management plugin is not installed" error appears.

A better algorithm or another solution could be a welcome alternative. One thing that might help would be to build all Krita plugins in a single plugins folder, so that an installation step is unnecessary to put them together in a single folder here. Another solution might be to construct several QPluginLoaders.

Parameters
servicetypeA service type like 'KMyApp/Plugin' or 'KFilePlugin'.
mimetypeA MimeType to constrain the search.
Returns
A list of QPluginLoader that satisfy the query

Definition at line 185 of file KoJsonTrader.cpp.

186{
187 QMutexLocker l(&m_mutex);
188
189 QList<Plugin> list;
190 Q_FOREACH(const PluginCacheEntry &plugin, m_pluginLoaderCache) {
191 if (!plugin.serviceTypes.contains(QJsonValue(servicetype))) {
192 continue;
193 }
194
195 if (!mimetype.isEmpty() && !plugin.mimeTypes.contains(mimetype)) {
196 continue;
197 }
198
199 list << Plugin(plugin.loader, &m_mutex);
200 }
201
202 return list;
203}

References KoJsonTrader::PluginCacheEntry::loader, m_mutex, m_pluginLoaderCache, KoJsonTrader::PluginCacheEntry::mimeTypes, and KoJsonTrader::PluginCacheEntry::serviceTypes.

Member Data Documentation

◆ m_mutex

QMutex KoJsonTrader::m_mutex
mutableprivate

Definition at line 81 of file KoJsonTrader.h.

◆ m_pluginLoaderCache

QList<PluginCacheEntry> KoJsonTrader::m_pluginLoaderCache
private

Definition at line 85 of file KoJsonTrader.h.

◆ m_pluginPath

QString KoJsonTrader::m_pluginPath
private

Definition at line 80 of file KoJsonTrader.h.


The documentation for this class was generated from the following files: