[Bug 100363] [PATCH] Add connection property averaging and presence setting to AccountSet
bugzilla-daemon at freedesktop.org
bugzilla-daemon at freedesktop.org
Mon Jun 5 21:47:42 UTC 2017
https://bugs.freedesktop.org/show_bug.cgi?id=100363
--- Comment #8 from James Smith <smithjd15 at gmail.com> ---
Comment on attachment 131719
--> https://bugs.freedesktop.org/attachment.cgi?id=131719
Add connection property averaging to AccountSet
>From 13321669e387949ae904d0e8e2afef9fa1663efb Mon Sep 17 00:00:00 2001
From: "James D. Smith" <smithjd15 at 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
--
You are receiving this mail because:
You are the assignee for the bug.
You are the QA Contact for the bug.
More information about the telepathy-bugs
mailing list