167 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			4.5 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();
 | |
| 
 | |
| 	[[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;
 | |
| 
 | |
| 	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
 | 
