Fix issues with interface and modem availability changes
authorAlexander Kanavin <alex.kanavin@gmail.com>
Tue, 19 Jul 2011 14:22:41 +0000 (17:22 +0300)
committerAlexander Kanavin <alex.kanavin@gmail.com>
Tue, 19 Jul 2011 14:22:41 +0000 (17:22 +0300)
When that happens, signal subsccriptions and lists of objects should be refreshed

TODO
lib/ofonocallbarring.cpp
lib/ofonocallbarring.h
lib/ofonoconnman.cpp
lib/ofonoconnman.h
lib/ofonomessagemanager.cpp
lib/ofonomessagemanager.h
lib/ofonosupplementaryservices.cpp
lib/ofonosupplementaryservices.h
lib/ofonovoicecallmanager.cpp
lib/ofonovoicecallmanager.h

diff --git a/TODO b/TODO
index be91e7f..b1645f9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -14,11 +14,3 @@ Convert "void setPowered(bool powered)" type functions to public slots.
 SIM toolkit bindings. This requires implementing a d-bus agent and some 
 kind of reasonable test. 
  - same for CallHistory.
-
-When automatic modem selection is used, and ofono-qt class moves to using a
-new modem, in addition to property change signal also other d-bus signal 
-subscriptions should be moved to the new modem path.
-
-When interface availability changes, in addition to properties also lists of
-object paths (such as voice calls, messages, GPRS contexts etc) should be 
-refreshed.
index 93f61fe..8c60d09 100644 (file)
@@ -37,18 +37,39 @@ OfonoCallBarring::OfonoCallBarring(OfonoModem::SelectionSetting modemSetting, co
             this, SLOT(setPropertyFailed(const QString&)));
     connect(m_if, SIGNAL(requestPropertyComplete(bool, const QString&, const QVariant&)),
            this, SLOT(requestPropertyComplete(bool, const QString&, const QVariant&)));
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(), 
+
+    connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
+
+    connectDbusSignals(path());
+}
+
+OfonoCallBarring::~OfonoCallBarring()
+{
+}
+
+void OfonoCallBarring::pathChanged(const QString& path)
+{
+    connectDbusSignals(path);
+}
+
+void OfonoCallBarring::connectDbusSignals(const QString& path)
+{
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(), 
                                         "IncomingBarringInEffect",
                                         this,
                                         SIGNAL(incomingBarringInEffect()));
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(), 
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(), 
+                                        "OutgoingBarringInEffect",
+                                        this,
+                                        SIGNAL(outgoingBarringInEffect()));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(), 
+                                        "IncomingBarringInEffect",
+                                        this,
+                                        SIGNAL(incomingBarringInEffect()));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(), 
                                         "OutgoingBarringInEffect",
                                         this,
                                         SIGNAL(outgoingBarringInEffect()));
-}
-
-OfonoCallBarring::~OfonoCallBarring()
-{
 }
 
 void OfonoCallBarring::changePassword(const QString &old_password, 
index dfeb383..76315b3 100644 (file)
@@ -72,6 +72,7 @@ signals:
     void disableAllOutgoingComplete(bool success);
 
 private slots:
+    void pathChanged(const QString& path);
     void propertyChanged(const QString& property, const QVariant& value);
     void setPropertyFailed(const QString& property);
     void changePasswordResp();
@@ -83,6 +84,8 @@ private slots:
     void disableAllOutgoingResp();
     void disableAllOutgoingErr(QDBusError error);
     void requestPropertyComplete(bool success, const QString& property, const QVariant& value);
+private:
+    void connectDbusSignals(const QString& path);
 };
 
 #endif  /* !OFONOCALLBARRING_H */
