Ilwis-Objects  1.0
GIS and Remote Sensing framework for data access and processing
 All Classes Functions Enumerations Pages
kernel.h
1 #ifndef KERNEL_H
2 #define KERNEL_H
3 
4 #include <QSqlDatabase>
5 #include <QCache>
6 #include <QFileInfo>
7 #include <QThreadStorage>
8 #include <QMutex>
9 #include <QMutexLocker>
10 #include <QStringList>
11 #include <QUrl>
12 #include <fstream>
13 #include "boost/current_function.hpp"
14 #include <time.h>
15 #include "Kernel_global.h"
16 #include "ilwis.h"
17 #include "prepareoptions.h"
18 #include "issuelogger.h"
19 #include "module.h"
20 #include "publicdatabase.h"
21 #include "ilwisobject.h"
22 #include "factory.h"
23 
24 namespace Ilwis {
25 // forwards
26 class Version;
27 class FactoryInterface;
28 class IssueLogger;
29 class Resource;
30 class Tranquilizer;
31 
32 typedef QScopedPointer<Version> SPVersion;
33 typedef std::shared_ptr<Tranquilizer> SPTranquilizer;
34 
43 class KERNELSHARED_EXPORT Kernel : public QObject
44 {
45  Q_OBJECT
46 public:
51  explicit Kernel(QObject *parent = 0);
52 
53  ~Kernel();
59  void setTLS(const QString& key, QVariant* data);
64  void deleteTLS(const QString& key);
71  const QVariant *getFromTLS(const QString& key) const;
76  void addFactory(FactoryInterface *fac);
77 
83  QString translate(const QString& s) const;
88  const SPVersion &version() const;
89 
90  static Kernel *_kernel;
94  void init();
99  PublicDatabase &database();
105  QScopedPointer<IssueLogger> &issues();
110  QString demangle(const char *mangled_name);
119  bool message(const QString& message, IssueObject::IssueType, const QString p1, const QString p2, const QString p3, const QString& file, int line, const QString& func);
120 
126  template<class T> const T *factory(const QString& type, const QString& subtype="") const {
127  QString key = subtype != "" ? QString(subtype + "::" + type).toLower() : type.toLower();
128  QHash<QString, FactoryInterface *>::const_iterator iter = _masterfactory.find(key) ;
129  if ( iter != _masterfactory.end())
130  return dynamic_cast<T *>(iter.value());
131  return 0;
132  }
133 
140  template<class T> T *factory(const QString& type, const QString& subtype="") {
141  QString key = subtype != "" ? QString(subtype + "::" + type).toLower() : type.toLower();
142  QHash<QString, FactoryInterface *>::const_iterator iter = _masterfactory.find(key) ;
143  if ( iter != _masterfactory.end())
144  return dynamic_cast<T *>(iter.value());
145  //this->_issues->log(TR(QString(ERR_NO_INITIALIZED_1).arg(kind)));
146  return 0;
147  }
148 
153  template<class T> const T *factory(const QString& kind, const Resource& resource) const {
154  QString type = kind.toLower();
155  for(QHash<QString, FactoryInterface *>::const_iterator iter = _masterfactory.begin(); iter != _masterfactory.end(); ++iter) {
156  QStringList slist = iter.key().split("::");
157  bool found = false;
158  if ( slist.size() > 0) {
159  QString back = slist.back();
160  found = back == type;
161  }
162  if (found ) {
163  if ( iter.value()->canUse(resource))
164  return dynamic_cast<T *>(iter.value());
165  }
166  }
167  return 0;
168  }
169  //for debugging
170  void startClock();
171  void endClock(const QString &label="");
172 
173  SPTranquilizer createTrq(const QString &title, const QString &description, qint64 end, qint32 step);
174 private:
175  QThreadStorage<QCache<QString, QVariant> *> _caches;
176  ModuleMap _modules;
177  SPVersion _version;
178  PublicDatabase _dbPublic;
179  QScopedPointer<IssueLogger> _issues;
180  QHash<QString, FactoryInterface * > _masterfactory;
181  mutable clock_t _start_clock;
182 
183 
184 signals:
185  void doCommand(const QString& expr, ExecutionContext* ctx);
186 
187 public slots:
188  void doProgress(quint64 id, qint32 amount);
189 
190 };
191 KERNELSHARED_EXPORT Ilwis::Kernel* kernel();
192 KERNELSHARED_EXPORT bool initIlwis(QFileInfo configFile = QFileInfo());
193 #define TR(s) (kernel()->translate(s))
194 
195 }
196 
197 
198 #define ERROR0(m) ( kernel()->message(m,IssueObject::itError, sUNDEF, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
199 #define ERROR1(m, p) ( kernel()->message(m,IssueObject::itError, p, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
200 #define ERROR2(m, p1, p2) ( kernel()->message(m,IssueObject::itError, p1, p2, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
201 #define ERROR3(m, p1, p2, p3) ( kernel()->message(m,IssueObject::itError,p1, p2, p3, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
202 
203 #define WARN(m) ( kernel()->message(m,IssueObject::itWarning,sUNDEF, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
204 #define WARN1(m, p) ( kernel()->message(m,IssueObject::itWarning, p, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
205 #define WARN2(m, p1, p2) ( kernel()->message(m,IssueObject::itWarning, p1, p2, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
206 #define WARN3(m, p1, p2, p3) ( kernel()->message(m,IssueObject::itWarning,p1, p2, p3, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
207 
208 #define MESSAGE0(m) ( kernel()->message(m,IssueObject::itMessage, sUNDEF, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
209 #define MESSAGE1(m, p) ( kernel()->message(m,IssueObject::itMessage, p, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
210 #define MESSAGE2(m, p1, p2) ( kernel()->message(m,IssueObject::itMessage, p1, p2, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
211 #define MESSAGE3(m, p1, p2, p3) ( kernel()->message(m,IssueObject::itMessage,p1, p2, p3, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
212 
213 #define DEBUG0(m) ( kernel()->message(m,IssueObject::itDebug, sUNDEF, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
214 #define DEBUG1(m, p) ( kernel()->message(m,IssueObject::itDebug, p, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
215 #define DEBUG2(m, p1, p2) ( kernel()->message(m,IssueObject::itDebug, p1, p2, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
216 #define DEBUG3(m, p1, p2, p3) ( kernel()->message(m,IssueObject::itDebug,p1, p2, p3, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
217 
218 #define CRITICAL0(m) ( kernel()->message(m,IssueObject::itCritical, sUNDEF, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
219 #define CRITICAL1(m, p) ( kernel()->message(m,IssueObject::itCritical, p, sUNDEF, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
220 #define CRITICAL2(m, p1, p2) ( kernel()->message(m,IssueObject::itCritical, p1, p2, sUNDEF, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
221 #define CRITICAL3(m, p1, p2, p3) ( kernel()->message(m,IssueObject::itCritical,p1, p2, p3, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
222 
223 typedef QList<IlwisTypes> IlwTypeList;
224 
225 
226 
227 #endif // KERNEL_H