2018-12-31 20:04:05 +01:00
|
|
|
//
|
2022-01-01 01:35:39 +01:00
|
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
|
2018-12-31 20:04:05 +01:00
|
|
|
//
|
|
|
|
// 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/DhConfig.h"
|
2018-06-25 23:10:53 +02:00
|
|
|
#include "td/telegram/net/DcId.h"
|
2018-12-31 20:04:05 +01:00
|
|
|
#include "td/telegram/net/NetQueryCreator.h"
|
|
|
|
#include "td/telegram/TdParameters.h"
|
|
|
|
|
2021-09-18 23:47:05 +02:00
|
|
|
#include "td/net/NetStats.h"
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
#include "td/actor/actor.h"
|
|
|
|
#include "td/actor/PromiseFuture.h"
|
|
|
|
#include "td/actor/SchedulerLocalStorage.h"
|
|
|
|
|
|
|
|
#include "td/utils/common.h"
|
2022-02-07 22:04:34 +01:00
|
|
|
#include "td/utils/FlatHashMap.h"
|
2019-04-08 00:09:54 +02:00
|
|
|
#include "td/utils/logging.h"
|
2018-12-31 20:04:05 +01:00
|
|
|
#include "td/utils/Slice.h"
|
|
|
|
#include "td/utils/Status.h"
|
|
|
|
#include "td/utils/Time.h"
|
|
|
|
|
|
|
|
#include <atomic>
|
|
|
|
#include <memory>
|
|
|
|
#include <mutex>
|
|
|
|
|
|
|
|
namespace td {
|
2022-03-11 22:50:04 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
class AnimationsManager;
|
2019-05-07 04:51:56 +02:00
|
|
|
class BackgroundManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class CallManager;
|
|
|
|
class ConfigManager;
|
2018-10-28 18:30:47 +01:00
|
|
|
class ConfigShared;
|
2018-12-31 20:04:05 +01:00
|
|
|
class ConnectionCreator;
|
|
|
|
class ContactsManager;
|
2022-03-03 16:58:51 +01:00
|
|
|
class DownloadManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class FileManager;
|
2019-01-03 16:26:44 +01:00
|
|
|
class FileReferenceManager;
|
2021-09-07 09:02:44 +02:00
|
|
|
class GameManager;
|
2020-11-25 15:04:32 +01:00
|
|
|
class GroupCallManager;
|
2018-07-17 04:58:34 +02:00
|
|
|
class LanguagePackManager;
|
2021-05-25 01:39:29 +02:00
|
|
|
class LinkManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class MessagesManager;
|
2018-10-28 18:30:47 +01:00
|
|
|
class MtprotoHeader;
|
2018-12-31 20:04:05 +01:00
|
|
|
class NetQueryDispatcher;
|
2018-11-11 13:58:52 +01:00
|
|
|
class NotificationManager;
|
2022-04-14 13:31:18 +02:00
|
|
|
class NotificationSettingsManager;
|
2021-12-15 23:45:43 +01:00
|
|
|
class OptionManager;
|
2018-03-27 15:11:15 +02:00
|
|
|
class PasswordManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class SecretChatsManager;
|
2021-09-07 14:49:34 +02:00
|
|
|
class SponsoredMessageManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class StateManager;
|
|
|
|
class StickersManager;
|
|
|
|
class StorageManager;
|
2020-10-25 02:20:24 +01:00
|
|
|
class MemoryManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class Td;
|
2019-01-06 20:59:17 +01:00
|
|
|
class TdDb;
|
2018-12-31 20:04:05 +01:00
|
|
|
class TempAuthKeyWatchdog;
|
2021-08-27 14:51:50 +02:00
|
|
|
class ThemeManager;
|
2018-12-31 20:04:05 +01:00
|
|
|
class TopDialogManager;
|
|
|
|
class UpdatesManager;
|
|
|
|
class WebPagesManager;
|
2018-06-26 01:43:11 +02:00
|
|
|
|
2021-07-04 04:58:54 +02:00
|
|
|
class Global final : public ActorContext {
|
2018-12-31 20:04:05 +01:00
|
|
|
public:
|
|
|
|
Global();
|
2021-07-03 22:51:36 +02:00
|
|
|
~Global() final;
|
2018-12-31 20:04:05 +01:00
|
|
|
Global(const Global &) = delete;
|
|
|
|
Global &operator=(const Global &) = delete;
|
|
|
|
Global(Global &&other) = delete;
|
|
|
|
Global &operator=(Global &&other) = delete;
|
|
|
|
|
2019-08-01 21:12:04 +02:00
|
|
|
static constexpr int32 ID = -572104940;
|
2021-07-03 22:51:36 +02:00
|
|
|
int32 get_id() const final {
|
2019-08-01 21:12:04 +02:00
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
2019-04-08 00:09:54 +02:00
|
|
|
#define td_db() get_td_db_impl(__FILE__, __LINE__)
|
|
|
|
TdDb *get_td_db_impl(const char *file, int line) {
|
|
|
|
LOG_CHECK(td_db_) << close_flag() << " " << file << " " << line;
|
2018-12-31 20:04:05 +01:00
|
|
|
return td_db_.get();
|
|
|
|
}
|
2019-09-08 02:10:09 +02:00
|
|
|
|
2022-05-02 19:59:07 +02:00
|
|
|
void log_out(Slice reason);
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void close_all(Promise<> on_finished);
|
|
|
|
void close_and_destroy_all(Promise<> on_finished);
|
|
|
|
|
2019-04-08 00:09:54 +02:00
|
|
|
Status init(const TdParameters ¶meters, ActorId<Td> td, unique_ptr<TdDb> td_db_ptr) TD_WARN_UNUSED_RESULT;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2022-01-21 14:52:49 +01:00
|
|
|
static bool get_use_custom_database(const std::string &database_directory) {
|
|
|
|
auto s = get_database_directory_opts(database_directory);
|
|
|
|
size_t qmarkpos;
|
|
|
|
std::string token;
|
|
|
|
size_t find_start_index = 0;
|
|
|
|
while ((qmarkpos = s.find_first_of('&'), find_start_index) != std::string::npos) {
|
|
|
|
token = s.substr(find_start_index, qmarkpos - find_start_index);
|
|
|
|
find_start_index = qmarkpos;
|
|
|
|
if ((qmarkpos = token.find_first_of('=')) != std::string::npos) {
|
|
|
|
std::string propkey = token.substr(0, qmarkpos), propval = token.substr(qmarkpos + 1);
|
|
|
|
if (propkey == "use_custom_database_format" && propval == "true") {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
static std::string get_database_directory_path(const std::string &database_directory) {
|
|
|
|
if (database_directory.empty()) {
|
|
|
|
return database_directory;
|
|
|
|
}
|
|
|
|
size_t qmarkpos;
|
|
|
|
if ((qmarkpos = database_directory.find_first_of('?')) != std::string::npos) {
|
|
|
|
std::string path = database_directory.substr(0, qmarkpos),
|
|
|
|
opts = database_directory.substr(qmarkpos + 1);
|
|
|
|
return path;
|
|
|
|
} else {
|
|
|
|
return database_directory;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static std::string get_database_directory_opts(const std::string &database_directory) {
|
|
|
|
if (database_directory.empty()) {
|
|
|
|
return database_directory;
|
|
|
|
}
|
|
|
|
size_t qmarkpos;
|
|
|
|
if ((qmarkpos = database_directory.find_first_of('?')) != std::string::npos) {
|
|
|
|
std::string path = database_directory.substr(0, qmarkpos),
|
|
|
|
opts = database_directory.substr(qmarkpos + 1);
|
|
|
|
return opts;
|
|
|
|
} else {
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool get_use_custom_database() const {
|
|
|
|
return parameters_.use_custom_db_format;
|
|
|
|
};
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
Slice get_dir() const {
|
|
|
|
return parameters_.database_directory;
|
|
|
|
}
|
2019-07-24 14:07:55 +02:00
|
|
|
Slice get_secure_files_dir() const {
|
|
|
|
if (store_all_files_in_files_directory_) {
|
|
|
|
return get_files_dir();
|
|
|
|
}
|
|
|
|
return get_dir();
|
|
|
|
}
|
2018-12-31 20:04:05 +01:00
|
|
|
Slice get_files_dir() const {
|
|
|
|
return parameters_.files_directory;
|
|
|
|
}
|
|
|
|
bool is_test_dc() const {
|
|
|
|
return parameters_.use_test_dc;
|
|
|
|
}
|
|
|
|
|
2021-02-19 14:37:44 +01:00
|
|
|
bool ignore_background_updates() const;
|
2019-04-21 20:17:11 +02:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
NetQueryCreator &net_query_creator() {
|
2020-07-30 16:28:56 +02:00
|
|
|
return *net_query_creator_.get();
|
2018-12-31 20:04:05 +01:00
|
|
|
}
|
|
|
|
|
2020-07-30 16:28:56 +02:00
|
|
|
void set_net_query_stats(std::shared_ptr<NetQueryStats> net_query_stats);
|
2021-10-06 17:47:32 +02:00
|
|
|
|
2018-09-27 03:19:03 +02:00
|
|
|
void set_net_query_dispatcher(unique_ptr<NetQueryDispatcher> net_query_dispatcher);
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
NetQueryDispatcher &net_query_dispatcher() {
|
2019-01-17 21:12:31 +01:00
|
|
|
CHECK(have_net_query_dispatcher());
|
2018-12-31 20:04:05 +01:00
|
|
|
return *net_query_dispatcher_;
|
|
|
|
}
|
|
|
|
|
2018-05-16 21:35:27 +02:00
|
|
|
bool have_net_query_dispatcher() const {
|
2020-06-13 03:43:07 +02:00
|
|
|
return net_query_dispatcher_.get() != nullptr;
|
2018-05-16 21:35:27 +02:00
|
|
|
}
|
|
|
|
|
2018-09-27 03:19:03 +02:00
|
|
|
void set_shared_config(unique_ptr<ConfigShared> shared_config);
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
ConfigShared &shared_config() {
|
2020-06-13 03:43:07 +02:00
|
|
|
CHECK(shared_config_.get() != nullptr);
|
2018-12-31 20:04:05 +01:00
|
|
|
return *shared_config_;
|
|
|
|
}
|
|
|
|
|
2020-01-07 13:42:04 +01:00
|
|
|
bool is_server_time_reliable() const {
|
|
|
|
return server_time_difference_was_updated_;
|
|
|
|
}
|
2018-12-31 20:04:05 +01:00
|
|
|
double to_server_time(double now) const {
|
|
|
|
return now + get_server_time_difference();
|
|
|
|
}
|
|
|
|
double server_time() const {
|
|
|
|
return to_server_time(Time::now());
|
|
|
|
}
|
|
|
|
double server_time_cached() const {
|
|
|
|
return to_server_time(Time::now_cached());
|
|
|
|
}
|
|
|
|
int32 unix_time() const {
|
2019-12-25 16:35:36 +01:00
|
|
|
return to_unix_time(server_time());
|
2018-12-31 20:04:05 +01:00
|
|
|
}
|
|
|
|
int32 unix_time_cached() const {
|
2019-12-25 16:35:36 +01:00
|
|
|
return to_unix_time(server_time_cached());
|
2018-12-31 20:04:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void update_server_time_difference(double diff);
|
2019-12-25 14:57:18 +01:00
|
|
|
|
|
|
|
void save_server_time();
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
double get_server_time_difference() const {
|
|
|
|
return server_time_difference_.load(std::memory_order_relaxed);
|
|
|
|
}
|
|
|
|
|
2019-07-04 18:21:07 +02:00
|
|
|
void update_dns_time_difference(double diff);
|
|
|
|
|
|
|
|
double get_dns_time_difference() const;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<StateManager> state_manager() const {
|
|
|
|
return state_manager_;
|
|
|
|
}
|
|
|
|
void set_state_manager(ActorId<StateManager> state_manager) {
|
|
|
|
state_manager_ = state_manager;
|
|
|
|
}
|
|
|
|
|
|
|
|
ActorId<Td> td() const {
|
|
|
|
return td_;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<AnimationsManager> animations_manager() const {
|
|
|
|
return animations_manager_;
|
|
|
|
}
|
|
|
|
void set_animations_manager(ActorId<AnimationsManager> animations_manager) {
|
|
|
|
animations_manager_ = animations_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2019-05-07 04:51:56 +02:00
|
|
|
ActorId<BackgroundManager> background_manager() const {
|
|
|
|
return background_manager_;
|
|
|
|
}
|
|
|
|
void set_background_manager(ActorId<BackgroundManager> background_manager) {
|
|
|
|
background_manager_ = background_manager;
|
|
|
|
}
|
|
|
|
|
2018-10-28 18:30:47 +01:00
|
|
|
ActorId<CallManager> call_manager() const {
|
|
|
|
return call_manager_;
|
|
|
|
}
|
|
|
|
void set_call_manager(ActorId<CallManager> call_manager) {
|
|
|
|
call_manager_ = call_manager;
|
|
|
|
}
|
|
|
|
|
|
|
|
ActorId<ConfigManager> config_manager() const {
|
|
|
|
return config_manager_;
|
|
|
|
}
|
|
|
|
void set_config_manager(ActorId<ConfigManager> config_manager) {
|
|
|
|
config_manager_ = config_manager;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<ContactsManager> contacts_manager() const {
|
|
|
|
return contacts_manager_;
|
|
|
|
}
|
|
|
|
void set_contacts_manager(ActorId<ContactsManager> contacts_manager) {
|
|
|
|
contacts_manager_ = contacts_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2022-03-03 16:58:51 +01:00
|
|
|
ActorId<DownloadManager> download_manager() const {
|
|
|
|
return download_manager_;
|
|
|
|
}
|
|
|
|
void set_download_manager(ActorId<DownloadManager> download_manager) {
|
|
|
|
download_manager_ = std::move(download_manager);
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<FileManager> file_manager() const {
|
|
|
|
return file_manager_;
|
|
|
|
}
|
|
|
|
void set_file_manager(ActorId<FileManager> file_manager) {
|
|
|
|
file_manager_ = std::move(file_manager);
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2019-01-03 16:26:44 +01:00
|
|
|
ActorId<FileReferenceManager> file_reference_manager() const {
|
|
|
|
return file_reference_manager_;
|
|
|
|
}
|
|
|
|
void set_file_reference_manager(ActorId<FileReferenceManager> file_reference_manager) {
|
|
|
|
file_reference_manager_ = std::move(file_reference_manager);
|
|
|
|
}
|
|
|
|
|
2021-09-07 09:02:44 +02:00
|
|
|
ActorId<GameManager> game_manager() const {
|
|
|
|
return game_manager_;
|
|
|
|
}
|
|
|
|
void set_game_manager(ActorId<GameManager> game_manager) {
|
|
|
|
game_manager_ = game_manager;
|
|
|
|
}
|
|
|
|
|
2020-11-25 15:04:32 +01:00
|
|
|
ActorId<GroupCallManager> group_call_manager() const {
|
|
|
|
return group_call_manager_;
|
|
|
|
}
|
|
|
|
void set_group_call_manager(ActorId<GroupCallManager> group_call_manager) {
|
|
|
|
group_call_manager_ = group_call_manager;
|
|
|
|
}
|
|
|
|
|
2018-07-17 04:58:34 +02:00
|
|
|
ActorId<LanguagePackManager> language_pack_manager() const {
|
|
|
|
return language_pack_manager_;
|
|
|
|
}
|
|
|
|
void set_language_pack_manager(ActorId<LanguagePackManager> language_pack_manager) {
|
|
|
|
language_pack_manager_ = language_pack_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2021-05-25 01:39:29 +02:00
|
|
|
ActorId<LinkManager> link_manager() const {
|
|
|
|
return link_manager_;
|
|
|
|
}
|
|
|
|
void set_link_manager(ActorId<LinkManager> link_manager) {
|
|
|
|
link_manager_ = link_manager;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<MessagesManager> messages_manager() const {
|
|
|
|
return messages_manager_;
|
|
|
|
}
|
|
|
|
void set_messages_manager(ActorId<MessagesManager> messages_manager) {
|
|
|
|
messages_manager_ = messages_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-11-11 13:58:52 +01:00
|
|
|
ActorId<NotificationManager> notification_manager() const {
|
|
|
|
return notification_manager_;
|
|
|
|
}
|
|
|
|
void set_notification_manager(ActorId<NotificationManager> notification_manager) {
|
|
|
|
notification_manager_ = notification_manager;
|
|
|
|
}
|
|
|
|
|
2022-04-14 13:31:18 +02:00
|
|
|
ActorId<NotificationSettingsManager> notification_settings_manager() const {
|
|
|
|
return notification_settings_manager_;
|
|
|
|
}
|
|
|
|
void set_notification_settings_manager(ActorId<NotificationSettingsManager> notification_settings_manager) {
|
|
|
|
notification_settings_manager_ = notification_settings_manager;
|
|
|
|
}
|
|
|
|
|
2021-12-15 23:45:43 +01:00
|
|
|
ActorId<OptionManager> option_manager() const {
|
|
|
|
return option_manager_;
|
|
|
|
}
|
|
|
|
void set_option_manager(ActorId<OptionManager> option_manager) {
|
|
|
|
option_manager_ = option_manager;
|
|
|
|
}
|
|
|
|
|
2018-03-27 15:11:15 +02:00
|
|
|
ActorId<PasswordManager> password_manager() const {
|
|
|
|
return password_manager_;
|
|
|
|
}
|
|
|
|
void set_password_manager(ActorId<PasswordManager> password_manager) {
|
|
|
|
password_manager_ = password_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<SecretChatsManager> secret_chats_manager() const {
|
|
|
|
return secret_chats_manager_;
|
|
|
|
}
|
|
|
|
void set_secret_chats_manager(ActorId<SecretChatsManager> secret_chats_manager) {
|
|
|
|
secret_chats_manager_ = secret_chats_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2021-09-07 14:49:34 +02:00
|
|
|
ActorId<SponsoredMessageManager> sponsored_message_manager() const {
|
|
|
|
return sponsored_message_manager_;
|
|
|
|
}
|
|
|
|
void set_sponsored_message_manager(ActorId<SponsoredMessageManager> sponsored_message_manager) {
|
|
|
|
sponsored_message_manager_ = sponsored_message_manager;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<StickersManager> stickers_manager() const {
|
|
|
|
return stickers_manager_;
|
|
|
|
}
|
|
|
|
void set_stickers_manager(ActorId<StickersManager> stickers_manager) {
|
|
|
|
stickers_manager_ = stickers_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<StorageManager> storage_manager() const {
|
|
|
|
return storage_manager_;
|
|
|
|
}
|
|
|
|
void set_storage_manager(ActorId<StorageManager> storage_manager) {
|
|
|
|
storage_manager_ = storage_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2020-10-25 02:20:24 +01:00
|
|
|
ActorId<MemoryManager> memory_manager() const {
|
|
|
|
return memory_manager_;
|
|
|
|
}
|
|
|
|
void set_memory_manager(ActorId<MemoryManager> memory_manager) {
|
|
|
|
memory_manager_ = memory_manager;
|
|
|
|
}
|
|
|
|
|
2021-08-27 14:51:50 +02:00
|
|
|
ActorId<ThemeManager> theme_manager() const {
|
|
|
|
return theme_manager_;
|
|
|
|
}
|
|
|
|
void set_theme_manager(ActorId<ThemeManager> theme_manager) {
|
|
|
|
theme_manager_ = theme_manager;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<TopDialogManager> top_dialog_manager() const {
|
|
|
|
return top_dialog_manager_;
|
|
|
|
}
|
|
|
|
void set_top_dialog_manager(ActorId<TopDialogManager> top_dialog_manager) {
|
|
|
|
top_dialog_manager_ = top_dialog_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<UpdatesManager> updates_manager() const {
|
|
|
|
return updates_manager_;
|
|
|
|
}
|
|
|
|
void set_updates_manager(ActorId<UpdatesManager> updates_manager) {
|
|
|
|
updates_manager_ = updates_manager;
|
|
|
|
}
|
2018-10-28 18:30:47 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<WebPagesManager> web_pages_manager() const {
|
|
|
|
return web_pages_manager_;
|
|
|
|
}
|
|
|
|
void set_web_pages_manager(ActorId<WebPagesManager> web_pages_manager) {
|
|
|
|
web_pages_manager_ = web_pages_manager;
|
|
|
|
}
|
|
|
|
|
|
|
|
ActorId<ConnectionCreator> connection_creator() const;
|
|
|
|
void set_connection_creator(ActorOwn<ConnectionCreator> connection_creator);
|
|
|
|
|
|
|
|
ActorId<TempAuthKeyWatchdog> temp_auth_key_watchdog() const;
|
|
|
|
void set_temp_auth_key_watchdog(ActorOwn<TempAuthKeyWatchdog> actor);
|
|
|
|
|
2018-05-08 22:02:15 +02:00
|
|
|
MtprotoHeader &mtproto_header();
|
2018-09-27 03:19:03 +02:00
|
|
|
void set_mtproto_header(unique_ptr<MtprotoHeader> mtproto_header);
|
2018-05-16 21:35:27 +02:00
|
|
|
bool have_mtproto_header() const {
|
|
|
|
return mtproto_header_ != nullptr;
|
|
|
|
}
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
const TdParameters ¶meters() const {
|
|
|
|
return parameters_;
|
|
|
|
}
|
|
|
|
|
2021-09-03 11:27:59 +02:00
|
|
|
int64 get_my_id() const {
|
2018-12-31 20:04:05 +01:00
|
|
|
return my_id_;
|
|
|
|
}
|
2021-09-03 11:27:59 +02:00
|
|
|
void set_my_id(int64 my_id) {
|
2018-12-31 20:04:05 +01:00
|
|
|
my_id_ = my_id;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32 get_gc_scheduler_id() const {
|
|
|
|
return gc_scheduler_id_;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32 get_slow_net_scheduler_id() const {
|
|
|
|
return slow_net_scheduler_id_;
|
|
|
|
}
|
|
|
|
|
2018-06-25 23:10:53 +02:00
|
|
|
DcId get_webfile_dc_id() const;
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::shared_ptr<DhConfig> get_dh_config() {
|
|
|
|
#if !TD_HAVE_ATOMIC_SHARED_PTR
|
|
|
|
std::lock_guard<std::mutex> guard(dh_config_mutex_);
|
|
|
|
auto res = dh_config_;
|
|
|
|
return res;
|
|
|
|
#else
|
|
|
|
return atomic_load(&dh_config_);
|
|
|
|
#endif
|
|
|
|
}
|
2020-01-07 01:55:51 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void set_dh_config(std::shared_ptr<DhConfig> new_dh_config) {
|
|
|
|
#if !TD_HAVE_ATOMIC_SHARED_PTR
|
|
|
|
std::lock_guard<std::mutex> guard(dh_config_mutex_);
|
2021-10-19 17:11:16 +02:00
|
|
|
dh_config_ = std::move(new_dh_config);
|
2018-12-31 20:04:05 +01:00
|
|
|
#else
|
|
|
|
atomic_store(&dh_config_, std::move(new_dh_config));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2021-10-07 15:36:21 +02:00
|
|
|
static Status request_aborted_error() {
|
|
|
|
return Status::Error(500, "Request aborted");
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void set_close_flag() {
|
|
|
|
close_flag_ = true;
|
|
|
|
}
|
|
|
|
bool close_flag() const {
|
|
|
|
return close_flag_.load();
|
|
|
|
}
|
|
|
|
|
2021-10-07 15:36:21 +02:00
|
|
|
Status close_status() const {
|
|
|
|
return close_flag() ? request_aborted_error() : Status::OK();
|
|
|
|
}
|
|
|
|
|
2020-03-30 23:22:52 +02:00
|
|
|
bool is_expected_error(const Status &error) const {
|
|
|
|
CHECK(error.is_error());
|
|
|
|
if (error.code() == 401) {
|
|
|
|
// authorization is lost
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (error.code() == 420 || error.code() == 429) {
|
|
|
|
// flood wait
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return close_flag();
|
|
|
|
}
|
|
|
|
|
2022-04-12 15:12:22 +02:00
|
|
|
static int32 get_retry_after(int32 error_code, Slice error_message);
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
const std::vector<std::shared_ptr<NetStatsCallback>> &get_net_stats_file_callbacks() {
|
|
|
|
return net_stats_file_callbacks_;
|
|
|
|
}
|
|
|
|
void set_net_stats_file_callbacks(std::vector<std::shared_ptr<NetStatsCallback>> callbacks) {
|
|
|
|
net_stats_file_callbacks_ = std::move(callbacks);
|
|
|
|
}
|
|
|
|
|
2018-08-14 01:11:49 +02:00
|
|
|
int64 get_location_access_hash(double latitude, double longitude);
|
|
|
|
|
|
|
|
void add_location_access_hash(double latitude, double longitude, int64 access_hash);
|
|
|
|
|
2019-07-24 14:07:55 +02:00
|
|
|
void set_store_all_files_in_files_directory(bool flag) {
|
|
|
|
store_all_files_in_files_directory_ = flag;
|
|
|
|
}
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
private:
|
|
|
|
std::shared_ptr<DhConfig> dh_config_;
|
|
|
|
|
2018-09-27 03:19:03 +02:00
|
|
|
unique_ptr<TdDb> td_db_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
ActorId<Td> td_;
|
|
|
|
ActorId<AnimationsManager> animations_manager_;
|
2019-05-07 04:51:56 +02:00
|
|
|
ActorId<BackgroundManager> background_manager_;
|
2018-10-28 18:30:47 +01:00
|
|
|
ActorId<CallManager> call_manager_;
|
|
|
|
ActorId<ConfigManager> config_manager_;
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<ContactsManager> contacts_manager_;
|
2022-03-03 16:58:51 +01:00
|
|
|
ActorId<DownloadManager> download_manager_;
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<FileManager> file_manager_;
|
2019-01-03 16:26:44 +01:00
|
|
|
ActorId<FileReferenceManager> file_reference_manager_;
|
2021-09-07 09:02:44 +02:00
|
|
|
ActorId<GameManager> game_manager_;
|
2020-11-25 15:04:32 +01:00
|
|
|
ActorId<GroupCallManager> group_call_manager_;
|
2018-07-17 04:58:34 +02:00
|
|
|
ActorId<LanguagePackManager> language_pack_manager_;
|
2021-05-25 01:39:29 +02:00
|
|
|
ActorId<LinkManager> link_manager_;
|
2018-10-28 18:30:47 +01:00
|
|
|
ActorId<MessagesManager> messages_manager_;
|
2018-11-11 13:58:52 +01:00
|
|
|
ActorId<NotificationManager> notification_manager_;
|
2022-04-14 13:31:18 +02:00
|
|
|
ActorId<NotificationSettingsManager> notification_settings_manager_;
|
2021-12-15 23:45:43 +01:00
|
|
|
ActorId<OptionManager> option_manager_;
|
2018-03-27 15:11:15 +02:00
|
|
|
ActorId<PasswordManager> password_manager_;
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<SecretChatsManager> secret_chats_manager_;
|
2021-09-07 14:49:34 +02:00
|
|
|
ActorId<SponsoredMessageManager> sponsored_message_manager_;
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<StickersManager> stickers_manager_;
|
|
|
|
ActorId<StorageManager> storage_manager_;
|
2020-10-25 02:20:24 +01:00
|
|
|
ActorId<MemoryManager> memory_manager_;
|
2021-08-27 14:51:50 +02:00
|
|
|
ActorId<ThemeManager> theme_manager_;
|
2018-12-31 20:04:05 +01:00
|
|
|
ActorId<TopDialogManager> top_dialog_manager_;
|
|
|
|
ActorId<UpdatesManager> updates_manager_;
|
|
|
|
ActorId<WebPagesManager> web_pages_manager_;
|
|
|
|
ActorOwn<ConnectionCreator> connection_creator_;
|
|
|
|
ActorOwn<TempAuthKeyWatchdog> temp_auth_key_watchdog_;
|
|
|
|
|
2018-09-27 03:19:03 +02:00
|
|
|
unique_ptr<MtprotoHeader> mtproto_header_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
|
|
|
TdParameters parameters_;
|
2021-11-11 15:39:09 +01:00
|
|
|
int32 gc_scheduler_id_ = 0;
|
|
|
|
int32 slow_net_scheduler_id_ = 0;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2019-07-24 14:07:55 +02:00
|
|
|
std::atomic<bool> store_all_files_in_files_directory_{false};
|
2020-01-07 01:55:51 +01:00
|
|
|
|
2019-01-24 04:18:14 +01:00
|
|
|
std::atomic<double> server_time_difference_{0.0};
|
|
|
|
std::atomic<bool> server_time_difference_was_updated_{false};
|
2019-07-04 18:21:07 +02:00
|
|
|
std::atomic<double> dns_time_difference_{0.0};
|
|
|
|
std::atomic<bool> dns_time_difference_was_updated_{false};
|
2018-12-31 20:04:05 +01:00
|
|
|
std::atomic<bool> close_flag_{false};
|
2019-12-25 16:03:08 +01:00
|
|
|
std::atomic<double> system_time_saved_at_{-1e10};
|
2020-02-22 17:31:08 +01:00
|
|
|
double saved_diff_ = 0.0;
|
|
|
|
double saved_system_time_ = 0.0;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2020-01-07 01:55:51 +01:00
|
|
|
#if !TD_HAVE_ATOMIC_SHARED_PTR
|
|
|
|
std::mutex dh_config_mutex_;
|
|
|
|
#endif
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
std::vector<std::shared_ptr<NetStatsCallback>> net_stats_file_callbacks_;
|
|
|
|
|
|
|
|
ActorId<StateManager> state_manager_;
|
|
|
|
|
2020-07-30 21:59:23 +02:00
|
|
|
LazySchedulerLocalStorage<unique_ptr<NetQueryCreator>> net_query_creator_;
|
2018-09-27 03:19:03 +02:00
|
|
|
unique_ptr<NetQueryDispatcher> net_query_dispatcher_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2018-09-27 03:19:03 +02:00
|
|
|
unique_ptr<ConfigShared> shared_config_;
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2021-09-03 11:27:59 +02:00
|
|
|
int64 my_id_ = 0; // hack
|
2018-12-31 20:04:05 +01:00
|
|
|
|
2018-08-14 01:11:49 +02:00
|
|
|
static int64 get_location_key(double latitude, double longitude);
|
|
|
|
|
2022-02-07 20:41:07 +01:00
|
|
|
FlatHashMap<int64, int64> location_access_hashes_;
|
2018-08-14 01:11:49 +02:00
|
|
|
|
2020-02-22 17:31:08 +01:00
|
|
|
int32 to_unix_time(double server_time) const;
|
2019-12-25 16:35:36 +01:00
|
|
|
|
2019-12-25 14:57:18 +01:00
|
|
|
void do_save_server_time_difference();
|
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
void do_close(Promise<> on_finish, bool destroy_flag);
|
|
|
|
};
|
|
|
|
|
2019-09-08 02:10:09 +02:00
|
|
|
#define G() G_impl(__FILE__, __LINE__)
|
|
|
|
|
|
|
|
inline Global *G_impl(const char *file, int line) {
|
2019-08-01 21:12:04 +02:00
|
|
|
ActorContext *context = Scheduler::context();
|
2021-11-09 08:19:04 +01:00
|
|
|
LOG_CHECK(context != nullptr && context->get_id() == Global::ID)
|
|
|
|
<< "Context = " << context << " in " << file << " at " << line;
|
2019-08-01 21:12:04 +02:00
|
|
|
return static_cast<Global *>(context);
|
2018-12-31 20:04:05 +01:00
|
|
|
}
|
2018-06-26 01:43:11 +02:00
|
|
|
|
2020-10-02 12:22:06 +02:00
|
|
|
double get_global_server_time();
|
2020-02-01 05:43:54 +01:00
|
|
|
|
2018-12-31 20:04:05 +01:00
|
|
|
} // namespace td
|