Some fixes to connection manager.
[jenirok] / src / common / settings.cpp
index 25fc13b..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()
 {
-       if(!instance_)
-       {
-               instance_ = new Settings;
-       }
+    if(!instance_)
+    {
+        instance_ = new Settings;
+    }
+
+    return instance_;
+}
+
+void Settings::getLanguages(QList<Settings::Language>& languages)
+{
+    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(language.isEmpty())
+    {
+       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();
+    }
+}
 
-       return instance_;
+void Settings::endEdit()
+{
+    if(editing_)
+    {
+        DB::disconnect();
+        editing_ = false;
+    }
 }
 
 bool Settings::set(QString const& name, QString const& value)
 {
-       bool connected = DB::connected();
-
-       if(!connected)
-       {
-               if(!DB::connect())
-               {
-                       return false;
-               }
-       }
-
-       QSqlQuery deleteQuery;
-       deleteQuery.prepare("DELETE FROM settings WHERE name = :name");
-       deleteQuery.bindValue(":name", QVariant(name));
-       deleteQuery.exec();
-
-       QSqlQuery query;
-       query.prepare("INSERT INTO settings(name, value) VALUES(:name, :value)");
-       query.bindValue(":name", QVariant(name));
-       query.bindValue(":value", QVariant(value));
-
-       bool returnValue = query.exec();
-
-       if(!connected)
-       {
-               DB::disconnect();
-       }
-
-       return returnValue;
+    bool close = !editing_;
+
+    startEdit();
+
+    QSqlQuery deleteQuery;
+    deleteQuery.prepare("DELETE FROM settings WHERE name = :name");
+    deleteQuery.bindValue(":name", QVariant(name));
+    deleteQuery.exec();
+
+    QSqlQuery query;
+    query.prepare("INSERT INTO settings(name, value) VALUES(:name, :value)");
+    query.bindValue(":name", QVariant(name));
+    query.bindValue(":value", QVariant(value));
+
+    bool returnValue = query.exec();
+
+    if(close)
+    {
+        endEdit();
+    }
+
+    settings_[name] = value;
+
+    return returnValue;
 }
 
 QString Settings::get(QString const& name)
 {
-       QString result = "";
+    QMap<QString, QString>::iterator it;
 
-       bool connected = DB::connected();
+    if((it = settings_.find(name)) != settings_.end())
+    {
+        return it.value();
+    }
 
-       if(!connected)
-       {
-               if(!DB::connect())
-               {
-                       return result;
-               }
-       }
+    QString result = "";
 
-       QSqlQuery query;
+    bool close = !editing_;
 
-       query.prepare("SELECT value FROM settings WHERE name = :name");
-       query.bindValue(":name", name);
+    startEdit();
 
-       if(query.exec() && query.next())
-       {
-               result = query.value(0).toString();
-       }
-       else
-       {
-               result = getDefaultValue(name);
-       }
+    QSqlQuery query;
 
-       if(!connected)
-       {
-               DB::disconnect();
-       }
+    query.prepare("SELECT value FROM settings WHERE name = :name");
+    query.bindValue(":name", name);
 
-       return result;
+    if(query.exec() && query.next())
+    {
+        result = query.value(0).toString();
+    }
+    else
+    {
+        result = getDefaultValue(name);
+    }
+
+    if(close)
+    {
+        endEdit();
+    }
+
+    settings_[name] = result;
+
+    return result;
 
 }
 
 QString Settings::getDefaultValue(QString const& name)
 {
-       static bool defaultValuesLoaded = false;
-       static QMap <QString, QString> defaultValues;
+    static bool defaultValuesLoaded = false;
+    static QMap <QString, QString> defaultValues;
 
-       if(!defaultValuesLoaded)
-       {
-               defaultValues["autostart"] = "1";
-               defaultValues["eniro_site"] = tr("fi");
-               defaultValues["cache_size"] = "200";
-               defaultValuesLoaded = true;
-       }
+    if(!defaultValuesLoaded)
+    {
+        defaultValues["autostart"] = "1";
+        defaultValues["eniro_site"] = tr("fi");
+        defaultValues["cache_size"] = "200";
+        defaultValues["connection"] = "global";
+        defaultValuesLoaded = true;
+    }
 
-       QMap<QString, QString>::const_iterator it = defaultValues.find(name);
+    QMap<QString, QString>::const_iterator it = defaultValues.find(name);
 
-       if(it != defaultValues.end())
-       {
-               return it.value();
-       }
+    if(it != defaultValues.end())
+    {
+        return it.value();
+    }
 
-       return "";
+    return "";
 
 }
 
 bool Settings::reset()
 {
-       bool connected = DB::connected();
+    bool close = !editing_;
 
-       if(!connected)
-       {
-               if(!DB::connect())
-               {
-                       return false;
-               }
-       }
+    startEdit();
 
-       QSqlQuery query;
+    QSqlQuery query;
 
-       bool ret = query.exec("DELETE FROM settings");
+    bool ret = query.exec("DELETE FROM settings");
 
-       if(!connected)
-       {
-               DB::disconnect();
-       }
+    if(close)
+    {
+        endEdit();
+    }
+
+    return ret;
+}
 
-       return ret;
+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()
+Settings::~Settings()
 {
+    DB::removeDatabase();
 }