diff --git a/CMakeLists.txt b/CMakeLists.txt index a7defe80d..f377a018b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -321,6 +321,7 @@ set(TDLIB_SOURCE td/telegram/DialogParticipant.cpp td/telegram/DialogParticipantFilter.cpp td/telegram/DialogSource.cpp + td/telegram/Dimensions.cpp td/telegram/Document.cpp td/telegram/DocumentsManager.cpp td/telegram/DownloadManager.cpp @@ -525,6 +526,7 @@ set(TDLIB_SOURCE td/telegram/DialogParticipant.h td/telegram/DialogParticipantFilter.h td/telegram/DialogSource.h + td/telegram/Dimensions.h td/telegram/Document.h td/telegram/DocumentsManager.h td/telegram/DownloadManager.h @@ -699,6 +701,7 @@ set(TDLIB_SOURCE td/telegram/AuthManager.hpp td/telegram/BackgroundType.hpp td/telegram/DialogFilter.hpp + td/telegram/Dimensions.hpp td/telegram/Document.hpp td/telegram/DocumentsManager.hpp td/telegram/DraftMessage.hpp diff --git a/example/java/CMakeLists.txt b/example/java/CMakeLists.txt index 6a03776b2..602a5fa99 100644 --- a/example/java/CMakeLists.txt +++ b/example/java/CMakeLists.txt @@ -59,13 +59,13 @@ set(JAVA_SOURCE_PATH "${TD_API_JAVA_PATH}/${TD_API_JAVA_PACKAGE}") get_filename_component(JAVA_OUTPUT_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin REALPATH BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") file(MAKE_DIRECTORY ${JAVA_OUTPUT_DIRECTORY}) add_custom_target(build_java - COMMAND ${Java_JAVAC_EXECUTABLE} -d ${JAVA_OUTPUT_DIRECTORY} ${JAVA_SOURCE_PATH}/example/Example.java ${JAVA_SOURCE_PATH}/Client.java ${JAVA_SOURCE_PATH}/Log.java ${JAVA_SOURCE_PATH}/TdApi.java + COMMAND ${Java_JAVAC_EXECUTABLE} -encoding UTF-8 -d ${JAVA_OUTPUT_DIRECTORY} ${JAVA_SOURCE_PATH}/example/Example.java ${JAVA_SOURCE_PATH}/Client.java ${JAVA_SOURCE_PATH}/Log.java ${JAVA_SOURCE_PATH}/TdApi.java COMMENT "Building Java code" DEPENDS td_generate_java_api ) add_custom_target(generate_javadoc - COMMAND ${Java_JAVADOC_EXECUTABLE} -d ${JAVA_OUTPUT_DIRECTORY}/../docs org.drinkless.tdlib + COMMAND ${Java_JAVADOC_EXECUTABLE} -encoding UTF-8 -d ${JAVA_OUTPUT_DIRECTORY}/../docs org.drinkless.tdlib WORKING_DIRECTORY ${TD_API_JAVA_PATH} COMMENT "Generating Javadoc documentation" DEPENDS td_generate_java_api diff --git a/td/telegram/AnimationsManager.h b/td/telegram/AnimationsManager.h index c3df12c68..f0d4b3832 100644 --- a/td/telegram/AnimationsManager.h +++ b/td/telegram/AnimationsManager.h @@ -6,6 +6,7 @@ // #pragma once +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileId.h" #include "td/telegram/files/FileSourceId.h" #include "td/telegram/PhotoSize.h" diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp index e9f9bf548..a102efbfd 100644 --- a/td/telegram/Client.cpp +++ b/td/telegram/Client.cpp @@ -24,6 +24,8 @@ #include "td/utils/port/RwMutex.h" #include "td/utils/port/thread.h" #include "td/utils/Slice.h" +#include "td/utils/StringBuilder.h" +#include "td/utils/utf8.h" #include #include @@ -679,7 +681,18 @@ static std::atomic log_message_callback; static void log_message_callback_wrapper(int verbosity_level, CSlice message) { auto callback = log_message_callback.load(std::memory_order_relaxed); if (callback != nullptr) { - callback(verbosity_level, message.c_str()); + if (check_utf8(message)) { + callback(verbosity_level, message.c_str()); + } else { + size_t pos = 0; + while (1 <= message[pos] && message[pos] <= 126) { + pos++; + } + CHECK(pos + 1 < message.size()); + auto utf8_message = PSTRING() << message.substr(0, pos) + << url_encode(message.substr(pos, message.size() - pos - 1)) << '\n'; + callback(verbosity_level, utf8_message.c_str()); + } } } diff --git a/td/telegram/Client.h b/td/telegram/Client.h index f765d0264..b8c1e814f 100644 --- a/td/telegram/Client.h +++ b/td/telegram/Client.h @@ -129,7 +129,7 @@ class ClientManager final { * \param verbosity_level Log verbosity level with which the message was added (-1 - 1024). * If 0, then TDLib will crash as soon as the callback returns. * None of the TDLib methods can be called from the callback. - * \param message Null-terminated string with the message added to the log. + * \param message Null-terminated UTF-8-encoded string with the message added to the log. */ using LogMessageCallbackPtr = void (*)(int verbosity_level, const char *message); diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index b1e675c0d..29b374f39 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -15810,7 +15810,7 @@ void ContactsManager::reload_dialog_administrators(DialogId dialog_id, Promise> &&promise) { auto dialog_type = dialog_id.get_type(); if (dialog_type == DialogType::Chat && !get_chat_permissions(dialog_id.get_chat_id()).is_member()) { - return promise.set_value(td_api::object_ptr()); + return promise.set_value(td_api::make_object()); } auto query_promise = PromiseCreator::lambda( [actor_id = actor_id(this), dialog_id, promise = std::move(promise)](Result &&result) mutable { diff --git a/td/telegram/DialogParticipant.cpp b/td/telegram/DialogParticipant.cpp index 30544db4c..b34c9b862 100644 --- a/td/telegram/DialogParticipant.cpp +++ b/td/telegram/DialogParticipant.cpp @@ -532,6 +532,9 @@ StringBuilder &operator<<(StringBuilder &string_builder, const DialogParticipant return string_builder; case DialogParticipantStatus::Type::Administrator: string_builder << status.get_administrator_rights(); + if (status.can_be_edited()) { + string_builder << "(can_be_edited)"; + } if (!status.rank_.empty()) { string_builder << " [" << status.rank_ << "]"; } diff --git a/td/telegram/Dimensions.cpp b/td/telegram/Dimensions.cpp new file mode 100644 index 000000000..9fd1a714c --- /dev/null +++ b/td/telegram/Dimensions.cpp @@ -0,0 +1,51 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/Dimensions.h" + +#include "td/utils/logging.h" +#include "td/utils/misc.h" + +namespace td { + +static uint16 get_dimension(int32 size, const char *source) { + if (size < 0 || size > 65535) { + if (source != nullptr) { + LOG(ERROR) << "Wrong image dimension = " << size << " from " << source; + } + return 0; + } + return narrow_cast(size); +} + +Dimensions get_dimensions(int32 width, int32 height, const char *source) { + Dimensions result; + result.width = get_dimension(width, source); + result.height = get_dimension(height, source); + if (result.width == 0 || result.height == 0) { + result.width = 0; + result.height = 0; + } + return result; +} + +uint32 get_dimensions_pixel_count(const Dimensions &dimensions) { + return static_cast(dimensions.width) * static_cast(dimensions.height); +} + +bool operator==(const Dimensions &lhs, const Dimensions &rhs) { + return lhs.width == rhs.width && lhs.height == rhs.height; +} + +bool operator!=(const Dimensions &lhs, const Dimensions &rhs) { + return !(lhs == rhs); +} + +StringBuilder &operator<<(StringBuilder &string_builder, const Dimensions &dimensions) { + return string_builder << "(" << dimensions.width << ", " << dimensions.height << ")"; +} + +} // namespace td diff --git a/td/telegram/Dimensions.h b/td/telegram/Dimensions.h new file mode 100644 index 000000000..59430d912 --- /dev/null +++ b/td/telegram/Dimensions.h @@ -0,0 +1,28 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/utils/common.h" +#include "td/utils/StringBuilder.h" + +namespace td { + +struct Dimensions { + uint16 width = 0; + uint16 height = 0; +}; + +Dimensions get_dimensions(int32 width, int32 height, const char *source); + +uint32 get_dimensions_pixel_count(const Dimensions &dimensions); + +bool operator==(const Dimensions &lhs, const Dimensions &rhs); +bool operator!=(const Dimensions &lhs, const Dimensions &rhs); + +StringBuilder &operator<<(StringBuilder &string_builder, const Dimensions &dimensions); + +} // namespace td diff --git a/td/telegram/Dimensions.hpp b/td/telegram/Dimensions.hpp new file mode 100644 index 000000000..19ffa8d42 --- /dev/null +++ b/td/telegram/Dimensions.hpp @@ -0,0 +1,28 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/Dimensions.h" + +#include "td/utils/tl_helpers.h" + +namespace td { + +template +void store(Dimensions dimensions, StorerT &storer) { + store(static_cast((static_cast(dimensions.width) << 16) | dimensions.height), storer); +} + +template +void parse(Dimensions &dimensions, ParserT &parser) { + uint32 width_height; + parse(width_height, parser); + dimensions.width = static_cast(width_height >> 16); + dimensions.height = static_cast(width_height & 0xFFFF); +} + +} // namespace td diff --git a/td/telegram/DocumentsManager.cpp b/td/telegram/DocumentsManager.cpp index e401ef4e4..e5e4d4535 100644 --- a/td/telegram/DocumentsManager.cpp +++ b/td/telegram/DocumentsManager.cpp @@ -9,6 +9,7 @@ #include "td/telegram/AnimationsManager.h" #include "td/telegram/AudiosManager.h" #include "td/telegram/AuthManager.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/Document.h" #include "td/telegram/files/FileEncryptionKey.h" #include "td/telegram/files/FileLocation.h" diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index ca07fc961..3a942c2a4 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -711,7 +711,7 @@ static bool tolower_begins_with(Slice str, Slice prefix) { Result LinkManager::check_link(CSlice link, bool http_only, bool https_only) { auto result = check_link_impl(link, http_only, https_only); if (result.is_ok()) { - return std::move(result); + return result; } auto error = result.move_as_error(); if (check_utf8(link)) { diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index b3e5d74c7..01479f208 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -19,6 +19,7 @@ #include "td/telegram/Dependencies.h" #include "td/telegram/DialogAction.h" #include "td/telegram/DialogParticipant.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/Document.h" #include "td/telegram/DocumentsManager.h" #include "td/telegram/DocumentsManager.hpp" diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 6ebd00ef7..3e0b6f7ee 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -23805,6 +23805,7 @@ void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId } if (from_the_end && last_added_message_id.is_valid()) { + CHECK(next_message != nullptr); // CHECK(d->first_database_message_id.is_valid()); // CHECK(last_added_message_id >= d->first_database_message_id); if ((had_full_history || d->have_full_history) && !d->last_new_message_id.is_valid() && @@ -23820,6 +23821,10 @@ void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId } if (last_added_message_id != d->last_database_message_id && d->last_new_message_id.is_valid()) { auto debug_last_database_message_id = d->last_database_message_id; + auto debug_set_dialog_last_database_message_id = d->debug_set_dialog_last_database_message_id; + if (!d->first_database_message_id.is_valid() && !d->last_database_message_id.is_valid()) { + set_dialog_first_database_message_id(d, next_message->message_id, "on_get_history_from_database 5"); + } set_dialog_last_database_message_id(d, last_added_message_id, "on_get_history_from_database 5"); if (last_added_message_id < d->first_database_message_id || !d->first_database_message_id.is_valid()) { CHECK(next_message != nullptr); @@ -23828,7 +23833,10 @@ void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId << last_added_message_id << ' ' << d->first_database_message_id << ' ' << debug_first_database_message_id << ' ' << d->last_database_message_id << ' ' << debug_last_database_message_id << ' ' << dialog_id << ' ' << d->last_new_message_id << ' ' << debug_last_new_message_id << ' ' << d->last_message_id << ' ' - << debug_last_message_id; + << debug_last_message_id << ' ' << debug_set_dialog_last_database_message_id << ' ' + << d->debug_set_dialog_last_database_message_id << ' ' << first_received_message_id << ' ' + << last_received_message_id << ' ' << d->debug_first_database_message_id << ' ' + << d->debug_last_database_message_id << ' ' << d->debug_last_new_message_id; CHECK(next_message->message_id <= d->last_database_message_id); LOG(ERROR) << "Fix first database message in " << dialog_id << " from " << d->first_database_message_id << " to " << next_message->message_id; diff --git a/td/telegram/Payments.cpp b/td/telegram/Payments.cpp index 82ebb7888..cff860453 100644 --- a/td/telegram/Payments.cpp +++ b/td/telegram/Payments.cpp @@ -8,6 +8,7 @@ #include "td/telegram/AccessRights.h" #include "td/telegram/ContactsManager.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileManager.h" #include "td/telegram/files/FileType.h" #include "td/telegram/Global.h" diff --git a/td/telegram/Photo.cpp b/td/telegram/Photo.cpp index 2c77023ae..c20bc5705 100644 --- a/td/telegram/Photo.cpp +++ b/td/telegram/Photo.cpp @@ -6,6 +6,7 @@ // #include "td/telegram/Photo.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileEncryptionKey.h" #include "td/telegram/files/FileLocation.h" #include "td/telegram/files/FileManager.h" diff --git a/td/telegram/PhotoSize.cpp b/td/telegram/PhotoSize.cpp index f40c31324..32aeb8f6e 100644 --- a/td/telegram/PhotoSize.cpp +++ b/td/telegram/PhotoSize.cpp @@ -23,43 +23,6 @@ namespace td { -static uint16 get_dimension(int32 size, const char *source) { - if (size < 0 || size > 65535) { - if (source != nullptr) { - LOG(ERROR) << "Wrong image dimension = " << size << " from " << source; - } - return 0; - } - return narrow_cast(size); -} - -Dimensions get_dimensions(int32 width, int32 height, const char *source) { - Dimensions result; - result.width = get_dimension(width, source); - result.height = get_dimension(height, source); - if (result.width == 0 || result.height == 0) { - result.width = 0; - result.height = 0; - } - return result; -} - -static uint32 get_pixel_count(const Dimensions &dimensions) { - return static_cast(dimensions.width) * static_cast(dimensions.height); -} - -bool operator==(const Dimensions &lhs, const Dimensions &rhs) { - return lhs.width == rhs.width && lhs.height == rhs.height; -} - -bool operator!=(const Dimensions &lhs, const Dimensions &rhs) { - return !(lhs == rhs); -} - -StringBuilder &operator<<(StringBuilder &string_builder, const Dimensions &dimensions) { - return string_builder << "(" << dimensions.width << ", " << dimensions.height << ")"; -} - static int32 get_minithumbnail_size(const string &packed) { if (packed.size() < 3) { return 0; @@ -447,8 +410,8 @@ bool operator<(const PhotoSize &lhs, const PhotoSize &rhs) { if (lhs.size != rhs.size) { return lhs.size < rhs.size; } - auto lhs_pixels = get_pixel_count(lhs.dimensions); - auto rhs_pixels = get_pixel_count(rhs.dimensions); + auto lhs_pixels = get_dimensions_pixel_count(lhs.dimensions); + auto rhs_pixels = get_dimensions_pixel_count(rhs.dimensions); if (lhs_pixels != rhs_pixels) { return lhs_pixels < rhs_pixels; } diff --git a/td/telegram/PhotoSize.h b/td/telegram/PhotoSize.h index 2510983ca..2c3eb90f6 100644 --- a/td/telegram/PhotoSize.h +++ b/td/telegram/PhotoSize.h @@ -7,6 +7,7 @@ #pragma once #include "td/telegram/DialogId.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileId.h" #include "td/telegram/files/FileType.h" #include "td/telegram/net/DcId.h" @@ -24,11 +25,6 @@ namespace td { class FileManager; -struct Dimensions { - uint16 width = 0; - uint16 height = 0; -}; - struct PhotoSize { int32 type = 0; Dimensions dimensions; @@ -41,13 +37,6 @@ struct AnimationSize final : public PhotoSize { double main_frame_timestamp = 0.0; }; -Dimensions get_dimensions(int32 width, int32 height, const char *source); - -bool operator==(const Dimensions &lhs, const Dimensions &rhs); -bool operator!=(const Dimensions &lhs, const Dimensions &rhs); - -StringBuilder &operator<<(StringBuilder &string_builder, const Dimensions &dimensions); - bool need_update_dialog_photo_minithumbnail(const string &from, const string &to); td_api::object_ptr get_minithumbnail_object(const string &packed); diff --git a/td/telegram/PhotoSize.hpp b/td/telegram/PhotoSize.hpp index c62bb35be..85184d25e 100644 --- a/td/telegram/PhotoSize.hpp +++ b/td/telegram/PhotoSize.hpp @@ -6,6 +6,7 @@ // #pragma once +#include "td/telegram/Dimensions.hpp" #include "td/telegram/files/FileId.hpp" #include "td/telegram/PhotoSize.h" #include "td/telegram/Version.h" @@ -15,19 +16,6 @@ namespace td { -template -void store(Dimensions dimensions, StorerT &storer) { - store(static_cast((static_cast(dimensions.width) << 16) | dimensions.height), storer); -} - -template -void parse(Dimensions &dimensions, ParserT &parser) { - uint32 width_height; - parse(width_height, parser); - dimensions.width = static_cast(width_height >> 16); - dimensions.height = static_cast(width_height & 0xFFFF); -} - template void store(const PhotoSize &photo_size, StorerT &storer) { LOG(DEBUG) << "Store photo size " << photo_size; diff --git a/td/telegram/SecretInputMedia.h b/td/telegram/SecretInputMedia.h index 35c96ee6a..e9c620758 100644 --- a/td/telegram/SecretInputMedia.h +++ b/td/telegram/SecretInputMedia.h @@ -6,7 +6,7 @@ // #pragma once -#include "td/telegram/PhotoSize.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/secret_api.h" #include "td/telegram/telegram_api.h" diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index c88002836..f0d3f0c07 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -7,6 +7,7 @@ #pragma once #include "td/telegram/DialogId.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileId.h" #include "td/telegram/files/FileSourceId.h" #include "td/telegram/FullMessageId.h" diff --git a/td/telegram/VideoNotesManager.h b/td/telegram/VideoNotesManager.h index debab8f0e..89a59a7f0 100644 --- a/td/telegram/VideoNotesManager.h +++ b/td/telegram/VideoNotesManager.h @@ -6,6 +6,7 @@ // #pragma once +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileId.h" #include "td/telegram/PhotoSize.h" #include "td/telegram/SecretInputMedia.h" diff --git a/td/telegram/VideosManager.h b/td/telegram/VideosManager.h index fbadf135c..b9b29a220 100644 --- a/td/telegram/VideosManager.h +++ b/td/telegram/VideosManager.h @@ -6,6 +6,7 @@ // #pragma once +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileId.h" #include "td/telegram/PhotoSize.h" #include "td/telegram/SecretInputMedia.h" diff --git a/td/telegram/VoiceNotesManager.cpp b/td/telegram/VoiceNotesManager.cpp index 5021007d3..ddbd6ad18 100644 --- a/td/telegram/VoiceNotesManager.cpp +++ b/td/telegram/VoiceNotesManager.cpp @@ -6,6 +6,7 @@ // #include "td/telegram/VoiceNotesManager.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/files/FileManager.h" #include "td/telegram/secret_api.h" #include "td/telegram/Td.h" diff --git a/td/telegram/WebPageBlock.cpp b/td/telegram/WebPageBlock.cpp index a4abdee99..229c00bd1 100644 --- a/td/telegram/WebPageBlock.cpp +++ b/td/telegram/WebPageBlock.cpp @@ -13,6 +13,7 @@ #include "td/telegram/ChannelId.h" #include "td/telegram/ContactsManager.h" #include "td/telegram/DialogId.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/Document.h" #include "td/telegram/DocumentsManager.h" #include "td/telegram/DocumentsManager.hpp" @@ -21,7 +22,6 @@ #include "td/telegram/Photo.h" #include "td/telegram/Photo.hpp" #include "td/telegram/PhotoFormat.h" -#include "td/telegram/PhotoSize.h" #include "td/telegram/Td.h" #include "td/telegram/Version.h" #include "td/telegram/VideosManager.h" diff --git a/td/telegram/WebPagesManager.cpp b/td/telegram/WebPagesManager.cpp index cd6092a09..ef00a3758 100644 --- a/td/telegram/WebPagesManager.cpp +++ b/td/telegram/WebPagesManager.cpp @@ -9,6 +9,7 @@ #include "td/telegram/AnimationsManager.h" #include "td/telegram/AudiosManager.h" #include "td/telegram/AuthManager.h" +#include "td/telegram/Dimensions.h" #include "td/telegram/Document.h" #include "td/telegram/Document.hpp" #include "td/telegram/DocumentsManager.h" @@ -22,7 +23,6 @@ #include "td/telegram/MessagesManager.h" #include "td/telegram/Photo.h" #include "td/telegram/PhotoFormat.h" -#include "td/telegram/PhotoSize.h" #include "td/telegram/secret_api.h" #include "td/telegram/StickersManager.h" #include "td/telegram/Td.h" diff --git a/td/telegram/td_json_client.h b/td/telegram/td_json_client.h index e27a3bae7..e6e0c2ded 100644 --- a/td/telegram/td_json_client.h +++ b/td/telegram/td_json_client.h @@ -91,7 +91,7 @@ TDJSON_EXPORT const char *td_execute(const char *request); * \param verbosity_level Log verbosity level with which the message was added (-1 - 1024). * If 0, then TDLib will crash as soon as the callback returns. * None of the TDLib methods can be called from the callback. - * \param message Null-terminated string with the logged message. The string isn't guaranteed to be encoded in UTF-8. + * \param message Null-terminated UTF-8-encoded string with the message added to the log. */ typedef void (*td_log_message_callback_ptr)(int verbosity_level, const char *message);