diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp')
-rw-r--r-- | protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp b/protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp index 2408e16df4..75427bbbb1 100644 --- a/protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp +++ b/protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp @@ -1,27 +1,30 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// 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/files/FileHashUploader.h" -#include "td/telegram/telegram_api.h" - +#include "td/telegram/files/FileType.h" #include "td/telegram/Global.h" +#include "td/telegram/net/DcId.h" #include "td/telegram/net/NetQueryDispatcher.h" +#include "td/telegram/telegram_api.h" #include "td/utils/buffer.h" +#include "td/utils/common.h" #include "td/utils/crypto.h" #include "td/utils/logging.h" #include "td/utils/MimeType.h" #include "td/utils/misc.h" #include "td/utils/PathView.h" -#include "td/utils/port/Fd.h" #include "td/utils/port/FileFd.h" +#include "td/utils/port/PollFlags.h" #include "td/utils/Status.h" namespace td { + void FileHashUploader::start_up() { auto status = init(); if (status.is_error()) { @@ -30,18 +33,21 @@ void FileHashUploader::start_up() { return; } } + Status FileHashUploader::init() { TRY_RESULT(fd, FileFd::open(local_.path_, FileFd::Read)); - if (fd.get_size() != size_) { - return Status::Error("size mismatch"); + TRY_RESULT(file_size, fd.get_size()); + if (file_size != size_) { + return Status::Error("Size mismatch"); } fd_ = BufferedFd<FileFd>(std::move(fd)); - sha256_init(&sha256_state_); + sha256_state_.init(); resource_state_.set_unit_size(1024); resource_state_.update_estimated_limit(size_); return Status::OK(); } + void FileHashUploader::loop() { if (stop_flag_) { return; @@ -56,20 +62,19 @@ void FileHashUploader::loop() { } Status FileHashUploader::loop_impl() { - if (state_ == CalcSha) { + if (state_ == State::CalcSha) { TRY_STATUS(loop_sha()); } - if (state_ == NetRequest) { - // messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document; + if (state_ == State::NetRequest) { + // messages.getDocumentByHash#338e2464 sha256:bytes size:long mime_type:string = Document; auto hash = BufferSlice(32); - sha256_final(&sha256_state_, hash.as_slice()); + sha256_state_.extract(hash.as_slice(), true); auto mime_type = MimeType::from_extension(PathView(local_.path_).extension(), "image/gif"); - auto query = - telegram_api::messages_getDocumentByHash(std::move(hash), static_cast<int32>(size_), std::move(mime_type)); + auto query = telegram_api::messages_getDocumentByHash(std::move(hash), size_, std::move(mime_type)); LOG(INFO) << "Send getDocumentByHash request: " << to_string(query); - auto ptr = G()->net_query_creator().create(create_storer(query)); + auto ptr = G()->net_query_creator().create(query); G()->net_query_dispatcher().dispatch_with_callback(std::move(ptr), actor_shared(this)); - state_ = WaitNetResult; + state_ = State::WaitNetResult; } return Status::OK(); } @@ -84,17 +89,17 @@ Status FileHashUploader::loop_sha() { } resource_state_.start_use(limit); - fd_.update_flags(Fd::Flag::Read); + fd_.get_poll_info().add_flags(PollFlags::Read()); TRY_RESULT(read_size, fd_.flush_read(static_cast<size_t>(limit))); if (read_size != static_cast<size_t>(limit)) { - return Status::Error("unexpected end of file"); + return Status::Error("Unexpected end of file"); } while (true) { auto ready = fd_.input_buffer().prepare_read(); if (ready.empty()) { break; } - sha256_update(ready, &sha256_state_); + sha256_state_.feed(ready); fd_.input_buffer().confirm_read(ready.size()); } resource_state_.stop_use(limit); @@ -102,7 +107,7 @@ Status FileHashUploader::loop_sha() { size_left_ -= narrow_cast<int64>(read_size); CHECK(size_left_ >= 0); if (size_left_ == 0) { - state_ = NetRequest; + state_ = State::NetRequest; return Status::OK(); } return Status::OK(); @@ -128,8 +133,12 @@ Status FileHashUploader::on_result_impl(NetQueryPtr net_query) { return Status::Error("Document is not found by hash"); case telegram_api::document::ID: { auto document = move_tl_object_as<telegram_api::document>(res); + if (!DcId::is_valid(document->dc_id_)) { + return Status::Error("Found document has invalid DcId"); + } callback_->on_ok(FullRemoteFileLocation(FileType::Document, document->id_, document->access_hash_, - DcId::internal(document->dc_id_))); + DcId::internal(document->dc_id_), + document->file_reference_.as_slice().str())); stop_flag_ = true; return Status::OK(); @@ -139,4 +148,5 @@ Status FileHashUploader::on_result_impl(NetQueryPtr net_query) { return Status::Error("UNREACHABLE"); } } + } // namespace td |