diff --git a/src/Error.cpp b/src/Error.cpp index b78947f..a7111fe 100644 --- a/src/Error.cpp +++ b/src/Error.cpp @@ -6,6 +6,11 @@ using namespace ts; +#define str(x) #x + +#define define_error_description(type, description) \ +{ error::type, str(type), description } + const std::vector ts::avariableErrors = { {0x0000, "ok" , "ok" }, {0x0001, "undefined" , "undefined error" }, @@ -95,6 +100,8 @@ const std::vector ts::avariableErrors = { {0x0605, "parameter_invalid_size" , "invalid parameter size" }, {0x0606, "parameter_missing" , "missing required parameter" }, {0x0607, "parameter_checksum" , "invalid checksum" }, + define_error_description(parameter_constraint_violation, "parameter does not fits its constraint"), + /* example: all name= parameter in a bulk must start with /icon_ */ {0x0700, "vs_critical" , "virtual server got a critical error" }, {0x0701, "connection_lost" , "Connection lost" }, @@ -134,7 +141,8 @@ const std::vector ts::avariableErrors = { {0x0815, "file_transfer_client_quota_exceeded" , "file transfer client quota exceeded" }, {0x0816, "file_transfer_reset" , "file transfer reset" }, {0x0817, "file_transfer_limit_reached" , "file transfer limit reached" }, - + define_error_description(file_api_timeout, "the file API call has been timed out"), + define_error_description(file_virtual_server_not_registered, "the file server does not know our virtual server"), {0x0A08, "server_insufficeient_permissions" , "insufficient client permissions" }, diff --git a/src/Error.h b/src/Error.h index 301472d..c98a7a2 100644 --- a/src/Error.h +++ b/src/Error.h @@ -105,6 +105,8 @@ namespace ts { parameter_invalid_size = 0x605, parameter_missing = 0x606, parameter_checksum = 0x607, + parameter_constraint_violation = 0x6010, + vs_critical = 0x700, connection_lost = 0x701, not_connected = 0x702, @@ -118,6 +120,7 @@ namespace ts { serverlibrary_not_initialised = 0x70a, whisper_too_many_targets = 0x70b, whisper_no_targets = 0x70c, + file_invalid_name = 0x800, file_invalid_permissions = 0x801, file_already_exists = 0x802, @@ -142,6 +145,12 @@ namespace ts { file_transfer_client_quota_exceeded = 0x815, file_transfer_reset = 0x816, file_transfer_limit_reached = 0x817, + + file_api_timeout = 0x820, + file_virtual_server_not_registered = 0x821, + file_server_transfer_limit_reached = 0x822, + file_client_transfer_limit_reached = 0x823, + server_insufficeient_permissions = 0xa08, accounting_slot_limit_reached = 0xb01, server_connect_banned = 0xd01, @@ -380,6 +389,14 @@ namespace ts { result.release_data(); } + inline size_t length() const { + return this->results.size(); + } + + inline const ts::command_result& response(size_t index) const { + return this->results[index]; + } + inline void reserve(size_t length) { this->results.reserve(length); } @@ -388,6 +405,10 @@ namespace ts { this->results.push_back(std::forward(result)); } + inline void set_result(size_t index, ts::command_result&& result) { + this->results[index].reset(std::forward(result)); + } + inline void emplace_result(permission::PermissionType permission) { this->results.emplace_back(permission); } diff --git a/src/License.h b/src/License.h index 70b1167..747e7d7 100644 --- a/src/License.h +++ b/src/License.h @@ -34,6 +34,8 @@ namespace license { return "MyTsIdSign"; case LicenseType::EPHEMERAL: return "Ephemeral"; + case LicenseType::TOKEN: + return "Token"; default: return "Unknown"; } diff --git a/src/Properties.h b/src/Properties.h index 85052b7..9072e70 100644 --- a/src/Properties.h +++ b/src/Properties.h @@ -767,7 +767,7 @@ namespace ts { [[nodiscard]] operator T(){ return this->as(); } template - [[nodiscard]] T as_save() const { + [[nodiscard]] T as_save(const std::function defaultValue = []{ return T{}; }) const { try { std::lock_guard lock(this->data_ptr->value_lock); if(this->data_ptr->casted_value.type() == typeid(T)) @@ -776,7 +776,7 @@ namespace ts { this->data_ptr->casted_value = ts::converter::from_string_view(this->data_ptr->value); return std::any_cast(this->data_ptr->casted_value); } catch(std::exception&) { - return T{}; + return defaultValue(); } } diff --git a/src/protocol/buffers.h b/src/protocol/buffers.h index 1a8f22f..39555eb 100644 --- a/src/protocol/buffers.h +++ b/src/protocol/buffers.h @@ -72,6 +72,8 @@ namespace ts::buffer { return 1024; case Bytes_1536: return 1536; + case unset: + case max: default: return 0; } diff --git a/src/query/command3.h b/src/query/command3.h index 79f7e49..028fbe5 100644 --- a/src/query/command3.h +++ b/src/query/command3.h @@ -184,6 +184,10 @@ namespace ts { this->bulk.reserve(length + (accumulative ? this->bulk.size() : 0)); } + inline void reset() { + this->bulk.clear(); + } + inline void put(const std::string_view& key, const std::string_view& value) { size_t begin, end; if(impl::value_raw_impl(this->bulk, key, begin, &end)) {