| |   |
| 1 | 1 | #include "NetworkMessage.h" |
| 2 | 2 | |
| #include <QDebug> |
|
| 3 | 5 | NetworkMessage::NetworkMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType) |
| 4 | 6 | { |
| 5 | 7 | m_command = command; |
| … | … | |
| 9 | 9 | m_messageType = messageType; |
| 10 | 10 | } |
| 11 | 11 | |
| NetworkMessage::NetworkMessage(const QByteArray& command, const QList<QByteArray>& payload, MessageType messageType) |
| { |
| m_command = command; |
| m_messageType = messageType; |
|
| m_payloadList = payload; |
|
| Q_FOREACH(const QByteArray& item, payload) |
| { |
| m_payload.append(QByteArray::number(item.length())); |
| m_payload.append(':'); |
| m_payload.append(item); |
| m_payload.append(','); |
| } |
| } |
|
| NetworkMessage::NetworkMessage(const QByteArray& serialized) |
| { |
| const int endOfCommandLength = serialized.indexOf(':'); |
| const int commandLength = serialized.left(endOfCommandLength).toInt(); |
|
| const int startOfCommand = endOfCommandLength + 1; |
| m_command = serialized.mid(startOfCommand, commandLength); |
| const int endOfCommand = startOfCommand + commandLength; |
|
| const int startOfPayloadLength = endOfCommand + 1; |
| const int endOfPayloadLength = serialized.indexOf(':', startOfPayloadLength); |
| const int payloadLength = serialized.mid(startOfPayloadLength, endOfPayloadLength - startOfPayloadLength).toInt(); |
|
| const int startOfPayload = endOfPayloadLength + 1; |
| m_payload = serialized.mid(startOfPayload, payloadLength); |
|
| m_messageType = UnsignedMessage; |
| } |
|
| QByteArray NetworkMessage::command() const |
| { |
| return m_command; |
| } |
|
| QList<QByteArray> NetworkMessage::payloadList() const |
| { |
| if(m_payloadList.isEmpty()) |
| { |
| // "size:data," |
| int left = 0; |
| while(left < m_payload.size()) |
| { |
| const QByteArray chunk = m_payload.mid(left); |
| const int separatorPosition = chunk.indexOf(':'); |
| const QByteArray lengthChunk = chunk.left(separatorPosition); |
| const int length = lengthChunk.toInt(); |
| qDebug() << Q_FUNC_INFO << "Length:" << lengthChunk << length; |
| Q_ASSERT(chunk.size() >= length + lengthChunk.size() + 2); |
| const QByteArray data = chunk.mid(separatorPosition + 1, length); |
| Q_ASSERT(data.length() == length); |
| left += lengthChunk.size() + 1 + length + 1; |
| m_payloadList.append(data); |
| } |
| } |
| return m_payloadList; |
| } |
|
| 12 | 75 | void NetworkMessage::updateSerialization() const |
| 13 | 76 | { |
| 14 | 77 | // netstrings-influenced |
| // CommandLength,Command,PayloadLength,Payload,{U|S,timestamp-length,timestamp,message-uuid,signature}; |
| // CommandLength:Command,PayloadLength:Payload,{U|S,timestamp-length:timestamp,message-uuid,signature}; |
| 16 | 79 | // |
| 17 | 80 | // Examples: |
| // 3,foo,0,,U; |
| // 3,bar,3,baz,S,10,1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000 |
| // 3:foo,0:,U; |
| // 3:bar,3:baz,S,10:1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000 |
| 20 | 83 | // |
| 21 | 84 | // Where: |
| 22 | 85 | // - timestamp is the number of seconds since 1970-01-01T00:00:00 UTC |
| … | … | |
| 89 | 89 | m_serialized.clear(); |
| 90 | 90 | Q_ASSERT(m_messageType == UnsignedMessage); |
| 91 | 91 | |
| out.append(QString::number(m_command.length()).toLatin1()); |
| out.append(','); |
| out.append(QByteArray::number(m_command.length())); |
| out.append(':'); |
| 94 | 94 | out.append(m_command); |
| 95 | 95 | out.append(','); |
| out.append(QString::number(m_payload.length()).toLatin1()); |
| out.append(','); |
| out.append(QByteArray::number(m_payload.length())); |
| out.append(':'); |
| 98 | 98 | out.append(m_payload); |
| 99 | 99 | out.append(",U;"); |
| 100 | 100 | } |