introducing autocached settings
[quassel.git] / src / common / settings.cpp
index 3d43e0a..eb4fc72 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-07 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
+#include <QCoreApplication>
 #include <QSettings>
 #include <QStringList>
 #include <QDebug>
 
 #ifdef Q_WS_QWS
 #include <Qtopia>
-#include <QCoreApplication>
 #endif
 
 #include "settings.h"
 
-Settings::Settings(QString g) : group(g) {
+static QHash<QString, QHash<QString, QVariant> > __settingsCache__;
 
+Settings::Settings(QString g, QString applicationName)
+
+#ifdef Q_WS_MAC
+  : QSettings(QCoreApplication::organizationDomain(), applicationName),
+#else
+  : QSettings(QCoreApplication::organizationName(), applicationName),
+#endif
+    group(g)
+{
+
+/* we need to call the constructor immediately in order to set the path...
 #ifndef Q_WS_QWS
-  QSettings();
+  QSettings(QCoreApplication::organizationName(), applicationName);
 #else
   // FIXME sandboxDir() is not currently working correctly...
   //if(Qtopia::sandboxDir().isEmpty()) QSettings();
@@ -44,18 +55,10 @@ Settings::Settings(QString g) : group(g) {
     QSettings(sandboxPath + "/etc/QuasselIRC.conf", QSettings::IniFormat);
     qDebug() << sandboxPath + "/etc/QuasselIRC.conf";
   } else {
-    QSettings();
+    QSettings(QCoreApplication::organizationName(), applicationName);
   }
 #endif
-}
-
-Settings::~Settings() {
-
-}
-
-void Settings::setGroup(QString g) {
-  group = g;
-
+*/
 }
 
 QStringList Settings::allLocalKeys() {
@@ -65,15 +68,21 @@ QStringList Settings::allLocalKeys() {
   return res;
 }
 
-QStringList Settings::localChildKeys() {
-  beginGroup(group);
+QStringList Settings::localChildKeys(const QString &rootkey) {
+  QString g;
+  if(rootkey.isEmpty()) g = group;
+  else g = QString("%1/%2").arg(group, rootkey);
+  beginGroup(g);
   QStringList res = childKeys();
   endGroup();
   return res;
 }
 
-QStringList Settings::localChildGroups() {
-  beginGroup(group);
+QStringList Settings::localChildGroups(const QString &rootkey) {
+  QString g;
+  if(rootkey.isEmpty()) g = group;
+  else g = QString("%1/%2").arg(group, rootkey);
+  beginGroup(g);
   QStringList res = childGroups();
   endGroup();
   return res;
@@ -82,14 +91,17 @@ QStringList Settings::localChildGroups() {
 void Settings::setLocalValue(const QString &key, const QVariant &data) {
   beginGroup(group);
   setValue(key, data);
+  setCacheValue(group, key, data);
   endGroup();
 }
 
-QVariant Settings::localValue(const QString &key, const QVariant &def) {
-  beginGroup(group);
-  QVariant res = value(key, def);
-  endGroup();
-  return res;
+const QVariant &Settings::localValue(const QString &key, const QVariant &def) {
+  if(!isCached(group, key)) {
+    beginGroup(group);
+    setCacheValue(group, key, value(key, def));
+    endGroup();
+  }
+  return cacheValue(group, key);
 }
 
 void Settings::removeLocalKey(const QString &key) {
@@ -97,3 +109,16 @@ void Settings::removeLocalKey(const QString &key) {
   remove(key);
   endGroup();
 }
+
+
+void Settings::setCacheValue(const QString &group, const QString &key, const QVariant &data) {
+  ::__settingsCache__[group][key] = data;
+}
+
+const QVariant &Settings::cacheValue(const QString &group, const QString &key) {
+  return ::__settingsCache__[group][key];
+}
+
+bool Settings::isCached(const QString &group, const QString &key) {
+  return ::__settingsCache__.contains(group) && ::__settingsCache__[group].contains(key);
+}