]> vaikene.ee Git - evaf/blobdiff - src/libs/Common/inifile.h
Mac OS changes and switched to c++11.
[evaf] / src / libs / Common / inifile.h
index 59f6fa0b1ff10fea94cace947395669be72e217c..6bcf86beb6f7d234f0959aeb4aede742e5c95351 100644 (file)
@@ -3,7 +3,7 @@
  * @brief Class for reading and writing parameter values in INI files.
  * @author Enar Vaikene
  *
- * Copyright (c) 2011 Enar Vaikene
+ * Copyright (c) 2011-2019 Enar Vaikene
  *
  * This file is part of the eVaf C++ cross-platform application development framework.
  *
 
 #include "libcommon.h"
 
+#include <QString>
+#include <QVariant>
+#include <QIODevice>
+#include <QScopedPointer>
+
 namespace eVaf {
 namespace Common {
 namespace Internal {
@@ -31,25 +36,48 @@ 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 = "My Application"
+ *
+ * # 4-byte binary version number 1.0.7.10 with the name 'main/version'
+ * version = &#x01;&#x00;&#x07;&#x0a;
+ *
+ * [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:
  *
  * @li Bool - '0', 'false', 'off', 'no' are equal to false and '1', 'true', 'on', 'yes' are equal to true;
- * @li Char - a single character or an ASCII code as '\0NNN' or '\0xNN';
+ * @li Char - a single character or an UTF-16 code as '\0NNNNNN' (oct) or '\0xNNNN' (hex);
  * @li Date - date string in the ISO 8601 format YYYY-MM-DD;
  * @li DateTime - date and time string in the ISO 8601 format YYY-MM-DDTHH:MM:SSTZD;
  * @li Double - the decimal point is always '.' regardless of the locale;
  * @li Int - only base 10 (decimal) is allowed;
  * @li Time - 24h time string in the format HH:MM:SS
  * @li UInt - base 16 (hex) if the string is prefixed with '0x'; base 8 if the string starts with '0'; otherwise
- * the value is expected to be base 10 (decimal).
+ * the value is expected to be base 10 (decimal);
+ * @li ByteArray - non-printable bytes and special characters are encoded as numeric character or character entity references;
+ * @li String - non-printable and special characters are encoded as numeric character or character entity references.
+ *
+ * Strings and Byte array values can be enclosed in single or double quotes. The IniFile class does this automatically when
+ * saving String or Byte array values with leading or trailing spaces. Quotes are removed from the parameter value prior
+ * returning the value to the application. Use character entity references "&quot;" and "&apos;" if quotes should be part of
+ * the parameter value.
  */
 class COMMON_EXPORT IniFile
 {
@@ -71,11 +99,6 @@ public:
      * The isValid() method returns true if the INI file is can be used. Use this
      * method after creating the object to verify that opening the INI file in the specified
      * mode succeeded.
-     *
-     * If the object is not valid, then:
-     * @li Writing to the INI file always fails; the internal cache is still updated and reading the parameter returns
-     * the new value;
-     * @li Reading from the INI file returns the cached value or the default value if no values with this name are written.
      */
     bool isValid() const;
 
@@ -93,7 +116,7 @@ public:
      * @return The value from the INI file or an invalid QVariant if failed
      *
      * The getValue() method reads a parameter value from the INI file. Parameters are identified by a section and key name pair
-     * in the format '&lt;section&gt;/&lt;key&gt'. For example, if the section is called 'general' and the key is called 'log_level',
+     * in the format '\<section\>/\<key\>'. For example, if the section is called 'general' and the key is called 'log_level',
      * then the name of the parameter should be given as 'general/log_level'. Parameter names are case insensitive.
      *
      * If the parameter cannot be read because it is not found in the INI file or the INI file object is invalid, returns the
@@ -104,8 +127,10 @@ public:
      * @li If the value in the INI file is 'abc' and the default value an integer value, then validation
      * fails and the method returns the default value;
      * @li If the default value is a boolean value, then the method accepts '1', 'true', 'on' and 'yes' as valid values.
+     *
+     * @sa eVaf::Common::toVariant()
      */
-    QVariant getValue(QString const & paramName, QVariant const & defaultValue = QVariant::Invalid);
+    QVariant getValue(QByteArray const & paramName, QVariant const & defaultValue = QVariant::Invalid);
 
     /**
      * Writes a value to the INI file.
@@ -114,26 +139,23 @@ public:
      * @return True if succeeded and false if not
      *
      * The setValue() method writes a parameter value to the INI file. Parameters are identified by a section and key name pair
-     * in the format '&lt;section&gt;/&lt;key&gt;'. For example, if the section is called 'general' and the key is called 'log_level',
+     * in the format '\<section\>/\<key\>'. For example, if the section is called 'general' and the key is called 'log_level',
      * the the name of the parameter should be given as 'general/log_level'. Parameter names are case insensitive.
      *
      * The method returns true if the parameter value was written into the INI file and false if not. Use the errorString() method
      * to get a human-readable error string if writing to the INI file fails.
-     *
-     * Writing to an invalid INI file always fails, but the value is still stored into the internal cache. Readin the same parameter
-     * value returns the new value even if it was actually not stored into the INI file.
      */
-    bool setValue(QString const & paramName, QVariant const & value);
+    bool setValue(QByteArray const & paramName, QVariant const & value);
 
 
 private:
 
     /// Pointer to the internal implementation of the class
-    Internal::IniFileImpl * d;
+    QScopedPointer<Internal::IniFileImpl> d;
 
 };
 
 } // namespace eVaf::Common
 } // namespace eVaf
 
-#endif // INIFILE_H
+#endif // inifile.h