You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.8 KiB
152 lines
4.8 KiB
/***************************************************************************
|
|
* Copyright (C) 2006-2012 by Thomas Schweitzer *
|
|
* thomas-schweitzer(at)arcor.de *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License version 2.0 as *
|
|
* published by the Free Software Foundation. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program in the file LICENSE.GPL; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
***************************************************************************/
|
|
|
|
#include "UiGuiIniFileParser.h"
|
|
|
|
#include <tqfile.h>
|
|
#include <tqstringlist.h>
|
|
#include <tqvariant.h>
|
|
#include <tqtextstream.h>
|
|
|
|
/*
|
|
\class UiGuiIniFileParser
|
|
\brief UiGuiIniFileParser is a simple ini file format parser.
|
|
|
|
These ini files need to have key-value pairs in the style
|
|
"key=value". Groups can be defined by writing the groupname
|
|
in the style [groupname] before some key-value pairs.
|
|
|
|
The reason why I use my own class instead of TQSettings is mainly that
|
|
TQSettings always internally sorts the groups alphabetically and also
|
|
rewrites a settings file sorted. Very annoying for me.
|
|
*/
|
|
|
|
/*
|
|
\brief Init and empty all needed lists and strings.
|
|
*/
|
|
UiGuiIniFileParser::UiGuiIniFileParser(void)
|
|
{
|
|
init();
|
|
}
|
|
|
|
/*
|
|
\brief Directly loads and parses the file with name \a iniFileName.
|
|
*/
|
|
UiGuiIniFileParser::UiGuiIniFileParser(const TQString &iniFileName)
|
|
{
|
|
init();
|
|
m_iniFileName = iniFileName;
|
|
parseIniFile();
|
|
}
|
|
|
|
void UiGuiIniFileParser::init()
|
|
{
|
|
m_sections.clear();
|
|
m_keyValueMap.clear();
|
|
m_iniFileName = TQString::null;
|
|
}
|
|
|
|
UiGuiIniFileParser::~UiGuiIniFileParser(void)
|
|
{
|
|
}
|
|
|
|
/*
|
|
\brief Returns the group/section names in the same order as they occurr in the ini file as TQStringList.
|
|
*/
|
|
TQStringList UiGuiIniFileParser::childGroups()
|
|
{
|
|
return m_sections;
|
|
}
|
|
|
|
/*
|
|
\brief Returns the value of the defined \a keyName as TQVariant.
|
|
|
|
The \a keyName is assembled by a section name, a slash and the key name itself.
|
|
For example if you wish to access the value of the following setting:
|
|
<code>[NiceSection]</br>niceKeyName=2</code> you would have to call
|
|
value("NiceSection/niceKeyName").
|
|
*/
|
|
TQVariant UiGuiIniFileParser::value(const TQString &keyName, const TQString &defaultValue)
|
|
{
|
|
if (m_keyValueMap.contains(keyName))
|
|
{
|
|
return m_keyValueMap[keyName];
|
|
}
|
|
return TQVariant(defaultValue);
|
|
}
|
|
|
|
/*
|
|
\brief Parses the ini file and stores the key value pairs in the internal vectors \a keys and \a values.
|
|
*/
|
|
void UiGuiIniFileParser::parseIniFile()
|
|
{
|
|
TQFile iniFile(m_iniFileName);
|
|
|
|
if (iniFile.open(IO_ReadOnly))
|
|
{
|
|
// Clear the vectors holding the keys and values.
|
|
m_sections.clear();
|
|
m_keyValueMap.clear();
|
|
|
|
TQTextStream iniFileStream(&iniFile);
|
|
TQString line;
|
|
TQString currentSectionName = TQString::null;
|
|
TQString keyName = TQString::null;
|
|
TQString valueAsString = TQString::null;
|
|
|
|
while (!iniFileStream.atEnd())
|
|
{
|
|
line = iniFileStream.readLine().stripWhiteSpace();
|
|
|
|
// Test if the read line is a section name and if so remeber it.
|
|
if (line.startsWith("[") && line.endsWith("]"))
|
|
{
|
|
// Store the section name.
|
|
currentSectionName = line.mid(1, line.length() - 2);
|
|
m_sections.push_back(currentSectionName);
|
|
}
|
|
// Otherwise test whether the line has a assign char
|
|
else if (line.contains("="))
|
|
{
|
|
int indexOfFirstAssign = line.find("=");
|
|
keyName = line.left(indexOfFirstAssign);
|
|
|
|
if (!keyName.isEmpty())
|
|
{
|
|
valueAsString = line.remove(0, indexOfFirstAssign + 1);
|
|
// Remove any existing double quotes from the value.
|
|
if (valueAsString.startsWith("\"") && valueAsString.endsWith("\""))
|
|
{
|
|
valueAsString = valueAsString.mid(1, valueAsString.length() - 2);
|
|
}
|
|
|
|
// Prepend an eventually section name to the key name.
|
|
if (!currentSectionName.isEmpty())
|
|
{
|
|
keyName = currentSectionName + "/" + keyName;
|
|
}
|
|
|
|
// Store the key and value in the map.
|
|
m_keyValueMap.insert(keyName, valueAsString);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|