summaryrefslogtreecommitdiff
path: root/sappeer.cc
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2015-12-16 02:10:10 +0100
committerJavier <dev.git@javispedro.com>2015-12-16 02:10:10 +0100
commit309947a4316a94f4c5d43c9b39b733cc3bbab459 (patch)
treea339058f8e1c3045240d71ab961c7ec1effdd947 /sappeer.cc
parentaabf2deebb9619e21f1ebac0690c6b206b16b251 (diff)
downloadsapd-309947a4316a94f4c5d43c9b39b733cc3bbab459.tar.gz
sapd-309947a4316a94f4c5d43c9b39b733cc3bbab459.zip
implement session termination requests
Diffstat (limited to 'sappeer.cc')
-rw-r--r--sappeer.cc81
1 files changed, 80 insertions, 1 deletions
diff --git a/sappeer.cc b/sappeer.cc
index 1e5be61..960e515 100644
--- a/sappeer.cc
+++ b/sappeer.cc
@@ -72,12 +72,44 @@ SAPConnection * SAPPeer::createServiceConnection(const QString &profile, const Q
_sessions.insert(sessionId, socket);
}
+ _conns.insert(profile, conn);
+
writeDataToSession(SAProtocol::defaultSessionId,
SAProtocol::packServiceConnectionRequestFrame(request));
return conn;
}
+bool SAPPeer::terminateServiceConnection(const QString &profile, const QString &requesterProfile, SAPServiceInfo::Role requesterRole)
+{
+ SAPManager *manager = SAPManager::instance();
+
+ int initiator = manager->registeredAgentId(requesterProfile, requesterRole);
+
+ if (initiator < 0) {
+ qWarning() << "Requester profile not found:" << requesterProfile;
+ return false;
+ }
+
+ // Search remote agent id in capability database.
+ CapabilityPeer *capPeer = capabilityPeer();
+
+ int acceptor = capPeer->remoteAgentId(profile, SAPServiceInfo::oppositeRole(requesterRole));
+ if (acceptor < 0) {
+ qWarning() << "Remote profile not found:" << profile;
+ return false;
+ }
+
+ SAPConnection *conn = _conns.value(profile, 0);
+ if (conn) {
+ // TODO send terminaterequest message
+ return true;
+ } else {
+ qWarning() << "Connection does not exist:" << profile;
+ return false;
+ }
+}
+
SAProtocol::Role SAPPeer::role() const
{
return _role;
@@ -100,6 +132,7 @@ CapabilityPeer *SAPPeer::capabilityPeer()
void SAPPeer::writeDataToSession(int session, const QByteArray &data)
{
+ qDebug() << "frame size" << data.size();
sendFrame(SAProtocol::packFrame(session, data, SAProtocol::FrameData));
}
@@ -149,7 +182,8 @@ void SAPPeer::acceptServiceConnection(SAPConnectionRequest *connReq, int statusC
_sessions.remove(socket->sessionId());
delete socket;
}
- delete conn; // Also deletes child sockets
+ _conns.remove(conn->profile());
+ delete conn;
}
// Can't delete connReq now because we must return to it.
@@ -320,6 +354,51 @@ void SAPPeer::handleDefaultSessionMessage(const QByteArray &message)
break;
}
+ case SAProtocol::ServiceTerminationRequest: {
+ SAProtocol::ServiceTerminationRequestFrame req = SAProtocol::unpackServiceTerminationRequestFrame(message);
+ SAPConnection *conn = _conns.value(req.profile, 0);
+
+ qDebug() << "Service termination request to profile" << req.profile;
+
+ if (!conn) {
+ // We did not find this profile; send a error back
+ SAProtocol::ServiceTerminationResponseFrame resp;
+ resp.messageType = SAProtocol::ServiceTerminationResponse;
+ resp.acceptorId = req.acceptorId;
+ resp.initiatorId = req.initiatorId;
+ resp.profile = req.profile;
+ resp.statusCode = 1;
+
+ qWarning() << "Profile" << req.profile << "not connected, sending negative response";
+
+ writeDataToSession(SAProtocol::defaultSessionId,
+ SAProtocol::packServiceTerminationResponseFrame(resp));
+ return;
+ }
+
+ // Ok, proceed to terminate the connection
+ foreach (SAPSocket *socket, conn->sockets()) {
+ emit socket->disconnected();
+ _sessions.remove(socket->sessionId());
+ delete socket;
+ }
+ emit conn->disconnected();
+ _conns.remove(conn->profile());
+ delete conn;
+
+ // Acknowledge everything was succesful
+ SAProtocol::ServiceTerminationResponseFrame resp;
+ resp.messageType = SAProtocol::ServiceTerminationResponse;
+ resp.acceptorId = req.acceptorId;
+ resp.initiatorId = req.initiatorId;
+ resp.profile = req.profile;
+ resp.statusCode = 0;
+
+ writeDataToSession(SAProtocol::defaultSessionId,
+ SAProtocol::packServiceTerminationResponseFrame(resp));
+
+ break;
+ }
default:
qWarning() << "Unknown default session message type:" << message_type;
}