Better MTProto header updates.

GitOrigin-RevId: f7df4c8259c286b699e27a7e33f2477515c6e798
This commit is contained in:
levlam 2018-07-02 23:36:45 +03:00
parent dcdbf6854b
commit 9c8a6f9c65
4 changed files with 97 additions and 31 deletions

View File

@ -3475,6 +3475,18 @@ void Td::on_config_option_updated(const string &name) {
} else if (name == "disable_top_chats") { } else if (name == "disable_top_chats") {
send_closure(top_dialog_manager_, &TopDialogManager::update_is_enabled, send_closure(top_dialog_manager_, &TopDialogManager::update_is_enabled,
!G()->shared_config().get_option_boolean(name)); !G()->shared_config().get_option_boolean(name));
} else if (name == "is_emulator") {
if (G()->mtproto_header().set_is_emulator(G()->shared_config().get_option_boolean(name))) {
G()->net_query_dispatcher().update_mtproto_header();
}
} else if (name == "language_pack") {
if (G()->mtproto_header().set_language_pack(G()->shared_config().get_option_string(name))) {
G()->net_query_dispatcher().update_mtproto_header();
}
} else if (name == "language_code") {
if (G()->mtproto_header().set_language_code(G()->shared_config().get_option_string(name))) {
G()->net_query_dispatcher().update_mtproto_header();
}
} else if (is_internal_config_option(name)) { } else if (is_internal_config_option(name)) {
return; return;
} }
@ -3926,17 +3938,6 @@ Status Td::init(DbKey key) {
class ConfigSharedCallback : public ConfigShared::Callback { class ConfigSharedCallback : public ConfigShared::Callback {
public: public:
void on_option_updated(const string &name, const string &value) override { void on_option_updated(const string &name, const string &value) override {
if (name == "is_emulator" && !G()->close_flag()) {
// it should be applied immediately, because it affects MtprotoHeader
if (G()->have_mtproto_header()) {
// can't use G()->shared_config(), because it may be not created yet
G()->mtproto_header().set_is_emulator(value == "Btrue");
}
if (G()->have_net_query_dispatcher()) {
G()->net_query_dispatcher().update_mtproto_header();
}
}
send_closure(G()->td(), &Td::on_config_option_updated, name); send_closure(G()->td(), &Td::on_config_option_updated, name);
} }
}; };
@ -3959,6 +3960,12 @@ Status Td::init(DbKey key) {
} }
}); });
options_.language_pack = G()->shared_config().get_option_string("language_pack");
options_.language_code = G()->shared_config().get_option_string("language_code");
options_.is_emulator = G()->shared_config().get_option_boolean("is_emulator");
// options_.proxy = Proxy();
G()->set_mtproto_header(std::make_unique<MtprotoHeader>(options_));
VLOG(td_init) << "Create NetQueryDispatcher"; VLOG(td_init) << "Create NetQueryDispatcher";
auto net_query_dispatcher = std::make_unique<NetQueryDispatcher>([&] { return create_reference(); }); auto net_query_dispatcher = std::make_unique<NetQueryDispatcher>([&] { return create_reference(); });
G()->set_net_query_dispatcher(std::move(net_query_dispatcher)); G()->set_net_query_dispatcher(std::move(net_query_dispatcher));
@ -4327,32 +4334,32 @@ Status Td::set_parameters(td_api::object_ptr<td_api::tdlibParameters> parameters
inc_request_actor_refcnt(); // guard inc_request_actor_refcnt(); // guard
inc_actor_refcnt(); // guard inc_actor_refcnt(); // guard
VLOG(td_init) << "Create MtprotoHeader"; VLOG(td_init) << "Create MtprotoHeader::Options";
MtprotoHeader::Options options; options_.api_id = parameters->api_id_;
options.api_id = parameters->api_id_; options_.system_language_code = trim(parameters->system_language_code_);
options.system_language_code = trim(parameters->system_language_code_); options_.device_model = trim(parameters->device_model_);
options.device_model = trim(parameters->device_model_); options_.system_version = trim(parameters->system_version_);
options.system_version = trim(parameters->system_version_); options_.application_version = trim(parameters->application_version_);
options.application_version = trim(parameters->application_version_); if (options_.system_language_code.empty()) {
if (options.system_language_code.empty()) {
return Status::Error(400, "System language code must be non-empty"); return Status::Error(400, "System language code must be non-empty");
} }
if (options.device_model.empty()) { if (options_.device_model.empty()) {
return Status::Error(400, "Device model must be non-empty"); return Status::Error(400, "Device model must be non-empty");
} }
if (options.system_version.empty()) { if (options_.system_version.empty()) {
return Status::Error(400, "System version must be non-empty"); return Status::Error(400, "System version must be non-empty");
} }
if (options.application_version.empty()) { if (options_.application_version.empty()) {
return Status::Error(400, "Application version must be non-empty"); return Status::Error(400, "Application version must be non-empty");
} }
if (options.api_id != 21724) { if (options_.api_id != 21724) {
options.application_version += ", TDLib "; options_.application_version += ", TDLib ";
options.application_version += TDLIB_VERSION; options_.application_version += TDLIB_VERSION;
} }
options.is_emulator = false; options_.language_pack = "";
options.proxy = Proxy(); options_.language_code = "";
G()->set_mtproto_header(std::make_unique<MtprotoHeader>(options)); options_.is_emulator = false;
options_.proxy = Proxy();
state_ = State::Decrypt; state_ = State::Decrypt;
VLOG(td_init) << "Send authorizationStateWaitEncryptionKey"; VLOG(td_init) << "Send authorizationStateWaitEncryptionKey";
@ -5963,6 +5970,25 @@ void Td::on_request(uint64 id, td_api::setOption &request) {
return false; return false;
}; };
auto set_string_option = [&](Slice name) {
if (request.name_ == name) {
if (value_constructor_id != td_api::optionValueString::ID &&
value_constructor_id != td_api::optionValueEmpty::ID) {
send_error_raw(id, 3, PSLICE() << "Option \"" << name << "\" must have string value");
return true;
}
if (value_constructor_id == td_api::optionValueEmpty::ID) {
G()->shared_config().set_option_empty(name);
} else {
G()->shared_config().set_option_string(name,
static_cast<td_api::optionValueString *>(request.value_.get())->value_);
}
send_closure(actor_id(this), &Td::send_result, id, make_tl_object<td_api::ok>());
return true;
}
return false;
};
switch (request.name_[0]) { switch (request.name_[0]) {
case 'd': case 'd':
if (set_boolean_option("disable_contact_registered_notifications")) { if (set_boolean_option("disable_contact_registered_notifications")) {
@ -5980,6 +6006,14 @@ void Td::on_request(uint64 id, td_api::setOption &request) {
return; return;
} }
break; break;
case 'l':
if (set_string_option("language_pack")) {
return;
}
if (set_string_option("language_code")) {
return;
}
break;
case 'o': case 'o':
if (request.name_ == "online") { if (request.name_ == "online") {
if (value_constructor_id != td_api::optionValueBoolean::ID && if (value_constructor_id != td_api::optionValueBoolean::ID &&

View File

@ -6,6 +6,7 @@
// //
#pragma once #pragma once
#include "td/telegram/net/MtprotoHeader.h"
#include "td/telegram/net/NetQuery.h" #include "td/telegram/net/NetQuery.h"
#include "td/telegram/StateManager.h" #include "td/telegram/StateManager.h"
#include "td/telegram/TdCallback.h" #include "td/telegram/TdCallback.h"
@ -37,7 +38,6 @@ class AudiosManager;
class AuthManager; class AuthManager;
class CallManager; class CallManager;
class CallbackQueriesManager; class CallbackQueriesManager;
class PhoneNumberManager;
class ConfigManager; class ConfigManager;
class ContactsManager; class ContactsManager;
class DeviceTokenManager; class DeviceTokenManager;
@ -48,6 +48,7 @@ class HashtagHints;
class MessagesManager; class MessagesManager;
class NetStatsManager; class NetStatsManager;
class PasswordManager; class PasswordManager;
class PhoneNumberManager;
class PrivacyManager; class PrivacyManager;
class SecureManager; class SecureManager;
class SecretChatsManager; class SecretChatsManager;
@ -223,6 +224,8 @@ class Td final : public NetQueryCallback {
void dec_stop_cnt(); void dec_stop_cnt();
MtprotoHeader::Options options_;
TdParameters parameters_; TdParameters parameters_;
unique_ptr<TdCallback> callback_; unique_ptr<TdCallback> callback_;

View File

@ -11,6 +11,7 @@
namespace td { namespace td {
namespace { namespace {
class HeaderStorer { class HeaderStorer {
public: public:
HeaderStorer(const MtprotoHeader::Options &options, bool is_anonymous) HeaderStorer(const MtprotoHeader::Options &options, bool is_anonymous)
@ -60,6 +61,7 @@ class HeaderStorer {
const MtprotoHeader::Options &options; const MtprotoHeader::Options &options;
bool is_anonymous; bool is_anonymous;
}; };
} // namespace } // namespace
string MtprotoHeader::gen_header(const MtprotoHeader::Options &options, bool is_anonymous) { string MtprotoHeader::gen_header(const MtprotoHeader::Options &options, bool is_anonymous) {

View File

@ -20,8 +20,10 @@ class MtprotoHeader {
string system_language_code; string system_language_code;
string device_model; string device_model;
string system_version; string system_version;
bool is_emulator = false;
string application_version; string application_version;
string language_pack;
string language_code;
bool is_emulator = false;
Proxy proxy; Proxy proxy;
}; };
@ -34,9 +36,34 @@ class MtprotoHeader {
default_header_ = gen_header(options_, false); default_header_ = gen_header(options_, false);
} }
void set_is_emulator(bool is_emulator) { bool set_is_emulator(bool is_emulator) {
if (options_.is_emulator == is_emulator) {
return false;
}
options_.is_emulator = is_emulator; options_.is_emulator = is_emulator;
default_header_ = gen_header(options_, false); default_header_ = gen_header(options_, false);
return true;
}
bool set_language_pack(string language_pack) {
if (options_.language_pack == language_pack) {
return false;
}
options_.language_pack = std::move(language_pack);
default_header_ = gen_header(options_, false);
return true;
}
bool set_language_code(string language_code) {
if (options_.language_code == language_code) {
return false;
}
options_.language_code = std::move(language_code);
default_header_ = gen_header(options_, false);
return true;
} }
Slice get_default_header() const { Slice get_default_header() const {