12 #include <framework/logging/Logger.h>
13 #include <framework/pcore/zmq/messages/ZMQNoIdMessage.h>
14 #include <framework/pcore/zmq/messages/ZMQIdMessage.h>
15 #include <framework/pcore/zmq/messages/ZMQDefinitions.h>
25 class ZMQMessageFactory {
31 const std::unique_ptr<EvtMessage>& eventMessage)
33 return createMessage<ZMQIdMessage>(msgIdentity, msgType, eventMessage);
39 const std::string& msgData =
"")
41 return createMessage<ZMQIdMessage>(msgIdentity, msgType, msgData);
47 zmq::message_t msgData)
49 return createMessage<ZMQIdMessage>(msgIdentity, msgType, std::move(msgData));
54 std::unique_ptr<ZMQNoIdMessage> shortMessage)
56 return createMessage<ZMQIdMessage>(msgIdentity, std::move(shortMessage->getMessagePart<0>()),
57 std::move(shortMessage->getMessagePart<1>()));
62 const std::string& msgData =
"")
64 return createMessage<ZMQNoIdMessage>(msgType, msgData);
71 return createMessage<ZMQNoIdMessage>(msgType, msgData);
78 return createMessage<ZMQNoIdMessage>(msgType, evtMetaData);
83 zmq::message_t msgData)
85 return createMessage<ZMQNoIdMessage>(msgType, std::move(msgData));
90 zmq::message_t msgData,
91 zmq::message_t additionalData)
93 return createMessage<ZMQNoIdMessage>(msgType, std::move(msgData), std::move(additionalData));
98 zmq::message_t msgData)
100 return createMessage<ZMQNoIdMessage>(std::move(msgType), std::move(msgData));
105 const std::unique_ptr<EvtMessage>& eventMessage)
107 return createMessage<ZMQNoIdMessage>(msgType, eventMessage);
112 const std::unique_ptr<EvtMessage>& eventMessage,
113 zmq::message_t additionalData)
115 return createMessage<ZMQNoIdMessage>(msgType, eventMessage, std::move(additionalData));
121 return createMessage<ZMQNoIdMessage>(std::move(message->getMessagePart<1>()),
122 std::move(message->getMessagePart<2>()),
123 std::move(message->getMessagePart<3>()));
127 template <
class AMessage>
128 static std::unique_ptr<AMessage>
fromSocket(
const std::unique_ptr<zmq::socket_t>& socket)
130 auto newMessage = std::unique_ptr<AMessage>(
new AMessage());
131 auto& messageParts = newMessage->getMessageParts();
132 for (
unsigned int i = 0; i < AMessage::c_messageParts; i++) {
133 B2ASSERT(
"The next part does not belong to the same message",
134 socket->getsockopt<
int>(ZMQ_RCVMORE) == 1 or i == 0);
135 socket->recv(&messageParts[i]);
137 B2ASSERT(
"There should not be more than the retrieved parts", socket->getsockopt<
int>(ZMQ_RCVMORE) == 0);
143 template <
class T,
class... Args>
146 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));