9#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
10#define HAS_PROTO_MESSAGE_DUMP
24 if (consumed !=
nullptr)
30 if ((buffer[0] & 0x80) == 0) {
31 if (consumed !=
nullptr)
38 uint64_t result = buffer[0] & 0x7F;
42 for (uint32_t i = 1; i <
len; i++) {
43 uint8_t
val = buffer[i];
44 result |= uint64_t(
val & 0x7F) << uint64_t(bitpos);
46 if ((
val & 0x80) == 0) {
47 if (consumed !=
nullptr)
53 if (consumed !=
nullptr)
64 return static_cast<int32_t
>(this->
as_int64());
68 return static_cast<int64_t
>(this->
value_);
73 return static_cast<int32_t
>(~(this->
value_ >> 1));
75 return static_cast<int32_t
>(this->
value_ >> 1);
81 return static_cast<int64_t
>(~(this->
value_ >> 1));
83 return static_cast<int64_t
>(this->
value_ >> 1);
105 uint8_t temp =
val & 0x7F;
108 buffer[i++] = temp | 0x80;
121 uint8_t temp =
val & 0x7F;
124 out.push_back(temp | 0x80);
205 uint32_t
val = (field_id << 3) | (
type & 0b111);
208 void encode_string(uint32_t field_id,
const char *
string,
size_t len,
bool force =
false) {
209 if (
len == 0 && !force)
214 auto *data =
reinterpret_cast<const uint8_t *
>(string);
217 void encode_string(uint32_t field_id,
const std::string &value,
bool force =
false) {
220 void encode_bytes(uint32_t field_id,
const uint8_t *data,
size_t len,
bool force =
false) {
221 this->
encode_string(field_id,
reinterpret_cast<const char *
>(data),
len, force);
224 if (value == 0 && !force)
230 if (value == 0 && !force)
235 void encode_bool(uint32_t field_id,
bool value,
bool force =
false) {
236 if (!value && !force)
242 if (value == 0 && !force)
246 this->
write((value >> 0) & 0xFF);
247 this->
write((value >> 8) & 0xFF);
248 this->
write((value >> 16) & 0xFF);
249 this->
write((value >> 24) & 0xFF);
252 if (value == 0 && !force)
256 this->
write((value >> 0) & 0xFF);
257 this->
write((value >> 8) & 0xFF);
258 this->
write((value >> 16) & 0xFF);
259 this->
write((value >> 24) & 0xFF);
260 this->
write((value >> 32) & 0xFF);
261 this->
write((value >> 40) & 0xFF);
262 this->
write((value >> 48) & 0xFF);
263 this->
write((value >> 56) & 0xFF);
265 template<
typename T>
void encode_enum(uint32_t field_id, T value,
bool force =
false) {
266 this->
encode_uint32(field_id,
static_cast<uint32_t
>(value), force);
268 void encode_float(uint32_t field_id,
float value,
bool force =
false) {
269 if (value == 0.0f && !force)
279 void encode_int32(uint32_t field_id, int32_t value,
bool force =
false) {
285 this->
encode_uint32(field_id,
static_cast<uint32_t
>(value), force);
287 void encode_int64(uint32_t field_id, int64_t value,
bool force =
false) {
288 this->
encode_uint64(field_id,
static_cast<uint64_t
>(value), force);
293 uvalue = ~(value << 1);
302 uvalue = ~(value << 1);
308 template<
class C>
void encode_message(uint32_t field_id,
const C &value,
bool force =
false) {
310 size_t begin = this->
buffer_->size();
314 const uint32_t nested_length = this->
buffer_->size() - begin;
316 std::vector<uint8_t> var;
318 this->
buffer_->insert(this->
buffer_->begin() + begin, var.begin(), var.end());
332#ifdef HAS_PROTO_MESSAGE_DUMP
333 std::string
dump()
const;
334 virtual void dump_to(std::string &out)
const = 0;
363 virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) = 0;
367 uint32_t msg_size = 0;
368 msg.calculate_size(msg_size);
uint32_t as_fixed32() const
int32_t as_sfixed32() const
Proto32Bit(uint32_t value)
Proto64Bit(uint64_t value)
uint64_t as_fixed64() const
int64_t as_sfixed64() const
const uint8_t *const value_
ProtoLengthDelimited(const uint8_t *value, size_t length)
std::string as_string() const
virtual bool decode_64bit(uint32_t field_id, Proto64Bit value)
virtual void calculate_size(uint32_t &total_size) const =0
virtual void encode(ProtoWriteBuffer buffer) const =0
virtual ~ProtoMessage()=default
virtual bool decode_32bit(uint32_t field_id, Proto32Bit value)
virtual void dump_to(std::string &out) const =0
virtual bool decode_length(uint32_t field_id, ProtoLengthDelimited value)
virtual bool decode_varint(uint32_t field_id, ProtoVarInt value)
void decode(const uint8_t *buffer, size_t length)
virtual void on_unauthenticated_access()=0
virtual ProtoWriteBuffer create_buffer(uint32_t reserve_size)=0
Create a buffer with a reserved size.
virtual void on_fatal_error()=0
virtual bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type)=0
virtual bool is_connection_setup()=0
virtual bool is_authenticated()=0
virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data)=0
virtual void on_no_setup_connection()=0
bool send_message_(const C &msg, uint32_t message_type)
Representation of a VarInt - in ProtoBuf should be 64bit but we only use 32bit.
int32_t as_sint32() const
uint64_t as_uint64() const
void encode_to_buffer_unchecked(uint8_t *buffer, size_t len)
Encode the varint value to a pre-allocated buffer without bounds checking.
void encode(std::vector< uint8_t > &out)
int64_t as_sint64() const
uint32_t as_uint32() const
ProtoVarInt(uint64_t value)
static optional< ProtoVarInt > parse(const uint8_t *buffer, uint32_t len, uint32_t *consumed)
void encode_varint_raw(uint32_t value)
void encode_string(uint32_t field_id, const std::string &value, bool force=false)
void write(uint8_t value)
void encode_enum(uint32_t field_id, T value, bool force=false)
void encode_int64(uint32_t field_id, int64_t value, bool force=false)
void encode_float(uint32_t field_id, float value, bool force=false)
void encode_int32(uint32_t field_id, int32_t value, bool force=false)
void encode_sint64(uint32_t field_id, int64_t value, bool force=false)
void encode_message(uint32_t field_id, const C &value, bool force=false)
void encode_string(uint32_t field_id, const char *string, size_t len, bool force=false)
void encode_bool(uint32_t field_id, bool value, bool force=false)
ProtoWriteBuffer(std::vector< uint8_t > *buffer)
void encode_uint64(uint32_t field_id, uint64_t value, bool force=false)
void encode_fixed64(uint32_t field_id, uint64_t value, bool force=false)
void encode_uint32(uint32_t field_id, uint32_t value, bool force=false)
void encode_sint32(uint32_t field_id, int32_t value, bool force=false)
void encode_field_raw(uint32_t field_id, uint32_t type)
Encode a field key (tag/wire type combination).
std::vector< uint8_t > * get_buffer() const
void encode_bytes(uint32_t field_id, const uint8_t *data, size_t len, bool force=false)
void encode_fixed32(uint32_t field_id, uint32_t value, bool force=false)
void encode_varint_raw(ProtoVarInt value)
std::vector< uint8_t > * buffer_
const char * proto_enum_to_string(T value)
Providing packet encoding functions for exchanging data with a remote host.