You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
1.6 KiB

#ifndef PRINT_MESSAGE_HPP
#define PRINT_MESSAGE_HPP
#include <cpp_utils/Message.hpp>
#include <mutex>
#include <condition_variable>
/// @brief prints the received message, can signal when ready
class PrintMessage : public Message
{
struct WaitForFlag {
bool m_isReady;
std::condition_variable m_condition_variable;
std::mutex m_mutex;
WaitForFlag() : m_isReady(false), m_condition_variable(), m_mutex() {}
};
public:
PrintMessage( void *msgParam = 0)
: Message(msgParam)
, m_flag()
{
TRACE;
}
bool buildMessage( const void *msgPart,
const size_t msgLen )
{
TRACE;
m_buffer = std::string( (const char*) msgPart, msgLen );
// not using getExpectedLength
onMessageReady();
return true;
}
void onMessageReady()
{
TRACE;
LOG_BEGIN(Logger::INFO)
LOG_PROP("message", m_buffer)
LOG_PROP("host", m_connection->getHost())
LOG_PROP("port", m_connection->getPort())
LOG_END("Got message.");
m_buffer.clear();
std::unique_lock<std::mutex> lock(m_flag.m_mutex);
m_flag.m_isReady = true;
m_flag.m_condition_variable.notify_one();
}
Message* clone()
{
TRACE;
return new PrintMessage(m_param);
}
std::string getBuffer()
{
TRACE;
return m_buffer;
}
void waitForReady() {
std::unique_lock<std::mutex> lock(m_flag.m_mutex);
while (!m_flag.m_isReady)
m_flag.m_condition_variable.wait(lock);
}
protected:
size_t getExpectedLength()
{
TRACE;
return 0;
}
private:
WaitForFlag m_flag;
};
#endif // PRINT_MESSAGE_HPP