data_media_preload.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 "storage/download_manager_mtproto.h"
  9. namespace Data {
  10. class PhotoMedia;
  11. struct FileOrigin;
  12. class MediaPreload {
  13. public:
  14. explicit MediaPreload(Fn<void()> done);
  15. virtual ~MediaPreload() = default;
  16. protected:
  17. void callDone();
  18. private:
  19. Fn<void()> _done;
  20. };
  21. class PhotoPreload final : public MediaPreload {
  22. public:
  23. [[nodiscard]] static bool Should(
  24. not_null<PhotoData*> photo,
  25. not_null<PeerData*> context);
  26. PhotoPreload(
  27. not_null<PhotoData*> data,
  28. FileOrigin origin,
  29. Fn<void()> done);
  30. ~PhotoPreload();
  31. private:
  32. void start(FileOrigin origin);
  33. std::shared_ptr<PhotoMedia> _photo;
  34. rpl::lifetime _lifetime;
  35. };
  36. class VideoPreload final
  37. : public MediaPreload
  38. , private Storage::DownloadMtprotoTask {
  39. public:
  40. [[nodiscard]] static bool Can(not_null<DocumentData*> video);
  41. VideoPreload(
  42. not_null<DocumentData*> video,
  43. FileOrigin origin,
  44. Fn<void()> done);
  45. ~VideoPreload();
  46. private:
  47. void check();
  48. void load();
  49. void done(QByteArray result);
  50. bool readyToRequest() const override;
  51. int64 takeNextRequestOffset() override;
  52. bool feedPart(int64 offset, const QByteArray &bytes) override;
  53. void cancelOnFail() override;
  54. bool setWebFileSizeHook(int64 size) override;
  55. const not_null<DocumentData*> _video;
  56. base::flat_map<uint32, QByteArray> _parts;
  57. base::flat_set<int> _requestedOffsets;
  58. int64 _full = 0;
  59. int _nextRequestOffset = 0;
  60. bool _finished = false;
  61. bool _failed = false;
  62. };
  63. } // namespace Data