libqutim 0.2.80.1
|
00001 /**************************************************************************** 00002 ** 00003 ** qutIM - instant messenger 00004 ** 00005 ** Copyright © 2011 Ruslan Nigmatullin <euroelessar@yandex.ru> 00006 ** 00007 ***************************************************************************** 00008 ** 00009 ** $QUTIM_BEGIN_LICENSE$ 00010 ** This program is free software: you can redistribute it and/or modify 00011 ** it under the terms of the GNU General Public License as published by 00012 ** the Free Software Foundation, either version 3 of the License, or 00013 ** (at your option) any later version. 00014 ** 00015 ** This program is distributed in the hope that it will be useful, 00016 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00018 ** See the GNU General Public License for more details. 00019 ** 00020 ** You should have received a copy of the GNU General Public License 00021 ** along with this program. If not, see http://www.gnu.org/licenses/. 00022 ** $QUTIM_END_LICENSE$ 00023 ** 00024 ****************************************************************************/ 00025 00026 #ifndef PLUGIN_H 00027 #define PLUGIN_H 00028 00029 #include "libqutim_version.h" 00030 #include "extensioninfo.h" 00031 #include <QtCore/QtPlugin> 00032 #include <QtCore/QObject> 00033 #include <QtCore/QSharedDataPointer> 00034 00035 #define PLUGIN_VERSION(major, minor, secminor, patch) QUTIM_MAKE_VERSION(major, minor, secminor, patch) 00036 00037 namespace qutim_sdk_0_3 00038 { 00039 class ModuleManager; 00040 class PluginInfoData; 00041 class PluginPrivate; 00042 00043 class LIBQUTIM_EXPORT PluginInfo 00044 { 00045 public: 00046 // Keep in sync with Plugin::Capability 00047 enum Capability 00048 { 00049 Loadable = 0x01 00050 }; 00051 Q_DECLARE_FLAGS(Capabilities, Capability) 00052 00053 PluginInfo(const LocalizedString &name = LocalizedString(), 00054 const LocalizedString &description = LocalizedString(), 00055 quint32 version = 0, ExtensionIcon icon = ExtensionIcon()); 00056 PluginInfo(const PluginInfo &other); 00057 ~PluginInfo(); 00058 PluginInfo &operator =(const PluginInfo &other); 00059 PluginInfo &addAuthor(const PersonInfo &author); 00060 PluginInfo &addAuthor(const QString &ocsUsername); 00061 PluginInfo &addAuthor(const LocalizedString &name, const LocalizedString &task, 00062 const QString &email = QString(), const QString &web = QString()); 00063 PluginInfo &setName(const LocalizedString &name); 00064 PluginInfo &setDescription(const LocalizedString &description); 00065 PluginInfo &setIcon(const ExtensionIcon &icon); 00066 PluginInfo &setVersion(quint32 version); 00067 Capabilities capabilities() const; 00068 PluginInfo &setCapabilities(Capabilities capabilities); 00069 QList<PersonInfo> authors() const; 00070 LocalizedString name() const; 00071 LocalizedString description() const; 00072 quint32 version() const; 00073 ExtensionIcon icon() const; 00074 #ifndef Q_QDOC 00075 QString fileName() const; 00076 private: 00077 QSharedDataPointer<PluginInfoData> d; 00078 public: 00079 typedef PluginInfoData Data; 00080 Data *data(); 00081 #endif 00082 }; 00083 00084 struct LIBQUTIM_EXPORT CommandArgumentDescription 00085 { 00086 QString name; 00087 QString parameter; 00088 QString description; 00089 }; 00090 00091 typedef QList<CommandArgumentDescription> CommandArgumentDescriptions; 00092 00093 class LIBQUTIM_EXPORT CommandArgumentsHandler 00094 { 00095 public: 00096 virtual ~CommandArgumentsHandler() {} 00097 virtual CommandArgumentDescriptions descriptions() = 0; 00098 virtual void addArgument(const QString &arg) = 0; 00099 }; 00100 00101 #ifndef Q_QDOC 00102 typedef void ( /*QObject::*/ *ModuleInit)(); 00103 #endif 00104 00105 class LIBQUTIM_EXPORT Plugin : public QObject 00106 { 00107 Q_OBJECT 00108 Q_DISABLE_COPY(Plugin) 00109 Q_DECLARE_PRIVATE(Plugin) 00110 public: 00111 // Keep in sync with PluginInfo::Capability 00112 enum Capability 00113 { 00114 Loadable = 0x01 00115 }; 00116 Q_DECLARE_FLAGS(Capabilities, Capability) 00117 Plugin(); 00118 virtual ~Plugin(); 00119 PluginInfo info() const; 00120 ExtensionInfoList avaiableExtensions() const; 00121 virtual void init() = 0; 00122 virtual bool load() = 0; 00123 virtual bool unload() = 0; 00124 protected: 00125 // Should be called at init 00126 void addAuthor(const LocalizedString &name, const LocalizedString &task, 00127 const QString &email = QString(), const QString &web = QString()); 00128 void addAuthor(const QString &ocsUsername); 00129 void setInfo(const LocalizedString &name, const LocalizedString &description, 00130 quint32 version = 0, ExtensionIcon icon = ExtensionIcon()); 00131 void setCapabilities(Capabilities capabilities); 00132 void addExtension(const LocalizedString &name, const LocalizedString &description, 00133 const ObjectGenerator *generator, ExtensionIcon icon = ExtensionIcon()); 00134 template<typename T> 00135 void addExtension(const LocalizedString &name, const LocalizedString &description, 00136 ExtensionIcon icon = ExtensionIcon()) 00137 { addExtension(name, description, new GeneralGenerator<T>(), icon); } 00138 template<typename T, typename I0> 00139 void addExtension(const LocalizedString &name, const LocalizedString &description, 00140 ExtensionIcon icon = ExtensionIcon()) 00141 { addExtension(name, description, new GeneralGenerator<T, I0>(), icon); } 00142 template<typename T, typename I0, typename I1> 00143 void addExtension(const LocalizedString &name, const LocalizedString &description, 00144 ExtensionIcon icon = ExtensionIcon()) 00145 { addExtension(name, description, new GeneralGenerator<T, I0, I1>(), icon); } 00146 #ifndef Q_QDOC 00147 private: 00148 QScopedPointer<PluginPrivate> p; 00149 friend class ModuleManager; 00150 #endif 00151 }; 00152 00153 class LIBQUTIM_EXPORT PluginFactory 00154 { 00155 public: 00156 virtual ~PluginFactory() {} 00157 // Will be called after ::load() method 00158 virtual QList<Plugin*> loadPlugins() = 0; 00159 }; 00160 00161 LIBQUTIM_EXPORT QList<QPointer<Plugin> > pluginsList(); 00162 } 00163 00164 Q_DECLARE_OPERATORS_FOR_FLAGS(qutim_sdk_0_3::PluginInfo::Capabilities) 00165 Q_DECLARE_OPERATORS_FOR_FLAGS(qutim_sdk_0_3::Plugin::Capabilities) 00166 00167 #ifdef QUTIM_STATIC_PLUGIN 00168 # define QUTIM_EXPORT_PLUGIN_HELPER(PluginInstance, Class) \ 00169 QT_PREPEND_NAMESPACE(QObject) \ 00170 *PluginInstance() \ 00171 Q_PLUGIN_INSTANCE(Class) 00172 # define QUTIM_EXPORT_PLUGIN(Class) \ 00173 QUTIM_EXPORT_PLUGIN_HELPER(QUTIM_PLUGIN_INSTANCE, Class) 00174 # define QUTIM_EXPORT_PLUGIN2(Plugin,Class) \ 00175 QUTIM_EXPORT_PLUGIN(Class) 00176 #else 00177 # define QUTIM_EXPORT_STRING_HELPER(ID) #ID 00178 # define QUTIM_EXPORT_STRING(ID) QUTIM_EXPORT_STRING_HELPER(ID) 00179 # define QUTIM_EXPORT_PLUGIN2(Plugin,Class) \ 00180 Q_EXPORT_PLUGIN2(Plugin,Class) \ 00181 static const char *qutim_plugin_verification_data = \ 00182 "pattern=""QUTIM_PLUGIN_VERIFICATION_DATA""\n" \ 00183 "debugid="QUTIM_EXPORT_STRING(QUTIM_PLUGIN_ID)"\0" \ 00184 "libqutim="QUTIM_VERSION_STRING"\0"; \ 00185 Q_EXTERN_C Q_DECL_EXPORT \ 00186 const char * Q_STANDARD_CALL qutim_plugin_query_verification_data() \ 00187 { return qutim_plugin_verification_data; } 00188 00189 #define QUTIM_EXPORT_PLUGIN(Plugin) \ 00190 QUTIM_EXPORT_PLUGIN2(Plugin, Plugin) 00191 #endif 00192 Q_DECLARE_INTERFACE(qutim_sdk_0_3::PluginFactory, "org.qutim.PluginFactory") 00193 Q_DECLARE_INTERFACE(qutim_sdk_0_3::CommandArgumentsHandler, "org.qutim.CommandArgumentsHandler") 00194 00195 #endif // PLUGIN_H 00196