index 4dcfdba..43a6984 100644 (file)
@@ -50,15 +50,42 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, OfonoConnmanStruc
 OfonoConnMan::OfonoConnMan(OfonoModem::SelectionSetting modemSetting, const QString &modemPath, QObject *parent)
     : OfonoModemInterface(modemSetting, modemPath, "org.ofono.ConnectionManager", OfonoGetAllOnStartup, parent)
 {
+    qDBusRegisterMetaType<OfonoConnmanStruct>();
+    qDBusRegisterMetaType<OfonoConnmanList>();
+
+    m_contextlist = getContextList();
 
+    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)),
+            this, SLOT(propertyChanged(const QString&, const QVariant&)));
+    connect(this, SIGNAL(validityChanged(bool)),
+            this, SLOT(validityChanged(bool)));
+    connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
+
+    connectDbusSignals(path());
+}
+
+OfonoConnMan::~OfonoConnMan()
+{
+}
+
+void OfonoConnMan::validityChanged(bool /*validity*/)
+{
+    m_contextlist = getContextList();
+}
+
+void OfonoConnMan::pathChanged(const QString& path)
+{
+    connectDbusSignals(path);
+}
+
+QStringList OfonoConnMan::getContextList()
+{
     QDBusReply<OfonoConnmanList> reply;
     OfonoConnmanList contexts;
+    QStringList contextList;
 
     QDBusMessage request;
 
-    qDBusRegisterMetaType<OfonoConnmanStruct>();
-    qDBusRegisterMetaType<OfonoConnmanList>();
-
     request = QDBusMessage::createMethodCall("org.ofono",
                                              path(), m_if->ifname(),
                                              "GetContexts");
@@ -67,24 +94,29 @@ OfonoConnMan::OfonoConnMan(OfonoModem::SelectionSetting modemSetting, const QStr
 
     contexts = reply;
     foreach(OfonoConnmanStruct context, contexts) {
-        m_contextlist<< context.path.path();
+        contextList << context.path.path();
     }
+    return contextList;
+}
 
+void OfonoConnMan::connectDbusSignals(const QString& path)
+{
+    QDBusConnection::systemBus().disconnect("org.ofono",QString(),m_if->ifname(),
+                                         "ContextAdded", this,
+                                         SLOT(contextAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
 
-    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)),
-            this, SLOT(propertyChanged(const QString&, const QVariant&)));
+    QDBusConnection::systemBus().disconnect("org.ofono",QString(),m_if->ifname(),
+                                         "ContextRemoved", this,
+                                         SLOT(contextRemovedChanged(const QDBusObjectPath&)));
 
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+    QDBusConnection::systemBus().connect("org.ofono",path,m_if->ifname(),
                                          "ContextAdded", this,
                                          SLOT(contextAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
 
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+    QDBusConnection::systemBus().connect("org.ofono",path,m_if->ifname(),
                                          "ContextRemoved", this,
                                          SLOT(contextRemovedChanged(const QDBusObjectPath&)));
-}
 
-OfonoConnMan::~OfonoConnMan()
-{
 }
 
 void OfonoConnMan::deactivateAll()
index 89e00c2..b5abec8 100644 (file)
@@ -90,6 +90,8 @@ signals:
     void setRoamingAllowedFailed();
 
 private slots:
+    void validityChanged(bool);
+    void pathChanged(const QString& path);
     void propertyChanged(const QString& property, const QVariant& value);
     void contextAddedChanged(const QDBusObjectPath &path, const QVariantMap &properties);
     void contextRemovedChanged(const QDBusObjectPath &path);
@@ -101,6 +103,9 @@ private slots:
     void removeContextErr(const QDBusError& error);
     void setPropertyFailed(const QString& property);
 private:
+    QStringList getContextList();
+    void connectDbusSignals(const QString& path);
+private:
     QStringList m_contextlist;
 };
 
index e9dc839..8101cbc 100644 (file)
@@ -46,12 +46,44 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, OfonoMessageManag
 OfonoMessageManager::OfonoMessageManager(OfonoModem::SelectionSetting modemSetting, const QString &modemPath, QObject *parent)
     : OfonoModemInterface(modemSetting, modemPath, "org.ofono.MessageManager", OfonoGetAllOnFirstRequest, parent)
 {
+    qDBusRegisterMetaType<OfonoMessageManagerStruct>();
+    qDBusRegisterMetaType<OfonoMessageManagerList>();
+
+    m_messagelist = getMessageList();
+
+    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)), 
+            this, SLOT(propertyChanged(const QString&, const QVariant&)));
+    connect(m_if, SIGNAL(setPropertyFailed(const QString&)), 
+            this, SLOT(setPropertyFailed(const QString&)));
+    connect(m_if, SIGNAL(requestPropertyComplete(bool, const QString&, const QVariant&)),
+           this, SLOT(requestPropertyComplete(bool, const QString&, const QVariant&)));
+    connect(this, SIGNAL(validityChanged(bool)),
+            this, SLOT(validityChanged(bool)));
+    connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
+
+    connectDbusSignals(path());
+}
+
+OfonoMessageManager::~OfonoMessageManager()
+{
+}
+
+void OfonoMessageManager::validityChanged(bool /*validity*/)
+{
+    m_messagelist = getMessageList();
+}
+
+void OfonoMessageManager::pathChanged(const QString& path)
+{
+    connectDbusSignals(path);
+}
+
+QStringList OfonoMessageManager::getMessageList()
+{
     QDBusReply<OfonoMessageManagerList> reply;
     OfonoMessageManagerList messages;
     QDBusMessage request;
-
-    qDBusRegisterMetaType<OfonoMessageManagerStruct>();
-    qDBusRegisterMetaType<OfonoMessageManagerList>();
+    QStringList messageList;
 
     request = QDBusMessage::createMethodCall("org.ofono",
                                              path(), m_if->ifname(),
@@ -60,39 +92,46 @@ OfonoMessageManager::OfonoMessageManager(OfonoModem::SelectionSetting modemSetti
 
     messages = reply;
     foreach(OfonoMessageManagerStruct message, messages) {
-        m_messagelist << message.path.path();
+        messageList << message.path.path();
     }
+    return messageList;
+}
 
-    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)), 
-            this, SLOT(propertyChanged(const QString&, const QVariant&)));
-    connect(m_if, SIGNAL(setPropertyFailed(const QString&)), 
-            this, SLOT(setPropertyFailed(const QString&)));
-    connect(m_if, SIGNAL(requestPropertyComplete(bool, const QString&, const QVariant&)),
-           this, SLOT(requestPropertyComplete(bool, const QString&, const QVariant&)));
-
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+void OfonoMessageManager::connectDbusSignals(const QString& path)
+{
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "MessageAdded",
                                          this,
                                          SLOT(onMessageAdded(const QDBusObjectPath&, const QVariantMap&)));
