From 36ec2c13b4d519231794c2262818e48526074f94 Mon Sep 17 00:00:00 2001
From: Javier <dev.git@javispedro.com>
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