[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
&currentPresence)
+ *
+ * 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 &currentPresence);
+    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