X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsessionthread.cpp;h=7b8bc105655bb9978345c8c22564dbbe816d51bf;hp=d5070955485dbbf7247f363dda731571f9365c4f;hb=c27d5bfbe80bfeb583a25404f4ccee4b70b010e0;hpb=d1b6499b0b848d4287efae89107576548533502c diff --git a/src/core/sessionthread.cpp b/src/core/sessionthread.cpp index d5070955..7b8bc105 100644 --- a/src/core/sessionthread.cpp +++ b/src/core/sessionthread.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,69 +15,117 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include - -#include "sessionthread.h" - +#include "core.h" #include "coresession.h" +#include "internalpeer.h" +#include "remotepeer.h" +#include "sessionthread.h" +#include "signalproxy.h" -SessionThread::SessionThread(UserId uid, QObject *parent) : QThread(parent) { - _user = uid; - _session = 0; - _sessionInitialized = false; +SessionThread::SessionThread(UserId uid, bool restoreState, bool strictIdentEnabled, QObject *parent) + : QThread(parent), + _session(0), + _user(uid), + _sessionInitialized(false), + _restoreState(restoreState), + _strictIdentEnabled(strictIdentEnabled) +{ connect(this, SIGNAL(initialized()), this, SLOT(setSessionInitialized())); } -SessionThread::~SessionThread() { - // FIXME - quit(); - wait(); - if(session()) _session->deleteLater(); + +SessionThread::~SessionThread() +{ + // shut down thread gracefully + quit(); + wait(); } -CoreSession *SessionThread::session() { - return _session; + +CoreSession *SessionThread::session() +{ + return _session; } -UserId SessionThread::user() { - return _user; + +UserId SessionThread::user() +{ + return _user; } -bool SessionThread::isSessionInitialized() { - return _sessionInitialized; + +bool SessionThread::isSessionInitialized() +{ + return _sessionInitialized; } -void SessionThread::setSessionInitialized() { - _sessionInitialized = true; - foreach(QIODevice *socket, clientQueue) { - addClientToSession(socket); - } - clientQueue.clear(); + +void SessionThread::setSessionInitialized() +{ + _sessionInitialized = true; + foreach(QObject *peer, clientQueue) { + addClientToSession(peer); + } + clientQueue.clear(); } -void SessionThread::addClient(QIODevice *socket) { - if(isSessionInitialized()) { - addClientToSession(socket); - } else { - clientQueue.append(socket); - } + +// this and the following related methods are executed in the Core thread! +void SessionThread::addClient(QObject *peer) +{ + if (isSessionInitialized()) { + addClientToSession(peer); + } + else { + clientQueue.append(peer); + } } -void SessionThread::addClientToSession(QIODevice *socket) { - socket->setParent(0); - socket->moveToThread(session()->thread()); - if(!QMetaObject::invokeMethod(session(), "addClient", Q_ARG(QObject *, socket))) { - qWarning() << qPrintable(tr("Could not initialize session!")); - socket->close(); - } + +void SessionThread::addClientToSession(QObject *peer) +{ + RemotePeer *remote = qobject_cast(peer); + if (remote) { + addRemoteClientToSession(remote); + return; + } + + InternalPeer *internal = qobject_cast(peer); + if (internal) { + addInternalClientToSession(internal); + return; + } + + qWarning() << "SessionThread::addClient() received invalid peer!" << peer; } -void SessionThread::run() { - _session = new CoreSession(user()); - emit initialized(); - exec(); + +void SessionThread::addRemoteClientToSession(RemotePeer *remotePeer) +{ + remotePeer->setParent(0); + remotePeer->moveToThread(session()->thread()); + emit addRemoteClient(remotePeer); } + +void SessionThread::addInternalClientToSession(InternalPeer *internalPeer) +{ + internalPeer->setParent(0); + internalPeer->moveToThread(session()->thread()); + emit addInternalClient(internalPeer); +} + + +void SessionThread::run() +{ + _session = new CoreSession(user(), _restoreState, _strictIdentEnabled); + connect(this, SIGNAL(addRemoteClient(RemotePeer*)), _session, SLOT(addClient(RemotePeer*))); + connect(this, SIGNAL(addInternalClient(InternalPeer*)), _session, SLOT(addClient(InternalPeer*))); + connect(_session, SIGNAL(sessionState(Protocol::SessionState)), Core::instance(), SIGNAL(sessionState(Protocol::SessionState))); + emit initialized(); + exec(); + delete _session; +}