Commit bc8ec3a3d6c2411d1718b5485aa2e4655cbbb04d

add NetworkCommon/NetworkMessage, and start using it for discovery
Added support for 'Library' plugins, and put NetworkCommon after
NetworkClient/NetworkServer in the link order.
  
2525 Boffin
2626 # WIP:
2727 NetworkClient
28 NetworkCommon
2928 NetworkServer
3029)
3130
5252 ENDIF()
5353ENDFOREACH()
5454
55# Library plugins
56IF(WITH_NetworkClient_PLUGIN OR WITH_NetworkServer_PLUGIN)
57 LIST(APPEND ACTIVE_PLUGINS NetworkCommon)
58ENDIF()
59
60# Write the header file defining our plugins
5561SET(STATIC_PLUGINS_H "${CMAKE_CURRENT_BINARY_DIR}/StaticPlugins.h")
5662FILE(WRITE ${STATIC_PLUGINS_H} "#include <QtPlugin>\n")
5763FOREACH(plugin ${ACTIVE_PLUGINS})
  
11SET(
22 CLASSES
33 NetworkCommon
4 NetworkMessage
45)
56
67SET(SOURCES)
  
1#include "NetworkMessage.h"
2
3NetworkMessage::NetworkMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType)
4{
5 m_command = command;
6 m_payload = payload;
7 m_messageType = messageType;
8}
9
10void NetworkMessage::updateSerialization() const
11{
12 // netstrings-influenced
13 // CommandLength,Command,PayloadLength,Payload,{U|S,timestamp-length,timestamp,message-uuid,signature};
14 //
15 // Examples:
16 // 3,foo,0,,U;
17 // 3,bar,3,baz,S,10,1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000
18 //
19 // Where:
20 // - timestamp is the number of seconds since 1970-01-01T00:00:00 UTC
21 // - message-uuid is a per-message UUID to prevent replays
22 // - signature is an HMAC-SHA1 of everything up to and including the previous comma
23 QByteArray& out = m_serialized;
24 m_serialized.clear();
25 Q_ASSERT(m_messageType == UnsignedMessage);
26
27 out.append(QString::number(m_command.length()).toLatin1());
28 out.append(',');
29 out.append(m_command);
30 out.append(',');
31 out.append(QString::number(m_payload.length()).toLatin1());
32 out.append(',');
33 out.append(m_payload);
34 out.append(",U;");
35}
36
37QByteArray NetworkMessage::toByteArray() const
38{
39 if(m_serialized.isNull())
40 {
41 updateSerialization();
42 }
43 return m_serialized;
44}
  
1#pragma once
2
3#include <QByteArray>
4#include <QIODevice>
5
6class NetworkMessage
7{
8 public:
9 enum MessageType
10 {
11 UnsignedMessage,
12 SignedMessage
13 };
14 NetworkMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType);
15 QByteArray toByteArray() const;
16 private:
17 void updateSerialization() const; // cache
18
19 QByteArray m_command;
20 QByteArray m_payload;
21 MessageType m_messageType;
22
23 mutable QByteArray m_serialized; // used as a cache
24};
  
1111 LIST(APPEND HEADERS ${class}.h)
1212ENDFOREACH()
1313
14INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
14INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ../NetworkCommon)
1515QT4_WRAP_CPP(MOC_SOURCES ${HEADERS})
1616ADD_LIBRARY(
1717 NetworkServer
  
11#include "NetworkServer_Implementation.h"
22
3#include "../NetworkCommon/NetworkCommon.h"
3#include "NetworkCommon.h"
4#include "NetworkMessage.h"
45
56#include "Uuid.h"
67
6767 payload.append(port);
6868 payload.append(',');
6969
70 m_discoveryResponse = createMessage("ANNOUNCE", payload, UnsignedMessage);
70 m_discoveryResponse = NetworkMessage("ANNOUNCE", payload, NetworkMessage::UnsignedMessage).toByteArray();
7171 }
72}
73
74QByteArray NetworkServer::Implementation::createMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType) const
75{
76 // netstrings-influenced
77 // CommandLength,Command,PayloadLength,Payload,{U|S,timestamp-length,timestamp,message-uuid,signature};
78 //
79 // Examples:
80 // 3,foo,0,,U;
81 // 3,bar,3,baz,S,10,1266356591,{fc8d8c6c-2ede-4bb8-8685-2cc47cdd8b2b},0000000000000000000000000000000000000000
82 //
83 // Where:
84 // - timestamp is the number of seconds since 1970-01-01T00:00:00 UTC
85 // - message-uuid is a per-message UUID to prevent replays
86 // - signature is an HMAC-SHA1 of everything up to and including the previous comma
87 QByteArray out;
88 Q_ASSERT(messageType == UnsignedMessage);
89 Q_UNUSED(messageType);
90
91 out.append(QString::number(command.length()).toLatin1());
92 out.append(',');
93 out.append(command);
94 out.append(',');
95 out.append(QString::number(payload.length()).toLatin1());
96 out.append(',');
97 out.append(payload);
98 out.append(",U;");
99 return out;
10072}
10173
10274void NetworkServer::Implementation::sendDiscoveryResponses()
  
2020 private slots:
2121 void sendDiscoveryResponses();
2222 private:
23 enum MessageType
24 {
25 UnsignedMessage,
26 SignedMessage
27 };
28 QByteArray createMessage(const QByteArray& command, const QByteArray& payload, MessageType messageType) const;
29
3023 Jerboa::CollectionInterface* m_collection;
3124 Jerboa::PlayerInterface* m_player;
3225 Jerboa::PlaylistInterface* m_playlist;