pluginmanager.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef PLUGINMANAGER_H
  2. #define PLUGINMANAGER_H
  3. #include <QObject>
  4. #include <QDateTime>
  5. #include <QSharedPointer>
  6. #include <QLibrary>
  7. #include <QPluginLoader>
  8. #include "../plugins/baseplugin.h"
  9. namespace QStarDict {
  10. class PluginServerImpl;
  11. class PluginManager : public QObject
  12. {
  13. Q_OBJECT
  14. public:
  15. enum class LoadError {
  16. NoError,
  17. NotPlugin,
  18. ABI,
  19. Metadata,
  20. };
  21. enum class PluginFeature {
  22. FirstFeature = 0x1,
  23. RegularPlugin = FirstFeature,
  24. DEIntegration = 0x2,
  25. TrayIcon = 0x4,
  26. GlobalShortcuts = 0x8,
  27. Notifications = 0x10,
  28. LastFeature = 0x20
  29. };
  30. Q_DECLARE_FLAGS(PluginFeatures, PluginFeature)
  31. class Plugin
  32. {
  33. public:
  34. typedef QSharedPointer<Plugin> Ptr;
  35. enum State : quint8 {
  36. Exist = 1, /* used during plugins search */
  37. Valid = 2,
  38. Enabled = 4
  39. };
  40. Plugin() : loader(0), pluginServer(0), state(0) {}
  41. QPluginLoader *loader;
  42. PluginServerImpl *pluginServer;
  43. uint state;
  44. QDateTime modifyTime; // modification time of plugin library (outdated metadata check)
  45. PluginMetadata metadata;
  46. inline bool isEnabled() const { return state & Enabled; }
  47. inline void setEnabled(bool enabled) {
  48. if (enabled) state |= Enabled;
  49. else state &= ~Enabled;
  50. }
  51. inline bool isLoaded() const { return loader? loader->isLoaded() : false; }
  52. LoadError load();
  53. bool unload();
  54. void cacheIcon();
  55. template<class T>
  56. inline T* castInstance() {
  57. QObject *o = isLoaded()? loader->instance() : 0;
  58. return o? qobject_cast<T*>(o) : 0;
  59. }
  60. };
  61. explicit PluginManager();
  62. ~PluginManager();
  63. inline QObject *plugin(const QString &pluginId) const {
  64. auto pd = plugins.value(pluginId);
  65. return (pd && pd->isLoaded())? pd->loader->instance() : 0;
  66. }
  67. template<class T>
  68. inline T *plugin(const QString &pluginId) const { // invalid pluginId could come from DictCore. so check it first
  69. auto pd = plugins.value(pluginId);
  70. return (pd && pd->isLoaded())? pd->castInstance<T>() : 0;
  71. }
  72. void loadPlugins();
  73. inline bool isEnabled(const QString &pluginId) const { auto pd = plugins.value(pluginId); return pd? pd->isEnabled() : false; }
  74. inline bool isLoaded(const QString &pluginId) const { auto pd = plugins.value(pluginId); return pd? pd->isLoaded() : false; }
  75. void setEnabled(const QString &pluginId, bool enabled);
  76. inline int pluginsCount() const { return plugins.size(); }
  77. QStringList availablePlugins() const;
  78. QStringList loadedPlugins() const;
  79. void setLoadedPlugins(const QStringList &pluginIds);
  80. Plugin::Ptr pluginDesc(const QString &pluginId) const { return plugins.value(pluginId); }
  81. Plugin::Ptr findPluginInstance(QObject *instance) const;
  82. signals:
  83. void pluginLoaded(const QString &);
  84. public slots:
  85. private:
  86. LoadError lastError;
  87. PluginServerImpl *pluginServer;
  88. QHash<QString, Plugin::Ptr> plugins;
  89. void updateMetadata();
  90. static QString iconsCacheDir();
  91. };
  92. }
  93. #endif // PLUGINMANAGER_H