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