main_domain.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "base/timer.h"
  9. #include "base/weak_ptr.h"
  10. namespace Storage {
  11. class Domain;
  12. enum class StartResult : uchar;
  13. } // namespace Storage
  14. namespace MTP {
  15. enum class Environment : uchar;
  16. } // namespace MTP
  17. namespace Main {
  18. class Account;
  19. class Session;
  20. class Domain final : public base::has_weak_ptr {
  21. public:
  22. struct AccountWithIndex {
  23. int index = 0;
  24. std::unique_ptr<Account> account;
  25. };
  26. static constexpr auto kMaxAccounts = 3;
  27. static constexpr auto kPremiumMaxAccounts = 6;
  28. explicit Domain(const QString &dataName);
  29. ~Domain();
  30. [[nodiscard]] bool started() const;
  31. [[nodiscard]] Storage::StartResult start(const QByteArray &passcode);
  32. void resetWithForgottenPasscode();
  33. void finish();
  34. [[nodiscard]] int maxAccounts() const;
  35. [[nodiscard]] rpl::producer<int> maxAccountsChanges() const;
  36. [[nodiscard]] Storage::Domain &local() const {
  37. return *_local;
  38. }
  39. [[nodiscard]] auto accounts() const
  40. -> const std::vector<AccountWithIndex> &;
  41. [[nodiscard]] std::vector<not_null<Account*>> orderedAccounts() const;
  42. [[nodiscard]] rpl::producer<Account*> activeValue() const;
  43. [[nodiscard]] rpl::producer<> accountsChanges() const;
  44. [[nodiscard]] Account *maybeLastOrSomeAuthedAccount();
  45. [[nodiscard]] int accountsAuthedCount() const;
  46. // Expects(started());
  47. [[nodiscard]] Account &active() const;
  48. [[nodiscard]] rpl::producer<not_null<Account*>> activeChanges() const;
  49. [[nodiscard]] rpl::producer<Session*> activeSessionValue() const;
  50. [[nodiscard]] rpl::producer<Session*> activeSessionChanges() const;
  51. [[nodiscard]] int unreadBadge() const;
  52. [[nodiscard]] bool unreadBadgeMuted() const;
  53. [[nodiscard]] rpl::producer<> unreadBadgeChanges() const;
  54. void notifyUnreadBadgeChanged();
  55. [[nodiscard]] not_null<Main::Account*> add(MTP::Environment environment);
  56. void maybeActivate(not_null<Main::Account*> account);
  57. void activate(not_null<Main::Account*> account);
  58. void addActivated(MTP::Environment environment, bool newWindow = false);
  59. // Interface for Storage::Domain.
  60. void accountAddedInStorage(AccountWithIndex accountWithIndex);
  61. void activateFromStorage(int index);
  62. [[nodiscard]] int activeForStorage() const;
  63. private:
  64. void activateAfterStarting();
  65. void closeAccountWindows(not_null<Main::Account*> account);
  66. bool removePasscodeIfEmpty();
  67. void removeRedundantAccounts();
  68. void watchSession(not_null<Account*> account);
  69. void scheduleWriteAccounts();
  70. void checkForLastProductionConfig(not_null<Main::Account*> account);
  71. void updateUnreadBadge();
  72. void scheduleUpdateUnreadBadge();
  73. void suggestExportIfNeeded();
  74. const QString _dataName;
  75. const std::unique_ptr<Storage::Domain> _local;
  76. std::vector<AccountWithIndex> _accounts;
  77. rpl::event_stream<> _accountsChanges;
  78. rpl::variable<Account*> _active = nullptr;
  79. int _accountToActivate = -1;
  80. int _lastActiveIndex = -1;
  81. bool _writeAccountsScheduled = false;
  82. rpl::event_stream<Session*> _activeSessions;
  83. rpl::event_stream<> _unreadBadgeChanges;
  84. int _unreadBadge = 0;
  85. bool _unreadBadgeMuted = true;
  86. bool _unreadBadgeUpdateScheduled = false;
  87. rpl::variable<int> _lastMaxAccounts;
  88. rpl::lifetime _activeLifetime;
  89. rpl::lifetime _lifetime;
  90. };
  91. } // namespace Main