summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/td/telegram/files/FileHashUploader.cpp50
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