Move help_getAppConfig receiving to ConfigManager.

GitOrigin-RevId: 310743ea038dffebd59c9b612438bc7cfc7553a4
This commit is contained in:
levlam 2019-12-19 04:23:14 +03:00
parent 71fb1d87e0
commit ddd8e6fa0f
3 changed files with 44 additions and 32 deletions

View File

@ -8,6 +8,7 @@
#include "td/telegram/ConfigShared.h" #include "td/telegram/ConfigShared.h"
#include "td/telegram/Global.h" #include "td/telegram/Global.h"
#include "td/telegram/JsonValue.h"
#include "td/telegram/logevent/LogEvent.h" #include "td/telegram/logevent/LogEvent.h"
#include "td/telegram/net/AuthDataShared.h" #include "td/telegram/net/AuthDataShared.h"
#include "td/telegram/net/ConnectionCreator.h" #include "td/telegram/net/ConnectionCreator.h"
@ -867,12 +868,10 @@ ConfigManager::ConfigManager(ActorShared<> parent) : parent_(std::move(parent))
} }
void ConfigManager::start_up() { void ConfigManager::start_up() {
// TODO there are some problems when many ConfigRecoverers starts at the same time
// if (G()->parameters().use_file_db) {
ref_cnt_++; ref_cnt_++;
config_recoverer_ = create_actor<ConfigRecoverer>("Recoverer", actor_shared()); config_recoverer_ = create_actor<ConfigRecoverer>("Recoverer", actor_shared());
send_closure(config_recoverer_, &ConfigRecoverer::on_dc_options_update, load_dc_options_update()); send_closure(config_recoverer_, &ConfigRecoverer::on_dc_options_update, load_dc_options_update());
// }
auto expire_time = load_config_expire_time(); auto expire_time = load_config_expire_time();
if (expire_time.is_in_past()) { if (expire_time.is_in_past()) {
request_config(); request_config();
@ -886,22 +885,26 @@ void ConfigManager::hangup_shared() {
ref_cnt_--; ref_cnt_--;
try_stop(); try_stop();
} }
void ConfigManager::hangup() { void ConfigManager::hangup() {
ref_cnt_--; ref_cnt_--;
config_recoverer_.reset(); config_recoverer_.reset();
try_stop(); try_stop();
} }
void ConfigManager::loop() { void ConfigManager::loop() {
if (expire_time_ && expire_time_.is_in_past()) { if (expire_time_ && expire_time_.is_in_past()) {
request_config(); request_config();
expire_time_ = {}; expire_time_ = {};
} }
} }
void ConfigManager::try_stop() { void ConfigManager::try_stop() {
if (ref_cnt_ == 0) { if (ref_cnt_ == 0) {
stop(); stop();
} }
} }
void ConfigManager::request_config() { void ConfigManager::request_config() {
if (config_sent_cnt_ != 0) { if (config_sent_cnt_ != 0) {
return; return;
@ -909,6 +912,17 @@ void ConfigManager::request_config() {
request_config_from_dc_impl(DcId::main()); request_config_from_dc_impl(DcId::main());
} }
void ConfigManager::get_app_config(Promise<td_api::object_ptr<td_api::JsonValue>> &&promise) {
get_app_config_queries_.push_back(std::move(promise));
if (get_app_config_queries_.size() == 1) {
G()->net_query_dispatcher().dispatch_with_callback(
G()->net_query_creator().create(create_storer(telegram_api::help_getAppConfig()), DcId::main(),
NetQuery::Type::Common, NetQuery::AuthFlag::Off, NetQuery::GzipFlag::On,
60 * 60 * 24),
actor_shared(this, 1));
}
}
void ConfigManager::on_dc_options_update(DcOptions dc_options) { void ConfigManager::on_dc_options_update(DcOptions dc_options) {
save_dc_options_update(dc_options); save_dc_options_update(dc_options);
send_closure(config_recoverer_, &ConfigRecoverer::on_dc_options_update, std::move(dc_options)); send_closure(config_recoverer_, &ConfigRecoverer::on_dc_options_update, std::move(dc_options));
@ -925,10 +939,30 @@ void ConfigManager::request_config_from_dc_impl(DcId dc_id) {
G()->net_query_dispatcher().dispatch_with_callback( G()->net_query_dispatcher().dispatch_with_callback(
G()->net_query_creator().create(create_storer(telegram_api::help_getConfig()), dc_id, NetQuery::Type::Common, G()->net_query_creator().create(create_storer(telegram_api::help_getConfig()), dc_id, NetQuery::Type::Common,
NetQuery::AuthFlag::Off, NetQuery::GzipFlag::On, 60 * 60 * 24), NetQuery::AuthFlag::Off, NetQuery::GzipFlag::On, 60 * 60 * 24),
actor_shared(this)); actor_shared(this, 0));
} }
void ConfigManager::on_result(NetQueryPtr res) { void ConfigManager::on_result(NetQueryPtr res) {
auto token = get_link_token();
if (token == 1) {
auto promises = std::move(get_app_config_queries_);
get_app_config_queries_.clear();
CHECK(!promises.empty());
auto result_ptr = fetch_result<telegram_api::help_getAppConfig>(std::move(res));
if (result_ptr.is_error()) {
for (auto &promise : promises) {
promise.set_error(result_ptr.error().clone());
}
}
auto result = result_ptr.move_as_ok();
for (auto &promise : promises) {
promise.set_value(convert_json_value_object(result));
}
return;
}
CHECK(token == 0);
CHECK(config_sent_cnt_ > 0); CHECK(config_sent_cnt_ > 0);
config_sent_cnt_--; config_sent_cnt_--;
auto r_config = fetch_result<telegram_api::help_getConfig>(std::move(res)); auto r_config = fetch_result<telegram_api::help_getConfig>(std::move(res));

View File

@ -10,6 +10,7 @@
#include "td/telegram/net/DcOptions.h" #include "td/telegram/net/DcOptions.h"
#include "td/telegram/net/NetQuery.h" #include "td/telegram/net/NetQuery.h"
#include "td/telegram/td_api.h"
#include "td/telegram/telegram_api.h" #include "td/telegram/telegram_api.h"
#include "td/actor/actor.h" #include "td/actor/actor.h"
@ -82,6 +83,8 @@ class ConfigManager : public NetQueryCallback {
void request_config(); void request_config();
void get_app_config(Promise<td_api::object_ptr<td_api::JsonValue>> &&promise);
void on_dc_options_update(DcOptions dc_options); void on_dc_options_update(DcOptions dc_options);
private: private:
@ -91,6 +94,8 @@ class ConfigManager : public NetQueryCallback {
int ref_cnt_{1}; int ref_cnt_{1};
Timestamp expire_time_; Timestamp expire_time_;
vector<Promise<td_api::object_ptr<td_api::JsonValue>>> get_app_config_queries_;
void start_up() override; void start_up() override;
void hangup_shared() override; void hangup_shared() override;
void hangup() override; void hangup() override;

View File

@ -469,33 +469,6 @@ class GetDeepLinkInfoQuery : public Td::ResultHandler {
} }
}; };
class GetAppConfigQuery : public Td::ResultHandler {
Promise<tl_object_ptr<td_api::JsonValue>> promise_;
public:
explicit GetAppConfigQuery(Promise<tl_object_ptr<td_api::JsonValue>> &&promise) : promise_(std::move(promise)) {
}
void send() {
send_query(G()->net_query_creator().create(create_storer(telegram_api::help_getAppConfig()), DcId::main(),
NetQuery::Type::Common, NetQuery::AuthFlag::Off));
}
void on_result(uint64 id, BufferSlice packet) override {
auto result_ptr = fetch_result<telegram_api::help_getAppConfig>(packet);
if (result_ptr.is_error()) {
return on_error(id, result_ptr.move_as_error());
}
auto result = result_ptr.move_as_ok();
promise_.set_value(convert_json_value_object(result));
}
void on_error(uint64 id, Status status) override {
promise_.set_error(std::move(status));
}
};
class SaveAppLogQuery : public Td::ResultHandler { class SaveAppLogQuery : public Td::ResultHandler {
Promise<Unit> promise_; Promise<Unit> promise_;
@ -7627,7 +7600,7 @@ void Td::on_request(uint64 id, td_api::getDeepLinkInfo &request) {
void Td::on_request(uint64 id, const td_api::getApplicationConfig &request) { void Td::on_request(uint64 id, const td_api::getApplicationConfig &request) {
CHECK_IS_USER(); CHECK_IS_USER();
CREATE_REQUEST_PROMISE(); CREATE_REQUEST_PROMISE();
create_handler<GetAppConfigQuery>(std::move(promise))->send(); send_closure(G()->config_manager(), &ConfigManager::get_app_config, std::move(promise));
} }
void Td::on_request(uint64 id, td_api::saveApplicationLogEvent &request) { void Td::on_request(uint64 id, td_api::saveApplicationLogEvent &request) {