diff --git a/td/telegram/files/FileBitmask.cpp b/td/telegram/files/FileBitmask.cpp index 0c6af8423..1ff6cb28f 100644 --- a/td/telegram/files/FileBitmask.cpp +++ b/td/telegram/files/FileBitmask.cpp @@ -20,9 +20,12 @@ Bitmask::Bitmask(Ones, int64 count) : data_(narrow_cast((count + 7) / 8) } } -std::string Bitmask::encode() const { +std::string Bitmask::encode(int32 prefix_count) const { // remove zeroes in the end to make encoding deterministic td::Slice data(data_); + if (prefix_count != -1) { + data.truncate(prefix_count); + } while (!data.empty() && data.back() == '\0') { data.remove_suffix(1); } diff --git a/td/telegram/files/FileBitmask.h b/td/telegram/files/FileBitmask.h index 0fd6427a4..ef17c0a4d 100644 --- a/td/telegram/files/FileBitmask.h +++ b/td/telegram/files/FileBitmask.h @@ -19,7 +19,7 @@ class Bitmask { Bitmask() = default; Bitmask(Decode, Slice data); Bitmask(Ones, int64 count); - std::string encode() const; + std::string encode(int32 prefix_count = -1) const; int64 get_ready_prefix_size(int64 offset, int64 part_size, int64 file_size) const; int64 get_total_size(int64 part_size, int64 file_size) const; bool get(int64 offset_part) const; diff --git a/td/telegram/files/PartsManager.cpp b/td/telegram/files/PartsManager.cpp index 386d6b864..5799c8fea 100644 --- a/td/telegram/files/PartsManager.cpp +++ b/td/telegram/files/PartsManager.cpp @@ -170,7 +170,11 @@ int32 PartsManager::get_ready_prefix_count() { return res; } string PartsManager::get_bitmask() const { - return bitmask_.encode(); + int32 prefix_count = -1; + if (need_check_) { + prefix_count = narrow_cast(checked_prefix_size_ / part_size_); + } + return bitmask_.encode(prefix_count); } Result PartsManager::start_part() {