libqutim 0.2.80.1

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     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