173 lines
4.6 KiB
C++
173 lines
4.6 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#pragma once
|
|
|
|
#include "mtproto/mtproto_auth_key.h"
|
|
#include "mtproto/mtp_instance.h"
|
|
#include "base/weak_ptr.h"
|
|
|
|
namespace Storage {
|
|
class Account;
|
|
class Domain;
|
|
enum class StartResult : uchar;
|
|
} // namespace Storage
|
|
|
|
namespace MTP {
|
|
class AuthKey;
|
|
class Config;
|
|
} // namespace MTP
|
|
|
|
namespace Main {
|
|
|
|
class Domain;
|
|
class Session;
|
|
class SessionSettings;
|
|
class AppConfig;
|
|
|
|
class Account final : public base::has_weak_ptr {
|
|
public:
|
|
Account(not_null<Domain*> domain, const QString &dataName, int index);
|
|
~Account();
|
|
|
|
[[nodiscard]] Domain &domain() const {
|
|
return *_domain;
|
|
}
|
|
|
|
[[nodiscard]] Storage::Domain &domainLocal() const;
|
|
|
|
[[nodiscard]] Storage::StartResult legacyStart(
|
|
const QByteArray &passcode);
|
|
[[nodiscard]] std::unique_ptr<MTP::Config> prepareToStart(
|
|
std::shared_ptr<MTP::AuthKey> localKey);
|
|
void prepareToStartAdded(
|
|
std::shared_ptr<MTP::AuthKey> localKey);
|
|
void start(std::unique_ptr<MTP::Config> config);
|
|
|
|
[[nodiscard]] uint64 willHaveSessionUniqueId(MTP::Config *config) const;
|
|
void createSession(
|
|
const MTPUser &user,
|
|
std::unique_ptr<SessionSettings> settings = nullptr);
|
|
void createSession(
|
|
UserId id,
|
|
QByteArray serialized,
|
|
int streamVersion,
|
|
std::unique_ptr<SessionSettings> settings);
|
|
|
|
void logOut();
|
|
void forcedLogOut();
|
|
[[nodiscard]] bool loggingOut() const;
|
|
|
|
[[nodiscard]] AppConfig &appConfig() const {
|
|
Expects(_appConfig != nullptr);
|
|
|
|
return *_appConfig;
|
|
}
|
|
|
|
[[nodiscard]] Storage::Account &local() const {
|
|
return *_local;
|
|
}
|
|
|
|
[[nodiscard]] bool sessionExists() const;
|
|
[[nodiscard]] Session &session() const;
|
|
[[nodiscard]] Session *maybeSession() const;
|
|
[[nodiscard]] rpl::producer<Session*> sessionValue() const;
|
|
[[nodiscard]] rpl::producer<Session*> sessionChanges() const;
|
|
|
|
[[nodiscard]] MTP::Instance &mtp() const {
|
|
return *_mtp;
|
|
}
|
|
[[nodiscard]] rpl::producer<not_null<MTP::Instance*>> mtpValue() const;
|
|
|
|
// Each time the main session changes a new copy of the pointer is fired.
|
|
// This allows to resend the requests that were not requiring auth, and
|
|
// which could be forgotten without calling .done() or .fail() because
|
|
// of the main dc changing.
|
|
[[nodiscard]] auto mtpMainSessionValue() const
|
|
-> rpl::producer<not_null<MTP::Instance*>>;
|
|
|
|
// Set from legacy storage.
|
|
void setLegacyMtpKey(std::shared_ptr<MTP::AuthKey> key);
|
|
|
|
void setMtpMainDcId(MTP::DcId mainDcId);
|
|
void setSessionUserId(UserId userId);
|
|
void setSessionFromStorage(
|
|
std::unique_ptr<SessionSettings> data,
|
|
QByteArray &&selfSerialized,
|
|
int32 selfStreamVersion);
|
|
[[nodiscard]] SessionSettings *getSessionSettings();
|
|
[[nodiscard]] rpl::producer<> mtpNewSessionCreated() const;
|
|
[[nodiscard]] rpl::producer<MTPUpdates> mtpUpdates() const;
|
|
|
|
// Serialization.
|
|
[[nodiscard]] QByteArray serializeMtpAuthorization() const;
|
|
void setMtpAuthorization(const QByteArray &serialized);
|
|
|
|
void suggestMainDcId(MTP::DcId mainDcId);
|
|
void destroyStaleAuthorizationKeys();
|
|
|
|
void setHandleLoginCode(Fn<void(QString)> callback);
|
|
void handleLoginCode(const QString &code) const;
|
|
|
|
[[nodiscard]] rpl::lifetime &lifetime() {
|
|
return _lifetime;
|
|
}
|
|
|
|
private:
|
|
static constexpr auto kDefaultSaveDelay = crl::time(1000);
|
|
enum class DestroyReason {
|
|
Quitting,
|
|
LoggedOut,
|
|
};
|
|
|
|
void startMtp(std::unique_ptr<MTP::Config> config);
|
|
void createSession(
|
|
const MTPUser &user,
|
|
QByteArray serialized,
|
|
int streamVersion,
|
|
std::unique_ptr<SessionSettings> settings);
|
|
void watchProxyChanges();
|
|
void watchSessionChanges();
|
|
bool checkForUpdates(const MTP::Response &message);
|
|
bool checkForNewSession(const MTP::Response &message);
|
|
|
|
void destroyMtpKeys(MTP::AuthKeysList &&keys);
|
|
void resetAuthorizationKeys();
|
|
|
|
void loggedOut();
|
|
void destroySession(DestroyReason reason);
|
|
|
|
const not_null<Domain*> _domain;
|
|
const std::unique_ptr<Storage::Account> _local;
|
|
|
|
std::unique_ptr<MTP::Instance> _mtp;
|
|
rpl::variable<MTP::Instance*> _mtpValue;
|
|
std::unique_ptr<MTP::Instance> _mtpForKeysDestroy;
|
|
rpl::event_stream<MTPUpdates> _mtpUpdates;
|
|
rpl::event_stream<> _mtpNewSessionCreated;
|
|
|
|
std::unique_ptr<AppConfig> _appConfig;
|
|
|
|
std::unique_ptr<Session> _session;
|
|
rpl::variable<Session*> _sessionValue;
|
|
|
|
Fn<void(QString)> _handleLoginCode = nullptr;
|
|
|
|
UserId _sessionUserId = 0;
|
|
QByteArray _sessionUserSerialized;
|
|
int32 _sessionUserStreamVersion = 0;
|
|
std::unique_ptr<SessionSettings> _storedSessionSettings;
|
|
MTP::Instance::Fields _mtpFields;
|
|
MTP::AuthKeysList _mtpKeysToDestroy;
|
|
bool _loggingOut = false;
|
|
|
|
rpl::lifetime _lifetime;
|
|
|
|
};
|
|
|
|
} // namespace Main
|