From 36ec2c13b4d519231794c2262818e48526074f94 Mon Sep 17 00:00:00 2001 From: Javier Date: Sat, 26 Dec 2015 20:19:10 +0100 Subject: fix a crash while disconnecting --- sappeer.cc | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/sappeer.cc b/sappeer.cc index 551ca45..85a5899 100644 --- a/sappeer.cc +++ b/sappeer.cc @@ -110,7 +110,15 @@ bool SAPPeer::terminateServiceConnection(const QString &profile, const QString & SAPConnection *conn = _conns.value(profile, 0); if (conn) { - // TODO send terminaterequest message + SAProtocol::ServiceTerminationRequestFrame request; + request.messageType = SAProtocol::ServiceTerminationRequest; + request.initiatorId = initiator; + request.acceptorId = acceptor; + request.profile = profile; + + writeDataToSession(SAProtocol::defaultSessionId, + SAProtocol::packServiceTerminationRequestFrame(request)); + return true; } else { qWarning() << "Connection does not exist:" << profile; @@ -179,7 +187,6 @@ void SAPPeer::acceptServiceConnection(SAPConnectionRequest *connReq, int statusC // Cancel any partial opened sessions foreach (SAPSocket *socket, conn->sockets()) { _sessions.remove(socket->sessionId()); - delete socket; } _conns.remove(conn->profile()); delete conn; @@ -232,9 +239,9 @@ void SAPPeer::handleDisconnected() // Clear out all active sessions emit disconnected(); qDeleteAll(_conns); - qDeleteAll(_sessions); - _conns.clear(); + // Deleting connections will clean up all sockets too. _sessions.clear(); + _conns.clear(); // TODO Figure out who should actually reconnect } @@ -349,26 +356,27 @@ void SAPPeer::handleDefaultSessionMessage(const QByteArray &message) SAPConnection *conn = firstSocket->connection(); - foreach (int session, frame.sessions) { - SAPSocket *socket = _sessions.value(session, 0); - if (socket) { - if (socket->isOpen()) { - qWarning() << "Session" << session << "was already open?"; + if (ok) { + foreach (int session, frame.sessions) { + SAPSocket *socket = _sessions.value(session, 0); + if (socket) { + if (socket->isOpen()) { + qWarning() << "Session" << session << "was already open?"; + } + + qDebug() << "Session" << session << "now live"; + socket->setOpen(true); + emit socket->connected(); + } else { + qWarning() << "Unknown session id:" << session; } - - qDebug() << "Session" << session << "now live"; - socket->setOpen(true); - emit socket->connected(); - } else { - qWarning() << "Unknown session id:" << session; } - } - if (ok) { emit conn->connected(); } else { emit conn->error(frame.statusCode); emit conn->disconnected(); + delete conn; } break; @@ -399,7 +407,6 @@ void SAPPeer::handleDefaultSessionMessage(const QByteArray &message) foreach (SAPSocket *socket, conn->sockets()) { emit socket->disconnected(); _sessions.remove(socket->sessionId()); - delete socket; } emit conn->disconnected(); _conns.remove(conn->profile()); -- cgit v1.2.3