-
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "MessageRemoved",
                                          this,
                                          SLOT(onMessageRemoved(const QDBusObjectPath&)));
-
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(),
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "IncomingMessage",
                                          this,
                                          SIGNAL(incomingMessage(QString, QVariantMap)));
-
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(),
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "ImmediateMessage",
                                          this,
                                          SIGNAL(immediateMessage(QString, QVariantMap)));
-}
 
-OfonoMessageManager::~OfonoMessageManager()
-{
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "MessageAdded",
+                                         this,
+                                         SLOT(onMessageAdded(const QDBusObjectPath&, const QVariantMap&)));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "MessageRemoved",
+                                         this,
+                                         SLOT(onMessageRemoved(const QDBusObjectPath&)));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "IncomingMessage",
+                                         this,
+                                         SIGNAL(incomingMessage(QString, QVariantMap)));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "ImmediateMessage",
+                                         this,
+                                         SIGNAL(immediateMessage(QString, QVariantMap)));
 }
 
 void OfonoMessageManager::requestServiceCenterAddress()
index dcc36e0..ccd33eb 100644 (file)
@@ -89,6 +89,8 @@ signals:
     void incomingMessage(const QString &message, const QVariantMap &info);
 
 private slots:
+    void validityChanged(bool);
+    void pathChanged(const QString& path);
     void propertyChanged(const QString &property, const QVariant &value);
     void setPropertyFailed(const QString &property);
     void requestPropertyComplete(bool success, const QString &property, const QVariant &value);
@@ -98,6 +100,10 @@ private slots:
     void sendMessageErr(QDBusError error);
 
 private:
+    QStringList getMessageList();
+    void connectDbusSignals(const QString& path);
+
+private:
     QStringList m_messagelist;
 };
 
index 69d6ea9..f3d55fc 100644 (file)
 OfonoSupplementaryServices::OfonoSupplementaryServices(OfonoModem::SelectionSetting modemSetting, const QString &modemPath, QObject *parent)
     : OfonoModemInterface(modemSetting, modemPath, "org.ofono.SupplementaryServices", OfonoGetAllOnStartup, parent)
 {
-
     connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)), 
             this, SLOT(propertyChanged(const QString&, const QVariant&)));
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(), 
+    connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
+
+    connectDbusSignals(path());
+}
+
+void OfonoSupplementaryServices::pathChanged(const QString& path)
+{
+    connectDbusSignals(path);
+}
+
+void OfonoSupplementaryServices::connectDbusSignals(const QString& path)
+{
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(), 
+                                            "NotificationReceived",
+                                            this,
+                                            SIGNAL(notificationReceived(QString)));
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(), 
+                                            "RequestReceived",
+                                            this,
+                                            SIGNAL(requestReceived(QString)));
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(), 
                                             "NotificationReceived",
                                             this,
                                             SIGNAL(notificationReceived(QString)));
-    QDBusConnection::systemBus().connect("org.ofono", path(), m_if->ifname(), 
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(), 
                                             "RequestReceived",
                                             this,
                                             SIGNAL(requestReceived(QString)));
