Commit 20eee004961781fb6c75d975cdd63fcf5816ea6d

add some more message handling code
  
11#include "NetworkMessage.h"
22
3#include <QDebug>
4
35NetworkMessage::NetworkMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType)
46{
57 m_command = command;
99 m_messageType = messageType;
1010}
1111
12NetworkMessage::NetworkMessage(const QByteArray& command, const QList<QByteArray>& payload, MessageType messageType)
13{
14 m_command = command;
15 m_messageType = messageType;
16
17 m_payloadList = payload;
18
19 Q_FOREACH(const QByteArray& item, payload)
20 {
21 m_payload.append(QByteArray::number(item.length()));
22 m_payload.append(':');
23 m_payload.append(item);
24 m_payload.append(',');
25 }
26}
27
28NetworkMessage::NetworkMessage(const QByteArray& serialized)
29{
30 const int endOfCommandLength = serialized.indexOf(':');
31 const int commandLength = serialized.left(endOfCommandLength).toInt();
32
33 const int startOfCommand = endOfCommandLength + 1;
34 m_command = serialized.mid(startOfCommand, commandLength);
35 const int endOfCommand = startOfCommand + commandLength;
36
37 const int startOfPayloadLength = endOfCommand + 1;
38 const int endOfPayloadLength = serialized.indexOf(':', startOfPayloadLength);
39 const int payloadLength = serialized.mid(startOfPayloadLength, endOfPayloadLength - startOfPayloadLength).toInt();
40
41 const int startOfPayload = endOfPayloadLength + 1;
42 m_payload = serialized.mid(startOfPayload, payloadLength);
43
44 m_messageType = UnsignedMessage;
45}
46
47QByteArray NetworkMessage::command() const
48{
49 return m_command;
50}
51
52QList<QByteArray> NetworkMessage::payloadList() const
53{
54 if(m_payloadList.isEmpty())
55 {
56 // "size:data,"
57 int left = 0;
58 while(left < m_payload.size())
59 {
60 const QByteArray chunk = m_payload.mid(left);
61 const int separatorPosition = chunk.indexOf(':');
62 const QByteArray lengthChunk = chunk.left(separatorPosition);
63 const int length = lengthChunk.toInt();
64 qDebug() << Q_FUNC_INFO << "Length:" << lengthChunk << length;
65 Q_ASSERT(chunk.size() >= length + lengthChunk.size() + 2);
66 const QByteArray data = chunk.mid(separatorPosition + 1, length);
67 Q_ASSERT(data.length() == length);
68 left += lengthChunk.size() + 1 + length + 1;
69 m_payloadList.append(data);
70 }
71 }
72 return m_payloadList;
73}
74
1275void NetworkMessage::updateSerialization() const
1376{
1477 // netstrings-influenced
15 // CommandLength,Command,PayloadLength,Payload,{U|S,timestamp-length,timestamp,message-uuid,signature};
78 // CommandLength:Command,PayloadLength:Payload,{U|S,timestamp-length:timestamp,message-uuid,signature};
1679 //
1780 // Examples:
18 // 3,foo,0,,U;
19 // 3,bar,3,baz,S,10,1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000
81 // 3:foo,0:,U;
82 // 3:bar,3:baz,S,10:1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000
2083 //
2184 // Where:
2285 // - timestamp is the number of seconds since 1970-01-01T00:00:00 UTC
8989 m_serialized.clear();
9090 Q_ASSERT(m_messageType == UnsignedMessage);
9191
92 out.append(QString::number(m_command.length()).toLatin1());
93 out.append(',');
92 out.append(QByteArray::number(m_command.length()));
93 out.append(':');
9494 out.append(m_command);
9595 out.append(',');
96 out.append(QString::number(m_payload.length()).toLatin1());
97 out.append(',');
96 out.append(QByteArray::number(m_payload.length()));
97 out.append(':');
9898 out.append(m_payload);
9999 out.append(",U;");
100100}
  
22
33#include <QByteArray>
44#include <QIODevice>
5#include <QList>
56
67class NetworkMessage
78{
1313 SignedMessage
1414 };
1515 NetworkMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType);
16 NetworkMessage(const QByteArray& command, const QList<QByteArray>& payload, MessageType messageType);
17 NetworkMessage(const QByteArray& serialized);
18
19 QByteArray command() const;
20 QByteArray payload() const;
21 QList<QByteArray> payloadList() const;
22
1623 QByteArray toByteArray() const;
1724 private:
1825 void updateSerialization() const; // cache
1926
2027 QByteArray m_command;
2128 QByteArray m_payload;
29 mutable QList<QByteArray> m_payloadList; // cache
2230 MessageType m_messageType;
2331
24 mutable QByteArray m_serialized; // used as a cache
32 mutable QByteArray m_serialized; // cache
2533};