void DatagramTransceiver::handleReceiveFrom(const boost::system::error_code &error, size_t bytes_received)
{
    if (error)
    {
        stop();
        return;
    }

    if (bytes_received < m_max_data_length)
    {
        m_data_received[bytes_received] = '\0';
        emit messageReceived(QString(m_data_received), m_sender_endpoint);
    }

    newReadCycle();
}
void StreamClient::handleConnect(const boost::system::error_code& error,
                                 tcp::resolver::iterator endpoint_iterator)
{
    if (!error)
    {
        emit connectionSuccess();
        newReadCycle();
    } else if (endpoint_iterator != tcp::resolver::iterator()) {
        m_socket.close();
        tcp::endpoint endpoint = *endpoint_iterator;
        m_socket.async_connect(endpoint,
                              boost::bind(&StreamClient::handleConnect, this,
                                          boost::asio::placeholders::error, ++endpoint_iterator));
    } else {
        m_exit_result = CONNECTION_FAILED;
        m_socket.close();
        emit connectionFailure();
    }
}
void Horus::Commons::Network::StreamConnection::handleReadChar(const boost::system::error_code &error)
{
    if (!error)
    {
        if (m_rx_data[m_rx_data_offset] == '\n')
        {
            m_rx_data[m_rx_data_offset+1] = '\0';
            emit messageReceived(QString(m_rx_data));

            newReadCycle();
        } else {
            boost::asio::async_read(
                m_socket,
                boost::asio::buffer(m_rx_data+(++m_rx_data_offset), 1),
                boost::bind(
                    &StreamConnection::handleReadChar,
                    this,
                    boost::asio::placeholders::error));
        }
    } else {
        onErrorOccured();
    }
}
void DatagramTransceiver::start(const udp::endpoint &local_endpoint)
{
    m_socket = new udp::socket(m_io_service, local_endpoint);
    newReadCycle();
}