mirror of
https://github.com/esphome/esphome.git
synced 2025-07-29 22:56:37 +00:00
dry
This commit is contained in:
parent
ae12097636
commit
32edc3f062
@ -167,10 +167,10 @@ void DeviceInfoResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_bool(2, this->api_encryption_supported);
|
||||
#endif
|
||||
#ifdef USE_DEVICES
|
||||
size.add_repeated_message(2, this->devices);
|
||||
size.add_force_message(2, this->devices);
|
||||
#endif
|
||||
#ifdef USE_AREAS
|
||||
size.add_repeated_message(2, this->areas);
|
||||
size.add_force_message(2, this->areas);
|
||||
#endif
|
||||
#ifdef USE_AREAS
|
||||
size.add_message_object(2, this->area);
|
||||
@ -353,7 +353,7 @@ void ListEntitiesFanResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint32(1, static_cast<uint32_t>(this->entity_category));
|
||||
if (!this->supported_preset_modes.empty()) {
|
||||
for (const auto &it : this->supported_preset_modes) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
#ifdef USE_DEVICES
|
||||
@ -470,14 +470,14 @@ void ListEntitiesLightResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_length(1, this->name_ref_.size());
|
||||
if (!this->supported_color_modes.empty()) {
|
||||
for (const auto &it : this->supported_color_modes) {
|
||||
size.add_uint32_repeated(1, static_cast<uint32_t>(it));
|
||||
size.add_uint32_force(1, static_cast<uint32_t>(it));
|
||||
}
|
||||
}
|
||||
size.add_float(1, this->min_mireds);
|
||||
size.add_float(1, this->max_mireds);
|
||||
if (!this->effects.empty()) {
|
||||
for (const auto &it : this->effects) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
size.add_bool(1, this->disabled_by_default);
|
||||
@ -862,9 +862,9 @@ void HomeassistantServiceResponse::encode(ProtoWriteBuffer buffer) const {
|
||||
}
|
||||
void HomeassistantServiceResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_length(1, this->service_ref_.size());
|
||||
size.add_repeated_message(1, this->data);
|
||||
size.add_repeated_message(1, this->data_template);
|
||||
size.add_repeated_message(1, this->variables);
|
||||
size.add_force_message(1, this->data);
|
||||
size.add_force_message(1, this->data_template);
|
||||
size.add_force_message(1, this->variables);
|
||||
size.add_bool(1, this->is_event);
|
||||
}
|
||||
#ifdef USE_API_HOMEASSISTANT_STATES
|
||||
@ -926,7 +926,7 @@ void ListEntitiesServicesResponse::encode(ProtoWriteBuffer buffer) const {
|
||||
void ListEntitiesServicesResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_length(1, this->name_ref_.size());
|
||||
size.add_fixed32(1, this->key);
|
||||
size.add_repeated_message(1, this->args);
|
||||
size.add_force_message(1, this->args);
|
||||
}
|
||||
bool ExecuteServiceArgument::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
||||
switch (field_id) {
|
||||
@ -1106,7 +1106,7 @@ void ListEntitiesClimateResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_bool(1, this->supports_two_point_target_temperature);
|
||||
if (!this->supported_modes.empty()) {
|
||||
for (const auto &it : this->supported_modes) {
|
||||
size.add_uint32_repeated(1, static_cast<uint32_t>(it));
|
||||
size.add_uint32_force(1, static_cast<uint32_t>(it));
|
||||
}
|
||||
}
|
||||
size.add_float(1, this->visual_min_temperature);
|
||||
@ -1115,27 +1115,27 @@ void ListEntitiesClimateResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_bool(1, this->supports_action);
|
||||
if (!this->supported_fan_modes.empty()) {
|
||||
for (const auto &it : this->supported_fan_modes) {
|
||||
size.add_uint32_repeated(1, static_cast<uint32_t>(it));
|
||||
size.add_uint32_force(1, static_cast<uint32_t>(it));
|
||||
}
|
||||
}
|
||||
if (!this->supported_swing_modes.empty()) {
|
||||
for (const auto &it : this->supported_swing_modes) {
|
||||
size.add_uint32_repeated(1, static_cast<uint32_t>(it));
|
||||
size.add_uint32_force(1, static_cast<uint32_t>(it));
|
||||
}
|
||||
}
|
||||
if (!this->supported_custom_fan_modes.empty()) {
|
||||
for (const auto &it : this->supported_custom_fan_modes) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
if (!this->supported_presets.empty()) {
|
||||
for (const auto &it : this->supported_presets) {
|
||||
size.add_uint32_repeated(2, static_cast<uint32_t>(it));
|
||||
size.add_uint32_force(2, static_cast<uint32_t>(it));
|
||||
}
|
||||
}
|
||||
if (!this->supported_custom_presets.empty()) {
|
||||
for (const auto &it : this->supported_custom_presets) {
|
||||
size.add_length_repeated(2, it.size());
|
||||
size.add_length_force(2, it.size());
|
||||
}
|
||||
}
|
||||
size.add_bool(2, this->disabled_by_default);
|
||||
@ -1387,7 +1387,7 @@ void ListEntitiesSelectResponse::calculate_size(ProtoSize &size) const {
|
||||
#endif
|
||||
if (!this->options.empty()) {
|
||||
for (const auto &it : this->options) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
size.add_bool(1, this->disabled_by_default);
|
||||
@ -1474,7 +1474,7 @@ void ListEntitiesSirenResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_bool(1, this->disabled_by_default);
|
||||
if (!this->tones.empty()) {
|
||||
for (const auto &it : this->tones) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
size.add_bool(1, this->supports_duration);
|
||||
@ -1734,7 +1734,7 @@ void ListEntitiesMediaPlayerResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_bool(1, this->disabled_by_default);
|
||||
size.add_uint32(1, static_cast<uint32_t>(this->entity_category));
|
||||
size.add_bool(1, this->supports_pause);
|
||||
size.add_repeated_message(1, this->supported_formats);
|
||||
size.add_force_message(1, this->supported_formats);
|
||||
#ifdef USE_DEVICES
|
||||
size.add_uint32(1, this->device_id);
|
||||
#endif
|
||||
@ -1840,7 +1840,7 @@ void BluetoothLERawAdvertisementsResponse::encode(ProtoWriteBuffer buffer) const
|
||||
}
|
||||
}
|
||||
void BluetoothLERawAdvertisementsResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_repeated_message(1, this->advertisements);
|
||||
size.add_force_message(1, this->advertisements);
|
||||
}
|
||||
bool BluetoothDeviceRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
||||
switch (field_id) {
|
||||
@ -1889,8 +1889,8 @@ void BluetoothGATTDescriptor::encode(ProtoWriteBuffer buffer) const {
|
||||
buffer.encode_uint32(2, this->handle);
|
||||
}
|
||||
void BluetoothGATTDescriptor::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint64_repeated(1, this->uuid[0]);
|
||||
size.add_uint64_repeated(1, this->uuid[1]);
|
||||
size.add_uint64_force(1, this->uuid[0]);
|
||||
size.add_uint64_force(1, this->uuid[1]);
|
||||
size.add_uint32(1, this->handle);
|
||||
}
|
||||
void BluetoothGATTCharacteristic::encode(ProtoWriteBuffer buffer) const {
|
||||
@ -1903,11 +1903,11 @@ void BluetoothGATTCharacteristic::encode(ProtoWriteBuffer buffer) const {
|
||||
}
|
||||
}
|
||||
void BluetoothGATTCharacteristic::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint64_repeated(1, this->uuid[0]);
|
||||
size.add_uint64_repeated(1, this->uuid[1]);
|
||||
size.add_uint64_force(1, this->uuid[0]);
|
||||
size.add_uint64_force(1, this->uuid[1]);
|
||||
size.add_uint32(1, this->handle);
|
||||
size.add_uint32(1, this->properties);
|
||||
size.add_repeated_message(1, this->descriptors);
|
||||
size.add_force_message(1, this->descriptors);
|
||||
}
|
||||
void BluetoothGATTService::encode(ProtoWriteBuffer buffer) const {
|
||||
buffer.encode_uint64(1, this->uuid[0], true);
|
||||
@ -1918,10 +1918,10 @@ void BluetoothGATTService::encode(ProtoWriteBuffer buffer) const {
|
||||
}
|
||||
}
|
||||
void BluetoothGATTService::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint64_repeated(1, this->uuid[0]);
|
||||
size.add_uint64_repeated(1, this->uuid[1]);
|
||||
size.add_uint64_force(1, this->uuid[0]);
|
||||
size.add_uint64_force(1, this->uuid[1]);
|
||||
size.add_uint32(1, this->handle);
|
||||
size.add_repeated_message(1, this->characteristics);
|
||||
size.add_force_message(1, this->characteristics);
|
||||
}
|
||||
void BluetoothGATTGetServicesResponse::encode(ProtoWriteBuffer buffer) const {
|
||||
buffer.encode_uint64(1, this->address);
|
||||
@ -1929,7 +1929,7 @@ void BluetoothGATTGetServicesResponse::encode(ProtoWriteBuffer buffer) const {
|
||||
}
|
||||
void BluetoothGATTGetServicesResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint64(1, this->address);
|
||||
size.add_message_object_repeated(1, this->services[0]);
|
||||
size.add_message_object_force(1, this->services[0]);
|
||||
}
|
||||
void BluetoothGATTGetServicesDoneResponse::encode(ProtoWriteBuffer buffer) const {
|
||||
buffer.encode_uint64(1, this->address);
|
||||
@ -2058,7 +2058,7 @@ void BluetoothConnectionsFreeResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_uint32(1, this->limit);
|
||||
if (!this->allocated.empty()) {
|
||||
for (const auto &it : this->allocated) {
|
||||
size.add_uint64_repeated(1, it);
|
||||
size.add_uint64_force(1, it);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2322,7 +2322,7 @@ void VoiceAssistantWakeWord::calculate_size(ProtoSize &size) const {
|
||||
size.add_length(1, this->wake_word_ref_.size());
|
||||
if (!this->trained_languages.empty()) {
|
||||
for (const auto &it : this->trained_languages) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2336,10 +2336,10 @@ void VoiceAssistantConfigurationResponse::encode(ProtoWriteBuffer buffer) const
|
||||
buffer.encode_uint32(3, this->max_active_wake_words);
|
||||
}
|
||||
void VoiceAssistantConfigurationResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_repeated_message(1, this->available_wake_words);
|
||||
size.add_force_message(1, this->available_wake_words);
|
||||
if (!this->active_wake_words.empty()) {
|
||||
for (const auto &it : this->active_wake_words) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
size.add_uint32(1, this->max_active_wake_words);
|
||||
@ -2710,7 +2710,7 @@ void ListEntitiesEventResponse::calculate_size(ProtoSize &size) const {
|
||||
size.add_length(1, this->device_class_ref_.size());
|
||||
if (!this->event_types.empty()) {
|
||||
for (const auto &it : this->event_types) {
|
||||
size.add_length_repeated(1, it.size());
|
||||
size.add_length_force(1, it.size());
|
||||
}
|
||||
}
|
||||
#ifdef USE_DEVICES
|
||||
|
@ -520,10 +520,10 @@ class ProtoSize {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of an int32 field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of an int32 field to the total message size (force version)
|
||||
*/
|
||||
inline void add_int32_repeated(uint32_t field_id_size, int32_t value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_int32_force(uint32_t field_id_size, int32_t value) {
|
||||
// Always calculate size when force is true
|
||||
if (value < 0) {
|
||||
// Negative values are encoded as 10-byte varints in protobuf
|
||||
total_size_ += field_id_size + 10;
|
||||
@ -538,15 +538,15 @@ class ProtoSize {
|
||||
*/
|
||||
inline void add_uint32(uint32_t field_id_size, uint32_t value) {
|
||||
if (value != 0) {
|
||||
add_uint32_repeated(field_id_size, value);
|
||||
add_uint32_force(field_id_size, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a uint32 field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a uint32 field to the total message size (force version)
|
||||
*/
|
||||
inline void add_uint32_repeated(uint32_t field_id_size, uint32_t value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_uint32_force(uint32_t field_id_size, uint32_t value) {
|
||||
// Always calculate size when force is true
|
||||
total_size_ += field_id_size + varint(value);
|
||||
}
|
||||
|
||||
@ -564,10 +564,10 @@ class ProtoSize {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a boolean field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a boolean field to the total message size (force version)
|
||||
*/
|
||||
inline void add_bool_repeated(uint32_t field_id_size, bool value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_bool_force(uint32_t field_id_size, bool value) {
|
||||
// Always calculate size when force is true
|
||||
// Boolean fields always use 1 byte
|
||||
total_size_ += field_id_size + 1;
|
||||
}
|
||||
@ -615,17 +615,17 @@ class ProtoSize {
|
||||
*/
|
||||
inline void add_sint32(uint32_t field_id_size, int32_t value) {
|
||||
if (value != 0) {
|
||||
add_sint32_repeated(field_id_size, value);
|
||||
add_sint32_force(field_id_size, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a sint32 field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a sint32 field to the total message size (force version)
|
||||
*
|
||||
* Sint32 fields use ZigZag encoding, which is more efficient for negative values.
|
||||
*/
|
||||
inline void add_sint32_repeated(uint32_t field_id_size, int32_t value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_sint32_force(uint32_t field_id_size, int32_t value) {
|
||||
// Always calculate size when force is true
|
||||
// ZigZag encoding for sint32: (n << 1) ^ (n >> 31)
|
||||
uint32_t zigzag = (static_cast<uint32_t>(value) << 1) ^ (static_cast<uint32_t>(value >> 31));
|
||||
total_size_ += field_id_size + varint(zigzag);
|
||||
@ -636,15 +636,15 @@ class ProtoSize {
|
||||
*/
|
||||
inline void add_int64(uint32_t field_id_size, int64_t value) {
|
||||
if (value != 0) {
|
||||
add_int64_repeated(field_id_size, value);
|
||||
add_int64_force(field_id_size, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of an int64 field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of an int64 field to the total message size (force version)
|
||||
*/
|
||||
inline void add_int64_repeated(uint32_t field_id_size, int64_t value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_int64_force(uint32_t field_id_size, int64_t value) {
|
||||
// Always calculate size when force is true
|
||||
total_size_ += field_id_size + varint(value);
|
||||
}
|
||||
|
||||
@ -653,19 +653,19 @@ class ProtoSize {
|
||||
*/
|
||||
inline void add_uint64(uint32_t field_id_size, uint64_t value) {
|
||||
if (value != 0) {
|
||||
add_uint64_repeated(field_id_size, value);
|
||||
add_uint64_force(field_id_size, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a uint64 field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a uint64 field to the total message size (force version)
|
||||
*/
|
||||
inline void add_uint64_repeated(uint32_t field_id_size, uint64_t value) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_uint64_force(uint32_t field_id_size, uint64_t value) {
|
||||
// Always calculate size when force is true
|
||||
total_size_ += field_id_size + varint(value);
|
||||
}
|
||||
|
||||
// NOTE: sint64 support functions (add_sint64_field, add_sint64_field_repeated) removed
|
||||
// NOTE: sint64 support functions (add_sint64_field, add_sint64_field_force) removed
|
||||
// sint64 type is not supported by ESPHome API to reduce overhead on embedded systems
|
||||
|
||||
/**
|
||||
@ -673,7 +673,7 @@ class ProtoSize {
|
||||
*/
|
||||
inline void add_length(uint32_t field_id_size, size_t len) {
|
||||
if (len != 0) {
|
||||
add_length_repeated(field_id_size, len);
|
||||
add_length_force(field_id_size, len);
|
||||
}
|
||||
}
|
||||
|
||||
@ -681,8 +681,8 @@ class ProtoSize {
|
||||
* @brief Calculates and adds the size of a length-delimited field (string/bytes) to the total message size (repeated
|
||||
* field version)
|
||||
*/
|
||||
inline void add_length_repeated(uint32_t field_id_size, size_t len) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_length_force(uint32_t field_id_size, size_t len) {
|
||||
// Always calculate size when force is true
|
||||
// Field ID + length varint + data bytes
|
||||
total_size_ += field_id_size + varint(static_cast<uint32_t>(len)) + static_cast<uint32_t>(len);
|
||||
}
|
||||
@ -717,12 +717,12 @@ class ProtoSize {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a nested message field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a nested message field to the total message size (force version)
|
||||
*
|
||||
* @param nested_size The pre-calculated size of the nested message
|
||||
*/
|
||||
inline void add_message_field_repeated(uint32_t field_id_size, uint32_t nested_size) {
|
||||
// Always calculate size for repeated fields
|
||||
inline void add_message_field_force(uint32_t field_id_size, uint32_t nested_size) {
|
||||
// Always calculate size when force is true
|
||||
// Field ID + length varint + nested message content
|
||||
total_size_ += field_id_size + varint(nested_size) + nested_size;
|
||||
}
|
||||
@ -747,18 +747,18 @@ class ProtoSize {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calculates and adds the size of a nested message field to the total message size (repeated field version)
|
||||
* @brief Calculates and adds the size of a nested message field to the total message size (force version)
|
||||
*
|
||||
* @param message The nested message object
|
||||
*/
|
||||
inline void add_message_object_repeated(uint32_t field_id_size, const ProtoMessage &message) {
|
||||
inline void add_message_object_force(uint32_t field_id_size, const ProtoMessage &message) {
|
||||
// Calculate nested message size by creating a temporary ProtoSize
|
||||
ProtoSize nested_calc;
|
||||
message.calculate_size(nested_calc);
|
||||
uint32_t nested_size = nested_calc.get_size();
|
||||
|
||||
// Use the base implementation with the calculated nested_size
|
||||
add_message_field_repeated(field_id_size, nested_size);
|
||||
add_message_field_force(field_id_size, nested_size);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -771,15 +771,15 @@ class ProtoSize {
|
||||
* @param messages Vector of message objects
|
||||
*/
|
||||
template<typename MessageType>
|
||||
inline void add_repeated_message(uint32_t field_id_size, const std::vector<MessageType> &messages) {
|
||||
inline void add_force_message(uint32_t field_id_size, const std::vector<MessageType> &messages) {
|
||||
// Skip if the vector is empty
|
||||
if (messages.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Use the repeated field version for all messages
|
||||
// Use the force version for all messages
|
||||
for (const auto &message : messages) {
|
||||
add_message_object_repeated(field_id_size, message);
|
||||
add_message_object_force(field_id_size, message);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -279,7 +279,7 @@ class TypeInfo(ABC):
|
||||
value_expr: Optional value expression (defaults to name)
|
||||
"""
|
||||
field_id_size = self.calculate_field_id_size()
|
||||
method = f"{base_method}_repeated" if force else base_method
|
||||
method = f"{base_method}_force" if force else base_method
|
||||
value = value_expr if value_expr else name
|
||||
return f"size.{method}({field_id_size}, {value});"
|
||||
|
||||
@ -629,9 +629,9 @@ class StringType(TypeInfo):
|
||||
# Check if this is being called from a repeated field context
|
||||
# In that case, 'name' will be 'it' and we need to use the repeated version
|
||||
if name == "it":
|
||||
# For repeated fields, we need to use add_length_repeated which includes field ID
|
||||
# For repeated fields, we need to use add_length_force which includes field ID
|
||||
field_id_size = self.calculate_field_id_size()
|
||||
return f"size.add_length_repeated({field_id_size}, it.size());"
|
||||
return f"size.add_length_force({field_id_size}, it.size());"
|
||||
|
||||
# For messages that need encoding, use the StringRef size
|
||||
field_id_size = self.calculate_field_id_size()
|
||||
@ -846,7 +846,7 @@ class FixedArrayBytesType(TypeInfo):
|
||||
|
||||
if force:
|
||||
# For repeated fields, always calculate size (no zero check)
|
||||
return f"size.add_length_repeated({field_id_size}, {length_field});"
|
||||
return f"size.add_length_force({field_id_size}, {length_field});"
|
||||
else:
|
||||
# For non-repeated fields, add_length already checks for zero
|
||||
return f"size.add_length({field_id_size}, {length_field});"
|
||||
@ -1236,7 +1236,7 @@ class RepeatedTypeInfo(TypeInfo):
|
||||
if isinstance(self._ti, MessageType):
|
||||
# For repeated messages, use the dedicated helper that handles iteration internally
|
||||
field_id_size = self._ti.calculate_field_id_size()
|
||||
o = f"size.add_repeated_message({field_id_size}, {name});"
|
||||
o = f"size.add_force_message({field_id_size}, {name});"
|
||||
return o
|
||||
|
||||
# For other repeated types, use the underlying type's size calculation with force=True
|
||||
|
Loading…
x
Reference in New Issue
Block a user