tdesktop/Telegram/SourceFiles/export/export_api_wrap.h

246 lines
6.8 KiB
C
Raw Normal View History

/*
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
2019-12-02 13:10:19 +00:00
#include "mtproto/mtproto_concurrent_sender.h"
2021-04-09 16:47:28 +00:00
#include "data/data_peer_id.h"
namespace Export {
namespace Data {
struct File;
2018-06-17 20:15:40 +00:00
struct Chat;
struct Document;
struct FileLocation;
struct PersonalInfo;
struct UserpicsInfo;
struct UserpicsSlice;
struct ContactsList;
2018-06-11 18:57:56 +00:00
struct SessionsList;
2018-06-12 18:09:21 +00:00
struct DialogsInfo;
2018-06-13 13:12:36 +00:00
struct DialogInfo;
struct MessagesSlice;
struct Message;
struct FileOrigin;
} // namespace Data
namespace Output {
struct Result;
class Stats;
} // namespace Output
2018-06-13 13:12:36 +00:00
struct Settings;
class ApiWrap {
public:
ApiWrap(QPointer<MTP::Instance> weak, Fn<void(FnMut<void()>)> runner);
2021-03-12 12:48:00 +00:00
rpl::producer<MTP::Error> errors() const;
rpl::producer<Output::Result> ioErrors() const;
2018-06-18 21:52:13 +00:00
struct StartInfo {
int userpicsCount = 0;
int dialogsCount = 0;
};
void startExport(
const Settings &settings,
Output::Stats *stats,
2018-06-18 21:52:13 +00:00
FnMut<void(StartInfo)> done);
void requestDialogsList(
Fn<bool(int count)> progress,
FnMut<void(Data::DialogsInfo&&)> done);
2018-06-13 13:12:36 +00:00
void requestPersonalInfo(FnMut<void(Data::PersonalInfo&&)> done);
2018-06-24 00:33:47 +00:00
void requestOtherData(
const QString &suggestedPath,
FnMut<void(Data::File&&)> done);
struct DownloadProgress {
uint64 randomId = 0;
2018-06-19 18:31:30 +00:00
QString path;
int itemIndex = 0;
2022-05-10 14:22:28 +00:00
int64 ready = 0;
int64 total = 0;
};
void requestUserpics(
FnMut<bool(Data::UserpicsInfo&&)> start,
Fn<bool(DownloadProgress)> progress,
Fn<bool(Data::UserpicsSlice&&)> slice,
FnMut<void()> finish);
void requestContacts(FnMut<void(Data::ContactsList&&)> done);
2018-06-11 18:57:56 +00:00
void requestSessions(FnMut<void(Data::SessionsList&&)> done);
2018-06-18 21:52:13 +00:00
void requestMessages(
const Data::DialogInfo &info,
FnMut<bool(const Data::DialogInfo &)> start,
Fn<bool(DownloadProgress)> progress,
Fn<bool(Data::MessagesSlice&&)> slice,
2018-06-18 21:52:13 +00:00
FnMut<void()> done);
2018-06-12 18:09:21 +00:00
2018-06-21 00:54:59 +00:00
void finishExport(FnMut<void()> done);
void skipFile(uint64 randomId);
2018-06-21 00:54:59 +00:00
void cancelExportFast();
~ApiWrap();
private:
2018-06-18 21:52:13 +00:00
class LoadedFileCache;
struct StartProcess;
2018-06-19 20:40:16 +00:00
struct ContactsProcess;
struct UserpicsProcess;
2018-06-24 00:33:47 +00:00
struct OtherDataProcess;
struct FileProcess;
struct FileProgress;
struct ChatsProcess;
2018-06-18 21:52:13 +00:00
struct LeftChannelsProcess;
struct DialogsProcess;
2018-06-18 21:52:13 +00:00
struct ChatProcess;
void startMainSession(FnMut<void()> done);
2018-06-18 21:52:13 +00:00
void sendNextStartRequest();
void requestUserpicsCount();
void requestSplitRanges();
2018-06-18 21:52:13 +00:00
void requestDialogsCount();
void requestLeftChannelsCount();
void finishStartProcess();
2018-06-19 20:40:16 +00:00
void requestTopPeersSlice();
void handleUserpicsSlice(const MTPphotos_Photos &result);
void loadUserpicsFiles(Data::UserpicsSlice &&slice);
void loadNextUserpic();
bool loadUserpicProgress(FileProgress value);
void loadUserpicDone(const QString &relativePath);
void finishUserpicsSlice();
void finishUserpics();
2018-06-24 00:33:47 +00:00
void otherDataDone(const QString &relativePath);
2018-06-24 01:34:47 +00:00
bool useOnlyLastSplit() const;
2018-06-12 18:09:21 +00:00
void requestDialogsSlice();
2018-06-13 13:12:36 +00:00
void appendDialogsSlice(Data::DialogsInfo &&info);
void finishDialogsList();
2018-07-23 13:11:56 +00:00
void requestSinglePeerDialog();
mtpRequestId requestSinglePeerMigrated(const Data::DialogInfo &info);
void appendSinglePeerDialogs(Data::DialogsInfo &&info);
2018-06-13 13:12:36 +00:00
2018-07-11 21:06:35 +00:00
void requestLeftChannelsIfNeeded();
void requestLeftChannelsList(
Fn<bool(int count)> progress,
FnMut<void(Data::DialogsInfo&&)> done);
2018-06-18 21:52:13 +00:00
void requestLeftChannelsSliceGeneric(FnMut<void()> done);
void requestLeftChannelsSlice();
void appendLeftChannelsSlice(Data::DialogsInfo &&info);
void appendChatsSlice(
2018-07-11 21:06:35 +00:00
ChatsProcess &process,
std::vector<Data::DialogInfo> &to,
std::vector<Data::DialogInfo> &&from,
int splitIndex);
void requestMessagesCount(int localSplitIndex);
2018-10-06 12:17:29 +00:00
void checkFirstMessageDate(int localSplitIndex, int count);
void messagesCountLoaded(int localSplitIndex, int count);
void requestMessagesSlice();
void requestChatMessages(
int splitIndex,
int offsetId,
int addOffset,
int limit,
FnMut<void(MTPmessages_Messages&&)> done);
void collectMessagesCustomEmoji(const Data::MessagesSlice &slice);
void resolveCustomEmoji();
2018-06-13 13:12:36 +00:00
void loadMessagesFiles(Data::MessagesSlice &&slice);
void loadNextMessageFile();
bool messageCustomEmojiReady(Data::Message &message);
bool loadMessageFileProgress(FileProgress value);
2018-06-13 13:12:36 +00:00
void loadMessageFileDone(const QString &relativePath);
bool loadMessageThumbProgress(FileProgress value);
void loadMessageThumbDone(const QString &relativePath);
bool loadMessageEmojiProgress(FileProgress progress);
void loadMessageEmojiDone(uint64 id, const QString &relativePath);
2018-06-17 20:15:40 +00:00
void finishMessagesSlice();
2018-06-13 13:12:36 +00:00
void finishMessages();
2018-06-12 18:09:21 +00:00
[[nodiscard]] Data::Message *currentFileMessage() const;
[[nodiscard]] Data::FileOrigin currentFileMessageOrigin() const;
bool processFileLoad(
Data::File &file,
const Data::FileOrigin &origin,
Fn<bool(FileProgress)> progress,
FnMut<void(QString)> done,
Data::Message *message = nullptr);
std::unique_ptr<FileProcess> prepareFileProcess(
const Data::File &file,
const Data::FileOrigin &origin) const;
bool writePreloadedFile(
Data::File &file,
const Data::FileOrigin &origin);
2018-06-18 21:52:13 +00:00
void loadFile(
const Data::File &file,
const Data::FileOrigin &origin,
Fn<bool(FileProgress)> progress,
2018-06-18 21:52:13 +00:00
FnMut<void(QString)> done);
void loadFilePart();
2022-05-10 14:22:28 +00:00
void filePartDone(int64 offset, const MTPupload_File &result);
2018-06-24 12:30:09 +00:00
void filePartUnavailable();
2022-05-10 14:22:28 +00:00
void filePartRefreshReference(int64 offset);
void filePartExtractReference(
2022-05-10 14:22:28 +00:00
int64 offset,
const MTPmessages_Messages &result);
template <typename Request>
class RequestBuilder;
template <typename Request>
[[nodiscard]] auto mainRequest(Request &&request);
template <typename Request>
[[nodiscard]] auto splitRequest(int index, Request &&request);
[[nodiscard]] auto fileRequest(
const Data::FileLocation &location,
2022-05-10 14:22:28 +00:00
int64 offset);
2021-03-12 12:48:00 +00:00
void error(const MTP::Error &error);
void error(const QString &text);
void ioError(const Output::Result &result);
MTP::ConcurrentSender _mtp;
2018-09-21 16:28:46 +00:00
std::optional<uint64> _takeoutId;
2021-04-09 16:47:28 +00:00
std::optional<UserId> _selfId;
Output::Stats *_stats = nullptr;
2018-06-13 13:12:36 +00:00
std::unique_ptr<Settings> _settings;
MTPInputUser _user = MTP_inputUserSelf();
2018-06-18 21:52:13 +00:00
std::unique_ptr<StartProcess> _startProcess;
std::unique_ptr<LoadedFileCache> _fileCache;
2018-06-19 20:40:16 +00:00
std::unique_ptr<ContactsProcess> _contactsProcess;
std::unique_ptr<UserpicsProcess> _userpicsProcess;
2018-06-24 00:33:47 +00:00
std::unique_ptr<OtherDataProcess> _otherDataProcess;
std::unique_ptr<FileProcess> _fileProcess;
2018-06-18 21:52:13 +00:00
std::unique_ptr<LeftChannelsProcess> _leftChannelsProcess;
2018-06-12 18:09:21 +00:00
std::unique_ptr<DialogsProcess> _dialogsProcess;
2018-06-18 21:52:13 +00:00
std::unique_ptr<ChatProcess> _chatProcess;
base::flat_set<uint64> _unresolvedCustomEmoji;
base::flat_map<uint64, Data::Document> _resolvedCustomEmoji;
QVector<MTPMessageRange> _splits;
2018-06-12 18:09:21 +00:00
2021-03-12 12:48:00 +00:00
rpl::event_stream<MTP::Error> _errors;
rpl::event_stream<Output::Result> _ioErrors;
};
} // namespace Export