X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=2e3da6d9f4395cf2b9a9382d37d2d21b0ba938aa;hp=298d7e35f1573b2b9d84e97e90138c78c5e11277;hb=9d4aff06284de98df1eed1179b958833221f5f85;hpb=e733408e4759473bf38831f498f48a0f2f5e6dc7 diff --git a/src/core/core.cpp b/src/core/core.cpp index 298d7e35..2e3da6d9 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -28,6 +28,7 @@ #include "coresettings.h" #include "signalproxy.h" #include "sqlitestorage.h" +#include "network.h" Core *Core::instanceptr = 0; QMutex Core::mutex; @@ -48,6 +49,10 @@ Core::Core() : storage(0) { startTime = QDateTime::currentDateTime(); // for uptime :) + + connect(&_storageSyncTimer, SIGNAL(timeout()), + this, SLOT(syncStorage())); + _storageSyncTimer.start(10 * 60 * 1000); // in msecs } void Core::init() { @@ -94,50 +99,62 @@ Core::~Core() { 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 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(); + instance()->createSession(user, true); } qDebug() << "...done."; } - */ } void Core::saveState() { - /* CoreSettings s; - QList 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(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) { - //QMutexLocker locker(&mutex); - return instance()->storage->getBufferInfo(user, network, buffer); +BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) { + QMutexLocker locker(&mutex); + return instance()->storage->getBufferInfo(user, networkId, buffer); } MsgId Core::storeMessage(const Message &message) { @@ -308,15 +325,6 @@ void Core::clientDisconnected() { // 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; @@ -366,12 +374,12 @@ void Core::setupClientSession(QTcpSocket *socket, UserId uid) { 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;