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)
65 return static_cast<int32_t
>(this->
as_int64());
69 return static_cast<int64_t
>(this->
value_);
74 return static_cast<int32_t
>(~(this->
value_ >> 1));
76 return static_cast<int32_t
>(this->
value_ >> 1);
82 return static_cast<int64_t
>(~(this->
value_ >> 1));
84 return static_cast<int64_t
>(this->
value_ >> 1);
106 uint8_t temp =
val & 0x7F;
109 buffer[i++] = temp | 0x80;
122 uint8_t temp =
val & 0x7F;
125 out.push_back(temp | 0x80);
206 uint32_t
val = (field_id << 3) | (
type & 0b111);
209 void encode_string(uint32_t field_id,
const char *
string,
size_t len,
bool force =
false) {
210 if (
len == 0 && !force)
215 auto *data =
reinterpret_cast<const uint8_t *
>(string);
218 void encode_string(uint32_t field_id,
const std::string &value,
bool force =
false) {
219 this->
encode_string(field_id, value.data(), value.size(), force);
221 void encode_bytes(uint32_t field_id,
const uint8_t *data,
size_t len,
bool force =
false) {
222 this->
encode_string(field_id,
reinterpret_cast<const char *
>(data),
len, force);
225 if (value == 0 && !force)
231 if (value == 0 && !force)
236 void encode_bool(uint32_t field_id,
bool value,
bool force =
false) {
237 if (!value && !force)
243 if (value == 0 && !force)
247 this->
write((value >> 0) & 0xFF);
248 this->
write((value >> 8) & 0xFF);
249 this->
write((value >> 16) & 0xFF);
250 this->
write((value >> 24) & 0xFF);
253 if (value == 0 && !force)
257 this->
write((value >> 0) & 0xFF);
258 this->
write((value >> 8) & 0xFF);
259 this->
write((value >> 16) & 0xFF);
260 this->
write((value >> 24) & 0xFF);
261 this->
write((value >> 32) & 0xFF);
262 this->
write((value >> 40) & 0xFF);
263 this->
write((value >> 48) & 0xFF);
264 this->
write((value >> 56) & 0xFF);
266 template<
typename T>
void encode_enum(uint32_t field_id, T value,
bool force =
false) {
267 this->
encode_uint32(field_id,
static_cast<uint32_t
>(value), force);
269 void encode_float(uint32_t field_id,
float value,
bool force =
false) {
270 if (value == 0.0f && !force)
280 void encode_int32(uint32_t field_id, int32_t value,
bool force =
false) {
286 this->
encode_uint32(field_id,
static_cast<uint32_t
>(value), force);
288 void encode_int64(uint32_t field_id, int64_t value,
bool force =
false) {
289 this->
encode_uint64(field_id,
static_cast<uint64_t
>(value), force);
294 uvalue = ~(value << 1);
303 uvalue = ~(value << 1);
309 template<
class C>
void encode_message(uint32_t field_id,
const C &value,
bool force =
false) {
311 size_t begin = this->
buffer_->size();
315 const uint32_t nested_length = this->
buffer_->size() - begin;
317 std::vector<uint8_t> var;
319 this->
buffer_->insert(this->
buffer_->begin() + begin, var.begin(), var.end());
333#ifdef HAS_PROTO_MESSAGE_DUMP
334 std::string
dump()
const;
335 virtual void dump_to(std::string &out)
const = 0;
364 virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) = 0;
368 uint32_t msg_size = 0;
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 bool send_buffer(ProtoWriteBuffer buffer, uint16_t message_type)=0
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 is_connection_setup()=0
virtual bool is_authenticated()=0
bool send_message_(const ProtoMessage &msg, uint16_t message_type)
virtual bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data)=0
virtual void on_no_setup_connection()=0
Representation of a VarInt - in ProtoBuf should be 64bit but we only use 32bit.
int32_t as_sint32() const
uint16_t as_uint16() 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.