Some connection handling improvements made for daemon. Changelog updated to newest...
[jenirok] / src / daemon / calllistener.cpp
index c44e5ce..4a2f1c5 100644 (file)
@@ -77,6 +77,7 @@ bool CallListener::begin()
                        this,
                        SLOT(callTerminate()));
 
+    findGprsId();
 
     qDebug() << "Starting...";
 
@@ -208,9 +209,9 @@ void CallListener::requestFinished(QVector <Source::Result> const& results,
 
     if(closeConnection_)
     {
+        closeConnection_ = false;
         ConnectionManager cm;
         cm.disconnect(true);
-        closeConnection_ = false;
     }
 }
 
@@ -252,8 +253,6 @@ void CallListener::showResult(QString const& text)
 
 void CallListener::incomingCall(QDBusObjectPath path, QString number)
 {
-    qDebug() << "Incoming: " << number;
-
     ContactManager cm;
 
     if(!cm.numberExists(number))
@@ -284,12 +283,17 @@ void CallListener::callTerminate()
 
     if(closeConnection_)
     {
+        closeConnection_ = false;
         ConnectionManager cm;
         cm.disconnect(true);
-        closeConnection_ = false;
     }
 
     searchClose();
+
+    if(gprsId_.isEmpty())
+    {
+        findGprsId();
+    }
 }
 
 void CallListener::showDelayedResult(QString const& text, int delay)
@@ -408,6 +412,9 @@ bool CallListener::handleConnection()
 
     int cretries = 0;
 
+    bool tryGprs = (!gprsId_.isEmpty() &&
+                   (configType == Settings::ANY || configType == Settings::GPRS));
+
     while(cretries < CONNECTION_LOOKUP_RETRIES)
     {
         if(!initialized_)
@@ -420,6 +427,15 @@ bool CallListener::handleConnection()
             break;
         }
 
+        // ICD doesn't always find gprs connection during call, so
+        // try to use gprs anyway.
+        if(tryGprs && is3g())
+        {
+            best.id = gprsId_;
+            qDebug() << "Trying gprs";
+            break;
+        }
+
         qDebug() << "No connections found, retrying...";
 
         cretries++;
@@ -443,8 +459,6 @@ bool CallListener::handleConnection()
             return false;
         }
 
-        sleep(WAIT_BETWEEN_RETRIES);
-
         if(cm.connect(best.id))
         {
             break;
@@ -455,6 +469,8 @@ bool CallListener::handleConnection()
             return false;
         }
 
+        sleep(WAIT_BETWEEN_RETRIES);
+
         qDebug() << "Unable to connect, retrying...";
         retries++;
 
@@ -505,3 +521,46 @@ void CallListener::sleep(int ms)
         QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents);
     }
 }
+
+void CallListener::findGprsId()
+{
+    ConnectionManager cm;
+
+    QList<ConnectionManager::Connection> connections;
+
+    if(cm.scanConnections(connections, ConnectionManager::GPRS) &&
+       connections.size() > 0)
+    {
+        gprsId_ = connections.at(0).id;
+    }
+}
+
+bool CallListener::is3g()
+{
+    QDBusMessage msg = QDBusMessage::createMethodCall("com.nokia.phone.net",
+                                                      "/com/nokia/phone/net",
+                                                      "Phone.Net",
+                                                      "get_registration_status");
+
+    QDBusMessage rep = systemBus_.call(msg);
+
+    if(rep.type() == QDBusMessage::ErrorMessage)
+    {
+        qDebug() << "Unable to get network status";
+        return false;
+    }
+
+    uint status = rep.arguments().value(6).toUInt();
+
+    if(status & 0x10) // 3.5G (HSUPA)
+    {
+        return true;
+    }
+    else if(status & 0x08) // 3G (HSDPA)
+    {
+        return true;
+    }
+
+    // Something else
+    return false;
+}