libqutim  0.3.2.0
plugin.h
Go to the documentation of this file.
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