summaryrefslogtreecommitdiff
path: root/PluginsManager.h
blob: 9b3ecc97f84371280e9756f46eb539d6169c5eb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/** \file PluginsManager.h
\brief Define the class to manage and load the plugins
\author alpha_one_x86
\licence GPL3, see the file COPYING */

#ifndef PLUGINS_MANAGER_H
#define PLUGINS_MANAGER_H

#include <QObject>
#include <QList>
#include <QStringList>
#include <QDomElement>
#include <QDomDocument>
#include <QDomNode>
#include <QTreeWidgetItem>
#include <QDateTime>
#include <QAction>
#include <QMenu>
#include <QCryptographicHash>
#include <QString>
#include <QSemaphore>
#include <QRegularExpression>
#include <QThread>

#include "Environment.h"
#include "OptionEngine.h"
#include "ResourcesManager.h"
#include "PluginInformation.h"
#ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
#include "QXzDecodeThread.h"
#include "QTarDecode.h"
#endif

namespace Ui {
    class PluginOptions;
}

/** \brief Define the class to manage and load the resources linked with the themes

This class provide a core load and manage the resources */
class PluginsManager : public QThread
{
    Q_OBJECT
    public:
        /// \brief to get plugins of type specific
        QList<PluginsAvailable> getPluginsByCategory(const PluginType &type) const;
        /** \brief to get plugins */
        QList<PluginsAvailable> getPlugins(bool withError=false) const;
        /// \brief get translated text
        //QString getTranslatedText(PluginsAvailable plugin,QString informationName,QString mainShortName);
        //QString getTranslatedText(PluginsAvailable plugin,QString informationName);
        /// \brief transform short plugin name into file name
        static QString getResolvedPluginName(const QString &name);
        static bool isSamePlugin(const PluginsAvailable &pluginA,const PluginsAvailable &pluginB);
        void lockPluginListEdition();
        void unlockPluginListEdition();
        bool allPluginHaveBeenLoaded() const;
        /// \brief to load the get dom specific
        QString getDomSpecific(const QDomElement &root,const QString &name,const QList<QPair<QString,QString> > &listChildAttribute) const;
        QString getDomSpecific(const QDomElement &root,const QString &name) const;
        /// \brief set current language
        void setLanguage(const QString &language);
        /// \brief Enumeration of plugin add backend
        enum ImportBackend
        {
            ImportBackend_File,		//import plugin from local file
            ImportBackend_Internet	//import plugin form internet
        };
        static PluginsManager *pluginsManager;
        /// \brief Create the manager and load the defaults variables
        PluginsManager();
        /// \brief Destroy the language manager
        ~PluginsManager();
        /// \brief To compare version
        static bool compareVersion(const QString &versionA,const QString &sign,const QString &versionB);
    private:
        /// \brief List of plugins
        QList<PluginsAvailable> pluginsList;
        QMultiMap<PluginType,PluginsAvailable> pluginsListIndexed;
        /// \brief to load the multi-language balise
        void loadBalise(const QDomElement &root,const QString &name,QList<QStringList> *informations,QString *errorString,bool needHaveOneEntryMinimum=true,bool multiLanguage=false,bool englishNeedBeFound=false);
        /// \brief get the version
        QString getPluginVersion(const QString &pluginName) const;
        /// \brief list of cat plugin type
        //QStringList catPlugin;
        QStringList englishPluginType;
        QList<QTreeWidgetItem *> catItemList;
        /// \brief store the current mainShortName
        QString mainShortName;
        /// \brief load the plugin list
        void loadPluginList();
        #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
        QAction *backendMenuFile;		///< Pointer on the file backend menu
        bool importingPlugin;
        void lunchDecodeThread(const QByteArray &data);
        QXzDecodeThread decodeThread;
        void executeTheFileBackendLoader();
        #endif
        #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
        /// \brief check the dependencies, return number of error
        quint32 checkDependencies();
        #endif
        void loadPluginXml(PluginsAvailable * thePlugin,const QByteArray &xml);
        QStringList readPluginPath;
        bool loadPluginInformation(const QString &path);
        QSemaphore editionSemList;
        bool stopIt;
        bool pluginLoaded;
        QString language;
        QString categoryToString(const PluginType &category) const;
        QString categoryToTranslation(const PluginType &category);
        QRegularExpression regexp_to_clean_1,regexp_to_clean_2,regexp_to_clean_3,regexp_to_clean_4,regexp_to_clean_5;
        QRegularExpression regexp_to_dep_1,regexp_to_dep_2,regexp_to_dep_3,regexp_to_dep_4,regexp_to_dep_5,regexp_to_dep_6;
        PluginInformation *pluginInformation;
    private slots:
        /// \brief show the information
        void showInformationDoubleClick();
        #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
        void decodingFinished();
        #endif
        #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
        void newAuthPath(const QString &path);
        #endif
        void post_operation();
/*	public slots:
        /// \brief to refresh the plugin list
        void refreshPluginList(QString mainShortName="en");*/
    signals:
        void pluginListingIsfinish() const;
        void onePluginAdded(const PluginsAvailable&) const;
        void onePluginInErrorAdded(const PluginsAvailable&) const;
        #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
        void onePluginWillBeRemoved(const PluginsAvailable&) const; // when will be really removed
        void onePluginWillBeUnloaded(const PluginsAvailable&) const;//just unload to quit the application
        #endif
        void needLangToRefreshPluginList() const;
        void newLanguageLoaded() const;
        #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
        void manuallyAdded(const PluginsAvailable&) const;
        #endif
    protected:
        void run();
    public slots: //do gui action
        void showInformation(const QString &path);
        #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
        void removeThePluginSelected(const QString &path);
        void addPlugin(const ImportBackend &backend);
        void tryLoadPlugin(const QString &file);
        #endif
};

/// \brief to do structure comparaison
bool operator==(PluginsAvailable pluginA,PluginsAvailable pluginB);

#endif // PLUGINS_MANAGER_H