summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/DownloadManagerCallback.cpp
blob: 816ef0742d796c200a2b4b77925750fa345a6510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
//
// 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/DownloadManagerCallback.h"

#include "td/telegram/FileReferenceManager.h"
#include "td/telegram/files/FileManager.h"
#include "td/telegram/Td.h"

#include "td/actor/actor.h"

#include "td/utils/common.h"
#include "td/utils/Promise.h"
#include "td/utils/Status.h"

namespace td {

void DownloadManagerCallback::update_counters(DownloadManager::Counters counters) {
  send_closure(td_->actor_id(td_), &Td::send_update, counters.get_update_file_downloads_object());
}

void DownloadManagerCallback::update_file_added(FileId file_id, FileSourceId file_source_id, int32 add_date,
                                                int32 complete_date, bool is_paused,
                                                DownloadManager::FileCounters counters) {
  send_closure(td_->actor_id(td_), &Td::send_update,
               td_api::make_object<td_api::updateFileAddedToDownloads>(
                   get_file_download_object(file_id, file_source_id, add_date, complete_date, is_paused),
                   counters.get_downloaded_file_counts_object()));
}

void DownloadManagerCallback::update_file_changed(FileId file_id, int32 complete_date, bool is_paused,
                                                  DownloadManager::FileCounters counters) {
  send_closure(td_->actor_id(td_), &Td::send_update,
               td_api::make_object<td_api::updateFileDownload>(file_id.get(), complete_date, is_paused,
                                                               counters.get_downloaded_file_counts_object()));
}

void DownloadManagerCallback::update_file_removed(FileId file_id, DownloadManager::FileCounters counters) {
  send_closure(td_->actor_id(td_), &Td::send_update,
               td_api::make_object<td_api::updateFileRemovedFromDownloads>(
                   file_id.get(), counters.get_downloaded_file_counts_object()));
}

void DownloadManagerCallback::start_file(FileId file_id, int8 priority, ActorShared<DownloadManager> download_manager) {
  send_closure_later(td_->file_manager_actor_, &FileManager::download, file_id,
                     make_download_file_callback(td_, std::move(download_manager)), priority,
                     FileManager::KEEP_DOWNLOAD_OFFSET, FileManager::IGNORE_DOWNLOAD_LIMIT,
                     Promise<td_api::object_ptr<td_api::file>>());
}

void DownloadManagerCallback::pause_file(FileId file_id) {
  send_closure_later(td_->file_manager_actor_, &FileManager::download, file_id, nullptr, 0,
                     FileManager::KEEP_DOWNLOAD_OFFSET, FileManager::KEEP_DOWNLOAD_LIMIT,
                     Promise<td_api::object_ptr<td_api::file>>());
}

void DownloadManagerCallback::delete_file(FileId file_id) {
  send_closure_later(td_->file_manager_actor_, &FileManager::delete_file, file_id, Promise<Unit>(),
                     "download manager callback");
}

FileId DownloadManagerCallback::dup_file_id(FileId file_id) {
  return td_->file_manager_->dup_file_id(file_id, "DownloadManagerCallback");
}

void DownloadManagerCallback::get_file_search_text(FileId file_id, FileSourceId file_source_id,
                                                   Promise<string> &&promise) {
  send_closure(td_->file_reference_manager_actor_, &FileReferenceManager::get_file_search_text, file_source_id,
               get_file_view(file_id).get_unique_file_id(), std::move(promise));
}

FileView DownloadManagerCallback::get_file_view(FileId file_id) {
  return td_->file_manager_->get_file_view(file_id);
}

FileView DownloadManagerCallback::get_sync_file_view(FileId file_id) {
  td_->file_manager_->check_local_location(file_id, true);
  return get_file_view(file_id);
}

td_api::object_ptr<td_api::file> DownloadManagerCallback::get_file_object(FileId file_id) {
  return td_->file_manager_->get_file_object(file_id);
}

td_api::object_ptr<td_api::fileDownload> DownloadManagerCallback::get_file_download_object(
    FileId file_id, FileSourceId file_source_id, int32 add_date, int32 complete_date, bool is_paused) {
  return td_api::make_object<td_api::fileDownload>(td_->file_manager_->get_file_view(file_id).get_main_file_id().get(),
                                                   td_->file_reference_manager_->get_message_object(file_source_id),
                                                   add_date, complete_date, is_paused);
}

std::shared_ptr<FileManager::DownloadCallback> DownloadManagerCallback::make_download_file_callback(
    Td *td, ActorShared<DownloadManager> download_manager) {
  class Impl final : public FileManager::DownloadCallback {
   public:
    Impl(Td *td, ActorShared<DownloadManager> download_manager)
        : td_(td), download_manager_(std::move(download_manager)) {
    }
    void on_progress(FileId file_id) final {
      send_update(file_id, false);
    }
    void on_download_ok(FileId file_id) final {
      send_update(file_id, false);
    }
    void on_download_error(FileId file_id, Status error) final {
      send_update(file_id, true);
    }

   private:
    Td *td_;
    ActorShared<DownloadManager> download_manager_;

    void send_update(FileId file_id, bool is_paused) const {
      auto file_view = td_->file_manager_->get_file_view(file_id);
      send_closure_later(download_manager_, &DownloadManager::update_file_download_state, file_id,
                         file_view.local_total_size(), file_view.size(), file_view.expected_size(), is_paused);
    }
  };
  return std::make_shared<Impl>(td, std::move(download_manager));
}

}  // namespace td