/* 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/concurrent_sender.h" namespace Export { namespace Data { struct File; struct FileLocation; struct PersonalInfo; struct UserpicsInfo; struct UserpicsSlice; struct ContactsList; struct SessionsList; struct DialogsInfo; struct DialogInfo; struct MessagesSlice; struct Message; } // namespace Data struct Settings; class ApiWrap { public: ApiWrap(Fn)> runner); rpl::producer errors() const; void startExport( const Settings &settings, FnMut done); void requestPersonalInfo(FnMut done); void requestUserpics( FnMut start, Fn slice, FnMut finish); void requestContacts(FnMut done); void requestSessions(FnMut done); void requestDialogs( FnMut start, Fn startOne, Fn sliceOne, Fn finishOne, FnMut finish); ~ApiWrap(); private: struct UserpicsProcess; struct FileProcess; struct DialogsProcess; void startMainSession(FnMut done); void handleUserpicsSlice(const MTPphotos_Photos &result); void loadUserpicsFiles(Data::UserpicsSlice &&slice); void loadNextUserpic(); void loadUserpicDone(const QString &relativePath); void finishUserpics(); void requestDialogsSlice(); void appendDialogsSlice(Data::DialogsInfo &&info); void finishDialogsList(); void fillDialogsPaths(); void requestNextDialog(); void requestMessagesSlice(); void loadMessagesFiles(Data::MessagesSlice &&slice); void loadNextMessageFile(); void loadMessageFileDone(const QString &relativePath); void finishMessages(); void finishDialogs(); bool processFileLoad( Data::File &file, FnMut done, Data::Message *message = nullptr); std::unique_ptr prepareFileProcess( const Data::File &file) const; bool writePreloadedFile(Data::File &file); void loadFile(const Data::File &file, FnMut done); void loadFilePart(); void filePartDone(int offset, const MTPupload_File &result); template [[nodiscard]] auto mainRequest(Request &&request); [[nodiscard]] auto fileRequest( const Data::FileLocation &location, int offset); void error(RPCError &&error); void error(const QString &text); MTP::ConcurrentSender _mtp; base::optional _takeoutId; std::unique_ptr _settings; MTPInputUser _user = MTP_inputUserSelf(); std::unique_ptr _userpicsProcess; std::unique_ptr _fileProcess; std::unique_ptr _dialogsProcess; rpl::event_stream _errors; }; } // namespace Export