diff --git a/example/web/build-tdlib.sh b/example/web/build-tdlib.sh index 548c77e3..1dbc85bb 100755 --- a/example/web/build-tdlib.sh +++ b/example/web/build-tdlib.sh @@ -37,8 +37,8 @@ eval emconfigure cmake -DCMAKE_BUILD_TYPE=Release $OPENSSL_OPTIONS -DASMJS=1 $TD cd ../.. echo "Generating TDLib autogenerated source files..." -cmake --build build/generate --target prepare_cross_compiling || exit 1 +cmake --build build/generate -j --target prepare_cross_compiling || exit 1 echo "Building TDLib to WebAssembly..." -cmake --build build/wasm --target td_wasm || exit 1 +cmake --build build/wasm -j --target td_wasm || exit 1 echo "Building TDLib to asm.js..." -cmake --build build/asmjs --target td_asmjs || exit 1 +cmake --build build/asmjs -j --target td_asmjs || exit 1 diff --git a/td/telegram/files/FileBitmask.cpp b/td/telegram/files/FileBitmask.cpp index 1ff6cb28..4e413d83 100644 --- a/td/telegram/files/FileBitmask.cpp +++ b/td/telegram/files/FileBitmask.cpp @@ -20,12 +20,27 @@ Bitmask::Bitmask(Ones, int64 count) : data_(narrow_cast((count + 7) / 8) } } -std::string Bitmask::encode(int32 prefix_count) const { +std::string Bitmask::encode(int32 prefix_count) { // remove zeroes in the end to make encoding deterministic td::Slice data(data_); + + int save_i = -1; + char save_c; if (prefix_count != -1) { - data.truncate(prefix_count); + auto truncated_size = (prefix_count + 7) / 8; + data.truncate(truncated_size); + if (prefix_count % 8 != 0) { + save_i = truncated_size - 1; + save_c = data_[save_i]; + uint8 mask = 0xff >> (8 - prefix_count % 8); + data_[save_i] &= mask; + } } + SCOPE_EXIT { + if (save_i != -1) { + data_[save_i] = save_c; + } + }; 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 ef17c0a4..390eeacd 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(int32 prefix_count = -1) const; + std::string encode(int32 prefix_count = -1); 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 5799c8fe..aaed84ea 100644 --- a/td/telegram/files/PartsManager.cpp +++ b/td/telegram/files/PartsManager.cpp @@ -169,7 +169,7 @@ int32 PartsManager::get_ready_prefix_count() { } return res; } -string PartsManager::get_bitmask() const { +string PartsManager::get_bitmask() { int32 prefix_count = -1; if (need_check_) { prefix_count = narrow_cast(checked_prefix_size_ / part_size_); diff --git a/td/telegram/files/PartsManager.h b/td/telegram/files/PartsManager.h index e0e56fab..c86b0afe 100644 --- a/td/telegram/files/PartsManager.h +++ b/td/telegram/files/PartsManager.h @@ -47,7 +47,7 @@ class PartsManager { int32 get_part_count() const; int32 get_unchecked_ready_prefix_count(); int32 get_ready_prefix_count(); - string get_bitmask() const; + string get_bitmask(); private: static constexpr int MAX_PART_COUNT = 3000;