X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=4826c3ecc60ef7bbd8449d5af182562085a8dc97;hp=32337988388958a0b9b376beec2a8c89a613339e;hb=59579d82e3a16a815a197a4300c8ef279275ccfc;hpb=d1b6499b0b848d4287efae89107576548533502c diff --git a/src/core/core.cpp b/src/core/core.cpp index 32337988..4826c3ec 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) { +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) { @@ -254,7 +271,7 @@ void Core::clientHasData() { mutex.lock(); UserId uid = storage->validateUser(msg["User"].toString(), msg["Password"].toString()); mutex.unlock(); - if(!uid) { + if(uid == 0) { reply["MsgType"] = "ClientLoginReject"; reply["Error"] = tr("Invalid username or password!
The username/password combination you supplied could not be found in the database."); SignalProxy::writeDataToDevice(socket, reply); @@ -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;