itom 2.2.1
K:/git-itom/sources/itom/Qitom/organizer/addInManager.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2016, Institut fuer Technische Optik (ITO),
00005     Universitaet Stuttgart, Germany
00006 
00007     This file is part of itom.
00008   
00009     itom is free software; you can redistribute it and/or modify it
00010     under the terms of the GNU Library General Public Licence as published by
00011     the Free Software Foundation; either version 2 of the Licence, or (at
00012     your option) any later version.
00013 
00014     itom is distributed in the hope that it will be useful, but
00015     WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
00017     General Public Licence for more details.
00018 
00019     You should have received a copy of the GNU Library General Public License
00020     along with itom. If not, see <http://www.gnu.org/licenses/>.
00021 *********************************************************************** */
00022 
00023 #ifndef ADDINMANAGER_H
00024 #define ADDINMANAGER_H
00025 
00026 #include "../global.h"
00027 
00028 #include "common/addInInterface.h"
00029 #include "DataObject/dataobj.h"
00030 #if ITOM_POINTCLOUDLIBRARY > 0
00031     #include "PointCloud/pclStructures.h"
00032 #endif
00033 #include "../models/PlugInModel.h"
00034 #include "algoInterfaceValidator.h"
00035 
00036 //#include <qcoreapplication.h>
00037 #include <qmetatype.h>
00038 #include <qvector.h>
00039 #include <qsharedpointer.h>
00040 #include <qhash.h>
00041 #include <qtimer.h>
00042 #include <qtranslator.h>
00043 #include <qpointer.h>
00044 
00045 // in the invokeMethod function parameters are passed with the Q_ARG macro, which works only with preregistered data types
00046 // the registration of "new" data types is done in two steps. First they are declared with the Q_DECLARE_METATYPE macro
00047 // second they are registered for use with the function qRegisterMetaType. For the data types used within the iTom plugin
00048 // system this is done here and in the constructor of the AddInManager
00049 Q_DECLARE_METATYPE(ItomSharedSemaphore *)
00050 Q_DECLARE_METATYPE(const char *)
00051 Q_DECLARE_METATYPE(const char **)
00052 Q_DECLARE_METATYPE(char *)
00053 Q_DECLARE_METATYPE(char **)
00054 Q_DECLARE_METATYPE(double)
00055 Q_DECLARE_METATYPE(double *)
00056 Q_DECLARE_METATYPE(const double *)
00057 Q_DECLARE_METATYPE(int *)
00058 Q_DECLARE_METATYPE(const int *)
00059 Q_DECLARE_METATYPE(ito::AddInInterfaceBase *)
00060 Q_DECLARE_METATYPE(ito::AddInBase *)
00061 Q_DECLARE_METATYPE(ito::AddInBase **)
00062 Q_DECLARE_METATYPE(ito::AddInDataIO **)
00063 Q_DECLARE_METATYPE(ito::AddInActuator **)
00064 Q_DECLARE_METATYPE(ito::AddInAlgo **)
00065 //Q_DECLARE_METATYPE(ito::ActuatorAxis **)
00066 Q_DECLARE_METATYPE(ito::RetVal *)
00067 Q_DECLARE_METATYPE(ito::RetVal)
00068 //Q_DECLARE_METATYPE(const void*)
00069 Q_DECLARE_METATYPE(QVector<ito::Param> *)
00070 Q_DECLARE_METATYPE(QVector<ito::ParamBase> *)
00071 Q_DECLARE_METATYPE(QVector<int>)
00072 Q_DECLARE_METATYPE(QVector<double>)
00073 
00074 Q_DECLARE_METATYPE(QSharedPointer<double> )
00075 Q_DECLARE_METATYPE(QSharedPointer<int>)
00076 Q_DECLARE_METATYPE(QSharedPointer<QVector<double> >)
00077 Q_DECLARE_METATYPE(QSharedPointer<char>)
00078 Q_DECLARE_METATYPE(QSharedPointer<QByteArray>)
00079 Q_DECLARE_METATYPE(QSharedPointer<ito::Param>)
00080 Q_DECLARE_METATYPE(QSharedPointer<ito::ParamBase>)
00081 
00082 Q_DECLARE_METATYPE(QVector<QSharedPointer<ito::ParamBase> >)
00083 Q_DECLARE_METATYPE(StringMap)
00084 
00085 Q_DECLARE_METATYPE(ito::DataObject)
00086 
00087 
00088 namespace ito
00089 {
00090     
00091 
00101     class AddInManager : public QObject
00102     {
00103         Q_OBJECT
00104 
00105         public:
00106             static AddInManager * getInstance(void);
00107             static RetVal closeInstance(void);
00108             const RetVal scanAddInDir(const QString &path);
00109             inline const QList<QObject *> * getDataIOList(void) const { return &m_addInListDataIO; }
00110             inline const QList<QObject *> * getActList(void)    const { return &m_addInListAct; }
00111             inline const QList<QObject *> * getAlgList(void)    const { return &m_addInListAlgo; }
00112             inline const QHash<QString, ito::AddInAlgo::FilterDef *>     * getFilterList(void)     const { return &m_filterList;     }
00113             inline const QHash<QString, ito::AddInAlgo::AlgoWidgetDef *> * getAlgoWidgetList(void) const { return &m_algoWidgetList; }
00114             const ito::FilterParams* getHashedFilterParams(ito::AddInAlgo::t_filterParam filterParam) const;
00115             const QList<PluginLoadStatus> getPluginLoadStatus() const { return m_pluginLoadStatus; }
00116             inline const AlgoInterfaceValidator * getAlgoInterfaceValidator(void) const { return m_algoInterfaceValidator; }
00117 
00118             const ito::AddInAlgo::AlgoWidgetDef * getAlgoWidgetDef( QString algoWidgetName, QString algoPluginName = QString() );
00119 
00120             inline PlugInModel * getPluginModel(void) { return &m_plugInModel; }
00121             const RetVal reloadAddIn(const QString &name);
00122             inline int getNumTotItems(void) const { return m_addInListDataIO.size() + m_addInListAct.size() + m_addInListAlgo.size(); }
00123             void * getAddInPtr(const int itemNum)
00124             {
00125                 int num = itemNum;
00126 
00127                 if (num < m_addInListAct.size())
00128                 {
00129                     return (void *)m_addInListAct[num];
00130                 }
00131                 else if (num -= m_addInListAct.size(), num < m_addInListAlgo.size())
00132                 {
00133                     return (void *)m_addInListAlgo[num];
00134                 }
00135                 else if (num -= m_addInListAlgo.size(), num < m_addInListDataIO.size())
00136                 {
00137                     return (void *)m_addInListDataIO[num];
00138                 }
00139                 else
00140                 {
00141                     return NULL;
00142                 }
00143             }
00144             int getItemNum(const void *item)
00145             {
00146                 int num = 0;
00147                 if ((num = m_addInListAct.indexOf((QObject*)item)) != -1)
00148                 {
00149                     return num;
00150                 }
00151                 else if ((num = m_addInListAlgo.indexOf((QObject*)item)) != -1)
00152                 {
00153                     return num + m_addInListAct.size();
00154                 }
00155                 else if ((num = m_addInListDataIO.indexOf((QObject*)item)) != -1)
00156                 {
00157                     return num + m_addInListAct.size() + m_addInListAlgo.size();
00158                 }
00159                 else
00160                 {
00161                     return -1;
00162                 }
00163             }
00164             int getItemIndexInList(const void *item)
00165             {
00166                 int num = 0;
00167                 if ((num = m_addInListAct.indexOf((QObject*)item)) != -1)
00168                 {
00169                     return num;
00170                 }
00171                 else if ((num = m_addInListAlgo.indexOf((QObject*)item)) != -1)
00172                 {
00173                     return num;
00174                 }
00175                 else if ((num = m_addInListDataIO.indexOf((QObject*)item)) != -1)
00176                 {
00177                     return num;
00178                 }
00179                 else
00180                 {
00181                     return -1;
00182                 }
00183             }
00184             int getPluginNum(const QString &name, ito::AddInInterfaceBase *&addIn)
00185             {
00186 
00187                 addIn = NULL;
00188 //                int num = -1;
00189                 for (int n = 0; n < m_addInListAct.size(); n++)
00190                 {
00191                     if ((m_addInListAct[n])->objectName() == name)
00192                     {
00193                         addIn = (ito::AddInInterfaceBase*)m_addInListAct[n];
00194                         return n;
00195                     }
00196                 }
00197                 for (int n = 0; n < m_addInListDataIO.size(); n++)
00198                 {
00199                     if ((m_addInListDataIO[n])->objectName() == name)
00200                     {
00201                         addIn = (ito::AddInInterfaceBase*)m_addInListDataIO[n];
00202                         return n;
00203                     }
00204                 }
00205                 for (int n = 0; n < m_addInListAlgo.size(); n++)
00206                 {
00207                     if ((m_addInListAlgo[n])->objectName() == name)
00208                     {
00209                         addIn = (ito::AddInInterfaceBase*)m_addInListAlgo[n];
00210                         return n;
00211                     }
00212                 }
00213                 return -1;
00214             }
00215 
00216 
00217             inline void updateModel(void) { m_plugInModel.update(); }
00218             const RetVal saveParamVals(ito::AddInBase *plugin);
00219             const RetVal loadParamVals(ito::AddInBase *plugin);
00220             const RetVal getInitParams(const QString &name, const int pluginType, int *pluginNum, QVector<ito::Param> *&paramsMand, QVector<ito::Param> *&paramsOpt);
00221             const RetVal getPluginInfo(const QString &name, int &pluginType, int &pluginNum, int &version, QString &typeString, QString &author, QString &description, QString &detaildescription, QString &license, QString &about);
00222             const RetVal incRef(ito::AddInBase *plugin);
00223             const RetVal decRef(ito::AddInBase **plugin);
00224 
00225             bool isPluginInstanceDead(const ito::AddInBase *plugin) const;
00226 
00227             const QList<ito::AddInAlgo::FilterDef *> getFilterByInterface(ito::AddInAlgo::tAlgoInterface iface, const QString tag = QString::Null()) const;
00228             const QList<ito::AddInAlgo::FilterDef *> getFiltersByCategory(ito::AddInAlgo::tAlgoCategory cat) const;
00229             const QList<ito::AddInAlgo::FilterDef *> getFilterByInterfaceAndCategory(ito::AddInAlgo::tAlgoInterface iface, ito::AddInAlgo::tAlgoCategory cat, const QString tag = QString::Null()) const;
00230 
00231         protected:
00232 
00233             RetVal initDockWidget(const ito::AddInBase *addIn);
00234             RetVal loadAddIn(QString &filename);
00235 
00236             RetVal loadAddInDataIO(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00237             RetVal loadAddInActuator(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00238             RetVal loadAddInAlgo(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00239 
00240             RetVal registerPluginAsDeadPlugin(ito::AddInBase *addIn);
00241 
00242 
00243         private:
00244             AddInManager(void);
00245             AddInManager(AddInManager  &/*copyConstr*/) : QObject() {}
00246             ~AddInManager(void);
00247             QVector<QTranslator*> m_Translator;
00248 
00249             static AddInManager *m_pAddInManager;
00250             static QList<QObject *> m_addInListDataIO;
00251             static QList<QObject *> m_addInListAct;
00252             static QList<QObject *> m_addInListAlgo;
00253             static QHash<QString, ito::AddInAlgo::FilterDef *> m_filterList;
00254             static QMultiHash<QString, ito::AddInAlgo::FilterDef *> m_filterListInterfaceTag; //hash value is "{interface-number}_{tag}"
00255             static QHash<QString, ito::AddInAlgo::AlgoWidgetDef *> m_algoWidgetList;
00256             static QHash<void*, ito::FilterParams *> filterParamHash;
00257             static QList<PluginLoadStatus> m_pluginLoadStatus;
00258 
00259             AlgoInterfaceValidator *m_algoInterfaceValidator;
00260 
00261             PlugInModel m_plugInModel;
00262 
00263             QList< QPointer<ito::AddInBase> > m_deadPlugins;
00264             QTimer m_deadPluginTimer;
00265 /*
00267             class AddInSingleton
00268             {
00269                 public:
00270                     ~AddInSingleton()
00271                     {
00272                         #pragma omp critical
00273                         {
00274                             if( AddInManager::m_pAddInManager != NULL)
00275                             {
00276                                 delete AddInManager::m_pAddInManager;
00277                                 AddInManager::m_pAddInManager = NULL;
00278                             }
00279                         }
00280                     }
00281             };
00282             friend class AddInSingleton;
00283 */
00284         signals:
00285             void splashLoadMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black);
00286 
00287         public slots:
00288             ito::RetVal showConfigDialog(ito::AddInBase *addin, ItomSharedSemaphore *waitCond = NULL);
00289             ito::RetVal showDockWidget(ito::AddInBase *addin, int visible, ItomSharedSemaphore *waitCond = NULL);
00290 
00291             ito::RetVal initAddIn(const int pluginNum, const QString &name, ito::AddInDataIO **addIn, QVector<ito::ParamBase> *paramsMand, QVector<ito::ParamBase> *paramsOpt, bool autoLoadPluginParams, ItomSharedSemaphore *aimWait = NULL);
00292             ito::RetVal initAddIn(const int pluginNum, const QString &name, ito::AddInActuator **addIn, QVector<ito::ParamBase> *paramsMand, QVector<ito::ParamBase> *paramsOpt, bool autoLoadPluginParams, ItomSharedSemaphore *aimWait = NULL);
00293             ito::RetVal initAddIn(const int pluginNum, const QString &name, ito::AddInAlgo **addIn, QVector<ito::ParamBase> *paramsMand, QVector<ito::ParamBase> *paramsOpt, bool autoLoadPluginParams, ItomSharedSemaphore *aimWait = NULL);
00294 
00295             ito::RetVal closeAddIn(ito::AddInBase *addIn, ItomSharedSemaphore *aimWait = NULL);
00296 
00297         private slots:
00298             RetVal closeDeadPlugins();
00299             void propertiesChanged();
00300     };
00301 } //namespace ito
00302 
00303 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Properties Friends