From 4bd6bd377be6b60cddea6c516c3384bbd463e228 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 2 Jun 2022 16:34:05 +0300 Subject: [PATCH 1/8] Fix empty chatAdministrators object creation. --- td/telegram/ContactsManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 9bcb2fdca..193f40878 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -15793,7 +15793,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 { From 014b45842578d01b5b7edc7a40f97f1666fdbe44 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 2 Jun 2022 17:52:12 +0300 Subject: [PATCH 2/8] Add Dimensions.h. --- CMakeLists.txt | 3 ++ td/telegram/AnimationsManager.h | 1 + td/telegram/Dimensions.cpp | 51 +++++++++++++++++++++++++++++++ td/telegram/Dimensions.h | 28 +++++++++++++++++ td/telegram/Dimensions.hpp | 28 +++++++++++++++++ td/telegram/DocumentsManager.cpp | 1 + td/telegram/MessageContent.cpp | 1 + td/telegram/Payments.cpp | 1 + td/telegram/Photo.cpp | 1 + td/telegram/PhotoSize.cpp | 41 ++----------------------- td/telegram/PhotoSize.h | 13 +------- td/telegram/PhotoSize.hpp | 14 +-------- td/telegram/SecretInputMedia.h | 2 +- td/telegram/StickersManager.h | 1 + td/telegram/VideoNotesManager.h | 1 + td/telegram/VideosManager.h | 1 + td/telegram/VoiceNotesManager.cpp | 1 + td/telegram/WebPageBlock.cpp | 2 +- td/telegram/WebPagesManager.cpp | 2 +- 19 files changed, 126 insertions(+), 67 deletions(-) create mode 100644 td/telegram/Dimensions.cpp create mode 100644 td/telegram/Dimensions.h create mode 100644 td/telegram/Dimensions.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 73c2d2aeb..0f7eb62e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,6 +317,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 @@ -520,6 +521,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 @@ -693,6 +695,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/td/telegram/AnimationsManager.h b/td/telegram/AnimationsManager.h index e07856531..5cdf73e84 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/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 be2e34e4d..30a5ec135 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/MessageContent.cpp b/td/telegram/MessageContent.cpp index 6873d88cb..a85aa2ab6 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/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 e4db76724..71e774617 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 6c8af6d0f..14b0acc9e 100644 --- a/td/telegram/PhotoSize.cpp +++ b/td/telegram/PhotoSize.cpp @@ -22,43 +22,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; @@ -431,8 +394,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 0d118ca96..cb0a12fb1 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 944e6d0dd..f9bcf8af2 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 304b5e56e..476c2fb8c 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 08438292a..dfe0bbd7a 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" From 1c0205c1be14e4fb6eb5b2a3acbc67ee9b94637d Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 3 Jun 2022 02:12:26 +0300 Subject: [PATCH 3/8] Improve log message. --- td/telegram/MessagesManager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index a7dec946b..da65fbced 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -23727,6 +23727,7 @@ 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; 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); @@ -23735,7 +23736,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; From 492a84d52b85a14777cdfe7979d7798cca019d0b Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 3 Jun 2022 02:29:10 +0300 Subject: [PATCH 4/8] Fix setting first_database_message_id. --- td/telegram/MessagesManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index da65fbced..e74a429ba 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -23712,6 +23712,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() && @@ -23728,6 +23729,9 @@ 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); From e86b323de94f616ef09d53a44b5c6d66ef4218ae Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 3 Jun 2022 12:29:31 +0300 Subject: [PATCH 5/8] Fix warning. --- td/telegram/LinkManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)) { From a8e8136f34b5dffa3ea21e269dccbc3d4ec2b2eb Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 4 Jun 2022 13:58:08 +0300 Subject: [PATCH 6/8] Improve DialogParticipantStatus logging. --- td/telegram/DialogParticipant.cpp | 3 +++ 1 file changed, 3 insertions(+) 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_ << "]"; } From cfe5c4a43bd47c21c377dc15acee43771b66bc54 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 4 Jun 2022 14:57:29 +0300 Subject: [PATCH 7/8] Ensure that strings passed to TDLib's log message callback are UTF-8 encoded. --- td/telegram/Client.cpp | 15 ++++++++++++++- td/telegram/Client.h | 2 +- td/telegram/td_json_client.h | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) 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/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); From 3edf14b64e8d3fa84f52d734508150cd00582774 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 4 Jun 2022 23:22:01 +0300 Subject: [PATCH 8/8] Explicitly specify encoding for javac and javadoc. --- example/java/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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