tdlight/td/telegram/StateManager.h
2024-01-01 03:07:21 +03:00

103 lines
2.4 KiB
C++

//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
//
// 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/ConnectionState.h"
#include "td/telegram/net/NetType.h"
#include "td/mtproto/ConnectionManager.h"
#include "td/actor/actor.h"
#include "td/utils/common.h"
#include "td/utils/Promise.h"
namespace td {
class StateManager final : public mtproto::ConnectionManager {
public:
class Callback {
public:
Callback() = default;
Callback(const Callback &) = delete;
Callback &operator=(const Callback &) = delete;
virtual ~Callback() = default;
virtual bool on_state(ConnectionState state) {
return true;
}
virtual bool on_network(NetType network_type, uint32 generation) {
return true;
}
virtual bool on_online(bool is_online) {
return true;
}
virtual bool on_logging_out(bool is_logging_out) {
return true;
}
};
explicit StateManager(ActorShared<> parent) : parent_(std::move(parent)) {
}
void on_synchronized(bool is_synchronized);
void on_network_updated();
void on_network(NetType new_network_type);
void on_online(bool is_online);
void on_proxy(bool use_proxy);
void on_logging_out(bool is_logging_out);
void add_callback(unique_ptr<Callback> net_callback);
void wait_first_sync(Promise<> promise);
void close();
private:
ActorShared<> parent_;
bool sync_flag_ = true;
bool network_flag_ = true;
NetType network_type_ = NetType::Unknown;
uint32 network_generation_ = 1;
bool online_flag_ = false;
bool use_proxy_ = false;
bool is_logging_out_ = false;
static constexpr double UP_DELAY = 0.05;
static constexpr double DOWN_DELAY = 0.3;
ConnectionState pending_state_ = ConnectionState::Empty;
bool has_timestamp_ = false;
double pending_timestamp_ = 0;
ConnectionState flush_state_ = ConnectionState::Empty;
vector<unique_ptr<Callback>> callbacks_;
bool was_sync_ = false;
vector<Promise<>> wait_first_sync_;
void inc_connect();
void dec_connect();
enum class Flag : int32 { Online, State, Network, LoggingOut };
void notify_flag(Flag flag);
void start_up() final;
void loop() final;
void on_network_soft();
void do_on_network(NetType new_network_type, bool inc_generation);
ConnectionState get_real_state() const;
};
} // namespace td