Fix g++ Internal Compiler Error 2.

GitOrigin-RevId: d1881c8bc7ca03bfb6e48d93cd4217a0a14ab7d2
This commit is contained in:
levlam 2018-04-09 21:53:43 +03:00
parent 50ab1fd175
commit 1c3ba5c3a3
2 changed files with 49 additions and 35 deletions

View File

@ -192,32 +192,33 @@ PhoneNumberManager::PhoneNumberManager(PhoneNumberManager::Type type, ActorShare
: type_(type), parent_(std::move(parent)) { : type_(type), parent_(std::move(parent)) {
} }
template <class T>
void PhoneNumberManager::process_send_code_result(uint64 query_id, T r_send_code) {
if (r_send_code.is_error()) {
return on_query_error(query_id, r_send_code.move_as_error());
}
on_new_query(query_id);
start_net_query(NetQueryType::SendCode, G()->net_query_creator().create(create_storer(r_send_code.move_as_ok())));
}
void PhoneNumberManager::set_phone_number(uint64 query_id, string phone_number, bool allow_flash_call, void PhoneNumberManager::set_phone_number(uint64 query_id, string phone_number, bool allow_flash_call,
bool is_current_phone_number) { bool is_current_phone_number) {
if (phone_number.empty()) { if (phone_number.empty()) {
return on_query_error(query_id, Status::Error(8, "Phone number can't be empty")); return on_query_error(query_id, Status::Error(8, "Phone number can't be empty"));
} }
auto process_send_code = [&](auto r_send_code) {
if (r_send_code.is_error()) {
return on_query_error(query_id, r_send_code.move_as_error());
}
on_new_query(query_id);
start_net_query(NetQueryType::SendCode, G()->net_query_creator().create(create_storer(r_send_code.move_as_ok())));
};
switch (type_) { switch (type_) {
case Type::ChangePhone: case Type::ChangePhone:
return process_send_code( return process_send_code_result(
send_code_helper_.send_change_phone_code(phone_number, allow_flash_call, is_current_phone_number)); query_id, send_code_helper_.send_change_phone_code(phone_number, allow_flash_call, is_current_phone_number));
case Type::VerifyPhone: case Type::VerifyPhone:
return process_send_code( return process_send_code_result(
send_code_helper_.send_verify_phone_code(phone_number, allow_flash_call, is_current_phone_number)); query_id, send_code_helper_.send_verify_phone_code(phone_number, allow_flash_call, is_current_phone_number));
case Type::ConfirmPhone: case Type::ConfirmPhone:
return process_send_code( return process_send_code_result(
send_code_helper_.send_confirm_phone_code(phone_number, allow_flash_call, is_current_phone_number)); query_id, send_code_helper_.send_confirm_phone_code(phone_number, allow_flash_call, is_current_phone_number));
default: default:
UNREACHABLE(); UNREACHABLE();
} }
@ -240,25 +241,28 @@ void PhoneNumberManager::resend_authentication_code(uint64 query_id) {
NetQuery::Type::Common, NetQuery::AuthFlag::Off)); NetQuery::Type::Common, NetQuery::AuthFlag::Off));
} }
template <class T>
void PhoneNumberManager::send_new_check_code_query(const T &query) {
start_net_query(NetQueryType::CheckCode, G()->net_query_creator().create(create_storer(query)));
}
void PhoneNumberManager::check_code(uint64 query_id, string code) { void PhoneNumberManager::check_code(uint64 query_id, string code) {
if (state_ != State::WaitCode) { if (state_ != State::WaitCode) {
return on_query_error(query_id, Status::Error(8, "checkAuthenticationCode unexpected")); return on_query_error(query_id, Status::Error(8, "checkAuthenticationCode unexpected"));
} }
on_new_query(query_id); on_new_query(query_id);
auto send_new_query = [&](auto q) {
start_net_query(NetQueryType::CheckCode, G()->net_query_creator().create(create_storer(q)));
};
switch (type_) { switch (type_) {
case Type::ChangePhone: case Type::ChangePhone:
return send_new_query(telegram_api::account_changePhone(send_code_helper_.phone_number().str(), return send_new_check_code_query(telegram_api::account_changePhone(
send_code_helper_.phone_code_hash().str(), code)); send_code_helper_.phone_number().str(), send_code_helper_.phone_code_hash().str(), code));
case Type::ConfirmPhone: case Type::ConfirmPhone:
return send_new_query(telegram_api::account_confirmPhone(send_code_helper_.phone_code_hash().str(), code)); return send_new_check_code_query(
telegram_api::account_confirmPhone(send_code_helper_.phone_code_hash().str(), code));
case Type::VerifyPhone: case Type::VerifyPhone:
return send_new_query(telegram_api::account_verifyPhone(send_code_helper_.phone_number().str(), return send_new_check_code_query(telegram_api::account_verifyPhone(
send_code_helper_.phone_code_hash().str(), code)); send_code_helper_.phone_number().str(), send_code_helper_.phone_code_hash().str(), code));
default: default:
UNREACHABLE(); UNREACHABLE();
} }
@ -303,22 +307,23 @@ void PhoneNumberManager::start_net_query(NetQueryType net_query_type, NetQueryPt
G()->net_query_dispatcher().dispatch_with_callback(std::move(net_query), actor_shared(this)); G()->net_query_dispatcher().dispatch_with_callback(std::move(net_query), actor_shared(this));
} }
void PhoneNumberManager::on_check_code_result(NetQueryPtr &result) { template <class T>
auto process_result = [&](auto result) { void PhoneNumberManager::process_check_code_result(T result) {
if (result.is_error()) { if (result.is_error()) {
return on_query_error(result.move_as_error()); return on_query_error(result.move_as_error());
} }
state_ = State::Ok; state_ = State::Ok;
on_query_ok(); on_query_ok();
}; }
void PhoneNumberManager::on_check_code_result(NetQueryPtr &result) {
switch (type_) { switch (type_) {
case Type::ChangePhone: case Type::ChangePhone:
return process_result(fetch_result<telegram_api::account_changePhone>(result->ok())); return process_check_code_result(fetch_result<telegram_api::account_changePhone>(result->ok()));
case Type::VerifyPhone: case Type::VerifyPhone:
return process_result(fetch_result<telegram_api::account_verifyPhone>(result->ok())); return process_check_code_result(fetch_result<telegram_api::account_verifyPhone>(result->ok()));
case Type::ConfirmPhone: case Type::ConfirmPhone:
return process_result(fetch_result<telegram_api::account_confirmPhone>(result->ok())); return process_check_code_result(fetch_result<telegram_api::account_confirmPhone>(result->ok()));
default: default:
UNREACHABLE(); UNREACHABLE();
} }

View File

@ -123,6 +123,15 @@ class PhoneNumberManager : public NetActor {
void on_query_ok(); void on_query_ok();
void start_net_query(NetQueryType net_query_type, NetQueryPtr net_query); void start_net_query(NetQueryType net_query_type, NetQueryPtr net_query);
template <class T>
void process_send_code_result(uint64 query_id, T r_send_code);
template <class T>
void send_new_check_code_query(const T &query);
template <class T>
void process_check_code_result(T result);
void on_check_code_result(NetQueryPtr &result); void on_check_code_result(NetQueryPtr &result);
void on_send_code_result(NetQueryPtr &result); void on_send_code_result(NetQueryPtr &result);
void on_result(NetQueryPtr result) override; void on_result(NetQueryPtr result) override;