itom 1.0.14
D:/git-itom/sources/itom/Qitom/organizer/addInManager.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2013, Institut für Technische Optik (ITO),
00005     Universität 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 "../models/PlugInModel.h"
00030 #include "algoInterfaceValidator.h"
00031 
00032 //#include <qcoreapplication.h>
00033 #include <qmetatype.h>
00034 #include <qvector.h>
00035 #include <qsharedpointer.h>
00036 #include <qhash.h>
00037 #include <qtimer.h>
00038 #include <qtranslator.h>
00039 
00040 // in the invokeMethod function parameters are passed with the Q_ARG macro, which works only with preregistered data types
00041 // the registration of "new" data types is done in two steps. First they are declared with the Q_DECLARE_METATYPE macro
00042 // second they are registered for use with the function qRegisterMetaType. For the data types used within the iTom plugin
00043 // system this is done here and in the constructor of the AddInManager
00044 Q_DECLARE_METATYPE(ItomSharedSemaphore *)
00045 Q_DECLARE_METATYPE(const char *)
00046 Q_DECLARE_METATYPE(const char **)
00047 Q_DECLARE_METATYPE(char *)
00048 Q_DECLARE_METATYPE(char **)
00049 Q_DECLARE_METATYPE(double)
00050 Q_DECLARE_METATYPE(double *)
00051 //Q_DECLARE_METATYPE(const double)
00052 Q_DECLARE_METATYPE(const double *)
00053 Q_DECLARE_METATYPE(int *)
00054 Q_DECLARE_METATYPE(const int *)
00055 //Q_DECLARE_METATYPE(int)
00056 Q_DECLARE_METATYPE(ito::AddInInterfaceBase *)
00057 Q_DECLARE_METATYPE(ito::AddInBase *)
00058 Q_DECLARE_METATYPE(ito::AddInBase **)
00059 Q_DECLARE_METATYPE(ito::AddInDataIO **)
00060 Q_DECLARE_METATYPE(ito::AddInActuator **)
00061 Q_DECLARE_METATYPE(ito::AddInAlgo **)
00062 //Q_DECLARE_METATYPE(ito::ActuatorAxis **)
00063 Q_DECLARE_METATYPE(ito::RetVal *)
00064 Q_DECLARE_METATYPE(ito::RetVal)
00065 Q_DECLARE_METATYPE(const void*)
00066 Q_DECLARE_METATYPE(QVector<ito::Param> *)
00067 Q_DECLARE_METATYPE(QVector<ito::ParamBase> *)
00068 Q_DECLARE_METATYPE(QVector<int>)
00069 Q_DECLARE_METATYPE(QVector<double>)
00070 
00071 Q_DECLARE_METATYPE(QSharedPointer<double> )
00072 Q_DECLARE_METATYPE(QSharedPointer<int>)
00073 Q_DECLARE_METATYPE(QSharedPointer<QVector<double> >)
00074 Q_DECLARE_METATYPE(QSharedPointer<char>)
00075 Q_DECLARE_METATYPE(QSharedPointer<ito::Param>)
00076 Q_DECLARE_METATYPE(QSharedPointer<ito::ParamBase>)
00077 
00078 Q_DECLARE_METATYPE(QVector<QSharedPointer<ito::ParamBase> >)
00079 Q_DECLARE_METATYPE(StringMap)
00080 
00081 //Q_DECLARE_METATYPE(ito::PCLPointCloud)
00082 //Q_DECLARE_METATYPE(ito::PCLPoint)
00083 //Q_DECLARE_METATYPE(ito::PCLPolygonMesh)
00084 
00085 namespace ito
00086 {
00087     
00088 
00098     class AddInManager : public QObject
00099     {
00100         Q_OBJECT
00101 
00102         public:
00103             static AddInManager * getInstance(void);
00104             static RetVal closeInstance(void);
00105             const RetVal scanAddInDir(const QString &path);
00106             inline const QList<QObject *> * getDataIOList(void) const { return &m_addInListDataIO; }
00107             inline const QList<QObject *> * getActList(void)    const { return &m_addInListAct; }
00108             inline const QList<QObject *> * getAlgList(void)    const { return &m_addInListAlgo; }
00109             inline const QHash<QString, ito::AddInAlgo::FilterDef *>     * getFilterList(void)     const { return &m_filterList;     }
00110             inline const QHash<QString, ito::AddInAlgo::AlgoWidgetDef *> * getAlgoWidgetList(void) const { return &m_algoWidgetList; }
00111             const ito::FilterParams* getHashedFilterParams(ito::AddInAlgo::t_filterParam filterParam) const;
00112             const QList<PluginLoadStatus> getPluginLoadStatus() const { return m_pluginLoadStatus; }
00113             inline const AlgoInterfaceValidator * getAlgoInterfaceValidator(void) const { return m_algoInterfaceValidator; }
00114 
00115             const ito::AddInAlgo::AlgoWidgetDef * getAlgoWidgetDef( QString algoWidgetName, QString algoPluginName = QString() );
00116 
00117             inline PlugInModel * getPluginModel(void) { return &m_plugInModel; }
00118             const RetVal reloadAddIn(const QString &name);
00119             inline int getNumTotItems(void) const { return m_addInListDataIO.size() + m_addInListAct.size() + m_addInListAlgo.size(); }
00120             void * getAddInPtr(const int itemNum)
00121             {
00122                 int num = itemNum;
00123 
00124                 if (num < m_addInListAct.size())
00125                 {
00126                     return (void *)m_addInListAct[num];
00127                 }
00128                 else if (num -= m_addInListAct.size(), num < m_addInListAlgo.size())
00129                 {
00130                     return (void *)m_addInListAlgo[num];
00131                 }
00132                 else if (num -= m_addInListAlgo.size(), num < m_addInListDataIO.size())
00133                 {
00134                     return (void *)m_addInListDataIO[num];
00135                 }
00136                 else
00137                 {
00138                     return NULL;
00139                 }
00140             }
00141             int getItemNum(const void *item)
00142             {
00143                 int num = 0;
00144                 if ((num = m_addInListAct.indexOf((QObject*)item)) != -1)
00145                 {
00146                     return num;
00147                 }
00148                 else if ((num = m_addInListAlgo.indexOf((QObject*)item)) != -1)
00149                 {
00150                     return num + m_addInListAct.size();
00151                 }
00152                 else if ((num = m_addInListDataIO.indexOf((QObject*)item)) != -1)
00153                 {
00154                     return num + m_addInListAct.size() + m_addInListAlgo.size();
00155                 }
00156                 else
00157                 {
00158                     return -1;
00159                 }
00160             }
00161             int getItemIndexInList(const void *item)
00162             {
00163                 int num = 0;
00164                 if ((num = m_addInListAct.indexOf((QObject*)item)) != -1)
00165                 {
00166                     return num;
00167                 }
00168                 else if ((num = m_addInListAlgo.indexOf((QObject*)item)) != -1)
00169                 {
00170                     return num;
00171                 }
00172                 else if ((num = m_addInListDataIO.indexOf((QObject*)item)) != -1)
00173                 {
00174                     return num;
00175                 }
00176                 else
00177                 {
00178                     return -1;
00179                 }
00180             }
00181             int getPluginNum(const QString &name, ito::AddInInterfaceBase *&addIn)
00182             {
00183 
00184                 addIn = NULL;
00185 //                int num = -1;
00186                 for (int n = 0; n < m_addInListAct.size(); n++)
00187                 {
00188                     if ((m_addInListAct[n])->objectName() == name)
00189                     {
00190                         addIn = (ito::AddInInterfaceBase*)m_addInListAct[n];
00191                         return n;
00192                     }
00193                 }
00194                 for (int n = 0; n < m_addInListDataIO.size(); n++)
00195                 {
00196                     if ((m_addInListDataIO[n])->objectName() == name)
00197                     {
00198                         addIn = (ito::AddInInterfaceBase*)m_addInListDataIO[n];
00199                         return n;
00200                     }
00201                 }
00202                 for (int n = 0; n < m_addInListAlgo.size(); n++)
00203                 {
00204                     if ((m_addInListAlgo[n])->objectName() == name)
00205                     {
00206                         addIn = (ito::AddInInterfaceBase*)m_addInListAlgo[n];
00207                         return n;
00208                     }
00209                 }
00210                 return -1;
00211             }
00212 
00213 //            inline void updateModel(void) { m_addInModel.update(); }
00214             inline void updateModel(void) { m_plugInModel.update(); }
00215             const RetVal saveParamVals(ito::AddInBase *plugin);
00216             const RetVal loadParamVals(ito::AddInBase *plugin);
00217             const RetVal getInitParams(const QString &name, const int pluginType, int *pluginNum, QVector<ito::Param> *&paramsMand, QVector<ito::Param> *&paramsOpt);
00218             const RetVal getPlugInInfo(const QString &name, int *pluginType, int *pluginNum, char **pluginTypeString, char ** author, char ** discription, char ** detaildiscription, int * version);
00219             const RetVal incRef(ito::AddInBase *plugin);
00220             const RetVal decRef(ito::AddInBase **plugin);
00221 
00222             bool isPluginInstanceDead(const ito::AddInBase *plugin) const;
00223 
00224             const QList<ito::AddInAlgo::FilterDef *> getFilterByInterface(ito::AddInAlgo::tAlgoInterface iface, const QString tag = QString::Null()) const;
00225             const QList<ito::AddInAlgo::FilterDef *> getFiltersByCategory(ito::AddInAlgo::tAlgoCategory cat) const;
00226             const QList<ito::AddInAlgo::FilterDef *> getFilterByInterfaceAndCategory(ito::AddInAlgo::tAlgoInterface iface, ito::AddInAlgo::tAlgoCategory cat, const QString tag = QString::Null()) const;
00227 
00228         protected:
00229 
00230             RetVal initDockWidget(const ito::AddInBase *addIn);
00231             RetVal loadAddIn(QString &filename);
00232 
00233             RetVal loadAddInDataIO(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00234             RetVal loadAddInActuator(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00235             RetVal loadAddInAlgo(QObject *plugin, ito::PluginLoadStatus &pluginLoadStatus);
00236 
00237             RetVal registerPluginAsDeadPlugin(ito::AddInBase *addIn);
00238 
00239 
00240         private:
00241             AddInManager(void);
00242             AddInManager(AddInManager  &/*copyConstr*/) : QObject() {}
00243             ~AddInManager(void);
00244             QVector<QTranslator*> m_Translator;
00245 
00246             static AddInManager *m_pAddInManager;
00247             static QList<QObject *> m_addInListDataIO;
00248             static QList<QObject *> m_addInListAct;
00249             static QList<QObject *> m_addInListAlgo;
00250             static QHash<QString, ito::AddInAlgo::FilterDef *> m_filterList;
00251             static QMultiHash<QString, ito::AddInAlgo::FilterDef *> m_filterListInterfaceTag; //hash value is "{interface-number}_{tag}"
00252             static QHash<QString, ito::AddInAlgo::AlgoWidgetDef *> m_algoWidgetList;
00253             static QHash<void*, ito::FilterParams *> filterParamHash;
00254             static QList<PluginLoadStatus> m_pluginLoadStatus;
00255 
00256             AlgoInterfaceValidator *m_algoInterfaceValidator;
00257 
00258             //AddInModel m_addInModel;
00259             PlugInModel m_plugInModel;
00260 
00261             QList< QWeakPointer<ito::AddInBase> > m_deadPlugins;
00262             QTimer m_deadPluginTimer;
00263 /*
00265             class AddInSingleton
00266             {
00267                 public:
00268                     ~AddInSingleton()
00269                     {
00270                         #pragma omp critical
00271                         {
00272                             if( AddInManager::m_pAddInManager != NULL)
00273                             {
00274                                 delete AddInManager::m_pAddInManager;
00275                                 AddInManager::m_pAddInManager = NULL;
00276                             }
00277                         }
00278                     }
00279             };
00280             friend class AddInSingleton;
00281 */
00282         signals:
00283             void splashLoadMessage(const QString &message, int alignment = Qt::AlignLeft, const QColor &color = Qt::black);
00284 
00285         public slots:
00286             ito::RetVal showConfigDialog(ito::AddInBase *addin);
00287             ito::RetVal showDockWidget(ito::AddInBase *addin, int visible, ItomSharedSemaphore *waitCond = NULL);
00288 
00289             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);
00290             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);
00291             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);
00292 
00293             ito::RetVal closeAddIn(ito::AddInBase **addIn, ItomSharedSemaphore *aimWait = NULL);
00294 
00295         private slots:
00296             RetVal closeDeadPlugins();
00297     };
00298 } //namespace ito
00299 
00300 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends