#include "coresettings.h"
#include "signalproxy.h"
#include "sqlitestorage.h"
+#include "network.h"
Core *Core::instanceptr = 0;
QMutex Core::mutex;
: storage(0)
{
startTime = QDateTime::currentDateTime(); // for uptime :)
+
+ connect(&_storageSyncTimer, SIGNAL(timeout()),
+ this, SLOT(syncStorage()));
+ _storageSyncTimer.start(10 * 60 * 1000); // in msecs
}
void Core::init() {
qDeleteAll(sessions);
}
+void Core::syncStorage() {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->sync();
+}
+
void Core::restoreState() {
- return;
- /*
- Q_ASSERT(!instance()->sessions.count());
+ if(instance()->sessions.count()) {
+ qWarning() << qPrintable(tr("Calling restoreState() even though active sessions exist!"));
+ return;
+ }
CoreSettings s;
- QList<QVariant> users = s.coreState().toList();
- if(users.count() > 0) {
+ uint build = s.coreState().toMap()["CoreBuild"].toUInt();
+ if(build < 362) {
+ qWarning() << qPrintable(tr("Core state too old, ignoring..."));
+ return;
+ }
+ QVariantList activeSessions = s.coreState().toMap()["ActiveSessions"].toList();
+ if(activeSessions.count() > 0) {
qDebug() << "Restoring previous core state...";
- foreach(QVariant v, users) {
- QVariantMap m = v.toMap();
- if(m.contains("UserId")) {
- CoreSession *sess = createSession(m["UserId"].toUInt());
- sess->restoreState(m["State"]); // FIXME multithreading
- }
+ foreach(QVariant v, activeSessions) {
+ UserId user = v.value<UserId>();
+ instance()->createSession(user, true);
}
qDebug() << "...done.";
}
- */
}
void Core::saveState() {
- /*
CoreSettings s;
- QList<QVariant> users;
- foreach(CoreSession *sess, instance()->sessions.values()) {
- QVariantMap m;
- m["UserId"] = sess->user(); // FIXME multithreading
- m["State"] = sess->state();
- users << m;
- }
- s.setCoreState(users);
- */
+ QVariantMap state;
+ QVariantList activeSessions;
+ foreach(UserId user, instance()->sessions.keys()) activeSessions << QVariant::fromValue<UserId>(user);
+ state["CoreBuild"] = Global::quasselBuild;
+ state["ActiveSessions"] = activeSessions;
+ s.setCoreState(state);
}
/*** Storage Access ***/
+bool Core::createNetworkId(UserId user, NetworkInfo &info) {
+ QMutexLocker locker(&mutex);
+ NetworkId networkId = instance()->storage->createNetworkId(user, info);
+ if(!networkId.isValid())
+ return false;
+
+ info.networkId = networkId;
+ return true;
+}
NetworkId Core::networkId(UserId user, const QString &network) {
QMutexLocker locker(&mutex);
return instance()->storage->getNetworkId(user, network);
}
-BufferInfo Core::bufferInfo(UserId user, const QString &network, const QString &buffer) {
+BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
//QMutexLocker locker(&mutex);
- return instance()->storage->getBufferInfo(user, network, buffer);
+ return instance()->storage->getBufferInfo(user, networkId, buffer);
}
MsgId Core::storeMessage(const Message &message) {
// Suggestion: kill sessions if they are not connected to any network and client.
}
-
- //disconnect(socket, 0, this, 0);
- /*
- sessions[uid]->addClient(socket); // FIXME multithreading
- qDebug() << "Client initialized successfully.";
- SignalProxy::writeDataToDevice(socket, reply);
- */
-
-
void Core::processCoreSetup(QTcpSocket *socket, QVariantMap &msg) {
if(msg["HasSettings"].toBool()) {
QVariantMap auth;
sess->addClient(socket);
}
-SessionThread *Core::createSession(UserId uid) {
+SessionThread *Core::createSession(UserId uid, bool restore) {
if(sessions.contains(uid)) {
qWarning() << "Calling createSession() when a session for the user already exists!";
return 0;
}
- SessionThread *sess = new SessionThread(uid, this);
+ SessionThread *sess = new SessionThread(uid, restore, this);
sessions[uid] = sess;
sess->start();
return sess;