Skip to content
Snippets Groups Projects
Select Git revision
  • bba8f3d5b36ffca70c36118eb9727ff3ce872dab
  • main default protected
  • latest
3 results

measure.py

Blame
  • 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);
        }
    }