author | zecke <zecke> | 2004-04-08 18:34:28 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-04-08 18:34:28 (UTC) |
commit | e892ef3b71ac582a3ee23e1a2a65e3b43121a40c (patch) (side-by-side diff) | |
tree | ee0a3b858daeca2dcbd24c196c31b18b47616f2e | |
parent | c8481d7f647ffdc08005f630263dfc05cfd7b230 (diff) | |
download | opie-e892ef3b71ac582a3ee23e1a2a65e3b43121a40c.zip opie-e892ef3b71ac582a3ee23e1a2a65e3b43121a40c.tar.gz opie-e892ef3b71ac582a3ee23e1a2a65e3b43121a40c.tar.bz2 |
Be a bit more picky on config files
-rw-r--r-- | library/config.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/library/config.cpp b/library/config.cpp index 8b60f60..0bfb476 100644 --- a/library/config.cpp +++ b/library/config.cpp @@ -431,148 +431,150 @@ QStringList Config::readListEntry( const QString &key, const QChar &sep ) } /*! Removes all entries from the current group. */ void Config::clearGroup() { if ( git == groups.end() ) { qWarning( "no group set" ); return; } if ( !(*git).isEmpty() ) { ( *git ).clear(); changed = TRUE; } } /*! \internal */ void Config::write( const QString &fn ) { QString strNewFile; if ( !fn.isEmpty() ) filename = fn; strNewFile = filename + ".new"; QFile f( strNewFile ); if ( !f.open( IO_WriteOnly|IO_Raw ) ) { qWarning( "could not open for writing `%s'", strNewFile.latin1() ); git = groups.end(); return; } QString str; QCString cstr; QMap< QString, ConfigGroup >::Iterator g_it = groups.begin(); for ( ; g_it != groups.end(); ++g_it ) { str += "[" + g_it.key() + "]\n"; ConfigGroup::Iterator e_it = ( *g_it ).begin(); for ( ; e_it != ( *g_it ).end(); ++e_it ) str += e_it.key() + " = " + *e_it + "\n"; } cstr = str.utf8(); int total_length; total_length = f.writeBlock( cstr.data(), cstr.length() ); if ( total_length != int(cstr.length()) ) { QMessageBox::critical( 0, QObject::tr("Out of Space"), QObject::tr("There was a problem creating\nConfiguration Information \nfor this program.\n\nPlease free up some space and\ntry again.") ); f.close(); QFile::remove( strNewFile ); return; } f.close(); // now rename the file... if ( rename( strNewFile, filename ) < 0 ) { qWarning( "problem renaming the file %s to %s", strNewFile.latin1(), filename.latin1() ); QFile::remove( strNewFile ); } } /*! Returns whether the Config is in a valid state. */ bool Config::isValid() const { return groups.end() != git; } /*! \internal */ void Config::read() { changed = FALSE; if ( !QFileInfo( filename ).exists() ) { git = groups.end(); return; } QFile f( filename ); if ( !f.open( IO_ReadOnly ) ) { git = groups.end(); return; } // hack to avoid problems if big files are passed to test // if they are valid configs ( like passing a mp3 ... ) // I just hope that there are no conf files > 100000 byte // not the best solution, find something else later - if ( f.size() > 100000 ) { + if ( f.getch()!='[' ||f.size() > 100000 ) { + git = groups.end(); return; } + f.ungetch('['); QTextStream s( &f ); #if QT_VERSION <= 230 && defined(QT_NO_CODECS) // The below should work, but doesn't in Qt 2.3.0 s.setCodec( QTextCodec::codecForMib( 106 ) ); #else s.setEncoding( QTextStream::UnicodeUTF8 ); #endif QStringList list = QStringList::split('\n', s.read() ); f.close(); for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { if ( !parse( *it ) ) { git = groups.end(); return; } } } /*! \internal */ bool Config::parse( const QString &l ) { QString line = l.stripWhiteSpace(); if ( line [0] == QChar ( '#' )) return true; // ignore comments if ( line[ 0 ] == QChar( '[' ) ) { QString gname = line; gname = gname.remove( 0, 1 ); if ( gname[ (int)gname.length() - 1 ] == QChar( ']' ) ) gname = gname.remove( gname.length() - 1, 1 ); git = groups.insert( gname, ConfigGroup() ); } else if ( !line.isEmpty() ) { if ( git == groups.end() ) return FALSE; int eq = line.find( '=' ); if ( eq == -1 ) return FALSE; QString key = line.left(eq).stripWhiteSpace(); QString value = line.mid(eq+1).stripWhiteSpace(); ( *git ).insert( key, value ); } return TRUE; } |