Description
James Smith
2017-03-23 23:04:31 UTC
Created attachment 130684 [details] [review] Add property averaging, presence setting and account lookup by unique identifier to AccountSet, <> operators to Presence. Add account lookup by uniqueIdentifier(). This requires changing the lookup key from objectPath() to uniqueIdentifier(). Document all new connection presence functions and signals. Created attachment 130685 [details] [review] Add property averaging, presence setting and account lookup by unique identifier to AccountSet, <> operators to Presence. Attach the correct patch. Created attachment 130887 [details] [review] Add property averaging, presence setting and account object export by unique identifier to AccountSet, <> operators to Presence Turn the account object list export into a hash of the account uniqueIdentifier and AccountPtr, and remove the single-account lookup. This breaks API compatibility, but is much nicer. Created attachment 131717 [details] [review] Change the presence spec weighting for individual states Clean up the presence spec weighting to allow for presence comparison. Created attachment 131718 [details] [review] Implement presence <> operators Implement <> operators to allow determining which presence of a set has the highest online state. Created attachment 131719 [details] [review] Add connection property averaging to AccountSet Add connection property averaging and presence setting for all accounts of an account set. Created attachment 131720 [details] [review] Export the AccountSet accounts as a QHash instead of a QList Change account use of objectPath() key for hash to uniqueIdentifier(). Export the entire QHash instead of a QList<AccountPtr>. Comment on attachment 131719 [details] [review] Add connection property averaging to AccountSet From 13321669e387949ae904d0e8e2afef9fa1663efb Mon Sep 17 00:00:00 2001 From: "James D. Smith" <smithjd15@gmail.com> Date: Sun, 4 Jun 2017 15:45:07 -0600 Subject: [PATCH] Add cumulative account connection information to AccountSet. Allow setting the requested presence of an entire account set. --- TelepathyQt/account-set-internal.h | 12 ++ TelepathyQt/account-set.cpp | 256 ++++++++++++++++++++++++++++++++++++- TelepathyQt/account-set.h | 20 +++ 3 files changed, 287 insertions(+), 1 deletion(-) diff --git TelepathyQt/account-set-internal.h TelepathyQt/account-set-internal.h index f7dbf9e0..0d6ec175 100644 --- TelepathyQt/account-set-internal.h +++ TelepathyQt/account-set-internal.h @@ -43,6 +43,12 @@ struct TP_QT_NO_EXPORT AccountSet::Private void removeAccount(const AccountPtr &account); void wrapAccount(const AccountPtr &account); void filterAccount(const AccountPtr &account); + void accountPropertiesChanged(); + void requestedPresenceChanged(); + void currentPresenceChanged(); + void connectionStatusChanged(); + void changingPresence(); + void onlinenessChanged(); bool accountMatchFilter(AccountWrapper *account); AccountSet *parent; @@ -50,6 +56,12 @@ struct TP_QT_NO_EXPORT AccountSet::Private AccountFilterConstPtr filter; QHash<QString, AccountWrapper *> wrappers; QHash<QString, AccountPtr> accounts; + + Tp::Presence requestedPresence; + Tp::Presence currentPresence; + Tp::ConnectionStatus connectionStatus; + bool isChangingPresence; + bool isOnline; bool ready; }; diff --git TelepathyQt/account-set.cpp TelepathyQt/account-set.cpp index fce92a39..4552bd5e 100644 --- TelepathyQt/account-set.cpp +++ TelepathyQt/account-set.cpp @@ -33,6 +33,7 @@ #include <TelepathyQt/AccountManager> #include <TelepathyQt/ConnectionCapabilities> #include <TelepathyQt/ConnectionManager> +#include <TelepathyQt/Presence> namespace Tp { @@ -69,6 +70,7 @@ void AccountSet::Private::init() if (filter->isValid()) { connectSignals(); insertAccounts(); + accountPropertiesChanged(); ready = true; } } @@ -93,6 +95,10 @@ void AccountSet::Private::insertAccount(const Tp::AccountPtr &account) Q_ASSERT(!wrappers.contains(accountPath)); wrapAccount(account); filterAccount(account); + + if (ready) { + accountPropertiesChanged(); + } } void AccountSet::Private::removeAccount(const Tp::AccountPtr &account) @@ -106,6 +112,104 @@ void AccountSet::Private::removeAccount(const Tp::AccountPtr &account) wrapper->deleteLater(); emit parent->accountRemoved(account); + + if (ready) { + accountPropertiesChanged(); + } +} + +void AccountSet::Private::accountPropertiesChanged() +{ + requestedPresenceChanged(); + currentPresenceChanged(); + connectionStatusChanged(); + changingPresence(); + onlinenessChanged(); +} + +void AccountSet::Private::requestedPresenceChanged() +{ + Tp::Presence highestRequestedPresence = Tp::PresenceSpec::offline().presence(); + + foreach (const Tp::AccountPtr &account, accounts.values()) { + if (account->requestedPresence() > highestRequestedPresence) { + highestRequestedPresence = account->requestedPresence(); + } + } + + if (requestedPresence != highestRequestedPresence) { + requestedPresence = highestRequestedPresence; + emit parent->requestedPresenceChanged(requestedPresence); + } +} + +void AccountSet::Private::currentPresenceChanged() +{ + Tp::Presence highestCurrentPresence = Tp::PresenceSpec::offline().presence(); + + foreach (const Tp::AccountPtr &account, accounts.values()) { + if (account->currentPresence() > highestCurrentPresence) { + highestCurrentPresence = account->currentPresence(); + } + } + + if (currentPresence != highestCurrentPresence) { + currentPresence = highestCurrentPresence; + emit parent->currentPresenceChanged(currentPresence); + } +} + +void AccountSet::Private::connectionStatusChanged() +{ + Tp::ConnectionStatus status = Tp::ConnectionStatusDisconnected; + QList<Tp::ConnectionStatus> allConnectionStatuses; + + foreach (const Tp::AccountPtr &account, accounts.values()) { + allConnectionStatuses << account->connectionStatus(); + } + + if (allConnectionStatuses.contains(Tp::ConnectionStatusConnecting)) { + status = Tp::ConnectionStatusConnecting; + } else if (allConnectionStatuses.contains(Tp::ConnectionStatusConnected)) { + status = Tp::ConnectionStatusConnected; + } + + if (connectionStatus != status) { + connectionStatus = status; + emit parent->connectionStatusChanged(connectionStatus); + } +} + +void AccountSet::Private::changingPresence() +{ + bool changing = false; + foreach (const Tp::AccountPtr &account, accounts.values()) { + changing = account->isChangingPresence(); + if (account->isChangingPresence()) { + break; + } + } + + if (isChangingPresence != changing) { + isChangingPresence = changing; + emit parent->isChangingPresence(isChangingPresence); + } +} + +void AccountSet::Private::onlinenessChanged() +{ + bool online = false; + foreach (const Tp::AccountPtr &account, accounts.values()) { + online = account->isOnline(); + if (!account->isOnline()) { + break; + } + } + + if (isOnline != online) { + isOnline = online; + emit parent->onlinenessChanged(isOnline); + } } void AccountSet::Private::wrapAccount(const AccountPtr &account) @@ -116,7 +220,7 @@ void AccountSet::Private::wrapAccount(const AccountPtr &account) SLOT(onAccountRemoved(Tp::AccountPtr))); parent->connect(wrapper, SIGNAL(accountPropertyChanged(Tp::AccountPtr,QString)), - SLOT(onAccountChanged(Tp::AccountPtr))); + SLOT(onAccountPropertyChanged(Tp::AccountPtr,QString))); parent->connect(wrapper, SIGNAL(accountCapabilitiesChanged(Tp::AccountPtr,Tp::ConnectionCapabilities)), SLOT(onAccountChanged(Tp::AccountPtr))); @@ -381,6 +485,84 @@ QList<AccountPtr> AccountSet::accounts() const } /** + * Set the requested presence of all accounts that match filter. + * + * \param presence The requested presence. + */ +void AccountSet::setPresence(const Tp::Presence &presence) +{ + foreach (const Tp::AccountPtr &account, mPriv->accounts.values()) { + account->setRequestedPresence(presence); + } +} + +/** + * The requested presence of all accounts that match filter. + * + * Change notification is via the requestedPresenceChanged() signal. + * + * \return The highest requested presence of the accounts that match filter. + * \sa requestedPresenceChanged() + */ +Tp::Presence AccountSet::requestedPresence() const +{ + return mPriv->requestedPresence; +} + +/** + * The current presence of all accounts that match filter. + * + * Change notification is via the currentPresenceChanged() signal. + * + * \return The highest current presence of the accounts that match filter. + * \sa currentPresenceChanged() + */ +Tp::Presence AccountSet::currentPresence() const +{ + return mPriv->currentPresence; +} + +/** + * The connection status of all accounts that match filter. + * + * Change notification is via the connectionStatusChanged() signal. + * + * \return connecting if any account is connecting, connected if at + * least one account is connected, or disconnected. + * \sa connectionStatusChanged() +*/ +Tp::ConnectionStatus AccountSet::connectionStatus() const +{ + return mPriv->connectionStatus; +} + +/** + * Of all accounts that match filter, if any are changing presence. + * + * Change notification is via the isChangingPresence() signal. + * + * \return true if any accounts that match filter are changing presence. + * \sa isChangingPresence() + */ +bool AccountSet::changingPresence() const +{ + return mPriv->isChangingPresence; +} + +/** + * Of all accounts that match filter, if all are online. + * + * Change notification is via the onlinenessChanged() signal. + * + * \return false if all accounts that match filter are not online. + * \sa onlinenessChanged() + */ +bool AccountSet::online() const +{ + return mPriv->isOnline; +} + +/** * \fn void AccountSet::accountAdded(const Tp::AccountPtr &account) * * Emitted whenever an account that matches filter is added to @@ -400,6 +582,51 @@ QList<AccountPtr> AccountSet::accounts() const * \sa accounts() */ +/** + * \fn void AccountSet::requestedPresenceChanged(const Tp::Presence &requestedPresence) + * + * Emitted whenever the highest requested presence of this set of accounts changes. + * + * \param requestedPresence The highest requested presence. + * \sa requestedPresence() + */ + +/** + * \fn void AccountSet::currentPresenceChanged(const Tp::Presence ¤tPresence) + * + * Emitted whenever the highest current presence of this set of accounts changes. + * + * \param requestedPresence The highest requested presence. + * \sa currentPresence() + */ + +/** + * \fn void AccountSet::connectionStatusChanged(Tp::ConnectionStatus connectionStatus) + * + * Emitted whenever the connection status of this set of accounts changes. + * + * \param connectionStatus The connection status. + * \sa connectionStatus() + */ + +/** + * \fn void AccountSet::isChangingPresence(bool changingPresence) + * + * Emitted whenever any of this set of accounts are changing presence. + * + * \param changingPresence If any account is changing presence. + * \sa changingPresence() + */ + +/** + * \fn void AccountSet::onlinenessChanged(bool online) + * + * Emitted whenever any of this set of accounts onlineness changes. + * + * \param online If all accounts are online. + * \sa online() + */ + void AccountSet::onNewAccount(const AccountPtr &account) { mPriv->insertAccount(account); @@ -415,4 +642,31 @@ void AccountSet::onAccountChanged(const AccountPtr &account) mPriv->filterAccount(account); } +void AccountSet::onAccountPropertyChanged(const Tp::AccountPtr &account, const QString &propertyName) +{ + mPriv->filterAccount(account); + + if (propertyName == QLatin1String("requestedPresence")) { + if (mPriv->requestedPresence != account->requestedPresence()) { + mPriv->requestedPresenceChanged(); + } + } else if (propertyName == QLatin1String("currentPresence")) { + if (mPriv->currentPresence != account->currentPresence()) { + mPriv->currentPresenceChanged(); + } + } else if (propertyName == QLatin1String("connectionStatus")) { + if (mPriv->connectionStatus != account->connectionStatus()) { + mPriv->connectionStatusChanged(); + } + } else if (propertyName == QLatin1String("changingPresence")) { + if (mPriv->isChangingPresence != account->isChangingPresence()) { + mPriv->changingPresence(); + } + } else if (propertyName == QLatin1String("online")) { + if (mPriv->isOnline != account->isOnline()) { + mPriv->onlinenessChanged(); + } + } +} + } // Tp diff --git TelepathyQt/account-set.h TelepathyQt/account-set.h index 40dd79af..c0681c32 100644 --- TelepathyQt/account-set.h +++ TelepathyQt/account-set.h @@ -30,6 +30,7 @@ #include <TelepathyQt/Filter> #include <TelepathyQt/Object> #include <TelepathyQt/Types> +#include <TelepathyQt/Presence> #include <QList> #include <QString> @@ -45,6 +46,11 @@ class TP_QT_EXPORT AccountSet : public Object Q_PROPERTY(AccountManagerPtr accountManager READ accountManager) Q_PROPERTY(AccountFilterConstPtr filter READ filter) Q_PROPERTY(QList<AccountPtr> accounts READ accounts) + Q_PROPERTY(Tp::Presence requestedPresence READ requestedPresence WRITE setPresence NOTIFY requestedPresenceChanged) + Q_PROPERTY(Tp::Presence currentPresence READ currentPresence NOTIFY currentPresenceChanged) + Q_PROPERTY(Tp::ConnectionStatus connectionStatus READ connectionStatus NOTIFY connectionStatusChanged) + Q_PROPERTY(bool changingPresence READ changingPresence NOTIFY isChangingPresence) + Q_PROPERTY(bool online READ online NOTIFY onlinenessChanged) public: AccountSet(const AccountManagerPtr &accountManager, @@ -59,14 +65,28 @@ public: QList<AccountPtr> accounts() const; + void setPresence(const Tp::Presence &presence); + + Tp::Presence requestedPresence() const; + Tp::Presence currentPresence() const; + Tp::ConnectionStatus connectionStatus() const; + bool changingPresence() const; + bool online() const; + Q_SIGNALS: void accountAdded(const Tp::AccountPtr &account); void accountRemoved(const Tp::AccountPtr &account); + void requestedPresenceChanged(const Tp::Presence &requestedPresence); + void currentPresenceChanged(const Tp::Presence ¤tPresence); + void connectionStatusChanged(Tp::ConnectionStatus connectionStatus); + void isChangingPresence(bool changingPresence); + void onlinenessChanged(bool online); private Q_SLOTS: TP_QT_NO_EXPORT void onNewAccount(const Tp::AccountPtr &account); TP_QT_NO_EXPORT void onAccountRemoved(const Tp::AccountPtr &account); TP_QT_NO_EXPORT void onAccountChanged(const Tp::AccountPtr &account); + TP_QT_NO_EXPORT void onAccountPropertyChanged(const Tp::AccountPtr &account, const QString &propertyName); private: struct Private; -- 2.12.3 Created attachment 131728 [details] [review] Add connection property averaging and presence setting to AccountSet Add connection property averaging and presence setting for all accounts of an account set. v2: Optimize init Created attachment 137599 [details] [review] Add connection property averaging and presence setting to AccountSet v3: Add automaticPresence property. Small cleanups, including documentation typos. -- GitLab Migration Automatic Message -- This bug has been migrated to freedesktop.org's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.freedesktop.org/telepathy/telepathy-qt/issues/52. |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.