index aab7e05..c9e81d8 100644 (file)
@@ -71,6 +71,7 @@ signals:
     void cancelComplete(bool success);
     
 private slots:
+    void pathChanged(const QString& path);
     void propertyChanged(const QString& property, const QVariant& value);
     void initiateResp(QString message, QDBusVariant details);
     void initiateErr(QDBusError error);
@@ -78,8 +79,8 @@ private slots:
     void respondErr(QDBusError error);
     void cancelResp();
     void cancelErr(QDBusError error);
-
 private:
+    void connectDbusSignals(const QString& path);
 
 };
 
index fe05d2a..65209bc 100644 (file)
@@ -58,10 +58,42 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, OfonoVoiceCallMan
 OfonoVoiceCallManager::OfonoVoiceCallManager(OfonoModem::SelectionSetting modemSetting, const QString &modemPath, QObject *parent)
     : OfonoModemInterface(modemSetting, modemPath, "org.ofono.VoiceCallManager", OfonoGetAllOnStartup, parent)
 {
+    qDBusRegisterMetaType<OfonoVoiceCallManagerStruct>();
+    qDBusRegisterMetaType<OfonoVoiceCallManagerList>();
+
+    m_calllist = getCallList();
+
+    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)), 
+            this, SLOT(propertyChanged(const QString&, const QVariant&)));
+    connect(this, SIGNAL(validityChanged(bool)),
+            this, SLOT(validityChanged(bool)));
+    connect(modem(), SIGNAL(pathChanged(QString)), this, SLOT(pathChanged(const QString&)));
+
+    connectDbusSignals(path());
+}
+
+OfonoVoiceCallManager::~OfonoVoiceCallManager()
+{
+}
+
+
+void OfonoVoiceCallManager::validityChanged(bool /*validity*/)
+{
+    m_calllist = getCallList();
+}
+
+void OfonoVoiceCallManager::pathChanged(const QString& path)
+{
+    connectDbusSignals(path);
+}
+
+QStringList OfonoVoiceCallManager::getCallList()
+{
     QDBusReply<OfonoVoiceCallManagerList> reply;
     OfonoVoiceCallManagerList calls;
 
     QDBusMessage request;
+    QStringList messageList;
 
     qDBusRegisterMetaType<OfonoVoiceCallManagerStruct>();
     qDBusRegisterMetaType<OfonoVoiceCallManagerList>();
@@ -73,23 +105,28 @@ OfonoVoiceCallManager::OfonoVoiceCallManager(OfonoModem::SelectionSetting modemS
 
     calls = reply;
     foreach(OfonoVoiceCallManagerStruct call, calls) {
-        m_calllist<< call.path.path();
+        messageList<< call.path.path();
     }
+    return messageList;
+}
 
-    connect(m_if, SIGNAL(propertyChanged(const QString&, const QVariant&)), 
-            this, SLOT(propertyChanged(const QString&, const QVariant&)));
-
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+void OfonoVoiceCallManager::connectDbusSignals(const QString& path)
+{
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "CallAdded", this,
                                          SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
 
-    QDBusConnection::systemBus().connect("org.ofono",path(),m_if->ifname(),
+    QDBusConnection::systemBus().disconnect("org.ofono", QString(), m_if->ifname(),
                                          "CallRemoved", this,
                                          SLOT(callRemovedChanged(const QDBusObjectPath&)));
-}
 
-OfonoVoiceCallManager::~OfonoVoiceCallManager()
-{
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "CallAdded", this,
+                                         SLOT(callAddedChanged(const QDBusObjectPath&, const QVariantMap&)));
+
+    QDBusConnection::systemBus().connect("org.ofono", path, m_if->ifname(),
+                                         "CallRemoved", this,
+                                         SLOT(callRemovedChanged(const QDBusObjectPath&)));
 }
 
 void OfonoVoiceCallManager::dial(const QString &number, const QString &callerid_hide)
index 6060b72..4fd82de 100644 (file)
@@ -92,6 +92,8 @@ signals:
     void hangupMultipartyComplete(const bool status);
 
 private slots:
+    void validityChanged(bool);
+    void pathChanged(const QString& path);
     void propertyChanged(const QString &property, const QVariant &value);
     void callAddedChanged(const QDBusObjectPath &call, const QVariantMap &properties);
     void callRemovedChanged(const QDBusObjectPath &call);
@@ -116,7 +118,9 @@ private slots:
     void hangupMultipartyResp();
     void hangupMultipartyErr(const QDBusError &error);
 
-
+private:
+    QStringList getCallList();
+    void connectDbusSignals(const QString& path);
 private:
     QStringList m_calllist;
 };