Select Git revision
gradio-example.py
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);
}
}