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

Sep 21, 2011 09:31


Первым делом нам необходимо указать в CMakeLists.txt OnlineBookmarks, что он может иметь плагины и где их искать. Делается это так:

copy to clipboardподсветка кода
  1. SET (ONLINEBOOKMARKS_INCLUDE_DIR ${CURRENT_SOURCE_DIR})  
  2. OPTION (ENABLE_ONLINEBOOKMARKS_READITLATER "Build plugin for service Read It Later for OnlineBookmarks" ON)  
  3. IF (ENABLE_ONLINEBOOKMARKS_READITLATER)  
  4.     ADD_SUBDIRECTORY (plugins/readitlater)  
  5. ENDIF (ENABLE_ONLINEBOOKMARKS_READITLATER)  


Теперь OnlineBookmarks знает, что если при сборке было передано -DENABLE_ONLINEBOOKMARKS_READITLATER, то плагин следует искать в plugins/readitlater.

Cоздадим типовой CMakeLists.txt и класс Plugin для нашего плагина ReadItLater:

CMakeLists.txt:

copy to clipboardподсветка кода
  1. SET (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")  
  2.  
  3. INCLUDE_DIRECTORIES (${ONLINEBOOKMARKS_INCLUDE_DIR}  
  4.     ${CMAKE_CURRENT_BINARY_DIR}  
  5.     ${CMAKE_CURRENT_SOURCE_DIR}  
  6.     )  
  7.  
  8. SET (READITLATER_SRCS  
  9.     readitlater.cpp  
  10.     )  
  11.  
  12. SET (READITLATER_HEADERS  
  13.     readitlater.h  
  14.     )  
  15.  
  16. QT4_WRAP_CPP (READITLATER_MOC_SRCS ${READITLATER_HEADERS})  
  17.  
  18. ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks_readitlater SHARED  
  19.     ${READITLATER_SRCS}  
  20.     ${READITLATER_MOC_SRCS}  
  21.     )  
  22.  
  23. TARGET_LINK_LIBRARIES (leechcraft_poshuku_onlinebookmarks_readitlater  
  24.     ${QT_LIBRARIES}  
  25.     ${LEECHCRAFT_LIBRARIES}  
  26.     )  
  27.  
  28. INSTALL (TARGETS leechcraft_poshuku_onlinebookmarks_readitlater DESTINATION ${LC_PLUGINS_DEST})  


Тут стоит обратить внимание на параметр INCLUDE_DIRECTORIES - первой директорие мы передаем ${ONLINEBOOKMARKS_INCLUDE_DIR}, которую добавили в CMakeLists.txt плагина OnlineBookmarks (SET (ONLINEBOOKMARKS_INCLUDE_DIR ${CURRENT_SOURCE_DIR})).

И типовая база класса Plugin:
readitlater.h:

copy to clipboardподсветка кода
  1. #ifndef PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H  
  2. #define PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H  
  3.   
  4. #include   
  5. #include   
  6. #include   
  7.   
  8. namespace LeechCraft  
  9. {  
  10. namespace Poshuku  
  11. {  
  12. namespace OnlineBookmarks  
  13. {  
  14. namespace ReadItLater  
  15. {  
  16.     class Plugin : public QObject  
  17.                 , public IPlugin2  
  18.                 , public IInfo  
  19.     {  
  20.         Q_OBJECT  
  21.         Q_INTERFACES (IInfo IPlugin2)  
  22.     public:  
  23.         void Init (ICoreProxy_ptr proxy);  
  24.         void SecondInit ();  
  25.         void Release ();  
  26.         QByteArray GetUniqueID() const;  
  27.         QString GetName() const;  
  28.         QString GetInfo() const;  
  29.         QIcon GetIcon() const;  
  30.         QSet GetPluginClasses () const;  
  31.     };  
  32. }  
  33. }  
  34. }  
  35. }  
  36.   
  37. #endif // PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H  


readitlater.cpp:

copy to clipboardподсветка кода
  1. #include "readitlater.h"  
  2. #include   
  3.   
  4. namespace LeechCraft  
  5. {  
  6. namespace Poshuku  
  7. {  
  8. namespace OnlineBookmarks  
  9. {  
  10. namespace ReadItLater  
  11. {  
  12.     void Plugin::Init (ICoreProxy_ptr proxy)  
  13.     {  
  14.     }  
  15.   
  16.     void Plugin::SecondInit ()  
  17.     {  
  18.     }  
  19.       
  20.     void Plugin::Release ()  
  21.     {  
  22.     }  
  23.   
  24.     QByteArray Plugin::GetUniqueID () const  
  25.     {  
  26.         return "org.LeechCraft.Poshuku.OnlineBookmarks.ReadItLater";  
  27.     }  
  28.   
  29.     QString Plugin::GetName () const  
  30.     {  
  31.         return "Poshuku OB: Read It Later";  
  32.     }  
  33.   
  34.     QString Plugin::GetInfo () const  
  35.     {  
  36.         return tr ("Sync local bookmarks with your account in Read It Later");  
  37.     }  
  38.   
  39.     QIcon Plugin::GetIcon () const  
  40.     {  
  41.         return QIcon ();  
  42.     }  
  43.   
  44.     QSet Plugin::GetPluginClasses () const  
  45.     {  
  46.         QSet classes;  
  47.         classes << "org.LeechCraft.Plugins.Poshuku.Plugins.OnlineBookmarks.IGeneralPlugin";  
  48.         return classes;  
  49.     }  
  50.   
  51. }  
  52. }  
  53. }  
  54. }  
  55.   
  56. Q_EXPORT_PLUGIN2 (leechcraft_poshuku_onlinebookmarks_readitlater,  
  57.         LeechCraft::Poshuku::OnlineBookmarks::ReadItLater::Plugin);  


Плагин для плагина обязательно должен быть отнаследован от IPlugin2, который в свою очередь требует переопределения QSet Plugin::GetPluginClasses (). Что должен возвращать этот метод? Вот тут и заключается связь плагинов по иерархичной лестнице - он должен возвращать одну из строк, которые у нас используются в методе OnlineBookmarks - QSet Plugin::GetExpectedPluginClasses () const.

Теперь все это можно скомпилировать и запустить. В настройках мы можем в разделе модули видеть наш плагин. Вот и все. Плагины для плагинов создавать не сложно, если они не требуют каких-то сложных вещей, типа доступа к ядру личкрафтов.
Далее мы будем создавать свой интерфейс, стараясь сделать его по-максимуму универсальным.

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

Previous post Next post
Up