From 555fa9e86134fda6e631e9178e50b444b1079e4f Mon Sep 17 00:00:00 2001
From: =?utf8?q?Enar=20V=C3=A4ikene?= <enar@vaikene.net>
Date: Wed, 5 Oct 2011 14:26:01 +0300
Subject: [PATCH] More work with the IniFile class: * Uses the last '/'
 character to separate section names from key names. 'extensions/about/module'
 means now   section name 'extensions/about'  and key name 'module'. * Fixed
 reading platform-specific parameters where we forgot to store the thisOsOnly
 flag. * Fixed writing parameters where we forgot to update the internal
 cache.

---
 src/libs/Common/IniFile     |  1 +
 src/libs/Common/inifile.cpp |  9 +++++++--
 src/libs/Common/inifile.h   | 21 +++++++++++++++++----
 3 files changed, 25 insertions(+), 6 deletions(-)
 create mode 100644 src/libs/Common/IniFile

diff --git a/src/libs/Common/IniFile b/src/libs/Common/IniFile
new file mode 100644
index 0000000..f1ae13e
--- /dev/null
+++ b/src/libs/Common/IniFile
@@ -0,0 +1 @@
+#include "inifile.h"
diff --git a/src/libs/Common/inifile.cpp b/src/libs/Common/inifile.cpp
index 28e700f..2b21d55 100644
--- a/src/libs/Common/inifile.cpp
+++ b/src/libs/Common/inifile.cpp
@@ -231,6 +231,7 @@ QExplicitlySharedDataPointer<IniFileValue> IniFileImpl::getParameter(QFile & fil
             valueObject = new IniFileValue(currentPos);
             valueObject->name = name;
             valueObject->paramValue = value;
+            valueObject->thisOsOnly = thisOsOnly;
             section.values.insert(name, valueObject);
         }
         else {
@@ -238,6 +239,7 @@ QExplicitlySharedDataPointer<IniFileValue> IniFileImpl::getParameter(QFile & fil
             valueObject = *it;
             valueObject->name = name;
             valueObject->paramValue = value;
+            valueObject->thisOsOnly = thisOsOnly;
         }
 
         // Is this the parameter vwe are looking for?
@@ -257,7 +259,7 @@ QExplicitlySharedDataPointer<IniFileValue> IniFileImpl::getParameter(QFile & fil
 QVariant IniFileImpl::getValue(QString const & paramName, QVariant const & defaultValue)
 {
     // Locate the '/' character that separates section names from key names
-    int idx = paramName.indexOf('/');
+    int idx = paramName.lastIndexOf('/');
     if (idx < 0)
         return defaultValue;
 
@@ -293,7 +295,7 @@ QVariant IniFileImpl::getValue(QString const & paramName, QVariant const & defau
 bool IniFileImpl::setValue(QString const & paramName, QVariant const & value)
 {
     // Locate the '/' character that separates section names from key names
-    int idx = paramName.indexOf('/');
+    int idx = paramName.lastIndexOf('/', -1);
     if (idx < 0)
         return false;
 
@@ -455,6 +457,9 @@ bool IniFileImpl::setValue(QString const & paramName, QVariant const & value)
         if (diff)
             updateCache(currentPos, diff);
 
+        // Update the parameter value in the internal cache
+        valueObject->paramValue = valueString;
+
     }
 
     f.close();
diff --git a/src/libs/Common/inifile.h b/src/libs/Common/inifile.h
index b795e6a..705bd9b 100644
--- a/src/libs/Common/inifile.h
+++ b/src/libs/Common/inifile.h
@@ -35,12 +35,25 @@ namespace Internal {
 /**
  * Class for reading and writing parameter values in INI files.
  *
- * The IniFile class provides access to parameter values in a standard INI file. Every parameter value is
- * identified by a section/key name pair. Key names can be prefixed with 'windows:' or 'linux:' if the
- * parameter value is specific for the given platform. This allows entering platform-specific parameter
- * values to the INI file. INI files can contain comment lines that start with ';' or '#'. Comments are
+ * The IniFile class provides access to parameter values in a standard INI file.
+ * Every parameter value is identified by a section/key name pair. Key names can be prefixed with
+ * 'windows:' or 'linux:' if the parameter value is specific for the given platform.
+ * This allows entering platform-specific parameter values to the INI file.
+ *
+ * INI files can contain comment lines that start with ';' or '#'. Comments are
  * preserved when new values are written to the INI file.
  *
+ * This is a sample INI file:
+ * @code
+ * [main]
+ * # The full name of this parameter is 'main/name'
+ * name = MyApplication
+ *
+ * [extensions/about]
+ * # The full name of this parameter is 'extensions/about/module'
+ * module = libabout.so
+ * @endcode
+ *
  * Values in INI files are stored as strings and the IniFile class expects them to use specific formats if
  * the returned value is supposed to be of a different data type. The following list shows the expected format
  * of different data types:
-- 
2.49.0