From 5abd8e0359cfa1dc2437427f2f0446d8801441cb Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 14 Dec 2015 22:07:50 +0100 Subject: initial ack controlflow implementation --- saprotocol.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'saprotocol.cc') diff --git a/saprotocol.cc b/saprotocol.cc index 22b3111..94594a1 100644 --- a/saprotocol.cc +++ b/saprotocol.cc @@ -219,11 +219,11 @@ QByteArray SAProtocol::packFrame(const Frame &frame) return data.prepend(reinterpret_cast(&header), 2); } -QByteArray SAProtocol::packFrame(quint16 sessionId, const QByteArray &data) +QByteArray SAProtocol::packFrame(quint16 sessionId, const QByteArray &data, FrameType type) { Frame frame; frame.protocolVersion = currentProtocolVersion; - frame.type = FrameData; + frame.type = type; frame.sessionId = sessionId; frame.data = data; return packFrame(frame); @@ -253,6 +253,58 @@ QByteArray SAProtocol::packDataFrame(const DataFrame &frame) return data; } +SAProtocol::ControlFrame SAProtocol::unpackControlFrame(const QByteArray &data) +{ + ControlFrame frame; + int offset = 0; + int num_ranges; + + frame.type = static_cast(read(data, offset)); + + switch (frame.type) { + case ControlFrameImmediateAck: + case ControlFrameBlockAck: + frame.seqNum = read(data, offset); + break; + case ControlFrameNak: + num_ranges = read(data, offset); + frame.seqNums.reserve(num_ranges); + for (int i = 0; i < num_ranges; i++) { + SeqNumRange r; + r.first = read(data, offset); + r.second = read(data, offset); + frame.seqNums.append(r); + } + break; + default: + qWarning() << "Unknown frame type"; + break; + } + + return frame; +} + +QByteArray SAProtocol::packControlFrame(const ControlFrame &frame) +{ + QByteArray data; + append(data, frame.type); + switch (frame.type) { + case ControlFrameImmediateAck: + case ControlFrameBlockAck: + Q_ASSERT(frame.seqNums.empty()); + append(data, frame.seqNum); + break; + case ControlFrameNak: + append(data, frame.seqNums.size()); + foreach (const SeqNumRange &r, frame.seqNums) { + append(data, r.first); + append(data, r.second); + } + break; + } + return data; +} + SAProtocol::ServiceConnectionRequestFrame SAProtocol::unpackServiceConnectionRequestFrame(const QByteArray &data) { ServiceConnectionRequestFrame frame; -- cgit v1.2.3