• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

libs/libkipi/libkipi

  • sources
  • kde-4.14
  • kdegraphics
  • libs
  • libkipi
  • libkipi
pluginloader.cpp
Go to the documentation of this file.
1 
34 #include "pluginloader.moc"
35 
36 // Qt includes
37 
38 #include <QStringList>
39 #include <QLayout>
40 #include <QList>
41 #include <QVariantList>
42 #include <QVariant>
43 
44 // KDE includes
45 
46 #include <kservicetypetrader.h>
47 #include <kdebug.h>
48 #include <kdialog.h>
49 #include <kdeversion.h>
50 #include <ksharedconfig.h>
51 #include <kdesktopfile.h>
52 #include <kconfig.h>
53 #include <kglobal.h>
54 #include <klibloader.h>
55 #include <kaction.h>
56 #include <kxmlguifactory.h>
57 #include <ktoolbar.h>
58 #include <kstandarddirs.h>
59 #include <kactioncollection.h>
60 
61 // Local includes
62 
63 #include "plugin.h"
64 #include "interface.h"
65 #include "version.h"
66 #include "configwidget.h"
67 
68 static const KCatalogLoader loader("libkipi");
69 
70 namespace KIPI
71 {
72 
73 class PluginLoader::Info::Private
74 {
75 public:
76 
77  Private()
78  {
79  shouldLoad = false;
80  plugin = 0;
81  parent = 0;
82  }
83 
84  bool shouldLoad;
85  KService::Ptr service;
86  Plugin* plugin;
87  KXmlGuiWindow* parent;
88 };
89 
90 PluginLoader::Info::Info(KXmlGuiWindow* const parent, const KService::Ptr& service, bool shouldLoad)
91  : d(new Private)
92 {
93  d->service = service;
94  d->shouldLoad = shouldLoad;
95  d->parent = parent;
96 }
97 
98 PluginLoader::Info::~Info()
99 {
100  if (d->parent && d->plugin)
101  {
102  d->parent->guiFactory()->removeClient(d->plugin);
103 #if KDE_IS_VERSION(4,8,5)
104  foreach(KToolBar* const toolbar, d->parent->toolBars())
105  {
106  toolbar->removeXMLGUIClient(d->plugin);
107  }
108 #endif
109  }
110 
111  delete d->plugin;
112  delete d;
113 }
114 
115 KService::Ptr PluginLoader::Info::service() const
116 {
117  return d->service;
118 }
119 
120 QString PluginLoader::Info::name() const
121 {
122  return d->service->name();
123 }
124 
125 QString PluginLoader::Info::author() const
126 {
127  return d->service->property(QString("author"), QVariant::String).toString();
128 }
129 
130 QString PluginLoader::Info::comment() const
131 {
132  return d->service->comment();
133 }
134 
135 QString PluginLoader::Info::library() const
136 {
137  return d->service->library();
138 }
139 
140 QIcon PluginLoader::Info::icon() const
141 {
142  if (d->service->icon().isEmpty() && d->plugin)
143  {
144  if (!d->plugin->actions().isEmpty() && d->plugin->actions().first())
145  {
146  return d->plugin->actions().first()->icon();
147  }
148  else
149  {
150  return QIcon();
151  }
152  }
153  else
154  {
155  return KIcon(d->service->icon());
156  }
157 }
158 
159 Plugin* PluginLoader::Info::plugin() const
160 {
161  if (!d->plugin && shouldLoad())
162  {
163  QString error;
164 
165  d->plugin = d->service->createInstance<Plugin>(PluginLoader::instance()->interface(), QVariantList(), &error);
166 
167  if (d->plugin)
168  {
169  kDebug(51001) << "Loaded plugin " << d->plugin->objectName();
170 
171  emit (PluginLoader::instance()->plug(const_cast<Info*>(this)));
172  }
173  else
174  {
175  kWarning(51001) << "Cannot create instance for plugin "
176  << name()
177  << " (" << library() << ")"
178  << " with error: "
179  << error;
180  }
181  }
182 
183  return d->plugin;
184 }
185 
186 QStringList PluginLoader::Info::pluginCategories() const
187 {
188  return d->service->property(QString::fromLatin1("X-KIPI-PluginCategories")).toStringList();
189 }
190 
191 void PluginLoader::Info::reload()
192 {
193  if (d->parent)
194  {
195  d->parent->guiFactory()->removeClient(d->plugin);
196 #if KDE_IS_VERSION(4,8,5)
197  foreach(KToolBar* const toolbar, d->parent->toolBars())
198  {
199  toolbar->removeXMLGUIClient(d->plugin);
200  }
201 #endif
202  }
203 
204  delete d->plugin;
205  d->plugin = 0;
206 }
207 
208 bool PluginLoader::Info::shouldLoad() const
209 {
210  return d->shouldLoad;
211 }
212 
213 void PluginLoader::Info::setShouldLoad(bool value)
214 {
215  d->shouldLoad = value;
216 }
217 
218 //---------------------------------------------------------------------
219 
220 static PluginLoader* s_instance = 0;
221 static bool s_loaded = false;
222 
223 class PluginLoader::Private
224 {
225 public:
226 
227  Private()
228  {
229  interface = 0;
230  parent = 0;
231  };
232 
233  QStringList ignoredPlugins;
234  QStringList disabledActions;
235 
236  KXmlGuiWindow* parent;
237 
238  PluginLoader::PluginList pluginList;
239  Interface* interface;
240 };
241 
242 PluginLoader::PluginLoader()
243  : d(new Private)
244 {
245  Q_ASSERT((s_instance == 0) && (!s_loaded));
246  s_instance = this;
247 
248  KGlobal::dirs()->addResourceDir("data", KStandardDirs::installPath("data") + QString("kipi"));
249 }
250 
251 PluginLoader::PluginLoader(KXmlGuiWindow* const parent)
252  : d(new Private)
253 {
254  Q_ASSERT((s_instance == 0) && (!s_loaded));
255  s_instance = this;
256 
257  KGlobal::dirs()->addResourceDir("data", KStandardDirs::installPath("data") + QString("kipi"));
258 
259  if (!parent)
260  {
261  kWarning() << "KDE XML application instance is null...";
262  }
263 
264  d->parent = parent;
265 }
266 
267 void PluginLoader::setInterface(Interface* const interface)
268 {
269  d->interface = interface;
270  setParent(interface);
271 }
272 
273 void PluginLoader::setIgnoredPluginsList(const QStringList& ignores)
274 {
275  d->ignoredPlugins = ignores;
276 }
277 
278 void PluginLoader::setDisabledPluginActions(const QStringList& disabledActions)
279 {
280  d->disabledActions = disabledActions;
281 }
282 
283 QStringList PluginLoader::disabledPluginActions() const
284 {
285  return d->disabledActions;
286 }
287 
288 void PluginLoader::init()
289 {
290  Q_ASSERT((s_instance != 0) && (!s_loaded));
291 
292  if (!d->interface)
293  {
294  kWarning() << "KIPI host interface instance is null. No plugin will be loaded...";
295  return;
296  }
297 
298  s_loaded = true;
299  const KService::List offers = KServiceTypeTrader::self()->query("KIPI/Plugin");
300  KSharedConfigPtr config = KGlobal::config();
301  KConfigGroup group = config->group(QString::fromLatin1("KIPI/EnabledPlugin"));
302 
303  for (KService::List::ConstIterator iter = offers.begin(); iter != offers.end(); ++iter)
304  {
305  KService::Ptr service = *iter;
306  QString name = service->name();
307  QString uname = service->untranslatedGenericName();
308  QString library = service->library();
309  QStringList reqFeatures = service->property(QString::fromLatin1("X-KIPI-ReqFeatures")).toStringList();
310  int binVersion = service->property(QString::fromLatin1("X-KIPI-BinaryVersion")).toInt();
311 
312  if (library.isEmpty() || uname.isEmpty())
313  {
314  kWarning(51001) << "Plugin had an empty name or library file - this should not happen.";
315  continue;
316  }
317 
318  if (d->ignoredPlugins.contains(uname))
319  {
320  kDebug(51001) << "Plugin " << name << " (generic name: " << uname << ") is in the ignore list from host application";
321  continue;
322  }
323 
324  if (binVersion != kipi_binary_version)
325  {
326  kDebug(51001) << "Plugin " << name
327  << "has a SO version (" << binVersion
328  << ") which is different than libkipi ABI version (" << kipi_binary_version << "). "
329  << "Refusing to load.";
330  continue;
331  }
332 
333  bool appHasAllReqFeatures = true;
334 
335  for (QStringList::const_iterator featureIt = reqFeatures.constBegin();
336  featureIt != reqFeatures.constEnd(); ++featureIt)
337  {
338  if (!d->interface->hasFeature(*featureIt))
339  {
340  kDebug(51001) << "Plugin " << name << " was not loaded because the host application is missing\n"
341  << "the feature " << *featureIt;
342  appHasAllReqFeatures = false;
343  break;
344  }
345  }
346 
347  bool load = group.readEntry(uname, true);
348 
349  if (!appHasAllReqFeatures)
350  {
351  continue;
352  }
353 
354  Info* const info = new Info(d->parent, service, load);
355  d->pluginList.append(info);
356  }
357 }
358 
359 PluginLoader::~PluginLoader()
360 {
361  delete d;
362 }
363 
364 void PluginLoader::loadPlugins()
365 {
366  emit replug(); // added for convenience, now they can be loaded on demand
367 }
368 
369 const PluginLoader::PluginList& PluginLoader::pluginList()
370 {
371  return d->pluginList;
372 }
373 
374 PluginLoader* PluginLoader::instance()
375 {
376  if (!s_instance)
377  {
378  kDebug(51001) << "Instance is null...";
379  }
380 
381  return s_instance;
382 }
383 
384 Interface* PluginLoader::interface() const
385 {
386  return d->interface;
387 }
388 
389 ConfigWidget* PluginLoader::configWidget(QWidget* const parent) const
390 {
391  return new ConfigWidget(parent);
392 }
393 
394 QString PluginLoader::kipiPluginsVersion() const
395 {
396  QString ver = i18nc("Version unavailable", "unavailable");
397  QString path = KGlobal::dirs()->installPath("xdgdata-apps") + QString("kipiplugins.desktop");
398  KDesktopFile desk(path);
399  QMap<QString, QString> map = desk.entryMap("X-KipiPlugins Entry");
400 
401  if (!map.isEmpty())
402  {
403  QString val = map["Version"];
404 
405  if (!val.isEmpty())
406  ver = val;
407  }
408 
409  return ver;
410 }
411 
412 } // namespace KIPI
QWidget
KIPI::PluginLoader::Info::plugin
Plugin * plugin() const
Definition: pluginloader.cpp:159
KIPI::PluginLoader
Definition: pluginloader.h:189
KIPI::PluginLoader::Info::pluginCategories
QStringList pluginCategories() const
Definition: pluginloader.cpp:186
KIPI::PluginLoader::ConfigWidget
friend class ConfigWidget
Definition: pluginloader.h:318
KIPI::PluginLoader::Info::author
QString author() const
Definition: pluginloader.cpp:125
QMap
plugin.h
===========================================================This file is a part of digiKam project htt...
KIPI::PluginLoader::Info::icon
QIcon icon() const
Definition: pluginloader.cpp:140
KIPI::PluginLoader::plug
void plug(KIPI::PluginLoader::Info *)
KIPI::PluginLoader::~PluginLoader
virtual ~PluginLoader()
Standard destructor.
Definition: pluginloader.cpp:359
KIPI::Interface
Definition: interface.h:158
KIPI::Plugin
Base class for the KIPI plugins.
Definition: plugin.h:79
KIPI::PluginLoader::Info::comment
QString comment() const
Definition: pluginloader.cpp:130
QList::const_iterator
configwidget.h
===========================================================This file is a part of digiKam project htt...
KIPI::PluginLoader::loadPlugins
void loadPlugins()
Call this method to load relevant plugins installed on your system to your KIPI host application NOTE...
Definition: pluginloader.cpp:364
KIPI::PluginLoader::setInterface
void setInterface(Interface *const interface)
Set KIPI interface instance from host application.
Definition: pluginloader.cpp:267
KIPI::PluginLoader::Info
Definition: pluginloader.h:195
QObject::name
const char * name() const
loader
static const KCatalogLoader loader("libkipi")
KIPI::PluginLoader::replug
void replug()
KIPI::PluginLoader::instance
static PluginLoader * instance()
Returns plugin loader instance.
Definition: pluginloader.cpp:374
KIPI::PluginLoader::PluginLoader
PluginLoader()
Use this constructor if your application does not use KDE XML GUI technology.
Definition: pluginloader.cpp:242
interface.h
===========================================================This file is a part of digiKam project htt...
KIPI::PluginLoader::configWidget
ConfigWidget * configWidget(QWidget *const parent) const
Return the config widget with list of plugins to manage.
Definition: pluginloader.cpp:389
KIPI::s_loaded
static bool s_loaded
Definition: pluginloader.cpp:221
KIPI::PluginLoader::setIgnoredPluginsList
void setIgnoredPluginsList(const QStringList &ignores)
Set Plugins ignore list, with name of obsoletes plugins to not load through init().
Definition: pluginloader.cpp:273
QString::isEmpty
bool isEmpty() const
KIPI::PluginLoader::init
void init()
Init plugin loader.
Definition: pluginloader.cpp:288
KIPI::PluginLoader::Info::service
KService::Ptr service() const
Definition: pluginloader.cpp:115
KIPI::PluginLoader::Info::setShouldLoad
void setShouldLoad(bool)
Definition: pluginloader.cpp:213
QString
QList< Info * >
KIPI::PluginLoader::Info::Info
Info(KXmlGuiWindow *const parent, const KService::Ptr &service, bool shouldLoad)
Definition: pluginloader.cpp:90
QStringList
KIPI::PluginLoader::Info::shouldLoad
bool shouldLoad() const
Definition: pluginloader.cpp:208
KIPI::ConfigWidget
Definition: configwidget.h:42
KIPI::PluginLoader::Info::library
QString library() const
Definition: pluginloader.cpp:135
QObject::setParent
void setParent(QObject *parent)
KIPI::PluginLoader::kipiPluginsVersion
QString kipiPluginsVersion() const
Return the kipi-plugins version installed on your computer if it's found through kipiplugins.desktop file.
Definition: pluginloader.cpp:394
KIPI::PluginLoader::Info::~Info
~Info()
Definition: pluginloader.cpp:98
KIPI::PluginLoader::Info::name
QString name() const
Definition: pluginloader.cpp:120
KIPI::s_instance
static PluginLoader * s_instance
Definition: pluginloader.cpp:220
QString::fromLatin1
QString fromLatin1(const char *str, int size)
QMap::isEmpty
bool isEmpty() const
KIPI::PluginLoader::Info::reload
void reload()
Definition: pluginloader.cpp:191
QList::constEnd
const_iterator constEnd() const
KIPI::PluginLoader::disabledPluginActions
QStringList disabledPluginActions() const
Return the list of disabled plugin actions.
Definition: pluginloader.cpp:283
QList::constBegin
const_iterator constBegin() const
QObject::parent
QObject * parent() const
KIPI::PluginLoader::setDisabledPluginActions
void setDisabledPluginActions(const QStringList &disabledActions)
Set disabled plugin actions that will not be plugged into the gui,.
Definition: pluginloader.cpp:278
KIPI::PluginLoader::pluginList
const PluginList & pluginList()
Returns the list of loaded plugins.
Definition: pluginloader.cpp:369
KIPI::PluginLoader::interface
Interface * interface() const
Return KIPI host interface instance.
Definition: pluginloader.cpp:384
QIcon
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:19:43 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libs/libkipi/libkipi

Skip menu "libs/libkipi/libkipi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkdcraw
  •     libkexiv2
  •     libkipi
  •     libksane
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal