/* 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 "storage/download_manager_mtproto.h" namespace Data { class PhotoMedia; struct FileOrigin; class MediaPreload { public: explicit MediaPreload(Fn done); virtual ~MediaPreload() = default; protected: void callDone(); private: Fn _done; }; class PhotoPreload final : public MediaPreload { public: [[nodiscard]] static bool Should( not_null photo, not_null context); PhotoPreload( not_null data, FileOrigin origin, Fn done); ~PhotoPreload(); private: void start(FileOrigin origin); std::shared_ptr _photo; rpl::lifetime _lifetime; }; class VideoPreload final : public MediaPreload , private Storage::DownloadMtprotoTask { public: [[nodiscard]] static bool Can(not_null video); VideoPreload( not_null video, FileOrigin origin, Fn done); ~VideoPreload(); private: void check(); void load(); void done(QByteArray result); bool readyToRequest() const override; int64 takeNextRequestOffset() override; bool feedPart(int64 offset, const QByteArray &bytes) override; void cancelOnFail() override; bool setWebFileSizeHook(int64 size) override; const not_null _video; base::flat_map _parts; base::flat_set _requestedOffsets; int64 _full = 0; int _nextRequestOffset = 0; bool _finished = false; bool _failed = false; }; } // namespace Data