libqutim
0.3.2.0
|
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 LIBQUTIM_EXPORT void debugAddPluginId(quint64, const QMetaObject *meta); 00044 00045 class LIBQUTIM_EXPORT PluginInfo 00046 { 00047 public: 00048 // Keep in sync with Plugin::Capability 00049 enum Capability 00050 { 00051 Loadable = 0x01 00052 }; 00053 Q_DECLARE_FLAGS(Capabilities, Capability) 00054 00055 PluginInfo(const LocalizedString &name = LocalizedString(), 00056 const LocalizedString &description = LocalizedString(), 00057 quint32 version = 0, ExtensionIcon icon = ExtensionIcon()); 00058 PluginInfo(const PluginInfo &other); 00059 ~PluginInfo(); 00060 PluginInfo &operator =(const PluginInfo &other); 00061 PluginInfo &addAuthor(const PersonInfo &author); 00062 PluginInfo &addAuthor(const QString &ocsUsername); 00063 PluginInfo &addAuthor(const LocalizedString &name, const LocalizedString &task, 00064 const QString &email = QString(), const QString &web = QString()); 00065 PluginInfo &setName(const LocalizedString &name); 00066 PluginInfo &setDescription(const LocalizedString &description); 00067 PluginInfo &setIcon(const ExtensionIcon &icon); 00068 PluginInfo &setVersion(quint32 version); 00069 Capabilities capabilities() const; 00070 PluginInfo &setCapabilities(Capabilities capabilities); 00071 QList<PersonInfo> authors() const; 00072 LocalizedString name() const; 00073 LocalizedString description() const; 00074 quint32 version() const; 00075 ExtensionIcon icon() const; 00076 #ifndef Q_QDOC 00077 QString fileName() const; 00078 private: 00079 QSharedDataPointer<PluginInfoData> d; 00080 public: 00081 typedef PluginInfoData Data; 00082 Data *data(); 00083 #endif 00084 }; 00085 00086 class CommandArgumentPrivate; 00087 00088 class LIBQUTIM_EXPORT CommandArgument 00089 { 00090 public: 00091 enum Type { 00092 NoValue = 0, 00093 ValueOptional = 1, 00094 ValueRequired = 2, 00095 AllowMultiple = 4, 00096 Undocumented = 8 00097 }; 00098 Q_DECLARE_FLAGS(Types, Type) 00099 00100 CommandArgument(const QString &name, const QString &desc = QString(), Types types = NoValue, int group = -1); 00101 CommandArgument(const CommandArgument &o); 00102 CommandArgument &operator =(const CommandArgument &o); 00103 ~CommandArgument(); 00104 00105 QString name() const; 00106 QString description() const; 00107 Types types() const; 00108 int group() const; 00109 void setAliases(const QStringList &aliases); 00110 void addAlias(const QStringList &alias); 00111 QStringList aliases() const; 00112 00113 private: 00114 QSharedPointer<CommandArgumentPrivate> d; 00115 }; 00116 00117 class LIBQUTIM_EXPORT CommandArgumentsHandler 00118 { 00119 public: 00120 virtual ~CommandArgumentsHandler(); 00121 00122 virtual QStringList commands() = 0; 00123 virtual QList<CommandArgument> commandOptions(const QString &name) = 0; 00124 }; 00125 00126 #ifndef Q_QDOC 00127 typedef void ( /*QObject::*/ *ModuleInit)(); 00128 #endif 00129 00130 class LIBQUTIM_EXPORT Plugin : public QObject 00131 { 00132 Q_OBJECT 00133 Q_DISABLE_COPY(Plugin) 00134 Q_DECLARE_PRIVATE(Plugin) 00135 public: 00136 // Keep in sync with PluginInfo::Capability 00137 enum Capability 00138 { 00139 Loadable = 0x01 00140 }; 00141 Q_DECLARE_FLAGS(Capabilities, Capability) 00142 Plugin(); 00143 virtual ~Plugin(); 00144 PluginInfo info() const; 00145 ExtensionInfoList avaiableExtensions() const; 00146 virtual void init() = 0; 00147 virtual bool load() = 0; 00148 virtual bool unload() = 0; 00149 protected: 00150 // Should be called at init 00151 void addAuthor(const LocalizedString &name, const LocalizedString &task, 00152 const QString &email = QString(), const QString &web = QString()); 00153 void addAuthor(const QString &ocsUsername); 00154 void setInfo(const LocalizedString &name, const LocalizedString &description, 00155 quint32 version = 0, ExtensionIcon icon = ExtensionIcon()); 00156 void setCapabilities(Capabilities capabilities); 00157 void addExtension(const LocalizedString &name, const LocalizedString &description, 00158 const ObjectGenerator *generator, ExtensionIcon icon = ExtensionIcon()); 00159 template<typename T> 00160 void addExtension(const LocalizedString &name, const LocalizedString &description, 00161 ExtensionIcon icon = ExtensionIcon()) 00162 { addExtension(name, description, new GeneralGenerator<T>(), icon); } 00163 template<typename T, typename I0> 00164 void addExtension(const LocalizedString &name, const LocalizedString &description, 00165 ExtensionIcon icon = ExtensionIcon()) 00166 { addExtension(name, description, new GeneralGenerator<T, I0>(), icon); } 00167 template<typename T, typename I0, typename I1> 00168 void addExtension(const LocalizedString &name, const LocalizedString &description, 00169 ExtensionIcon icon = ExtensionIcon()) 00170 { addExtension(name, description, new GeneralGenerator<T, I0, I1>(), icon); } 00171 #ifndef Q_QDOC 00172 private: 00173 QScopedPointer<PluginPrivate> p; 00174 friend class ModuleManager; 00175 #endif 00176 }; 00177 00178 class LIBQUTIM_EXPORT PluginFactory 00179 { 00180 public: 00181 virtual ~PluginFactory() {} 00182 // Will be called after ::load() method 00183 virtual QList<Plugin*> loadPlugins() = 0; 00184 }; 00185 00186 LIBQUTIM_EXPORT QList<QPointer<Plugin> > pluginsList(); 00187 } 00188 00189 Q_DECLARE_OPERATORS_FOR_FLAGS(qutim_sdk_0_3::PluginInfo::Capabilities) 00190 Q_DECLARE_OPERATORS_FOR_FLAGS(qutim_sdk_0_3::Plugin::Capabilities) 00191 00192 #ifdef QUTIM_STATIC_PLUGIN 00193 00194 # define QUTIM_DEBUG_ID_CONVERT_HELPER(A) 0x ## A ## ULL 00195 # define QUTIM_DEBUG_ID_CONVERT(A) QUTIM_DEBUG_ID_CONVERT_HELPER(A) 00196 # define QUTIM_PLUGIN_INSTANCE_BODY(IMPLEMENTATION) \ 00197 { \ 00198 static QT_PREPEND_NAMESPACE(QPointer)<QT_PREPEND_NAMESPACE(QObject)> _instance; \ 00199 if (!_instance) { \ 00200 _instance = new IMPLEMENTATION; \ 00201 debugAddPluginId(QUTIM_DEBUG_ID_CONVERT(QUTIM_PLUGIN_ID), &IMPLEMENTATION::staticMetaObject);\ 00202 } \ 00203 return _instance; \ 00204 } 00205 # define QUTIM_EXPORT_PLUGIN_HELPER(PluginInstance, Class) \ 00206 QT_PREPEND_NAMESPACE(QObject) \ 00207 *PluginInstance() \ 00208 QUTIM_PLUGIN_INSTANCE_BODY(Class) 00209 # undef QUTIM_DEBUG_ID_CONVERT_HELPER 00210 # undef QUTIM_DEBUG_ID_CONVERT 00211 00212 # define QUTIM_EXPORT_PLUGIN(Class) \ 00213 QUTIM_EXPORT_PLUGIN_HELPER(QUTIM_PLUGIN_INSTANCE_BODY, Class) 00214 # define QUTIM_EXPORT_PLUGIN2(Plugin,Class) \ 00215 QUTIM_EXPORT_PLUGIN(Class) 00216 #else 00217 # define QUTIM_EXPORT_STRING_HELPER(ID) #ID 00218 # define QUTIM_EXPORT_STRING(ID) QUTIM_EXPORT_STRING_HELPER(ID) 00219 # define QUTIM_EXPORT_PLUGIN2(Plugin,Class) \ 00220 Q_EXPORT_PLUGIN2(Plugin,Class) \ 00221 static const char *qutim_plugin_verification_data = \ 00222 "pattern=""QUTIM_PLUGIN_VERIFICATION_DATA""\n" \ 00223 "debugid=" QUTIM_EXPORT_STRING(QUTIM_PLUGIN_ID)"\n" \ 00224 "libqutim=" QUTIM_VERSION_STRING"\0"; \ 00225 Q_EXTERN_C Q_DECL_EXPORT \ 00226 const char * Q_STANDARD_CALL qutim_plugin_query_verification_data() \ 00227 { return qutim_plugin_verification_data; } 00228 00229 #define QUTIM_EXPORT_PLUGIN(Plugin) \ 00230 QUTIM_EXPORT_PLUGIN2(Plugin, Plugin) 00231 #endif 00232 Q_DECLARE_INTERFACE(qutim_sdk_0_3::PluginFactory, "org.qutim.PluginFactory") 00233 Q_DECLARE_INTERFACE(qutim_sdk_0_3::CommandArgumentsHandler, "org.qutim.CommandArgumentsHandler") 00234 00235 #endif // PLUGIN_H 00236