summaryrefslogtreecommitdiff
path: root/saprotocol.cc
diff options
context:
space:
mode:
Diffstat (limited to 'saprotocol.cc')
-rw-r--r--saprotocol.cc56
1 files changed, 54 insertions, 2 deletions
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<char*>(&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<ControlFrameType>(read<quint8>(data, offset));
+
+ switch (frame.type) {
+ case ControlFrameImmediateAck:
+ case ControlFrameBlockAck:
+ frame.seqNum = read<quint16>(data, offset);
+ break;
+ case ControlFrameNak:
+ num_ranges = read<quint8>(data, offset);
+ frame.seqNums.reserve(num_ranges);
+ for (int i = 0; i < num_ranges; i++) {
+ SeqNumRange r;
+ r.first = read<quint8>(data, offset);
+ r.second = read<quint8>(data, offset);
+ frame.seqNums.append(r);
+ }
+ break;
+ default:
+ qWarning() << "Unknown frame type";
+ break;
+ }
+
+ return frame;
+}
+
+QByteArray SAProtocol::packControlFrame(const ControlFrame &frame)
+{
+ QByteArray data;
+ append<quint8>(data, frame.type);
+ switch (frame.type) {
+ case ControlFrameImmediateAck:
+ case ControlFrameBlockAck:
+ Q_ASSERT(frame.seqNums.empty());
+ append<quint16>(data, frame.seqNum);
+ break;
+ case ControlFrameNak:
+ append<quint8>(data, frame.seqNums.size());
+ foreach (const SeqNumRange &r, frame.seqNums) {
+ append<quint16>(data, r.first);
+ append<quint16>(data, r.second);
+ }
+ break;
+ }
+ return data;
+}
+
SAProtocol::ServiceConnectionRequestFrame SAProtocol::unpackServiceConnectionRequestFrame(const QByteArray &data)
{
ServiceConnectionRequestFrame frame;