4 #include <QSqlDatabase>
7 #include <QThreadStorage>
9 #include <QMutexLocker>
10 #include <QStringList>
13 #include "boost/current_function.hpp"
15 #include "Kernel_global.h"
17 #include "prepareoptions.h"
18 #include "issuelogger.h"
20 #include "publicdatabase.h"
21 #include "ilwisobject.h"
27 class FactoryInterface;
32 typedef QScopedPointer<Version> SPVersion;
33 typedef std::shared_ptr<Tranquilizer> SPTranquilizer;
43 class KERNELSHARED_EXPORT
Kernel :
public QObject
51 explicit Kernel(QObject *parent = 0);
59 void setTLS(
const QString& key, QVariant* data);
64 void deleteTLS(
const QString& key);
71 const QVariant *getFromTLS(
const QString& key)
const;
83 QString translate(
const QString& s)
const;
88 const SPVersion &version()
const;
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);
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());
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());
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(
"::");
158 if ( slist.size() > 0) {
159 QString back = slist.back();
160 found = back == type;
163 if ( iter.value()->canUse(resource))
164 return dynamic_cast<T *>(iter.value());
171 void endClock(
const QString &label=
"");
173 SPTranquilizer createTrq(
const QString &title,
const QString &description, qint64 end, qint32 step);
175 QThreadStorage<QCache<QString, QVariant> *> _caches;
179 QScopedPointer<IssueLogger> _issues;
180 QHash<QString, FactoryInterface * > _masterfactory;
181 mutable clock_t _start_clock;
188 void doProgress(quint64
id, qint32 amount);
192 KERNELSHARED_EXPORT
bool initIlwis(QFileInfo configFile = QFileInfo());
193 #define TR(s) (kernel()->translate(s))
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))
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))
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))
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))
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))
223 typedef QList<IlwisTypes> IlwTypeList;