From 0d49f7e83bd1055711e66aa880f3a0d62f7eefc9 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Tue, 21 Oct 2008 15:49:15 +0200 Subject: [PATCH 1/1] properly handling disconnects - this might even fix an antique bug with duplicate nicks --- src/client/client.cpp | 28 +++++++++++++++------------- src/client/client.h | 10 ++-------- src/client/clientsyncer.cpp | 4 +--- src/core/coresession.cpp | 4 +++- src/qtui/monoapplication.cpp | 12 ++++++------ src/qtui/monoapplication.h | 1 + 6 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 9611f71b..b17fa28a 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -65,7 +65,6 @@ void Client::init(AbstractUi *ui) { Client::Client(QObject *parent) : QObject(parent), - socket(0), _signalProxy(new SignalProxy(SignalProxy::Client, this)), mainUi(0), _networkModel(0), @@ -116,7 +115,7 @@ void Client::init() { p->attachSlot(SIGNAL(networkCreated(NetworkId)), this, SLOT(coreNetworkCreated(NetworkId))); p->attachSlot(SIGNAL(networkRemoved(NetworkId)), this, SLOT(coreNetworkRemoved(NetworkId))); - connect(p, SIGNAL(disconnected()), this, SLOT(disconnectFromCore())); + connect(p, SIGNAL(disconnected()), this, SLOT(disconnectedFromCore())); //connect(mainUi, SIGNAL(connectToCore(const QVariantMap &)), this, SLOT(connectToCore(const QVariantMap &))); connect(mainUi, SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore())); @@ -252,13 +251,20 @@ void Client::userInput(BufferInfo bufferInfo, QString message) { /*** core connection stuff ***/ -void Client::setConnectedToCore(QIODevice *sock, AccountId id) { - socket = sock; +void Client::setConnectedToCore(QIODevice *socket, AccountId id) { + // if the socket is an orphan, the signalProxy adopts it. + // -> we don't need to care about it anymore + socket->setParent(0); signalProxy()->addPeer(socket); _connectedToCore = true; setCurrentCoreAccount(id); } +void Client::setConnectedToInternalCore() { + _connectedToCore = true; + setCurrentCoreAccount(AccountId()); +} + void Client::setSyncedToCore() { // create buffersyncer Q_ASSERT(!_bufferSyncer); @@ -286,12 +292,12 @@ void Client::setSecuredConnection() { void Client::disconnectFromCore() { if(!isConnected()) return; - _connectedToCore = false; - if(socket) { - socket->close(); - socket->deleteLater(); - } + signalProxy()->removeAllPeers(); +} + +void Client::disconnectedFromCore() { + _connectedToCore = false; _syncedToCore = false; emit disconnected(); emit coreConnectionStateChanged(false); @@ -336,10 +342,6 @@ void Client::disconnectFromCore() { } -void Client::setCoreConfiguration(const QVariantMap &settings) { - SignalProxy::writeDataToDevice(socket, settings); -} - /*** ***/ void Client::networkDestroyed() { diff --git a/src/client/client.h b/src/client/client.h index 2d073c5f..b8faf9fb 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -154,16 +154,11 @@ public slots: void disconnectFromCore(); - void setCoreConfiguration(const QVariantMap &settings); - void bufferRemoved(BufferId bufferId); void bufferRenamed(BufferId bufferId, const QString &newName); private slots: - //void coreSocketError(QAbstractSocket::SocketError); - - //void networkConnected(NetworkId); - //void networkDisconnected(NetworkId); + void disconnectedFromCore(); void recvMessage(const Message &message); void recvStatusMsg(QString network, QString message); @@ -175,6 +170,7 @@ private slots: void coreNetworkRemoved(NetworkId); void setConnectedToCore(QIODevice *socket, AccountId id); + void setConnectedToInternalCore(); void setSyncedToCore(); void setSecuredConnection(); @@ -190,8 +186,6 @@ private: static QPointer instanceptr; - QPointer socket; - SignalProxy * _signalProxy; AbstractUi * mainUi; NetworkModel * _networkModel; diff --git a/src/client/clientsyncer.cpp b/src/client/clientsyncer.cpp index a9d59727..ed59b996 100644 --- a/src/client/clientsyncer.cpp +++ b/src/client/clientsyncer.cpp @@ -248,7 +248,7 @@ void ClientSyncer::loginToCore(const QString &user, const QString &passwd) { void ClientSyncer::internalSessionStateReceived(const QVariant &packedState) { QVariantMap state = packedState.toMap(); emit sessionProgress(1, 1); - // Client::instance()->setConnectedToCore(socket, AccountId()); + Client::instance()->setConnectedToInternalCore(); syncToCore(state); } @@ -256,13 +256,11 @@ void ClientSyncer::sessionStateReceived(const QVariantMap &state) { emit sessionProgress(1, 1); disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32))); disconnect(socket, 0, this, 0); // rest of communication happens through SignalProxy - //Client::signalProxy()->addPeer(socket); Client::instance()->setConnectedToCore(socket, coreConnectionInfo["AccountId"].value()); syncToCore(state); } void ClientSyncer::syncToCore(const QVariantMap &sessionState) { - // create identities foreach(QVariant vid, sessionState["Identities"].toList()) { Client::instance()->coreIdentityCreated(vid.value()); diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index f287ac20..020950f6 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -233,6 +233,9 @@ void CoreSession::addClient(QIODevice *device) { if(!device) { quError() << "Invoking CoreSession::addClient with a QObject that is not a QIODevice!"; } else { + // if the socket is an orphan, the signalProxy adopts it. + // -> we don't need to care about it anymore + device->setParent(0); signalProxy()->addPeer(device); QVariantMap reply; reply["MsgType"] = "SessionInit"; @@ -250,7 +253,6 @@ void CoreSession::removeClient(QIODevice *iodev) { QTcpSocket *socket = qobject_cast(iodev); if(socket) quInfo() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("disconnected (UserId: %1).").arg(user().toInt())); - iodev->deleteLater(); } SignalProxy *CoreSession::signalProxy() const { diff --git a/src/qtui/monoapplication.cpp b/src/qtui/monoapplication.cpp index 7b05c734..b6280793 100644 --- a/src/qtui/monoapplication.cpp +++ b/src/qtui/monoapplication.cpp @@ -26,7 +26,8 @@ #include "qtui.h" MonolithicApplication::MonolithicApplication(int &argc, char **argv) - : QtUiApplication(argc, argv) + : QtUiApplication(argc, argv), + _internalInitDone(false) { _internal = new CoreApplicationInternal(); // needed for parser options setRunMode(Monolithic); @@ -34,10 +35,7 @@ MonolithicApplication::MonolithicApplication(int &argc, char **argv) bool MonolithicApplication::init() { connect(Client::instance(), SIGNAL(newClientSyncer(ClientSyncer *)), this, SLOT(newClientSyncer(ClientSyncer *))); - if(QtUiApplication::init()) { - return true; - } - return false; + return QtUiApplication::init(); } MonolithicApplication::~MonolithicApplication() { @@ -51,7 +49,9 @@ void MonolithicApplication::newClientSyncer(ClientSyncer *syncer) { } void MonolithicApplication::startInternalCore() { - _internal->init(); + if(!_internalInitDone) { + _internal->init(); + } Core *core = Core::instance(); ClientSyncer *syncer = static_cast(sender()); connect(syncer, SIGNAL(connectToInternalCore(SignalProxy *)), core, SLOT(setupInternalClientSession(SignalProxy *))); diff --git a/src/qtui/monoapplication.h b/src/qtui/monoapplication.h index ff35ddd1..9b49403a 100644 --- a/src/qtui/monoapplication.h +++ b/src/qtui/monoapplication.h @@ -40,6 +40,7 @@ private slots: private: CoreApplicationInternal *_internal; + bool _internalInitDone; }; #endif -- 2.20.1