/* 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 "data/data_abstract_sparse_ids.h" #include "history/history_item.h" class PeerData; namespace Data { class Session; struct FileOrigin; class SavedMusic final { public: explicit SavedMusic(not_null owner); ~SavedMusic(); [[nodiscard]] static bool Supported(PeerId peerId); [[nodiscard]] bool countKnown(PeerId peerId) const; [[nodiscard]] int count(PeerId peerId) const; [[nodiscard]] const std::vector> &list( PeerId peerId) const; void loadMore(PeerId peerId); [[nodiscard]] rpl::producer changed() const; void loadIds(); [[nodiscard]] bool has(not_null document) const; void save(not_null document, FileOrigin origin); void remove(not_null document); void reorder(int oldPosition, int newPosition); void apply(not_null user, const MTPDocument *last); void clear(); private: using OwnedItem = std::unique_ptr; struct Entry { base::flat_map> musicIdFromMsgId; base::flat_map, OwnedItem> musicIdToMsg; std::vector> list; History *history = nullptr; mtpRequestId requestId = 0; int total = -1; bool loaded = false; bool reloading = false; }; void loadMore(PeerId peerId, bool reload); [[nodiscard]] Entry *lookupEntry(PeerId peerId); [[nodiscard]] const Entry *lookupEntry(PeerId peerId) const; [[nodiscard]] uint64 firstPageHash(const Entry &entry) const; [[nodiscard]] not_null musicIdToMsg( PeerId peerId, Entry &entry, not_null id); const not_null _owner; std::vector _myIds; crl::time _lastReceived = 0; mtpRequestId _loadIdsRequest = 0; std::unordered_map _entries; rpl::event_stream _changed; }; using SavedMusicSlice = AbstractSparseIds< std::vector>>; [[nodiscard]] rpl::producer SavedMusicList( not_null peer, HistoryItem *aroundId, int limit); } // namespace Data