summaryrefslogtreecommitdiff
path: root/library
Side-by-side diff
Diffstat (limited to 'library') (more/less context) (show whitespace changes)
-rw-r--r--library/config.cpp164
-rw-r--r--library/config.h33
-rw-r--r--library/qpeglobal.h3
3 files changed, 182 insertions, 18 deletions
diff --git a/library/config.cpp b/library/config.cpp
index 664ca34..61ff089 100644
--- a/library/config.cpp
+++ b/library/config.cpp
@@ -1,66 +1,66 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000,2004 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qdir.h>
#include <qmessagebox.h>
#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
#include <qtextcodec.h>
#endif
#include <qtextstream.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define QTOPIA_INTERNAL_LANGLIST
#include "config.h"
#include "global.h"
/*!
\internal
*/
QString Config::configFilename(const QString& name, Domain d)
{
switch (d) {
case File:
return name;
case User: {
QDir dir = (QString(getenv("HOME")) + "/Settings");
if ( !dir.exists() )
mkdir(dir.path().local8Bit(),0700);
return dir.path() + "/" + name + ".conf";
}
}
return name;
}
/*!
\class Config config.h
\brief The Config class provides for saving application cofniguration state.
You should keep a Config in existence only while you do not want others
to be able to change the state. There is no locking currently, but there
may be in the future.
*/
/*!
@@ -517,64 +517,226 @@ void Config::read()
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.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;
}
+
+
+
+bool Config::hasGroup( const QString& name )const {
+ return ( groups. find ( name ) != groups. end ( ));
+};
+
+QStringList Config::groupList()const {
+ QStringList sl;
+ for ( ConfigGroupMap::ConstIterator it = groups. begin ( ); it != groups. end ( ); ++it )
+ sl << it.key();
+
+ return sl;
+};
+
+/////////////
+// Qtopia 2.1 Functions
+//
+////////////
+
+QStringList Config::allGroups()const {
+ return groupList();
+}
+
+/*!
+ Returns the time stamp for the config identified by \a name. The
+ time stamp represents the time the config was last committed to storage.
+ Returns 0 if there is no time stamp available for the config.
+
+ A \a domain can optionally be specified and defaults to User.
+ See \l{Config()} for details.
+
+ First availability: Qtopia 2.0
+*/
+long Config::timeStamp(const QString& name, Domain domain)
+{
+#ifdef Q_WS_WIN
+ // Too slow (many conversions too and from time_t and QDataTime)
+ QDateTime epoch;
+ epoch.setTime_t(0);
+ return epoch.secsTo(QFileInfo(Config::configFilename(name,domain)).lastModified());
+#else
+ QString fn = Config::configFilename(name,domain);
+ struct stat b;
+ if (lstat( QFile::encodeName(fn).data(), &b ) == 0)
+ return b.st_mtime;
+ else
+ return 0;
+#endif
+}
+
+
+/*!
+ Removes the current group (and all its entries).
+
+ The current group becomes unset.
+
+ First availability: Qtopia 2.0
+*/
+void Config::removeGroup()
+{
+ if ( git == groups.end() ) {
+ qWarning( "no group set" );
+ return;
+ }
+
+ groups.remove(git.key());
+ git = groups.end();
+ changed = TRUE;
+}
+
+/*!
+ Removes the current group (and all its entries).
+
+ The current group becomes unset.
+
+ First availability: Qtopia 2.0
+*/
+void Config::removeGroup(const QString& g)
+{
+ groups.remove(g);
+ git = groups.end();
+}
+
+
+
+/*!
+ Writes a (\a key, \a lst) entry to the current group.
+
+ The list is
+ separated by the two characters "^e", and "^" withing the strings
+ is replaced by "^^", such that the strings may contain any character,
+ including "^".
+
+ Null strings are also allowed, and are recorded as "^0" in the string.
+
+ First availability: Qtopia 2.0
+
+ \sa readListEntry()
+*/
+void Config::writeEntry( const QString &key, const QStringList &lst )
+{
+ QString s;
+ for (QStringList::ConstIterator it=lst.begin(); it!=lst.end(); ++it) {
+ QString el = *it;
+ if ( el.isNull() ) {
+ el = "^0";
+ } else {
+ el.replace(QRegExp("\\^"), "^^");
+ }
+ s+=el;
+ s+="^e"; // end of element
+ }
+ writeEntry(key, s);
+}
+
+/*!
+ Returns the string list entry stored using \a key and with
+ the escaped seperator convention described in writeListEntry().
+
+ First availability: Qtopia 2.0
+*/
+QStringList Config::readListEntry( const QString &key ) const
+{
+ QString value = readEntry( key, QString::null );
+ QStringList l;
+ QString s;
+ bool esc=FALSE;
+ for (int i=0; i<(int)value.length(); i++) {
+ if ( esc ) {
+ if ( value[i] == 'e' ) { // end-of-string
+ l.append(s);
+ s="";
+ } else if ( value[i] == '0' ) { // null string
+ s=QString::null;
+ } else {
+ s.append(value[i]);
+ }
+ esc = FALSE;
+ } else if ( value[i] == '^' ) {
+ esc = TRUE;
+ } else {
+ s.append(value[i]);
+ if ( i == (int)value.length()-1 )
+ l.append(s);
+ }
+ }
+ return l;
+}
+
+QString Config::readEntry( const QString &key, const QString &deflt ) const
+{ return ((Config*)this)->readEntry(key,deflt); }
+QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const
+{ return ((Config*)this)->readEntryCrypt(key,deflt); }
+QString Config::readEntryDirect( const QString &key, const QString &deflt ) const
+{ return ((Config*)this)->readEntryDirect(key,deflt); }
+int Config::readNumEntry( const QString &key, int deflt ) const
+{ return ((Config*)this)->readNumEntry(key,deflt); }
+bool Config::readBoolEntry( const QString &key, bool deflt ) const
+{ return ((Config*)this)->readBoolEntry(key,deflt); }
+QStringList Config::readListEntry( const QString &key, const QChar &sep ) const
+{ return ((Config*)this)->readListEntry(key,sep); }
diff --git a/library/config.h b/library/config.h
index a2f9b2d..29ba0d6 100644
--- a/library/config.h
+++ b/library/config.h
@@ -1,109 +1,108 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000, 2004 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef CONFIG_H
#define CONFIG_H
// ##### could use QSettings with Qt 3.0
+#include <qpe/qpeglobal.h>
+
#include <qmap.h>
#include <qstringlist.h>
+typedef QMap< QString, QString > ConfigGroup;
+typedef QMap< QString, ConfigGroup> ConfigGroupMap;
+
class ConfigPrivate;
class Config
{
public:
- typedef QMap< QString, QString > ConfigGroup;
enum Domain { File, User };
Config( const QString &name, Domain domain=User );
~Config();
+ QTOPIA_MERGED_METHOD(static long timeStamp( const QString &name, Domain domain=User ), "2.1");
+
bool operator == ( const Config & other ) const { return (filename == other.filename); }
bool operator != ( const Config & other ) const { return (filename != other.filename); }
bool isValid() const;
bool hasKey( const QString &key ) const;
// inline for better SharpROM BC
- inline bool hasGroup ( const QString &gname ) const { return ( groups. find ( gname ) != groups. end ( )); };
- inline QStringList groupList ( ) const { QStringList sl; for ( QMap< QString, ConfigGroup >::ConstIterator it = groups. begin ( ); it != groups. end ( ); ++it ) { sl << it.key(); } return sl; };
+ NOT_IN_QPE(bool hasGroup ( const QString &gname ) const);
+ NOT_IN_QPE(QStringList groupList ( ) const);
void setGroup( const QString &gname );
void writeEntry( const QString &key, const char* value );
void writeEntry( const QString &key, const QString &value );
void writeEntryCrypt( const QString &key, const QString &value );
void writeEntry( const QString &key, int num );
#ifdef Q_HAS_BOOL_TYPE
void writeEntry( const QString &key, bool b );
#endif
void writeEntry( const QString &key, const QStringList &lst, const QChar &sep );
+ QTOPIA_MERGED_METHOD(void writeEntry( const QString &key, const QStringList &lst ), "2.1.0");
+
void removeEntry( const QString &key );
QString readEntry( const QString &key, const QString &deflt = QString::null ) const;
QString readEntryCrypt( const QString &key, const QString &deflt = QString::null ) const;
QString readEntryDirect( const QString &key, const QString &deflt = QString::null ) const;
int readNumEntry( const QString &key, int deflt = -1 ) const;
bool readBoolEntry( const QString &key, bool deflt = FALSE ) const;
QStringList readListEntry( const QString &key, const QChar &sep ) const;
+ QTOPIA_MERGED_METHOD(QStringList readListEntry( const QString &key ) const, "2.1.0");
// For compatibility, non-const versions.
QString readEntry( const QString &key, const QString &deflt );
QString readEntryCrypt( const QString &key, const QString &deflt );
QString readEntryDirect( const QString &key, const QString &deflt );
int readNumEntry( const QString &key, int deflt );
bool readBoolEntry( const QString &key, bool deflt );
QStringList readListEntry( const QString &key, const QChar &sep );
void clearGroup();
+ QTOPIA_MERGED_METHOD(void removeGroup(), "2.1.0");
+ QTOPIA_MERGED_METHOD(void removeGroup(const QString&), "2.1.0");
+ QTOPIA_MERGED_METHOD(QStringList allGroups() const, "2.1.0");
void write( const QString &fn = QString::null );
protected:
void read();
bool parse( const QString &line );
QMap< QString, ConfigGroup > groups;
QMap< QString, ConfigGroup >::Iterator git;
QString filename;
QString lang;
QString glang;
bool changed;
ConfigPrivate *d;
static QString configFilename(const QString& name, Domain);
private: // Sharp ROM compatibility
Config( const QString &name, bool what );
};
-inline QString Config::readEntry( const QString &key, const QString &deflt ) const
-{ return ((Config*)this)->readEntry(key,deflt); }
-inline QString Config::readEntryCrypt( const QString &key, const QString &deflt ) const
-{ return ((Config*)this)->readEntryCrypt(key,deflt); }
-inline QString Config::readEntryDirect( const QString &key, const QString &deflt ) const
-{ return ((Config*)this)->readEntryDirect(key,deflt); }
-inline int Config::readNumEntry( const QString &key, int deflt ) const
-{ return ((Config*)this)->readNumEntry(key,deflt); }
-inline bool Config::readBoolEntry( const QString &key, bool deflt ) const
-{ return ((Config*)this)->readBoolEntry(key,deflt); }
-inline QStringList Config::readListEntry( const QString &key, const QChar &sep ) const
-{ return ((Config*)this)->readListEntry(key,sep); }
-
#endif
diff --git a/library/qpeglobal.h b/library/qpeglobal.h
index a84e435..f64ccfd 100644
--- a/library/qpeglobal.h
+++ b/library/qpeglobal.h
@@ -23,66 +23,69 @@
 :     =  ...= . :.=-
 -.   .:....=;==+<; You should have received a copy of the GNU
  -_. . .   )=.  = Library General Public License along with
    --        :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef QPE_GLOBAL_DEFINES_H
#define QPE_GLOBAL_DEFINES_H
/**
* Defines for used compiler attributes
*
*/
/*
* commons
*/
#define QPE_DEPRECATED
#if defined(Q_OS_MACX)
#define QPE_WEAK_SYMBOL __attribute__((weak_import))
#define QPE_SYMBOL_USED
#define QPE_SYMBOL_UNUSED
#define QPE_EXPORT_SYMBOL
#elif defined(_OS_UNIX_)
#define QPE_WEAK_SYMBOL __attribute__((weak))
#define QPE_SYMBOL_USED __attribute__((used))
#define QPE_SYMBOL_UNUSED __attribute__((unused))
#define QPE_EXPORT_SYMBOL
/*
* mark method as deprecated
*/
#if __GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)
/* gcc >= 3.2 */
#undef QPE_DEPRECATED
#define QPE_DEPRECATED __attribute__((deprecated))
#endif
/*
* Defined if Compiler supports attributes
*/
#ifdef GCC_SUPPORTS_VISIBILITY
#undef QPE_EXPORT_SYMBOL
#define QPE_EXPORT_SYMBOL __attribute__((visibility("default")))
#endif
#else // defined(Q_OS_WIN32)
#define QPE_WEAK_SYMBOL
#define QPE_SYMBOL_USED
#define QPE_SYMBOL_UNUSED
#define QPE_EXPORT_SYMBOL
#endif
+#define QTOPIA_MERGED_METHOD(method, version) method QPE_WEAK_SYMBOL;
+#define NOT_IN_SHARP(method) method QPE_WEAK_SYMBOL;
+#define NOT_IN_QPE(method) method QPE_WEAK_SYMBOL;
#endif