diff options
author | Javier <dev.git@javispedro.com> | 2015-12-16 02:10:10 +0100 |
---|---|---|
committer | Javier <dev.git@javispedro.com> | 2015-12-16 02:10:10 +0100 |
commit | 309947a4316a94f4c5d43c9b39b733cc3bbab459 (patch) | |
tree | a339058f8e1c3045240d71ab961c7ec1effdd947 /sappeer.cc | |
parent | aabf2deebb9619e21f1ebac0690c6b206b16b251 (diff) | |
download | sapd-309947a4316a94f4c5d43c9b39b733cc3bbab459.tar.gz sapd-309947a4316a94f4c5d43c9b39b733cc3bbab459.zip |
implement session termination requests
Diffstat (limited to 'sappeer.cc')
-rw-r--r-- | sappeer.cc | 81 |
1 files changed, 80 insertions, 1 deletions
@@ -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; } |