// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "td/telegram/BackgroundId.h" #include "td/telegram/BackgroundType.h" #include "td/telegram/files/FileId.h" #include "td/telegram/files/FileSourceId.h" #include "td/telegram/Photo.h" #include "td/telegram/td_api.h" #include "td/telegram/telegram_api.h" #include "td/actor/actor.h" #include "td/actor/PromiseFuture.h" #include "td/utils/common.h" #include "td/utils/Status.h" #include #include #include #include namespace td { class Td; class BackgroundManager final : public Actor { public: BackgroundManager(Td *td, ActorShared<> parent); void memory_cleanup(); void memory_stats(vector &output); void get_backgrounds(Promise &&promise); Result get_background_url(const string &name, td_api::object_ptr background_type) const; void reload_background(BackgroundId background_id, int64 access_hash, Promise &&promise); std::pair search_background(const string &name, Promise &&promise); BackgroundId set_background(const td_api::InputBackground *input_background, const td_api::BackgroundType *background_type, bool for_dark_theme, Promise &&promise); void remove_background(BackgroundId background_id, Promise &&promise); void reset_backgrounds(Promise &&promise); td_api::object_ptr get_background_object(BackgroundId background_id, bool for_dark_theme, const BackgroundType *type = nullptr) const; td_api::object_ptr get_backgrounds_object(bool for_dark_theme) const; BackgroundId on_get_background(BackgroundId expected_background_id, const string &expected_background_name, telegram_api::object_ptr wallpaper_ptr); FileSourceId get_background_file_source_id(BackgroundId background_id, int64 access_hash); void on_uploaded_background_file(FileId file_id, const BackgroundType &type, bool for_dark_theme, telegram_api::object_ptr wallpaper, Promise &&promise); void get_current_state(vector> &updates) const; private: struct Background { BackgroundId id; int64 access_hash = 0; string name; FileId file_id; bool is_creator = false; bool is_default = false; bool is_dark = false; bool has_new_local_id = true; BackgroundType type; FileSourceId file_source_id; template void store(StorerT &storer) const; template void parse(ParserT &parser); }; class BackgroundLogEvent; class BackgroundsLogEvent; class UploadBackgroundFileCallback; void start_up() final; void tear_down() final; void memory_cleanup(bool full); static string get_background_database_key(bool for_dark_theme); static string get_local_backgrounds_database_key(bool for_dark_theme); void save_background_id(bool for_dark_theme); void save_local_backgrounds(bool for_dark_theme); void reload_background_from_server(BackgroundId background_id, const string &background_name, telegram_api::object_ptr &&input_wallpaper, Promise &&promise) const; td_api::object_ptr get_update_selected_background_object(bool for_dark_theme) const; void send_update_selected_background(bool for_dark_theme) const; void set_max_local_background_id(BackgroundId background_id); BackgroundId get_next_local_background_id(); BackgroundId add_local_background(const BackgroundType &type); void add_background(const Background &background); Background *get_background_ref(BackgroundId background_id); const Background *get_background(BackgroundId background_id) const; static string get_background_name_database_key(const string &name); void on_load_background_from_database(string name, string value); void on_get_backgrounds(Result> result); Result prepare_input_file(const tl_object_ptr &input_file); BackgroundId set_background(BackgroundId background_id, BackgroundType type, bool for_dark_theme, Promise &&promise); void on_installed_background(BackgroundId background_id, BackgroundType type, bool for_dark_theme, Result &&result, Promise &&promise); void set_background_id(BackgroundId background_id, const BackgroundType &type, bool for_dark_theme); void on_removed_background(BackgroundId background_id, Result &&result, Promise &&promise); void on_reset_background(Result &&result, Promise &&promise); void upload_background_file(FileId file_id, const BackgroundType &type, bool for_dark_theme, Promise &&promise); void on_upload_background_file(FileId file_id, tl_object_ptr input_file); void on_upload_background_file_error(FileId file_id, Status status); void do_upload_background_file(FileId file_id, const BackgroundType &type, bool for_dark_theme, tl_object_ptr &&input_file, Promise &&promise); std::unordered_map backgrounds_; std::unordered_map, BackgroundIdHash> background_id_to_file_source_id_; // id -> [access_hash, file_source_id] std::unordered_map name_to_background_id_; std::unordered_map file_id_to_background_id_; std::unordered_set loaded_from_database_backgrounds_; std::unordered_map>> being_loaded_from_database_backgrounds_; BackgroundId set_background_id_[2]; BackgroundType set_background_type_[2]; vector installed_background_ids_; vector> pending_get_backgrounds_queries_; std::shared_ptr upload_background_file_callback_; struct UploadedFileInfo { BackgroundType type; bool for_dark_theme; Promise promise; }; std::unordered_map being_uploaded_files_; BackgroundId max_local_background_id_; vector local_background_ids_[2]; Td *td_; ActorShared<> parent_; }; } // namespace td