Разработка плагина OnlineBookmarks. Part 5: "IPluginReady"

Sep 20, 2011 14:54


Теперь мы переходим к самому интересному.
Для того, что бы наш плагин мог иметь свои плагины необходимо отнаследовать его от интерфейса IPluginReady и переопределить методы, которые необходимо.

Вот эти 2 метода (согласно документации):

QSet< QByteArray > GetExpectedPluginClasses () const - Returns the expected second level plugins' classes expected by this first-level plugin.
void AddPlugin (QObject *plugin) - Adds second-level plugin to this one.

На самом деле мне из этой документации ни черта не понятно, что и как надо делать. Но после разбора исходников других классов и консультации с лиддевом стало ясно.  И так что должен возвращать первый метод? На самом деле любой QSet . Все что угодно, но при одном условии - все плагины для этого плагина должны возвращать один из этих QByteArray из своего метода
QSet< QByteArray > GetPluginClasses () const. Для удобства я вынес все эти методы в Core. Тоесть добил 2 метода в Core:

copy to clipboardподсветка кода
  1. QSet GetExpectedPluginClasses () const;  
  2. void AddPlugin (QObject*);  

И теперь вызов в Plugin выглядит так:

opy to clipboardподсветка кода
  1. QSet Plugin::GetExpectedPluginClasses () const  
  2. {  
  3.     return Core::Instance ().GetExpectedPluginClasses ();  
  4. }  
  5.  
  6. void Plugin::AddPlugin (QObject *plugin)  
  7. {  
  8.     Core::Instance ().AddPlugin (plugin);  
  9. }  


Реализация Core::GetExpectedPluginClasses будет возвращать QSet с одной записью:

copy to clipboardподсветка кода
  1. QSet Core::GetExpectedPluginClasses () const  
  2. {  
  3.     QSet classes;  
  4.     classes << "org.LeechCraft.Plugins.Poshuku.Plugins.OnlineBookmarks.IGeneralPlugin";  
  5.     return classes;  
  6. }  


Тоесть мы сообщаем этим методом ядру личкрафтов, что все плагины, которые из QSet< QByteArray > GetPluginClasses () const возвращают строку "org.LeechCraft.Plugins.Poshuku.Plugins.OnlineBookmarks.IGeneralPlugin" являются плагинами для нашего плагина. Тоесть с этим вопросом все просто. Стоит писать только более-менее уникальные строки, что бы была малая вероятность повторения.

Второй метод нужна для того, что бы хранить весь спиоск загруженным плагинов в нашем плагине для доступа к ним.
Можно сделать просто -завести в Core QObjectList и хранить в нем все плагины, но по рекомендации лидедва стоит создать класс PluginManager, которые будет наследоваться от BaseHookConnector и даст возможность хукать какие-то действия. Если вам не нужны хуки сегодня, то не факт, что не понадобятся завтра, так что я согласен с данным решением.
Класс PlguinManger очень просто и выглядит так:

copy to clipboardподсветка кода
  1. #ifndef PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_PLUGINMANAGER_H  
  2. #define PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_PLUGINMANAGER_H  
  3.  
  4. #include   
  5.  
  6. namespace LeechCraft  
  7. {  
  8. namespace Poshuku  
  9. {  
  10. namespace OnlineBookmarks  
  11. {  
  12.     class PluginManager : public Util::BaseHookInterconnector  
  13.     {  
  14.         Q_OBJECT  
  15.     public:  
  16.         PluginManager (QObject* = 0);  
  17.         virtual void AddPlugin (QObject*);  
  18.     };  
  19. }  
  20. }  
  21. }  
  22. #endif // PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_PLUGINMANAGER_H  


Реалиация в нем еще проще:\

copy to clipboardподсветка кода
  1. #include "pluginmanager.h"  
  2. namespace LeechCraft  
  3. {  
  4. namespace Poshuku  
  5. {  
  6. namespace OnlineBookmarks  
  7. {  
  8.     PluginManager::PluginManager (QObject *parent)  
  9.     : Util::BaseHookInterconnector (parent)  
  10.     {  
  11.     }  
  12.     void PluginManager::AddPlugin (QObject *plugin)  
  13.     {  
  14.         Util::BaseHookInterconnector::AddPlugin (plugin);  
  15.     }  
  16. }  
  17. }  
  18. }  


Так как на данный момент нам не нужны хуки, то и зацикливаться на них мы не будем, а реализуем метода Core::AddPlugin :

copy to clipboardподсветка кода
  1. void Core::AddPlugin (QObject *plugin)  
  2. {  
  3.     PluginManager_->AddPlugin (plugin);  
  4. }  

Вот и все. Теперь наш плагин может иметь свои же плагины.  Созданием своего плагина для плагина мы займемся в следующем посту.

программирование, coding is my life, plugins, С++, leechcraftdevblog, qt, leechcraft

Previous post Next post
Up