itom 2.2.1
|
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> *¶msMand, QVector<ito::Param> *¶msOpt); 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