Some fixes to connection manager.
[jenirok] / src / common / settings.cpp
index 91b289d..6453bb3 100644 (file)
 
 #include <QtSql/QSqlQuery>
 #include <QtCore/QVariant>
+#include <QtCore/QDebug>
+#include <QtCore/QTranslator>
+#include <QtCore/QLocale>
+#include <gconf/gconf-client.h>
 #include "settings.h"
 #include "db.h"
 
+namespace
+{
+    static int const LANGUAGE_COUNT = 5;
+
+    static QString const LANGUAGE_NAMES[LANGUAGE_COUNT] = {
+       "English",
+       "Deutsch",
+       "Norsk",
+       "Suomi",
+       "Svenska"
+    };
+
+    static QString const LANGUAGE_IDS[LANGUAGE_COUNT] = {
+       "en_US",
+       "de_DE",
+       "nb_NO",
+       "fi_FI",
+       "sv_SE"
+    };
+}
+
 Settings* Settings::instance_ = 0;
 
 Settings* Settings::instance()
@@ -33,17 +58,59 @@ Settings* Settings::instance()
     return instance_;
 }
 
-bool Settings::set(QString const& name, QString const& value)
+void Settings::getLanguages(QList<Settings::Language>& languages)
 {
-    bool connected = DB::connected();
+    for(int i = 0; i < LANGUAGE_COUNT; i++)
+    {
+        Language lang;
+        lang.name = LANGUAGE_NAMES[i];
+        lang.id = LANGUAGE_IDS[i];
+        languages.push_back(lang);
+    }
+}
+
+void Settings::loadLanguage(QApplication& app)
+{
+    QString language = get("language");
 
-    if(!connected)
+    if(language.isEmpty())
     {
-        if(!DB::connect())
-        {
-            return false;
-        }
+       language = QLocale::system().name();
+    }
+
+    QTranslator* translator = new QTranslator(&app);
+    translator->load(":/translations/" + language);
+    app.installTranslator(translator);
+}
+
+void Settings::close()
+{
+    delete instance_;
+    instance_ = 0;
+}
+
+void Settings::startEdit()
+{
+    if(!editing_ && !DB::connected())
+    {
+        editing_ = DB::connect();
+    }
+}
+
+void Settings::endEdit()
+{
+    if(editing_)
+    {
+        DB::disconnect();
+        editing_ = false;
     }
+}
+
+bool Settings::set(QString const& name, QString const& value)
+{
+    bool close = !editing_;
+
+    startEdit();
 
     QSqlQuery deleteQuery;
     deleteQuery.prepare("DELETE FROM settings WHERE name = :name");
@@ -57,28 +124,31 @@ bool Settings::set(QString const& name, QString const& value)
 
     bool returnValue = query.exec();
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
+    settings_[name] = value;
+
     return returnValue;
 }
 
 QString Settings::get(QString const& name)
 {
-    QString result = "";
-
-    bool connected = DB::connected();
+    QMap<QString, QString>::iterator it;
 
-    if(!connected)
+    if((it = settings_.find(name)) != settings_.end())
     {
-        if(!DB::connect())
-        {
-            return result;
-        }
+        return it.value();
     }
 
+    QString result = "";
+
+    bool close = !editing_;
+
+    startEdit();
+
     QSqlQuery query;
 
     query.prepare("SELECT value FROM settings WHERE name = :name");
@@ -93,11 +163,13 @@ QString Settings::get(QString const& name)
         result = getDefaultValue(name);
     }
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
+    settings_[name] = result;
+
     return result;
 
 }
@@ -112,6 +184,7 @@ QString Settings::getDefaultValue(QString const& name)
         defaultValues["autostart"] = "1";
         defaultValues["eniro_site"] = tr("fi");
         defaultValues["cache_size"] = "200";
+        defaultValues["connection"] = "global";
         defaultValuesLoaded = true;
     }
 
@@ -128,28 +201,112 @@ QString Settings::getDefaultValue(QString const& name)
 
 bool Settings::reset()
 {
-    bool connected = DB::connected();
+    bool close = !editing_;
 
-    if(!connected)
-    {
-        if(!DB::connect())
-        {
-            return false;
-        }
-    }
+    startEdit();
 
     QSqlQuery query;
 
     bool ret = query.exec("DELETE FROM settings");
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
     return ret;
 }
 
-Settings::Settings()
+Settings::ConnectionType Settings::getConnectionType()
+{
+    QString value = get("connection");
+
+    if(value == "any")
+    {
+        return ANY;
+    }
+    else if(value == "wlan")
+    {
+        return WLAN;
+    }
+    else if(value == "gprs")
+    {
+        return GPRS;
+    }
+    else
+    {
+        if(value != "global")
+        {
+            qDebug() << "Unknown connection type in settings, using default";
+        }
+
+        QList<QString> values;
+
+        GConfClient* gcClient = NULL;
+        gcClient = gconf_client_get_default();
+
+        g_assert(GCONF_IS_CLIENT(gcClient));
+
+        GError* error = NULL;
+        GSList* list = NULL;
+        list = gconf_client_get_list(gcClient,
+                                     "/system/osso/connectivity/network_type/auto_connect",
+                                     GCONF_VALUE_STRING,
+                                     &error);
+
+        if(error)
+        {
+            qDebug() << "Error: " << error->message;
+            g_error_free(error);
+        }
+        else
+        {
+            while(list)
+            {
+                values.push_back((char *)list->data);
+                list = list->next;
+            }
+        }
+
+        g_object_unref(gcClient);
+
+        if(values.size() == 0)
+        {
+            return ALWAYS_ASK;
+        }
+        else
+        {
+            QString value = values.at(0);
+
+            if(value == "*")
+            {
+                return ANY;
+            }
+            else if(value == "GPRS")
+            {
+                return GPRS;
+            }
+            else if(value == "WLAN_INFRA" || value == "WLAN_ADHOC" || value == "WLAN")
+            {
+                return WLAN;
+            }
+            else
+            {
+                qDebug() << "Unknown connection type: " << value;
+                return ALWAYS_ASK;
+            }
+        }
+
+    }
+
+    return ALWAYS_ASK;
+}
+
+Settings::Settings(): editing_(false)
+{
+}
+
+Settings::~Settings()
 {
+    DB::removeDatabase();
 }