export_api_wrap.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "mtproto/mtproto_concurrent_sender.h"
  9. #include "data/data_peer_id.h"
  10. namespace Export {
  11. namespace Data {
  12. struct File;
  13. struct Chat;
  14. struct Document;
  15. struct FileLocation;
  16. struct PersonalInfo;
  17. struct UserpicsInfo;
  18. struct UserpicsSlice;
  19. struct StoriesInfo;
  20. struct StoriesSlice;
  21. struct ContactsList;
  22. struct SessionsList;
  23. struct DialogsInfo;
  24. struct DialogInfo;
  25. struct MessagesSlice;
  26. struct Message;
  27. struct Story;
  28. struct FileOrigin;
  29. } // namespace Data
  30. namespace Output {
  31. struct Result;
  32. class Stats;
  33. } // namespace Output
  34. struct Settings;
  35. class ApiWrap {
  36. public:
  37. ApiWrap(QPointer<MTP::Instance> weak, Fn<void(FnMut<void()>)> runner);
  38. rpl::producer<MTP::Error> errors() const;
  39. rpl::producer<Output::Result> ioErrors() const;
  40. struct StartInfo {
  41. int userpicsCount = 0;
  42. int storiesCount = 0;
  43. int dialogsCount = 0;
  44. };
  45. void startExport(
  46. const Settings &settings,
  47. Output::Stats *stats,
  48. FnMut<void(StartInfo)> done);
  49. void requestDialogsList(
  50. Fn<bool(int count)> progress,
  51. FnMut<void(Data::DialogsInfo&&)> done);
  52. void requestPersonalInfo(FnMut<void(Data::PersonalInfo&&)> done);
  53. void requestOtherData(
  54. const QString &suggestedPath,
  55. FnMut<void(Data::File&&)> done);
  56. struct DownloadProgress {
  57. uint64 randomId = 0;
  58. QString path;
  59. int itemIndex = 0;
  60. int64 ready = 0;
  61. int64 total = 0;
  62. };
  63. void requestUserpics(
  64. FnMut<bool(Data::UserpicsInfo&&)> start,
  65. Fn<bool(DownloadProgress)> progress,
  66. Fn<bool(Data::UserpicsSlice&&)> slice,
  67. FnMut<void()> finish);
  68. void requestStories(
  69. FnMut<bool(Data::StoriesInfo&&)> start,
  70. Fn<bool(DownloadProgress)> progress,
  71. Fn<bool(Data::StoriesSlice&&)> slice,
  72. FnMut<void()> finish);
  73. void requestContacts(FnMut<void(Data::ContactsList&&)> done);
  74. void requestSessions(FnMut<void(Data::SessionsList&&)> done);
  75. void requestMessages(
  76. const Data::DialogInfo &info,
  77. FnMut<bool(const Data::DialogInfo &)> start,
  78. Fn<bool(DownloadProgress)> progress,
  79. Fn<bool(Data::MessagesSlice&&)> slice,
  80. FnMut<void()> done);
  81. void finishExport(FnMut<void()> done);
  82. void skipFile(uint64 randomId);
  83. void cancelExportFast();
  84. ~ApiWrap();
  85. private:
  86. class LoadedFileCache;
  87. struct StartProcess;
  88. struct ContactsProcess;
  89. struct UserpicsProcess;
  90. struct StoriesProcess;
  91. struct OtherDataProcess;
  92. struct FileProcess;
  93. struct FileProgress;
  94. struct ChatsProcess;
  95. struct LeftChannelsProcess;
  96. struct DialogsProcess;
  97. struct ChatProcess;
  98. void startMainSession(FnMut<void()> done);
  99. void sendNextStartRequest();
  100. void requestUserpicsCount();
  101. void requestStoriesCount();
  102. void requestSplitRanges();
  103. void requestDialogsCount();
  104. void requestLeftChannelsCount();
  105. void finishStartProcess();
  106. void requestTopPeersSlice();
  107. void handleUserpicsSlice(const MTPphotos_Photos &result);
  108. void loadUserpicsFiles(Data::UserpicsSlice &&slice);
  109. void loadNextUserpic();
  110. bool loadUserpicProgress(FileProgress value);
  111. void loadUserpicDone(const QString &relativePath);
  112. void finishUserpicsSlice();
  113. void finishUserpics();
  114. void handleStoriesSlice(const MTPstories_Stories &result);
  115. void loadStoriesFiles(Data::StoriesSlice &&slice);
  116. void loadNextStory();
  117. bool loadStoryProgress(FileProgress value);
  118. void loadStoryDone(const QString &relativePath);
  119. bool loadStoryThumbProgress(FileProgress value);
  120. void loadStoryThumbDone(const QString &relativePath);
  121. void finishStoriesSlice();
  122. void finishStories();
  123. void otherDataDone(const QString &relativePath);
  124. bool useOnlyLastSplit() const;
  125. void requestDialogsSlice();
  126. void appendDialogsSlice(Data::DialogsInfo &&info);
  127. void finishDialogsList();
  128. void requestSinglePeerDialog();
  129. mtpRequestId requestSinglePeerMigrated(const Data::DialogInfo &info);
  130. void appendSinglePeerDialogs(Data::DialogsInfo &&info);
  131. void requestLeftChannelsIfNeeded();
  132. void requestLeftChannelsList(
  133. Fn<bool(int count)> progress,
  134. FnMut<void(Data::DialogsInfo&&)> done);
  135. void requestLeftChannelsSliceGeneric(FnMut<void()> done);
  136. void requestLeftChannelsSlice();
  137. void appendLeftChannelsSlice(Data::DialogsInfo &&info);
  138. void appendChatsSlice(
  139. ChatsProcess &process,
  140. std::vector<Data::DialogInfo> &to,
  141. std::vector<Data::DialogInfo> &&from,
  142. int splitIndex);
  143. void requestMessagesCount(int localSplitIndex);
  144. void checkFirstMessageDate(int localSplitIndex, int count);
  145. void messagesCountLoaded(int localSplitIndex, int count);
  146. void requestMessagesSlice();
  147. void requestChatMessages(
  148. int splitIndex,
  149. int offsetId,
  150. int addOffset,
  151. int limit,
  152. FnMut<void(MTPmessages_Messages&&)> done);
  153. void collectMessagesCustomEmoji(const Data::MessagesSlice &slice);
  154. void resolveCustomEmoji();
  155. void loadMessagesFiles(Data::MessagesSlice &&slice);
  156. void loadNextMessageFile();
  157. [[nodiscard]] std::optional<QByteArray> getCustomEmoji(QByteArray &data);
  158. bool messageCustomEmojiReady(Data::Message &message);
  159. bool loadMessageFileProgress(FileProgress value);
  160. void loadMessageFileDone(const QString &relativePath);
  161. bool loadMessageThumbProgress(FileProgress value);
  162. void loadMessageThumbDone(const QString &relativePath);
  163. bool loadMessageEmojiProgress(FileProgress progress);
  164. void loadMessageEmojiDone(uint64 id, const QString &relativePath);
  165. void finishMessagesSlice();
  166. void finishMessages();
  167. [[nodiscard]] Data::Message *currentFileMessage() const;
  168. [[nodiscard]] Data::FileOrigin currentFileMessageOrigin() const;
  169. bool processFileLoad(
  170. Data::File &file,
  171. const Data::FileOrigin &origin,
  172. Fn<bool(FileProgress)> progress,
  173. FnMut<void(QString)> done,
  174. Data::Message *message = nullptr,
  175. Data::Story *story = nullptr);
  176. std::unique_ptr<FileProcess> prepareFileProcess(
  177. const Data::File &file,
  178. const Data::FileOrigin &origin) const;
  179. bool writePreloadedFile(
  180. Data::File &file,
  181. const Data::FileOrigin &origin);
  182. void loadFile(
  183. const Data::File &file,
  184. const Data::FileOrigin &origin,
  185. Fn<bool(FileProgress)> progress,
  186. FnMut<void(QString)> done);
  187. void loadFilePart();
  188. void filePartDone(int64 offset, const MTPupload_File &result);
  189. void filePartUnavailable();
  190. void filePartRefreshReference(int64 offset);
  191. void filePartExtractReference(
  192. int64 offset,
  193. const MTPmessages_Messages &result);
  194. void filePartExtractReference(
  195. int64 offset,
  196. const MTPstories_Stories &result);
  197. template <typename Request>
  198. class RequestBuilder;
  199. template <typename Request>
  200. [[nodiscard]] auto mainRequest(Request &&request);
  201. template <typename Request>
  202. [[nodiscard]] auto splitRequest(int index, Request &&request);
  203. [[nodiscard]] auto fileRequest(
  204. const Data::FileLocation &location,
  205. int64 offset);
  206. void error(const MTP::Error &error);
  207. void error(const QString &text);
  208. void ioError(const Output::Result &result);
  209. MTP::ConcurrentSender _mtp;
  210. std::optional<uint64> _takeoutId;
  211. std::optional<UserId> _selfId;
  212. Output::Stats *_stats = nullptr;
  213. std::unique_ptr<Settings> _settings;
  214. MTPInputUser _user = MTP_inputUserSelf();
  215. std::unique_ptr<StartProcess> _startProcess;
  216. std::unique_ptr<LoadedFileCache> _fileCache;
  217. std::unique_ptr<ContactsProcess> _contactsProcess;
  218. std::unique_ptr<UserpicsProcess> _userpicsProcess;
  219. std::unique_ptr<StoriesProcess> _storiesProcess;
  220. std::unique_ptr<OtherDataProcess> _otherDataProcess;
  221. std::unique_ptr<FileProcess> _fileProcess;
  222. std::unique_ptr<LeftChannelsProcess> _leftChannelsProcess;
  223. std::unique_ptr<DialogsProcess> _dialogsProcess;
  224. std::unique_ptr<ChatProcess> _chatProcess;
  225. base::flat_set<uint64> _unresolvedCustomEmoji;
  226. base::flat_map<uint64, Data::Document> _resolvedCustomEmoji;
  227. QVector<MTPMessageRange> _splits;
  228. rpl::event_stream<MTP::Error> _errors;
  229. rpl::event_stream<Output::Result> _ioErrors;
  230. };
  231. } // namespace Export