/* 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 "base/timer.h" namespace Storage { class Domain; enum class StartResult : uchar; } // namespace Storage namespace MTP { enum class Environment : uchar; } // namespace MTP namespace Main { class Account; class Session; class Domain final { public: struct AccountWithIndex { int index = 0; std::unique_ptr account; }; static constexpr auto kMaxAccounts = 3; explicit Domain(const QString &dataName); ~Domain(); [[nodiscard]] bool started() const; [[nodiscard]] Storage::StartResult start(const QByteArray &passcode); void resetWithForgottenPasscode(); void finish(); [[nodiscard]] Storage::Domain &local() const { return *_local; } [[nodiscard]] auto accounts() const -> const std::vector &; [[nodiscard]] rpl::producer activeValue() const; [[nodiscard]] rpl::producer<> accountsChanges() const; [[nodiscard]] Account *maybeLastOrSomeAuthedAccount(); // Expects(started()); [[nodiscard]] Account &active() const; [[nodiscard]] rpl::producer> activeChanges() const; [[nodiscard]] rpl::producer activeSessionValue() const; [[nodiscard]] rpl::producer activeSessionChanges() const; [[nodiscard]] int unreadBadge() const; [[nodiscard]] bool unreadBadgeMuted() const; [[nodiscard]] rpl::producer<> unreadBadgeChanges() const; void notifyUnreadBadgeChanged(); [[nodiscard]] not_null add(MTP::Environment environment); void maybeActivate(not_null account); void activate(not_null account); void addActivated(MTP::Environment environment); // Interface for Storage::Domain. void accountAddedInStorage(AccountWithIndex accountWithIndex); void activateFromStorage(int index); [[nodiscard]] int activeForStorage() const; private: void activateAfterStarting(); void activateAuthedAccount(); bool removePasscodeIfEmpty(); void removeRedundantAccounts(); void watchSession(not_null account); void scheduleWriteAccounts(); void checkForLastProductionConfig(not_null account); void updateUnreadBadge(); void scheduleUpdateUnreadBadge(); void suggestExportIfNeeded(); const QString _dataName; const std::unique_ptr _local; std::vector _accounts; rpl::event_stream<> _accountsChanges; rpl::variable _active = nullptr; int _accountToActivate = -1; int _lastActiveIndex = -1; bool _writeAccountsScheduled = false; rpl::event_stream _activeSessions; rpl::event_stream<> _unreadBadgeChanges; int _unreadBadge = 0; bool _unreadBadgeMuted = true; bool _unreadBadgeUpdateScheduled = false; rpl::lifetime _activeLifetime; rpl::lifetime _lifetime; }; } // namespace Main