#include #include "sappeer.h" #include "sapconnection.h" #include "sapsocket.h" SAPSocket::SAPSocket(SAPConnection *conn, int sessionId, const SAPChannelInfo &chanInfo) : QObject(conn), _sessionId(sessionId), _info(chanInfo), _open(false), _seqNum(0), _expectedSeqNum(0) { } SAPPeer * SAPSocket::peer() { return connection()->peer(); } SAPConnection * SAPSocket::connection() { return static_cast(parent()); } SAPChannelInfo SAPSocket::channelInfo() const { return _info; } bool SAPSocket::isOpen() const { return _open; } bool SAPSocket::messageAvailable() const { return !_in.empty(); } QByteArray SAPSocket::receive() { if (!_in.empty()) { return _in.dequeue(); } else { return QByteArray(); } } bool SAPSocket::send(const QByteArray &data) { SAProtocol::DataFrame frame; frame.withSeqNum = isWithSeqNum(); if (isReliable()) { frame.seqNum = _seqNum++; } else { frame.seqNum = 0; } frame.unk_1 = 0; frame.data = data; return peer()->writeToSession(_sessionId, SAProtocol::packDataFrame(frame)); } void SAPSocket::setOpen(bool open) { _open = open; } void SAPSocket::acceptIncomingData(const QByteArray &data) { if (data.isEmpty()) return; SAProtocol::DataFrame frame = SAProtocol::unpackDataFrame(data, isWithSeqNum()); if (isReliable()) { if (frame.seqNum != _expectedSeqNum) { qWarning() << "Unexpected sequence number" << frame.seqNum << "on session" << _sessionId << "(expected " << _expectedSeqNum << ")"; } _expectedSeqNum = frame.seqNum + 1; // TODO Do we actually need to ack this somehow? } _in.enqueue(frame.data); emit messageReceived(); } int SAPSocket::sessionId() const { return _sessionId; } bool SAPSocket::isReliable() const { return _info.qosType() == SAPChannelInfo::QoSReliabilityEnable; } bool SAPSocket::isWithSeqNum() const { return _info.qosType() == SAPChannelInfo::QoSReliabilityDisable || _info.qosType() == SAPChannelInfo::QoSReliabilityEnable; }