// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2026 // // 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/net/MtprotoHeader.h" #include "td/telegram/net/NetQuery.h" #include "td/telegram/net/NetQueryStats.h" #include "td/telegram/td_api.h" #include "td/telegram/TdCallback.h" #include "td/telegram/TdDb.h" #include "td/telegram/telegram_api.h" #include "td/actor/actor.h" #include "td/utils/buffer.h" #include "td/utils/common.h" #include "td/utils/Container.h" #include "td/utils/FlatHashMap.h" #include "td/utils/logging.h" #include "td/utils/Promise.h" #include "td/utils/Slice.h" #include "td/utils/Status.h" #include #include #include namespace td { class AccountManager; class AlarmManager; class AnimationsManager; class AttachMenuManager; class AudiosManager; class AuthManager; class AutosaveManager; class BackgroundManager; class BoostManager; class BotInfoManager; class BotRecommendationManager; class BusinessConnectionManager; class BusinessManager; class CallManager; class CallbackQueriesManager; class ChannelRecommendationManager; class ChatManager; class CommonDialogManager; class CommunityManager; class ConfigManager; class ConnectionStateManager; class CountryInfoManager; class DeviceTokenManager; class DialogActionManager; class DialogFilterManager; class DialogInviteLinkManager; class DialogManager; class DialogParticipantManager; class DocumentsManager; class DownloadManager; class DraftMessageManager; class FileManager; class FileReferenceManager; class ForumTopicManager; class GameManager; class GroupCallManager; class InlineMessageManager; class InlineQueriesManager; class HashtagHints; class LanguagePackManager; class LinkManager; class MessageImportManager; class MessageQueryManager; class MessagesManager; class NetStatsManager; class NotificationManager; class NotificationSettingsManager; class OnlineManager; class OptionManager; class PasswordManager; class PeopleNearbyManager; class PhoneNumberManager; class PollManager; class PrivacyManager; class PromoDataManager; class ProxyChecker; class QuickReplyManager; class ReactionManager; class ReferralProgramManager; class Requests; class SavedMessagesManager; class SecureManager; class SecretChatsManager; class SponsoredMessageManager; class StarGiftManager; class StarManager; class StateManager; class StatisticsManager; class StickersManager; class StorageManager; class StoryManager; class SuggestedActionManager; class TermsOfServiceManager; class ThemeManager; class TimeZoneManager; class TopDialogManager; class TranscriptionManager; class TranslationManager; class UpdatesManager; class UserManager; class VideoNotesManager; class VideosManager; class VoiceNotesManager; class WebAppManager; class WebBrowserManager; class WebPagesManager; extern int VERBOSITY_NAME(td_init); extern int VERBOSITY_NAME(td_requests); // Td may start closing after explicit "close" or "destroy" query. // Or it may start closing by itself, because authorization is lost. // It any case the parent will be notified via updateAuthorizationState. // // Td needs a way to know that it will receive no more queries. // It happens after "hangup". // // Parent needs a way to know that it will receive no more updates. // It happens after destruction of callback class Td final : public Actor { public: Td(const Td &) = delete; Td(Td &&) = delete; Td &operator=(const Td &) = delete; Td &operator=(Td &&) = delete; ~Td() final; struct Options { std::shared_ptr net_query_stats; }; Td(unique_ptr callback, Options options); void request(uint64 id, tl_object_ptr function); void destroy(); void on_update(telegram_api::object_ptr updates, uint64 auth_key_id); void on_result(NetQueryPtr query); bool can_ignore_background_updates() const { return can_ignore_background_updates_; } bool ignore_background_updates() const; unique_ptr audios_manager_; unique_ptr callback_queries_manager_; unique_ptr documents_manager_; unique_ptr option_manager_; unique_ptr videos_manager_; unique_ptr account_manager_; ActorOwn account_manager_actor_; unique_ptr animations_manager_; ActorOwn animations_manager_actor_; unique_ptr attach_menu_manager_; ActorOwn attach_menu_manager_actor_; unique_ptr auth_manager_; ActorOwn auth_manager_actor_; unique_ptr autosave_manager_; ActorOwn autosave_manager_actor_; unique_ptr background_manager_; ActorOwn background_manager_actor_; unique_ptr boost_manager_; ActorOwn boost_manager_actor_; unique_ptr bot_info_manager_; ActorOwn bot_info_manager_actor_; unique_ptr bot_recommendation_manager_; ActorOwn bot_recommendation_manager_actor_; unique_ptr business_connection_manager_; ActorOwn business_connection_manager_actor_; unique_ptr business_manager_; ActorOwn business_manager_actor_; unique_ptr call_manager_; ActorOwn call_manager_actor_; unique_ptr channel_recommendation_manager_; ActorOwn channel_recommendation_manager_actor_; unique_ptr chat_manager_; ActorOwn chat_manager_actor_; unique_ptr common_dialog_manager_; ActorOwn common_dialog_manager_actor_; unique_ptr community_manager_; ActorOwn community_manager_actor_; unique_ptr connection_state_manager_; ActorOwn connection_state_manager_actor_; unique_ptr country_info_manager_; ActorOwn country_info_manager_actor_; unique_ptr dialog_action_manager_; ActorOwn dialog_action_manager_actor_; unique_ptr dialog_filter_manager_; ActorOwn dialog_filter_manager_actor_; unique_ptr dialog_invite_link_manager_; ActorOwn dialog_invite_link_manager_actor_; unique_ptr dialog_manager_; ActorOwn dialog_manager_actor_; unique_ptr dialog_participant_manager_; ActorOwn dialog_participant_manager_actor_; unique_ptr draft_message_manager_; ActorOwn draft_message_manager_actor_; unique_ptr download_manager_; ActorOwn download_manager_actor_; unique_ptr file_manager_; ActorOwn file_manager_actor_; unique_ptr file_reference_manager_; ActorOwn file_reference_manager_actor_; unique_ptr forum_topic_manager_; ActorOwn forum_topic_manager_actor_; unique_ptr game_manager_; ActorOwn game_manager_actor_; unique_ptr group_call_manager_; ActorOwn group_call_manager_actor_; unique_ptr inline_message_manager_; ActorOwn inline_message_manager_actor_; unique_ptr inline_queries_manager_; ActorOwn inline_queries_manager_actor_; unique_ptr link_manager_; ActorOwn link_manager_actor_; unique_ptr message_import_manager_; ActorOwn message_import_manager_actor_; unique_ptr message_query_manager_; ActorOwn message_query_manager_actor_; unique_ptr messages_manager_; ActorOwn messages_manager_actor_; unique_ptr notification_manager_; ActorOwn notification_manager_actor_; unique_ptr notification_settings_manager_; ActorOwn notification_settings_manager_actor_; unique_ptr online_manager_; ActorOwn online_manager_actor_; unique_ptr people_nearby_manager_; ActorOwn people_nearby_manager_actor_; unique_ptr phone_number_manager_; ActorOwn phone_number_manager_actor_; unique_ptr poll_manager_; ActorOwn poll_manager_actor_; unique_ptr privacy_manager_; ActorOwn privacy_manager_actor_; unique_ptr promo_data_manager_; ActorOwn promo_data_manager_actor_; unique_ptr quick_reply_manager_; ActorOwn quick_reply_manager_actor_; unique_ptr reaction_manager_; ActorOwn reaction_manager_actor_; unique_ptr referral_program_manager_; ActorOwn referral_program_manager_actor_; unique_ptr saved_messages_manager_; ActorOwn saved_messages_manager_actor_; unique_ptr sponsored_message_manager_; ActorOwn sponsored_message_manager_actor_; unique_ptr star_gift_manager_; ActorOwn star_gift_manager_actor_; unique_ptr star_manager_; ActorOwn star_manager_actor_; unique_ptr statistics_manager_; ActorOwn statistics_manager_actor_; unique_ptr stickers_manager_; ActorOwn stickers_manager_actor_; unique_ptr story_manager_; ActorOwn story_manager_actor_; unique_ptr suggested_action_manager_; ActorOwn suggested_action_manager_actor_; unique_ptr terms_of_service_manager_; ActorOwn terms_of_service_manager_actor_; unique_ptr theme_manager_; ActorOwn theme_manager_actor_; unique_ptr time_zone_manager_; ActorOwn time_zone_manager_actor_; unique_ptr top_dialog_manager_; ActorOwn top_dialog_manager_actor_; unique_ptr transcription_manager_; ActorOwn transcription_manager_actor_; unique_ptr translation_manager_; ActorOwn translation_manager_actor_; unique_ptr updates_manager_; ActorOwn updates_manager_actor_; unique_ptr user_manager_; ActorOwn user_manager_actor_; unique_ptr video_notes_manager_; ActorOwn video_notes_manager_actor_; unique_ptr voice_notes_manager_; ActorOwn voice_notes_manager_actor_; unique_ptr web_app_manager_; ActorOwn web_app_manager_actor_; unique_ptr web_browser_manager_; ActorOwn web_browser_manager_actor_; unique_ptr web_pages_manager_; ActorOwn web_pages_manager_actor_; ActorOwn alarm_manager_; ActorOwn cashtag_search_hints_; ActorOwn config_manager_; ActorOwn device_token_manager_; ActorOwn hashtag_hints_; ActorOwn hashtag_search_hints_; ActorOwn language_pack_manager_; ActorOwn net_stats_manager_; ActorOwn password_manager_; ActorOwn proxy_checker_; ActorOwn secret_chats_manager_; ActorOwn secure_manager_; ActorOwn state_manager_; ActorOwn storage_manager_; class ResultHandler : public std::enable_shared_from_this { public: ResultHandler() = default; ResultHandler(const ResultHandler &) = delete; ResultHandler &operator=(const ResultHandler &) = delete; virtual ~ResultHandler() = default; virtual void on_result(BufferSlice packet) { UNREACHABLE(); } virtual void on_error(Status status) { UNREACHABLE(); } friend class Td; protected: void send_query(NetQueryPtr query); Td *td_ = nullptr; bool is_query_sent_ = false; private: void set_td(Td *td); }; template std::shared_ptr create_handler(Args &&...args) { LOG_CHECK(close_flag_ < 2) << close_flag_ #if TD_CLANG || TD_GCC << ' ' << __PRETTY_FUNCTION__ #endif ; auto ptr = std::make_shared(std::forward(args)...); ptr->set_td(this); return ptr; } void send_update(tl_object_ptr &&object); static td_api::object_ptr static_request(td_api::object_ptr function); private: void run_request(uint64 id, td_api::object_ptr function); void send_result(uint64 id, tl_object_ptr object); void send_error(uint64 id, Status error); void send_error_impl(uint64 id, tl_object_ptr error); ActorShared create_reference(); void inc_actor_refcnt(); void dec_actor_refcnt(); void inc_request_actor_refcnt(); void dec_request_actor_refcnt(); void close(); void on_closed(); void dec_stop_cnt(); unique_ptr callback_; Options td_options_; MtprotoHeader::Options options_; unique_ptr requests_; std::unordered_multimap request_set_; int actor_refcnt_ = 0; int request_actor_refcnt_ = 0; int stop_cnt_ = 2; bool destroy_flag_ = false; int close_flag_ = 0; enum class State : int32 { WaitParameters, Run, Close } state_ = State::WaitParameters; uint64 set_parameters_request_id_ = 0; FlatHashMap> result_handlers_; enum : int8 { RequestActorIdType = 1, ActorIdType = 2 }; Container> request_actors_; bool can_ignore_background_updates_ = false; vector>> pending_preauthentication_requests_; vector>> pending_set_parameters_requests_; vector>> pending_init_requests_; template void complete_pending_preauthentication_requests(const T &func); td_api::object_ptr get_fake_authorization_state_object() const; vector> get_fake_current_state() const; template friend class RequestActor; // uses send_result/send_error friend class AuthManager; // uses send_result/send_error, TODO pass Promise<> friend class Requests; void add_handler(uint64 id, std::shared_ptr handler); std::shared_ptr extract_handler(uint64 id); void clear_requests(); std::shared_ptr old_context_; static bool is_authentication_request(int32 id); static bool is_preinitialization_request(int32 id); static bool is_preauthentication_request(int32 id); struct Parameters { int32 api_id_ = 0; string api_hash_; bool use_secret_chats_ = false; }; void finish_set_parameters(); void init(Parameters parameters, Result r_opened_database); void init_options_and_network(); void init_file_manager(); void init_non_actor_managers(); void init_managers(); void init_pure_actor_managers(const Parameters ¶meters); void process_binlog_events(TdDb::OpenedDatabase &&events); void clear(); void close_impl(bool destroy_flag); Result> get_parameters( td_api::object_ptr parameters) TD_WARN_UNUSED_RESULT; static td_api::object_ptr make_error(int32 code, CSlice error) { return td_api::make_object(code, error.str()); } // Actor void start_up() final; void tear_down() final; void hangup_shared() final; void hangup() final; }; } // namespace td