2022-11-20 12:29:34 +00:00
|
|
|
#include "webfuse/ws/messagewriter.hpp"
|
|
|
|
#include "webfuse/filesystem/accessmode.hpp"
|
|
|
|
|
2022-11-19 21:57:32 +00:00
|
|
|
#include <libwebsockets.h>
|
|
|
|
|
|
|
|
namespace webfuse
|
|
|
|
{
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
messagewriter::messagewriter(message_type msg_type)
|
2022-11-19 21:57:32 +00:00
|
|
|
: id(0)
|
|
|
|
, data(LWS_PRE)
|
|
|
|
{
|
2022-11-20 12:29:34 +00:00
|
|
|
write_u32(0);
|
|
|
|
write_u8(static_cast<uint8_t>(msg_type));
|
2022-11-19 21:57:32 +00:00
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
messagewriter::messagewriter(messagewriter && other)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
this->id = other.id;
|
|
|
|
this->data = std::move(other.data);
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
messagewriter& messagewriter::operator=(messagewriter && other)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
this->id = other.id;
|
|
|
|
this->data = std::move(other.data);
|
|
|
|
}
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::set_id(uint32_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
2022-11-20 12:29:34 +00:00
|
|
|
id = value;
|
2022-11-19 21:57:32 +00:00
|
|
|
data[LWS_PRE ] = (id >> 24) & 0xff;
|
|
|
|
data[LWS_PRE + 1] = (id >> 16) & 0xff;
|
|
|
|
data[LWS_PRE + 2] = (id >> 8) & 0xff;
|
|
|
|
data[LWS_PRE + 3] = id & 0xff;
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
uint32_t messagewriter::get_id() const
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_bool(bool value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
data.push_back(value ? 0x01 : 0x00);
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_u8(uint8_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
data.push_back(value);
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_i8(int8_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
data.push_back(static_cast<uint8_t>(value));
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_i32(int32_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
2022-11-20 12:29:34 +00:00
|
|
|
write_u32((static_cast<uint32_t>(value)));
|
2022-11-19 21:57:32 +00:00
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_u32(uint32_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
auto const offset = data.size();
|
|
|
|
data.resize(offset + 4);
|
|
|
|
data[offset ] = (value >> 24) & 0xff;
|
|
|
|
data[offset + 1] = (value >> 16) & 0xff;
|
|
|
|
data[offset + 2] = (value >> 8) & 0xff;
|
|
|
|
data[offset + 3] = value & 0xff;
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_u64(uint64_t value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
auto const offset = data.size();
|
|
|
|
data.resize(offset + 8);
|
|
|
|
data[offset ] = (value >> 56) & 0xff;
|
|
|
|
data[offset + 1] = (value >> 48) & 0xff;
|
|
|
|
data[offset + 2] = (value >> 40) & 0xff;
|
|
|
|
data[offset + 3] = (value >> 32) & 0xff;
|
|
|
|
data[offset + 4] = (value >> 24) & 0xff;
|
|
|
|
data[offset + 5] = (value >> 16) & 0xff;
|
|
|
|
data[offset + 6] = (value >> 8) & 0xff;
|
|
|
|
data[offset + 7] = value & 0xff;
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_str(std::string const &value)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
2022-11-20 12:29:34 +00:00
|
|
|
write_data(value.data(), value.size());
|
2022-11-19 21:57:32 +00:00
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_data(char const * buffer, size_t size)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
uint32_t const effective_size = size & 0xffffffff;
|
2022-11-20 12:29:34 +00:00
|
|
|
write_u32(effective_size);
|
2022-11-19 21:57:32 +00:00
|
|
|
|
|
|
|
if (size > 0)
|
|
|
|
{
|
|
|
|
auto const offset = data.size();
|
|
|
|
data.resize(offset + effective_size);
|
|
|
|
void * to = reinterpret_cast<void*>(&data.data()[offset]);
|
|
|
|
void const * from = reinterpret_cast<void const *>(buffer);
|
|
|
|
memcpy(to, from, effective_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_strings(std::vector<std::string> const & list)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
uint32_t const count = list.size() & 0xffffffff;
|
2022-11-20 12:29:34 +00:00
|
|
|
write_u32(count);
|
2022-11-19 21:57:32 +00:00
|
|
|
for (auto const & item: list)
|
|
|
|
{
|
2022-11-20 12:29:34 +00:00
|
|
|
write_str(item);
|
2022-11-19 21:57:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-20 12:29:34 +00:00
|
|
|
void messagewriter::write_access_mode(int value)
|
|
|
|
{
|
|
|
|
access_mode mode = access_mode::from_int(value);
|
|
|
|
write_i8(mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char * messagewriter::get_data(size_t &size)
|
2022-11-19 21:57:32 +00:00
|
|
|
{
|
|
|
|
size = data.size() - LWS_PRE;
|
|
|
|
void * result = reinterpret_cast<void *>(&data.data()[LWS_PRE]);
|
|
|
|
|
|
|
|
return reinterpret_cast<unsigned char *>(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|