diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 29858316b..26efcd6c2 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -82,10 +82,14 @@ class OnUpdate { }; class GetUpdatesStateQuery : public Td::ResultHandler { + Promise> promise_; + public: + explicit GetUpdatesStateQuery(Promise> &&promise) + : promise_(std::move(promise)) { + } + void send() { - // TODO this call must be first after client is logged in, there must be no API calls before - // it succeeds send_query(G()->net_query_creator().create(telegram_api::updates_getState())); } @@ -95,18 +99,11 @@ class GetUpdatesStateQuery : public Td::ResultHandler { return on_error(id, result_ptr.move_as_error()); } - auto state = result_ptr.move_as_ok(); - CHECK(state->get_id() == telegram_api::updates_state::ID); - - td->updates_manager_->on_get_updates_state(std::move(state), "GetUpdatesStateQuery"); + promise_.set_value(result_ptr.move_as_ok()); } void on_error(uint64 id, Status status) override { - if (status.code() != 401) { - LOG(ERROR) << "Receive updates.getState error: " << status; - } - status.ignore(); - td->updates_manager_->on_get_updates_state(nullptr, "GetUpdatesStateQuery"); + promise_.set_error(std::move(status)); } }; @@ -856,6 +853,15 @@ void UpdatesManager::on_get_updates(tl_object_ptr &&updat } } +void UpdatesManager::on_failed_get_updates_state(Status &&error) { + if (error.code() != 401) { + LOG(ERROR) << "Receive updates.getState error: " << error; + } + + running_get_difference_ = false; + schedule_get_difference("on_failed_get_updates_state"); +} + void UpdatesManager::on_failed_get_difference(Status &&error) { if (error.code() != 401) { LOG(ERROR) << "Receive updates.getDifference error: " << error; @@ -883,11 +889,8 @@ void UpdatesManager::schedule_get_difference(const char *source) { } void UpdatesManager::on_get_updates_state(tl_object_ptr &&state, const char *source) { - if (state == nullptr) { - running_get_difference_ = false; - schedule_get_difference("on_get_updates_state"); - return; - } + CHECK(state != nullptr); + VLOG(get_difference) << "Receive " << oneline(to_string(state)) << " from " << source; // TODO use state->unread_count; @@ -1108,7 +1111,15 @@ void UpdatesManager::init_state() { before_get_difference(true); - td_->create_handler()->send(); + auto promise = PromiseCreator::lambda([](Result> result) { + if (result.is_ok()) { + send_closure(G()->updates_manager(), &UpdatesManager::on_get_updates_state, result.move_as_ok(), + "GetUpdatesStateQuery"); + } else { + send_closure(G()->updates_manager(), &UpdatesManager::on_failed_get_updates_state, result.move_as_error()); + } + }); + td_->create_handler(std::move(promise))->send(); } return; } diff --git a/td/telegram/UpdatesManager.h b/td/telegram/UpdatesManager.h index d8c45f3fd..5c9640cd8 100644 --- a/td/telegram/UpdatesManager.h +++ b/td/telegram/UpdatesManager.h @@ -91,8 +91,6 @@ class UpdatesManager : public Actor { void on_get_updates(tl_object_ptr &&updates_ptr, Promise &&promise); - void on_get_updates_state(tl_object_ptr &&state, const char *source); - void add_pending_pts_update(tl_object_ptr &&update, int32 new_pts, int32 pts_count, Promise &&promise, const char *source); @@ -113,8 +111,6 @@ class UpdatesManager : public Actor { void schedule_get_difference(const char *source); - void init_state(); - void ping_server(); void on_server_pong(tl_object_ptr &&state); @@ -225,6 +221,10 @@ class UpdatesManager : public Actor { int32 get_short_update_date() const; + void init_state(); + + void on_get_updates_state(tl_object_ptr &&state, const char *source); + void on_get_difference(tl_object_ptr &&difference_ptr); void process_get_difference_updates(vector> &&new_messages, @@ -278,6 +278,8 @@ class UpdatesManager : public Actor { void run_get_difference(bool is_recursive, const char *source); + void on_failed_get_updates_state(Status &&error); + void on_failed_get_difference(Status &&error); void before_get_difference(bool is_initial);