tdesktop/Telegram/SourceFiles/data/data_download_manager.h

132 lines
3.0 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "base/timer.h"
namespace Ui {
struct DownloadBarProgress;
struct DownloadBarContent;
} // namespace Ui
namespace Main {
class Session;
} // namespace Main
namespace Data {
enum class DownloadType {
Document,
Photo,
};
// unixtime * 1000.
using DownloadDate = int64;
struct DownloadId {
uint64 objectId = 0;
DownloadType type = DownloadType::Document;
};
struct DownloadProgress {
int64 ready = 0;
int64 total = 0;
};
inline constexpr bool operator==(
const DownloadProgress &a,
const DownloadProgress &b) {
return (a.ready == b.ready) && (a.total == b.total);
}
struct DownloadObject {
HistoryItem *item = nullptr;
DocumentData *document = nullptr;
PhotoData *photo = nullptr;
};
struct DownloadedId {
DownloadId download;
DownloadDate started = 0;
QString path;
FullMsgId itemId;
uint64 peerAccessHash = 0;
std::unique_ptr<DownloadObject> object;
};
struct DownloadingId {
DownloadObject object;
DownloadDate started = 0;
int ready = 0;
int total = 0;
bool done = false;
};
class DownloadManager final {
public:
DownloadManager();
~DownloadManager();
void trackSession(not_null<Main::Session*> session);
void addLoading(DownloadObject object);
void addLoaded(
DownloadObject object,
const QString &path,
DownloadDate started);
[[nodiscard]] auto loadingList() const
-> ranges::any_view<DownloadingId, ranges::category::input>;
[[nodiscard]] DownloadProgress loadingProgress() const;
[[nodiscard]] rpl::producer<> loadingListChanges() const;
[[nodiscard]] auto loadingProgressValue() const
-> rpl::producer<DownloadProgress>;
private:
struct SessionData {
std::vector<DownloadedId> downloaded;
std::vector<DownloadingId> downloading;
rpl::lifetime lifetime;
};
void check(not_null<const HistoryItem*> item);
void changed(not_null<const HistoryItem*> item);
void removed(not_null<const HistoryItem*> item);
void untrack(not_null<Main::Session*> session);
void remove(
SessionData &data,
std::vector<DownloadingId>::iterator i);
void cancel(
SessionData &data,
std::vector<DownloadingId>::iterator i);
void clearLoading();
[[nodiscard]] SessionData &sessionData(not_null<Main::Session*> session);
[[nodiscard]] SessionData &sessionData(
not_null<const HistoryItem*> item);
base::flat_map<not_null<Main::Session*>, SessionData> _sessions;
base::flat_set<not_null<const HistoryItem*>> _loading;
base::flat_set<not_null<const HistoryItem*>> _loadingDone;
base::flat_set<not_null<const HistoryItem*>> _loaded;
rpl::event_stream<> _loadingListChanges;
rpl::variable<DownloadProgress> _loadingProgress;
base::Timer _clearLoadingTimer;
};
[[nodiscard]] auto MakeDownloadBarProgress()
-> rpl::producer<Ui::DownloadBarProgress>;
[[nodiscard]] rpl::producer<Ui::DownloadBarContent> MakeDownloadBarContent();
} // namespace Data