Skip to content
Snippets Groups Projects
Select Git revision
  • b6e5cb57d8d55c6dd7a49d489838a7ae3fd54107
  • master default
  • feature_scripts
  • develop
  • feature_without_logging
  • feature_opc_server
  • feature_seperate_apps
  • fix_raspi_cmake
  • ss19 protected
  • ss20
10 results

Protocol.cpp

Blame
  • Armin Co's avatar
    Armin Co authored
    b6e5cb57
    History
    Protocol.cpp 1.40 KiB
    /// @file Protocol.cpp
    ///
    
    #include <com/Protocol.hpp>
    
    IProtocol::IProtocol(DataSocket& socket)
        : m_socket{socket}
    {}
    
    
    /// @brief Resizeable string wrapper
    ///
    class StringSizer
    {
        std::string& m_string_data;
        std::size_t& m_current_size;
    public:
        StringSizer(std::string& string_data, std::size_t& size)
            : m_string_data{string_data}
            , m_current_size{size}
        {
            // resize to max size before more mem has to be allocated
            m_string_data.resize(m_string_data.capacity());
        }
    
        ~StringSizer()
        {
            m_string_data.resize(m_current_size);
        }
    
        void increment_size(std::size_t amount)
        {
            m_current_size += amount;
        }
    };
    
    void ProtocolSimple::send_message(std::string const& url, std::string const& message)
    {
        m_socket.put_data(url.c_str(), url.size());
        m_socket.put_data(message.c_str(), message.size());
        m_socket.end_transmission();
    }
    
    
    void ProtocolSimple::recv_message(std::string& message)
    {
        std::size_t data_read {0};
        message.clear();
    
        while(true)
        {
            StringSizer string_sizer(message, data_read);
            std::size_t const data_max {message.capacity() - 1};
            char* buffer = &message[0];
    
            auto got = m_socket.get_data(buffer + data_read, data_max - data_read);
            data_read += got;
            if (got == 0)
            {
                break;
            }
            message.reserve(data_max * 1.5 + 10);
        }
    }