237 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
	
		
			6.4 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 "mtproto/mtproto_concurrent_sender.h"
 | |
| #include "data/data_peer_id.h"
 | |
| 
 | |
| namespace Export {
 | |
| namespace Data {
 | |
| struct File;
 | |
| struct Chat;
 | |
| struct FileLocation;
 | |
| struct PersonalInfo;
 | |
| struct UserpicsInfo;
 | |
| struct UserpicsSlice;
 | |
| struct ContactsList;
 | |
| struct SessionsList;
 | |
| struct DialogsInfo;
 | |
| struct DialogInfo;
 | |
| struct MessagesSlice;
 | |
| struct Message;
 | |
| struct FileOrigin;
 | |
| } // namespace Data
 | |
| 
 | |
| namespace Output {
 | |
| struct Result;
 | |
| class Stats;
 | |
| } // namespace Output
 | |
| 
 | |
| struct Settings;
 | |
| 
 | |
| class ApiWrap {
 | |
| public:
 | |
| 	ApiWrap(QPointer<MTP::Instance> weak, Fn<void(FnMut<void()>)> runner);
 | |
| 
 | |
| 	rpl::producer<MTP::Error> errors() const;
 | |
| 	rpl::producer<Output::Result> ioErrors() const;
 | |
| 
 | |
| 	struct StartInfo {
 | |
| 		int userpicsCount = 0;
 | |
| 		int dialogsCount = 0;
 | |
| 	};
 | |
| 	void startExport(
 | |
| 		const Settings &settings,
 | |
| 		Output::Stats *stats,
 | |
| 		FnMut<void(StartInfo)> done);
 | |
| 
 | |
| 	void requestDialogsList(
 | |
| 		Fn<bool(int count)> progress,
 | |
| 		FnMut<void(Data::DialogsInfo&&)> done);
 | |
| 
 | |
| 	void requestPersonalInfo(FnMut<void(Data::PersonalInfo&&)> done);
 | |
| 
 | |
| 	void requestOtherData(
 | |
| 		const QString &suggestedPath,
 | |
| 		FnMut<void(Data::File&&)> done);
 | |
| 
 | |
| 	struct DownloadProgress {
 | |
| 		uint64 randomId = 0;
 | |
| 		QString path;
 | |
| 		int itemIndex = 0;
 | |
| 		int ready = 0;
 | |
| 		int 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);
 | |
| 
 | |
| 	void requestSessions(FnMut<void(Data::SessionsList&&)> done);
 | |
| 
 | |
| 	void requestMessages(
 | |
| 		const Data::DialogInfo &info,
 | |
| 		FnMut<bool(const Data::DialogInfo &)> start,
 | |
| 		Fn<bool(DownloadProgress)> progress,
 | |
| 		Fn<bool(Data::MessagesSlice&&)> slice,
 | |
| 		FnMut<void()> done);
 | |
| 
 | |
| 	void finishExport(FnMut<void()> done);
 | |
| 	void skipFile(uint64 randomId);
 | |
| 	void cancelExportFast();
 | |
| 
 | |
| 	~ApiWrap();
 | |
| 
 | |
| private:
 | |
| 	class LoadedFileCache;
 | |
| 	struct StartProcess;
 | |
| 	struct ContactsProcess;
 | |
| 	struct UserpicsProcess;
 | |
| 	struct OtherDataProcess;
 | |
| 	struct FileProcess;
 | |
| 	struct FileProgress;
 | |
| 	struct ChatsProcess;
 | |
| 	struct LeftChannelsProcess;
 | |
| 	struct DialogsProcess;
 | |
| 	struct ChatProcess;
 | |
| 
 | |
| 	void startMainSession(FnMut<void()> done);
 | |
| 	void sendNextStartRequest();
 | |
| 	void requestUserpicsCount();
 | |
| 	void requestSplitRanges();
 | |
| 	void requestDialogsCount();
 | |
| 	void requestLeftChannelsCount();
 | |
| 	void finishStartProcess();
 | |
| 
 | |
| 	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();
 | |
| 
 | |
| 	void otherDataDone(const QString &relativePath);
 | |
| 
 | |
| 	bool useOnlyLastSplit() const;
 | |
| 
 | |
| 	void requestDialogsSlice();
 | |
| 	void appendDialogsSlice(Data::DialogsInfo &&info);
 | |
| 	void finishDialogsList();
 | |
| 	void requestSinglePeerDialog();
 | |
| 	mtpRequestId requestSinglePeerMigrated(const Data::DialogInfo &info);
 | |
| 	void appendSinglePeerDialogs(Data::DialogsInfo &&info);
 | |
| 
 | |
| 	void requestLeftChannelsIfNeeded();
 | |
| 	void requestLeftChannelsList(
 | |
| 		Fn<bool(int count)> progress,
 | |
| 		FnMut<void(Data::DialogsInfo&&)> done);
 | |
| 	void requestLeftChannelsSliceGeneric(FnMut<void()> done);
 | |
| 	void requestLeftChannelsSlice();
 | |
| 	void appendLeftChannelsSlice(Data::DialogsInfo &&info);
 | |
| 
 | |
| 	void appendChatsSlice(
 | |
| 		ChatsProcess &process,
 | |
| 		std::vector<Data::DialogInfo> &to,
 | |
| 		std::vector<Data::DialogInfo> &&from,
 | |
| 		int splitIndex);
 | |
| 
 | |
| 	void requestMessagesCount(int localSplitIndex);
 | |
| 	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 loadMessagesFiles(Data::MessagesSlice &&slice);
 | |
| 	void loadNextMessageFile();
 | |
| 	bool loadMessageFileProgress(FileProgress value);
 | |
| 	void loadMessageFileDone(const QString &relativePath);
 | |
| 	bool loadMessageThumbProgress(FileProgress value);
 | |
| 	void loadMessageThumbDone(const QString &relativePath);
 | |
| 	void finishMessagesSlice();
 | |
| 	void finishMessages();
 | |
| 
 | |
| 	[[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);
 | |
| 	void loadFile(
 | |
| 		const Data::File &file,
 | |
| 		const Data::FileOrigin &origin,
 | |
| 		Fn<bool(FileProgress)> progress,
 | |
| 		FnMut<void(QString)> done);
 | |
| 	void loadFilePart();
 | |
| 	void filePartDone(int offset, const MTPupload_File &result);
 | |
| 	void filePartUnavailable();
 | |
| 	void filePartRefreshReference(int offset);
 | |
| 	void filePartExtractReference(
 | |
| 		int 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,
 | |
| 		int offset);
 | |
| 
 | |
| 	void error(const MTP::Error &error);
 | |
| 	void error(const QString &text);
 | |
| 	void ioError(const Output::Result &result);
 | |
| 
 | |
| 	MTP::ConcurrentSender _mtp;
 | |
| 	std::optional<uint64> _takeoutId;
 | |
| 	std::optional<UserId> _selfId;
 | |
| 	Output::Stats *_stats = nullptr;
 | |
| 
 | |
| 	std::unique_ptr<Settings> _settings;
 | |
| 	MTPInputUser _user = MTP_inputUserSelf();
 | |
| 
 | |
| 	std::unique_ptr<StartProcess> _startProcess;
 | |
| 	std::unique_ptr<LoadedFileCache> _fileCache;
 | |
| 	std::unique_ptr<ContactsProcess> _contactsProcess;
 | |
| 	std::unique_ptr<UserpicsProcess> _userpicsProcess;
 | |
| 	std::unique_ptr<OtherDataProcess> _otherDataProcess;
 | |
| 	std::unique_ptr<FileProcess> _fileProcess;
 | |
| 	std::unique_ptr<LeftChannelsProcess> _leftChannelsProcess;
 | |
| 	std::unique_ptr<DialogsProcess> _dialogsProcess;
 | |
| 	std::unique_ptr<ChatProcess> _chatProcess;
 | |
| 	QVector<MTPMessageRange> _splits;
 | |
| 
 | |
| 	rpl::event_stream<MTP::Error> _errors;
 | |
| 	rpl::event_stream<Output::Result> _ioErrors;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Export
 | 
