insilmaril@0: #include insilmaril@163: #include insilmaril@0: #include "settings.h" insilmaril@0: insilmaril@0: using namespace std; insilmaril@163: insilmaril@163: bool loadStringFromDisk (const QString &fname, QString &s) insilmaril@163: { insilmaril@163: s=""; insilmaril@163: QFile file ( fname); insilmaril@163: if ( !file.open( IO_ReadOnly ) ) return false; insilmaril@163: insilmaril@163: QTextStream ts( &file ); insilmaril@163: ts.setEncoding (QTextStream::UnicodeUTF8); insilmaril@163: while ( !ts.atEnd() ) insilmaril@163: s+=ts.readLine()+"\n"; insilmaril@163: file.close(); insilmaril@163: return true; insilmaril@163: } insilmaril@163: insilmaril@163: bool saveStringToDisk (const QString &fname, const QString &s) insilmaril@163: { insilmaril@163: QFile file( fname); insilmaril@163: insilmaril@163: file.setName ( fname); insilmaril@163: if ( !file.open( IO_WriteOnly ) ) insilmaril@163: { insilmaril@163: file.close(); insilmaril@163: return false; insilmaril@163: } insilmaril@163: insilmaril@163: // Write it finally, and write in UTF8, no matter what insilmaril@163: QTextStream ts( &file ); insilmaril@163: ts.setEncoding (QTextStream::UnicodeUTF8); insilmaril@163: ts << s; insilmaril@163: file.close(); insilmaril@163: return true; insilmaril@163: } insilmaril@163: insilmaril@163: ///////////////////////////////////////////////////////////////// insilmaril@163: // SimpleSettings insilmaril@163: ///////////////////////////////////////////////////////////////// insilmaril@163: SimpleSettings::SimpleSettings() insilmaril@163: { insilmaril@163: clear(); insilmaril@163: } insilmaril@163: insilmaril@163: SimpleSettings::~SimpleSettings() insilmaril@163: { insilmaril@163: } insilmaril@163: insilmaril@163: void SimpleSettings::clear() insilmaril@163: { insilmaril@163: keylist.clear(); insilmaril@163: valuelist.clear(); insilmaril@163: } insilmaril@163: insilmaril@163: void SimpleSettings::readSettings (const QString &path) insilmaril@163: { insilmaril@163: QString s; insilmaril@163: if (!loadStringFromDisk(path,s)) insilmaril@163: { insilmaril@163: qWarning ("SimpleSettings::readSettings() Couldn't read "+path); insilmaril@163: return; insilmaril@163: } insilmaril@163: QStringList lines; insilmaril@163: lines=QStringList::split (QRegExp("\n"),s,false); insilmaril@163: int i; insilmaril@163: QStringList::Iterator it=lines.begin(); insilmaril@163: while (it !=lines.end() ) insilmaril@163: { insilmaril@163: i=(*it).find("=",0); insilmaril@163: keylist.append((*it).left(i)); insilmaril@163: valuelist.append((*it).right((*it).length()-i-1)); insilmaril@163: it++; insilmaril@163: } insilmaril@163: } insilmaril@163: insilmaril@163: void SimpleSettings::writeSettings (const QString &path) insilmaril@163: { insilmaril@163: QString s; insilmaril@163: QStringList::Iterator itk=keylist.begin(); insilmaril@163: QStringList::Iterator itv=valuelist.begin(); insilmaril@163: insilmaril@163: // First search for value in settings saved in map insilmaril@163: while (itk !=keylist.end() ) insilmaril@163: { insilmaril@163: s+=*itk+"="+*itv+"\n"; insilmaril@163: itk++; insilmaril@163: itv++; insilmaril@163: } insilmaril@163: if (!saveStringToDisk(path,s)) insilmaril@163: qWarning ("SimpleSettings::writeSettings() Couldn't write "+path); insilmaril@163: } insilmaril@163: insilmaril@163: QString SimpleSettings::readEntry (const QString &key) insilmaril@163: { insilmaril@163: QStringList::Iterator itk=keylist.begin(); insilmaril@163: QStringList::Iterator itv=valuelist.begin(); insilmaril@163: insilmaril@163: // First search for value in settings saved in map insilmaril@163: while (itk !=keylist.end() ) insilmaril@163: { insilmaril@163: if (*itk == key) insilmaril@163: return *itv; insilmaril@163: itk++; insilmaril@163: itv++; insilmaril@163: } insilmaril@163: qWarning ("SimpleSettings::readEntry() Couldn't find key "+key); insilmaril@163: return ""; insilmaril@163: } insilmaril@163: insilmaril@163: void SimpleSettings::setEntry (const QString &key, const QString &value) insilmaril@163: { insilmaril@163: QStringList::Iterator itk=keylist.begin(); insilmaril@163: QStringList::Iterator itv=valuelist.begin(); insilmaril@163: insilmaril@163: if (!key.isEmpty() ) insilmaril@163: { insilmaril@163: // Search for existing entry first insilmaril@163: while (itk !=keylist.end() ) insilmaril@163: { insilmaril@163: if (*itk == key) insilmaril@163: { insilmaril@163: if (!value.isEmpty()) insilmaril@163: *itv=value; insilmaril@163: else insilmaril@163: *itv=""; insilmaril@164: *itv=value; insilmaril@163: return; insilmaril@163: } insilmaril@163: itk++; insilmaril@163: itv++; insilmaril@163: } insilmaril@163: insilmaril@163: // If no entry exists, append a new one insilmaril@163: keylist.append (key); insilmaril@163: valuelist.append (value); insilmaril@163: } insilmaril@163: } insilmaril@163: insilmaril@163: insilmaril@163: insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: // Settings insilmaril@0: ///////////////////////////////////////////////////////////////// insilmaril@0: Settings::Settings() insilmaril@0: { insilmaril@0: clear(); insilmaril@0: } insilmaril@0: insilmaril@0: Settings::~Settings() insilmaril@0: { insilmaril@0: } insilmaril@0: insilmaril@0: void Settings::clear() insilmaril@0: { insilmaril@0: pathlist.clear(); insilmaril@0: keylist.clear(); insilmaril@0: valuelist.clear(); insilmaril@0: } insilmaril@0: insilmaril@0: void Settings::clearLocal(const QString &s) insilmaril@0: { insilmaril@0: QStringList::Iterator itp=pathlist.begin(); insilmaril@0: QStringList::Iterator itk=keylist.begin(); insilmaril@0: QStringList::Iterator itv=valuelist.begin(); insilmaril@0: insilmaril@0: while (itp !=pathlist.end() ) insilmaril@0: { insilmaril@0: if ((*itk).startsWith (s)) insilmaril@0: { insilmaril@0: itp=pathlist.remove (itp); insilmaril@0: itk=keylist.remove (itk); insilmaril@0: itv=valuelist.remove (itv); insilmaril@0: } else insilmaril@0: { insilmaril@0: itp++; insilmaril@0: itk++; insilmaril@0: itv++; insilmaril@0: } insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: QString Settings::readLocalEntry ( const QString &fpath, const QString & key, const QString & def = QString::null ) insilmaril@0: { insilmaril@0: QStringList::Iterator itp=pathlist.begin(); insilmaril@0: QStringList::Iterator itk=keylist.begin(); insilmaril@0: QStringList::Iterator itv=valuelist.begin(); insilmaril@0: insilmaril@0: // First search for value in settings saved in map insilmaril@0: while (itp !=pathlist.end() ) insilmaril@0: { insilmaril@0: if (*itp == fpath && *itk == key) insilmaril@0: return *itv; insilmaril@0: itp++; insilmaril@0: itk++; insilmaril@0: itv++; insilmaril@0: } insilmaril@0: insilmaril@0: // Fall back to global vym settings insilmaril@0: bool ok; insilmaril@0: return readEntry (key,def, &ok); insilmaril@0: } insilmaril@0: insilmaril@0: void Settings::setLocalEntry (const QString &fpath, const QString &key, const QString &value) insilmaril@0: { insilmaril@0: QStringList::Iterator itp=pathlist.begin(); insilmaril@0: QStringList::Iterator itk=keylist.begin(); insilmaril@0: QStringList::Iterator itv=valuelist.begin(); insilmaril@0: insilmaril@0: if (!fpath.isEmpty() && !key.isEmpty() && !value.isEmpty() ) insilmaril@0: { insilmaril@0: // Search for existing entry first insilmaril@0: while (itp !=pathlist.end() ) insilmaril@0: { insilmaril@0: if (*itp == fpath && *itk == key) insilmaril@0: { insilmaril@0: *itv=value; insilmaril@0: return; insilmaril@0: } insilmaril@0: itp++; insilmaril@0: itk++; insilmaril@0: itv++; insilmaril@0: } insilmaril@0: insilmaril@0: // If no entry exists, append a new one insilmaril@0: pathlist.append (fpath); insilmaril@0: keylist.append (key); insilmaril@0: valuelist.append (value); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: QString Settings::getXMLData (const QString &fpath) insilmaril@0: { insilmaril@0: QString s; insilmaril@0: QStringList::Iterator itp=pathlist.begin(); insilmaril@0: QStringList::Iterator itk=keylist.begin(); insilmaril@0: QStringList::Iterator itv=valuelist.begin(); insilmaril@0: insilmaril@0: while (itp !=pathlist.end() ) insilmaril@0: { insilmaril@0: if (*itp == fpath ) insilmaril@0: if (!(*itv).isEmpty()) insilmaril@0: s+=singleElement ( insilmaril@0: "setting", insilmaril@0: attribut ("key",*itk) insilmaril@0: +attribut ("value",*itv) insilmaril@0: )+"\n"; insilmaril@0: itp++; insilmaril@0: itk++; insilmaril@0: itv++; insilmaril@0: } insilmaril@0: return s; insilmaril@0: } insilmaril@0: