From 595bc9f1ca8321ac43ca458627eb7ac4377a39fd Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 4 Nov 2011 17:46:48 -0500 Subject: Moved the experimental code to its own repository (cherry picked from commit e1ea8cb53e0d0067e5c15360a333a5ebddbf4d86) --- .../tqtinterface/qt4/src/tools/tqsettings.cpp | 2105 -------------------- 1 file changed, 2105 deletions(-) delete mode 100644 experimental/tqtinterface/qt4/src/tools/tqsettings.cpp (limited to 'experimental/tqtinterface/qt4/src/tools/tqsettings.cpp') diff --git a/experimental/tqtinterface/qt4/src/tools/tqsettings.cpp b/experimental/tqtinterface/qt4/src/tools/tqsettings.cpp deleted file mode 100644 index d949940f8..000000000 --- a/experimental/tqtinterface/qt4/src/tools/tqsettings.cpp +++ /dev/null @@ -1,2105 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQSettings class -** -** Created : 000626 -** -** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqplatformdefs.h" - -// POSIX Large File Support redefines open -> open64 -static inline int qt_open( const char *pathname, int flags, mode_t mode ) -{ return ::open( pathname, flags, mode ); } -#if defined(open) -# undef open -#endif - -// POSIX Large File Support redefines truncate -> truncate64 -#if defined(truncate) -# undef truncate -#endif - -#include "tqsettings.h" - -#ifndef TQT_NO_SETTINGS - -#include "tqdir.h" -#include "tqfile.h" -#include "tqfileinfo.h" -#include "tqmap.h" -#include "tqtextstream.h" -#include "tqregexp.h" -#include -#ifndef NO_ERRNO_H -#include -#endif - -/*! - \class TQSettings - \brief The TQSettings class provides persistent platform-independent application settings. - - \ingroup io - \ingroup misc - \mainclass - - On Unix systems, TQSettings uses text files to store settings. On Windows - systems, TQSettings uses the system registry. On Mac OS X, TQSettings uses - the Carbon preferences API. - - Each setting comprises an identifying key and the data associated with - the key. A key is a tqunicode string which consists of \e two or more - subkeys. A subkey is a slash, '/', followed by one or more tqunicode - characters (excluding slashes, newlines, carriage returns and equals, - '=', signs). The associated data, called the entry or value, may be a - boolean, an integer, a double, a string or a list of strings. Entry - strings may contain any tqunicode characters. - - If you want to save and restore the entire desktop's settings, i.e. - which applications are running, use TQSettings to save the settings - for each individual application and TQSessionManager to save the - desktop's session. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - /MyCompany/MyApplication/recent files/1 - /MyCompany/MyApplication/recent files/2 - /MyCompany/MyApplication/recent files/3 - \endcode - Each line above is a complete key, made up of subkeys. - - A typical usage pattern for reading settings at application - startup: - \code - TQSettings settings; - settings.setPath( "MyCompany.com", "MyApplication" ); - - TQString bgColor = settings.readEntry( "/colors/background", "white" ); - int width = settings.readNumEntry( "/tqgeometry/width", 640 ); - // ... - \endcode - - A typical usage pattern for saving settings at application exit or - 'save preferences': - \code - TQSettings settings; - settings.setPath( "MyCompany.com", "MyApplication" ); - - settings.writeEntry( "/colors/background", bgColor ); - settings.writeEntry( "/tqgeometry/width", width ); - // ... - \endcode - - A key prefix can be prepended to all keys using beginGroup(). The - application of the prefix is stopped using endGroup(). For - example: - \code - TQSettings settings; - - settings.beginGroup( "/MainWindow" ); - settings.beginGroup( "/Geometry" ); - int x = settings.readEntry( "/x" ); - // ... - settings.endGroup(); - settings.beginGroup( "/Toolbars" ); - // ... - settings.endGroup(); - settings.endGroup(); - \endcode - - You can get a list of entry-holding keys by calling entryList(), and - a list of key-holding keys using subkeyList(). - - \code - TQStringList keys = settings.entryList( "/MyApplication" ); - // keys contains 'background color' and 'foreground color'. - - TQStringList keys = settings.entryList( "/MyApplication/recent files" ); - // keys contains '1', '2' and '3'. - - TQStringList subkeys = settings.subkeyList( "/MyApplication" ); - // subkeys contains 'tqgeometry' and 'recent files' - - TQStringList subkeys = settings.subkeyList( "/MyApplication/recent files" ); - // subkeys is empty. - \endcode - - Since settings for Windows are stored in the registry there are - some size limitations as follows: - \list - \i A subkey may not exceed 255 characters. - \i An entry's value may not exceed 16,300 characters. - \i All the values of a key (for example, all the 'recent files' - subkeys values), may not exceed 65,535 characters. - \endlist - - These limitations are not enforced on Unix or Mac OS X. - - \warning Creating multiple, simultaneous instances of TQSettings writing - to a text file may lead to data loss! This is a known issue which will - be fixed in a future release of TQt. - - \section1 Notes for Mac OS X Applications - - The location where settings are stored is not formally defined by - the CFPreferences API. - - At the time of writing settings are stored (either on a global or - user basis, preferring locally) into a plist file in \c - $ROOT/System/Library/Preferences (in XML format). TQSettings will - create an appropriate plist file (\c{com..plist}) - out of the full path to a key. - - For further information on CFPreferences see - \link http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPreferences/index.html - Apple's Specifications\endlink - - \section1 Notes for Unix Applications - - There is no universally accepted place for storing application - settings under Unix. In the examples the settings file will be - searched for in the following directories: - \list 1 - \i \c SYSCONF - the default value is \c INSTALL/etc/settings - \i \c /opt/MyCompany/share/etc - \i \c /opt/MyCompany/share/MyApplication/etc - \i \c $HOME/.qt - \endlist - When reading settings the files are searched in the order shown - above, with later settings overriding earlier settings. Files for - which the user doesn't have read permission are ignored. When saving - settings TQSettings works in the order shown above, writing - to the first settings file for which the user has write permission. - (\c INSTALL is the directory where TQt was installed. This can be - modified by using the configure script's -prefix argument ) - - If you want to put the settings in a particular place in the - filesystem you could do this: - \code - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share" ); - \endcode - - But in practice you may prefer not to use a search path for Unix. - For example the following code: - \code - settings.writeEntry( "/MyApplication/tqgeometry/width", width ); - \endcode - will end up writing the "tqgeometry/width" setting to the file - \c{$HOME/.qt/myapplicationrc} (assuming that the application is - being run by an ordinary user, i.e. not by root). - - For cross-platform applications you should ensure that the - \link #sizelimit Windows size limitations \endlink are not exceeded. - - \warning TQSettings doesn't write the settings until it is destroyed so - you should construct the TQSettings object on the stack. -*/ - -/*! - \enum TQSettings::System - - \value Mac Macintosh execution environments - \value Unix Mac OS X, Unix, Linux and Unix-like execution environments - \value Windows Windows execution environments -*/ - -/*! - \enum TQSettings::Format - - \value Native Store the settings in a platform dependent location - \value Ini Store the settings in a text file -*/ - -/*! - \enum TQSettings::Scope - - \value Global Save settings as global as possible - \value User Save settings in user space -*/ - -#if defined(TQ_OS_UNIX) -typedef int HANDLE; -#define TQ_LOCKREAD F_RDLCK -#define TQ_LOCKWRITE F_WRLCK -/* - Locks the file specified by name. The lockfile is created as a - hidden file in the same directory as the target file, with .lock - appended to the name. For example, "/etc/settings/onerc" uses a - lockfile named "/etc/settings/.onerc.lock". The type argument - controls the type of the lock, it can be either F_RDLCK for a read - lock, or F_WRLCK for a write lock. - - A file descriptor for the lock file is returned, and should be - closed with closelock() when the lock is no longer needed. - */ -static HANDLE openlock( const TQString &name, int type ) -{ - TQFileInfo info( name ); - // lockfile should be hidden, and never removed - TQString lockfile = info.dirPath() + "/." + info.fileName() + ".lock"; - - // open the lockfile - HANDLE fd = qt_open( TQFile::encodeName( lockfile ), - O_RDWR | O_CREAT, S_IRUSR | S_IWUSR ); - - if ( fd < 0 ) { - // failed to open the lock file, most likely because of permissions - return fd; - } - - struct flock fl; - fl.l_type = type; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - if ( fcntl( fd, F_SETLKW, &fl ) == -1 ) { - // the lock failed, so we should fail silently, so that people - // using filesystems that do not support locking don't see - // numerous warnings about a failed lock - close( fd ); - fd = -1; - } - - return fd; -} - -/* - Closes the lock file specified by fd. fd is the file descriptor - returned by the openlock() function. -*/ -static void closelock( HANDLE fd ) -{ - if ( fd < 0 ) { - // the lock file is not open - return; - } - - struct flock fl; - fl.l_type = F_UNLCK; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - // ignore the return value, so that the unlock fails silently - (void) fcntl( fd, F_SETLKW, &fl ); - - close( fd ); -} -#endif - - -TQSettingsGroup::TQSettingsGroup() - : modified(FALSE) -{ -} - - - - -void TQSettingsHeading::read(const TQString &filename) -{ - if (! TQFileInfo(filename).exists()) - return; - -#ifndef TQ_WS_WIN - HANDLE lockfd = openlock( filename, TQ_LOCKREAD ); -#endif - - TQFile file(filename); - if (! file.open(IO_ReadOnly)) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: failed to open file '%s'", filename.latin1()); -#endif - return; - } - - git = end(); - - TQTextStream stream(&file); - stream.setEncoding(TQTextStream::UnicodeUTF8); - while (! stream.atEnd()) - parseLine(stream); - - git = end(); - - file.close(); - -#ifndef TQ_WS_WIN - closelock( lockfd ); -#endif -} - - -void TQSettingsHeading::parseLine(TQTextStream &stream) -{ - TQString line = stream.readLine(); - if (line.isEmpty()) - // empty line... we'll allow it - return; - - if (line[0] == TQChar('#')) - // commented line - return; - - if (line[0] == TQChar('[')) { - TQString gname = line; - - gname = gname.remove((uint)0, 1); - if (gname[(int)gname.length() - 1] == TQChar(']')) - gname = gname.remove(gname.length() - 1, 1); - - git = find(gname); - if (git == end()) - git = replace(gname, TQSettingsGroup()); - } else { - if (git == end()) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: line '%s' out of group", line.latin1()); -#endif - return; - } - - int i = line.find('='); - if (i == -1) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: malformed line '%s' in group '%s'", - line.latin1(), git.key().latin1()); -#endif - return; - } else { - TQString key, value; - key = line.left(i); - value = ""; - bool esc=TRUE; - i++; - while (esc) { - esc = FALSE; - for ( ; i < (int)line.length(); i++ ) { - if ( esc ) { - if ( line[i] == 'n' ) - value.append('\n'); // escaped newline - else if ( line[i] == '0' ) - value = TQString::null; // escaped empty string - else - value.append(line[i]); - esc = FALSE; - } else if ( line[i] == '\\' ) - esc = TRUE; - else - value.append(line[i]); - } - if ( esc ) { - // Backwards-compatiblity... - // still escaped at EOL - manually escaped "newline" - if (stream.atEnd()) { -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: reached end of file, expected continued line"); -#endif - break; - } - value.append('\n'); - line = stream.readLine(); - i = 0; - } - } - - (*git).insert(key, value); - } - } -} - -#ifdef TQ_WS_WIN // for homedirpath reading from registry -#include "tqt_windows.h" -#include "tqlibrary.h" - -#ifndef CSIDL_APPDATA -#define CSIDL_APPDATA 0x001a // \Application Data -#endif -#ifndef CSIDL_COMMON_APPDATA -#define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data -#endif - -#endif - -TQSettingsPrivate::TQSettingsPrivate( TQSettings::Format format ) - : groupDirty( TRUE ), modified(FALSE), globalScope(TRUE) -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( format != TQSettings::Ini ) - return; -#else - TQ_UNUSED( format ); -#endif - - TQString appSettings(TQDir::homeDirPath() + "/.qt/"); - TQString defPath; -#ifdef TQ_WS_WIN -#ifdef TQ_OS_TEMP - TCHAR path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromUcs2( path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromUcs2( path ); -#else - TQLibrary library( "shell32" ); - library.setAutoUnload( FALSE ); - TQT_WA( { - typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPTSTR, int, BOOL); - GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathW" ); - if ( SHGetSpecialFolderPath ) { - TCHAR path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromUcs2( (ushort*)path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromUcs2( (ushort*)path ); - } - } , { - typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, char*, int, BOOL); - GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathA" ); - if ( SHGetSpecialFolderPath ) { - char path[MAX_PATH]; - SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE ); - appSettings = TQString::fromLocal8Bit( path ); - SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE ); - defPath = TQString::fromLocal8Bit( path ); - } - } ); -#endif // TQ_OS_TEMP -#else - defPath = qInstallPathSysconf(); -#endif - TQDir dir(appSettings); - if (! dir.exists()) { - if (! dir.mkdir(dir.path())) -#if defined(TQT_CHECK_STATE) - qWarning("TQSettings: error creating %s", dir.path().latin1()); -#else - ; -#endif - } - - if ( !!defPath ) - searchPaths.append(defPath); - searchPaths.append(dir.path()); -} - -TQSettingsPrivate::~TQSettingsPrivate() -{ -} - -TQSettingsGroup TQSettingsPrivate::readGroup() -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - - TQMap::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) - grp = *grpit; - } else if (hd.count() != 0) - grp = *grpit; - - return grp; -} - - -void TQSettingsPrivate::removeGroup(const TQString &key) -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - bool found = FALSE; - - TQMap::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) { - found = TRUE; - grp = *grpit; - } - } else if (hd.count() != 0) { - found = TRUE; - grp = *grpit; - } - - if (found) { - grp.remove(key); - - if (grp.count() > 0) - hd.replace(group, grp); - else - hd.remove(group); - - if (hd.count() > 0) - headings.replace(heading, hd); - else - headings.remove(heading); - - modified = TRUE; - } -} - - -void TQSettingsPrivate::writeGroup(const TQString &key, const TQString &value) -{ - TQSettingsHeading hd; - TQSettingsGroup grp; - - TQMap::Iterator headingsit = headings.find(heading); - if (headingsit != headings.end()) - hd = *headingsit; - - TQSettingsHeading::Iterator grpit = hd.find(group); - if (grpit == hd.end()) { - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQString filebase = heading.lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQString fn((*it++) + "/" + filebase + "rc"); - if (! hd.contains(fn + "cached")) { - hd.read(fn); - hd.insert(fn + "cached", TQSettingsGroup()); - } - } - - headings.replace(heading, hd); - - grpit = hd.find(group); - if (grpit != hd.end()) - grp = *grpit; - } else if (hd.count() != 0) - grp = *grpit; - - grp.modified = TRUE; - grp.replace(key, value); - hd.replace(group, grp); - headings.replace(heading, hd); - - modified = TRUE; -} - - -TQDateTime TQSettingsPrivate::modificationTime() -{ - TQSettingsHeading hd = headings[heading]; - TQSettingsGroup grp = hd[group]; - - TQDateTime datetime; - - TQStringList::Iterator it = searchPaths.begin(); - if ( !globalScope ) - ++it; - while (it != searchPaths.end()) { - TQFileInfo fi((*it++) + "/" + heading + "rc"); - if (fi.exists() && fi.lastModified() > datetime) - datetime = fi.lastModified(); - } - - return datetime; -} - -bool qt_verify_key( const TQString &key ) -{ - if ( key.isEmpty() || key[0] != '/' || key.contains( TQRegExp(TQString::tqfromLatin1("[=\\r\\n]")) ) ) - return FALSE; - return TRUE; -} - -static TQString groupKey( const TQString &group, const TQString &key ) -{ - TQString grp_key; - if ( group.isEmpty() || ( group.length() == 1 && group[0] == '/' ) ) { - // group is empty, or it contains a single '/', so we just return the key - if ( key.startsWith( "/" ) ) - grp_key = key; - else - grp_key = "/" + key; - } else if ( group.endsWith( "/" ) || key.startsWith( "/" ) ) { - grp_key = group + key; - } else { - grp_key = group + "/" + key; - } - return grp_key; -} - -/*! - Inserts \a path into the settings search path. The semantics of \a - path depends on the system \a s. It is usually easier and better to - use setPath() instead of this function. - - When \a s is \e Windows and the execution environment is \e not - Windows the function does nothing. Similarly when \a s is \e Unix and - the execution environment is \e not Unix the function does nothing. - - When \a s is \e Windows, and the execution environment is Windows, the - search path list will be used as the first subfolder of the "Software" - folder in the registry. - - When reading settings the folders are searched forwards from the - first folder (listed below) to the last, returning the first - settings found, and ignoring any folders for which the user doesn't - have read permission. - \list 1 - \i HKEY_CURRENT_USER/Software/MyCompany/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication - \i HKEY_CURRENT_USER/Software/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyApplication - \endlist - - \code - TQSettings settings; - settings.insertSearchPath( TQSettings::Windows, "/MyCompany" ); - settings.writeEntry( "/MyApplication/Tip of the day", TRUE ); - \endcode - The code above will write the subkey "Tip of the day" into the \e - first of the registry folders listed below that is found and for - which the user has write permission. - \list 1 - \i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication - \i HKEY_CURRENT_USER/Software/MyCompany/MyApplication - \i HKEY_LOCAL_MACHINE/Software/MyApplication - \i HKEY_CURRENT_USER/Software/MyApplication - \endlist - If a setting is found in the HKEY_CURRENT_USER space, this setting - is overwritten independently of write permissions in the - HKEY_LOCAL_MACHINE space. - - When \a s is \e Unix, and the execution environment is Unix, the - search path list will be used when trying to determine a suitable - filename for reading and writing settings files. By default, there are - two entries in the search path: - - \list 1 - \i \c SYSCONF - where \c SYSCONF is a directory specified when - configuring TQt; by default it is INSTALL/etc/settings. - \i \c $HOME/.qt/ - where \c $HOME is the user's home directory. - \endlist - - All insertions into the search path will go before $HOME/.qt/. - For example: - \code - TQSettings settings; - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share/etc" ); - settings.insertSearchPath( TQSettings::Unix, "/opt/MyCompany/share/MyApplication/etc" ); - // ... - \endcode - Will result in a search path of: - \list 1 - \i SYSCONF - \i /opt/MyCompany/share/etc - \i /opt/MyCompany/share/MyApplication/etc - \i $HOME/.qt - \endlist - When reading settings the files are searched in the order shown - above, with later settings overriding earlier settings. Files for - which the user doesn't have read permission are ignored. When saving - settings TQSettings works in the order shown above, writing - to the first settings file for which the user has write permission. - - Note that paths in the file system are not created by this - function, so they must already exist to be useful. - - Settings under Unix are stored in files whose names are based on the - first subkey of the key (not including the search path). The algorithm - for creating names is essentially: lowercase the first subkey, replace - spaces with underscores and add 'rc', e.g. - /MyCompany/MyApplication/background color will be stored in - myapplicationrc (assuming that /MyCompany is part of - the search path). - - \sa removeSearchPath() - -*/ -void TQSettings::insertSearchPath( System s, const TQString &path) -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) { - d->sysInsertSearchPath( s, path ); - return; - } -#endif - -#if !defined(TQ_WS_WIN) - if ( s == Windows ) - return; -#endif -#if !defined(TQ_OS_MAC) - if ( s == Mac ) - return; -#endif - - if ( !qt_verify_key( path ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() ); -#endif - return; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd && s != Unix ) { -#else - if ( s != Unix ) { -#endif -#if !defined(TQWS) && defined(TQ_OS_MAC) - if(s != Mac) //mac is respected on the mac as well -#endif - return; - } - - TQString realPath = path; -#if defined(TQ_WS_WIN) - TQString defPath = d->globalScope ? d->searchPaths.first() : d->searchPaths.last(); - realPath = defPath + path; -#endif - - TQStringList::Iterator it = d->searchPaths.find(d->searchPaths.last()); - if (it != d->searchPaths.end()) { - d->searchPaths.insert(it, realPath); - } -} - - -/*! - Removes all occurrences of \a path (using exact matching) from the - settings search path for system \a s. Note that the default search - paths cannot be removed. - - \sa insertSearchPath() -*/ -void TQSettings::removeSearchPath( System s, const TQString &path) -{ - if ( !qt_verify_key( path ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() ); -#endif - return; - } - -#ifdef TQ_WS_WIN - if ( d->sysd ) { - d->sysRemoveSearchPath( s, path ); - return; - } -#endif -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd && s != Unix ) { -#else - if ( s != Unix ) { -#endif -#if !defined(TQWS) && defined(TQ_OS_MAC) - if(s != Mac) //mac is respected on the mac as well -#endif - return; - } - - if (path == d->searchPaths.first() || path == d->searchPaths.last()) - return; - - d->searchPaths.remove(path); -} - - -/*! - Creates a settings object. - - Be aware that you must call setPath() or insertSearchPath() before - you can use the TQSettings object. -*/ -TQSettings::TQSettings() -{ - d = new TQSettingsPrivate( Native ); - TQ_CHECK_PTR(d); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - d->sysd = 0; - d->sysInit(); -#endif -} - -/*! - Creates a settings object. If \a format is 'Ini' the settings will - be stored in a text file, using the Unix strategy (see above). If \a format - is 'Native', the settings will be stored in a platform specific way - (ie. the Windows registry). - - Be aware that you must call setPath() or insertSearchPath() before - you can use the TQSettings object. -*/ -TQSettings::TQSettings( Format format ) -{ - d = new TQSettingsPrivate( format ); - TQ_CHECK_PTR(d); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - d->sysd = 0; - if ( format == Native ) - d->sysInit(); -#else - TQ_UNUSED(format); -#endif -} - -/*! - Destroys the settings object. All modifications made to the settings - will automatically be saved. - -*/ -TQSettings::~TQSettings() -{ - sync(); - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - d->sysClear(); -#endif - - delete d; -} - - -/*! \internal - Writes all modifications to the settings to disk. If any errors are - encountered, this function returns FALSE, otherwise it will return TRUE. -*/ -bool TQSettings::sync() -{ -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysSync(); -#endif - if (! d->modified) - // fake success - return TRUE; - - bool success = TRUE; - TQMap::Iterator it = d->headings.begin(); - - while (it != d->headings.end()) { - // determine filename - TQSettingsHeading hd(*it); - TQSettingsHeading::Iterator hdit = hd.begin(); - TQString filename; - - TQStringList::Iterator pit = d->searchPaths.begin(); - if ( !d->globalScope ) - ++pit; - while (pit != d->searchPaths.end()) { - TQString filebase = it.key().lower().replace(TQRegExp(TQString::tqfromLatin1("\\s+")), "_"); - TQFileInfo di(*pit); - if ( !di.exists() ) { - TQDir dir; - dir.mkdir( *pit ); - } - - TQFileInfo fi((*pit++) + "/" + filebase + "rc"); - - if ((fi.exists() && fi.isFile() && fi.isWritable()) || - (! fi.exists() && di.isDir() -#ifndef TQ_WS_WIN - && di.isWritable() -#else - && ((qWinVersion()&TQt::WV_NT_based) > TQt::WV_2000 || di.isWritable()) -#endif - )) { - filename = fi.filePath(); - break; - } - } - - ++it; - - if ( filename.isEmpty() ) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: filename is null/empty"); -#endif // TQT_CHECK_STATE - - success = FALSE; - continue; - } - -#ifndef TQ_WS_WIN - HANDLE lockfd = openlock( filename, TQ_LOCKWRITE ); -#endif - - TQFile file( filename + ".tmp" ); - if (! file.open(IO_WriteOnly)) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: failed to open '%s' for writing", - file.name().latin1()); -#endif // TQT_CHECK_STATE - - success = FALSE; - continue; - } - - // spew to file - TQTextStream stream(&file); - stream.setEncoding(TQTextStream::UnicodeUTF8); - - while (hdit != hd.end()) { - if ((*hdit).count() > 0) { - stream << "[" << hdit.key() << "]" << endl; - - TQSettingsGroup grp(*hdit); - TQSettingsGroup::Iterator grpit = grp.begin(); - - while (grpit != grp.end()) { - TQString v = grpit.data(); - if ( v.isNull() ) { - v = TQString::tqfromLatin1("\\0"); // escape null string - } else { - v.replace('\\', TQString::tqfromLatin1("\\\\")); // escape backslash - v.replace('\n', TQString::tqfromLatin1("\\n")); // escape newlines - } - - stream << grpit.key() << "=" << v << endl; - ++grpit; - } - - stream << endl; - } - - ++hdit; - } - - if (file.status() != IO_Ok) { - -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::sync: error at end of write"); -#endif // TQT_CHECK_STATE - - success = FALSE; - } - - file.close(); - - if ( success ) { - TQDir dir( TQFileInfo( file ).dir( TRUE ) ); - if ( dir.exists( filename ) && !dir.remove( filename ) || - !dir.rename( file.name(), filename, TRUE ) ) { - -#ifdef TQT_CHECK_STATE - qWarning( "TQSettings::sync: error writing file '%s'", - TQFile::encodeName( filename ).data() ); -#endif // TQT_CHECK_STATE - - success = FALSE; - } - } - - // remove temporary file - file.remove(); - -#ifndef TQ_WS_WIN - closelock( lockfd ); -#endif - } - - d->modified = FALSE; - - return success; -} - - -/*! - \fn bool TQSettings::readBoolEntry(const TQString &key, bool def, bool *ok ) const - - Reads the entry specified by \a key, and returns a bool, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readNumEntry(), readDoubleEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -bool TQSettings::readBoolEntry(const TQString &key, bool def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readBoolEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadBoolEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, ( def ? "true" : "false" ), ok ); - - if (value.lower() == "true") - return TRUE; - else if (value.lower() == "false") - return FALSE; - else if (value == "1") - return TRUE; - else if (value == "0") - return FALSE; - - if (! value.isEmpty()) - qWarning("TQSettings::readBoolEntry: '%s' is not 'true' or 'false'", - value.latin1()); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn double TQSettings::readDoubleEntry(const TQString &key, double def, bool *ok ) const - - Reads the entry specified by \a key, and returns a double, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readNumEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -double TQSettings::readDoubleEntry(const TQString &key, double def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readDoubleEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadDoubleEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, TQString::number(def), ok ); - bool conv_ok; - double retval = value.toDouble( &conv_ok ); - if ( conv_ok ) - return retval; - if ( ! value.isEmpty() ) - qWarning( "TQSettings::readDoubleEntry: '%s' is not a number", - value.latin1() ); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn int TQSettings::readNumEntry(const TQString &key, int def, bool *ok ) const - - Reads the entry specified by \a key, and returns an integer, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -int TQSettings::readNumEntry(const TQString &key, int def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readNumEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadNumEntry( grp_key, def, ok ); -#endif - - TQString value = readEntry( key, TQString::number( def ), ok ); - bool conv_ok; - int retval = value.toInt( &conv_ok ); - if ( conv_ok ) - return retval; - if ( ! value.isEmpty() ) - qWarning( "TQSettings::readNumEntry: '%s' is not a number", - value.latin1() ); - if ( ok ) - *ok = FALSE; - return def; -} - - -/*! - \fn TQString TQSettings::readEntry(const TQString &key, const TQString &def, bool *ok ) const - - Reads the entry specified by \a key, and returns a TQString, or the - default value, \a def, if the entry couldn't be read. - If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE - otherwise. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry() -*/ - -/*! - \internal -*/ -TQString TQSettings::readEntry(const TQString &key, const TQString &def, bool *ok ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::readEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - if ( ok ) - *ok = FALSE; - - return def; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysReadEntry( grp_key, def, ok ); -#endif - - if ( ok ) // no, everything is not ok - *ok = FALSE; - - TQString realkey; - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::readEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - if ( ok ) - *ok = FALSE; - return def; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::const_iterator it = grp.find( realkey ), end = grp.end(); - TQString retval = def; - if ( it != end ) { - // found the value we needed - retval = *it; - if ( ok ) *ok = TRUE; - } - return retval; -} - - -#if !defined(TQ_NO_BOOL_TYPE) -/*! - Writes the boolean entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \warning On certain platforms, keys are required to contain at least - two components (e.g., "/foo/bar"). This limitation does not apply to - TQt 4. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, bool value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(value ? "true" : "false"); - return writeEntry(key, s); -} -#endif - - -/*! - \overload - Writes the double entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, double value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(TQString::number(value)); - return writeEntry(key, s); -} - - -/*! - \overload - Writes the integer entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, int value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - TQString s(TQString::number(value)); - return writeEntry(key, s); -} - - -/*! - \internal - - Writes the entry specified by \a key with the string-literal \a value, - replacing any previous setting. If \a value is zero-length or null, the - entry is replaced by an empty setting. - - \e NOTE: This function is provided because some compilers use the - writeEntry (const TQString &, bool) overload for this code: - writeEntry ("/foo/bar", "baz") - - If an error occurs, this functions returns FALSE and the object is left - unchanged. - - \sa readEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const char *value) -{ - return writeEntry(key, TQString(value)); -} - - -/*! - \overload - Writes the string entry \a value into key \a key. The \a key is - created if it doesn't exist. Any previous value is overwritten by \a - value. If \a value is an empty string or a null string the key's - value will be an empty string. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise TRUE is returned. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQString &value) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::writeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysWriteEntry( grp_key, value ); -#endif - // NOTE: we *do* allow value to be a null/empty string - - TQString realkey; - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::writeEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return FALSE; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - d->writeGroup(realkey, value); - return TRUE; -} - - -/*! - Removes the entry specified by \a key. - - Returns true if the entry was successfully removed; otherwise - returns false. Note that removing the last entry in any given - folder, will also remove the folder. - - \sa readEntry(), writeEntry() -*/ -bool TQSettings::removeEntry(const TQString &key) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::removeEntry: Invalid key: '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return FALSE; - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysRemoveEntry( grp_key ); -#endif - - TQString realkey; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::removeEntry: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return FALSE; - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - realkey = list[1]; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else { - realkey = grp_key; - } - - d->removeGroup(realkey); - return TRUE; -} - - -/*! - Returns a list of the keys which contain entries under \a key. Does \e - not return any keys that contain subkeys. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - \endcode - \code - TQStringList keys = settings.entryList( "/MyCompany/MyApplication" ); - \endcode - - In the above example, \c keys will contain 'background color' and - 'foreground color'. It will not contain 'tqgeometry' because this key - contains subkeys not entries. - - To access the tqgeometry values, you could either use subkeyList() - to read the keys then read each entry, or simply read each entry - directly by specifying its full key, e.g. - "/MyCompany/MyApplication/tqgeometry/y". - - \sa subkeyList() -*/ -TQStringList TQSettings::entryList(const TQString &key) const -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::entryList: Invalid key: %s", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQStringList(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysEntryList( grp_key ); -#endif - - TQString realkey; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 1) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::listEntries: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQStringList(); - } - - if (list.count() == 1) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - } else - realkey = grp_key; - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::Iterator it = grp.begin(); - TQStringList ret; - TQString itkey; - while (it != grp.end()) { - itkey = it.key(); - ++it; - - if ( realkey.length() > 0 ) { - if ( itkey.left( realkey.length() ) != realkey ) - continue; - else - itkey.remove( 0, realkey.length() + 1 ); - } - - if ( itkey.find( '/' ) != -1 ) - continue; - - ret << itkey; - } - - return ret; -} - - -/*! - Returns a list of the keys which contain subkeys under \a key. Does \e - not return any keys that contain entries. - - Example settings: - \code - /MyCompany/MyApplication/background color - /MyCompany/MyApplication/foreground color - /MyCompany/MyApplication/tqgeometry/x - /MyCompany/MyApplication/tqgeometry/y - /MyCompany/MyApplication/tqgeometry/width - /MyCompany/MyApplication/tqgeometry/height - /MyCompany/MyApplication/recent files/1 - /MyCompany/MyApplication/recent files/2 - /MyCompany/MyApplication/recent files/3 - \endcode - \code - TQStringList keys = settings.subkeyList( "/MyCompany/MyApplication" ); - \endcode - - In the above example, \c keys will contain 'tqgeometry' and - 'recent files'. It will not contain 'background color' or - 'foreground color' because those keys contain entries not - subkeys. To get a list of keys that contain entries rather than - subkeys use entryList() instead. - - \warning In the above example, if TQSettings is writing to an Ini file, - then a call to - \code subkeyList("/MyCompany") \endcode - will return an empty list. This happens because a key like - \code /MyCompany/MyApplication/background color \endcode - is written to the file \e{"mycompanyrc"}, under the section \e{[MyApplication]}. - This call is therefore a request to list the sections in an ini file, which - is not supported in this version of TQSettings. This is a known issue which - will be fixed in TQt-4. - - \sa entryList() -*/ -TQStringList TQSettings::subkeyList(const TQString &key) const -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::subkeyList: Invalid key: %s", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQStringList(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return d->sysSubkeyList( grp_key ); -#endif - - TQString realkey; - int subkeycount = 2; - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 1) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::subkeyList: invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQStringList(); - } - - subkeycount = (int)list.count(); - - if (list.count() == 1) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - - // remove the group from the list - list.remove(list.at(1)); - // remove the heading from the list - list.remove(list.at(0)); - - realkey = list.join("/"); - } - - } else - realkey = grp_key; - - TQStringList ret; - if ( subkeycount == 1 ) { - TQMap::Iterator it = d->headings.begin(); - while ( it != d->headings.end() ) { - if ( it.key() != "General" && ! ret.contains( it.key() ) ) - ret << it.key(); - ++it; - } - - return ret; - } - - TQSettingsGroup grp = d->readGroup(); - TQSettingsGroup::Iterator it = grp.begin(); - TQString itkey; - while (it != grp.end()) { - itkey = it.key(); - ++it; - - if ( realkey.length() > 0 ) { - if ( itkey.left( realkey.length() ) != realkey - || itkey.length()+1 < realkey.length() - || itkey[(int)realkey.length()] != '/') - continue; - else - itkey.remove( 0, realkey.length() + 1 ); - } - - int slash = itkey.find( '/' ); - if ( slash == -1 ) - continue; - itkey.truncate( slash ); - - if ( ! ret.contains( itkey ) ) - ret << itkey; - } - - return ret; -} - - -/*! - \internal - - This function returns the time of last modification for \a key. -*/ -TQDateTime TQSettings::lastModificationTime( const TQString &key ) -{ - TQString grp_key( groupKey( group(), key ) ); - if ( !qt_verify_key( grp_key ) ) { -#if defined(TQT_CHECK_STATE) - qWarning( "TQSettings::lastModificationTime: Invalid key '%s'", grp_key.isNull() ? "(null)" : grp_key.latin1() ); -#endif - return TQDateTime(); - } - -#if !defined(TQWS) && (defined(TQ_WS_WIN) || defined(TQ_OS_MAC)) - if ( d->sysd ) - return TQDateTime(); -#endif - - if (grp_key[0] == '/') { - // parse our key - TQStringList list(TQStringList::split('/', grp_key)); - - if (list.count() < 2) { -#ifdef TQT_CHECK_STATE - qWarning("TQSettings::lastModificationTime: Invalid key '%s'", grp_key.latin1()); -#endif // TQT_CHECK_STATE - - return TQDateTime(); - } - - if (list.count() == 2) { - d->heading = list[0]; - d->group = "General"; - } else { - d->heading = list[0]; - d->group = list[1]; - } - } - - return d->modificationTime(); -} - - -/*! - \overload - \obsolete - - Writes the string list entry \a value into key \a key. The \a key - is created if it doesn't exist. Any previous value is overwritten - by \a value. The list is stored as a sequence of strings separated - by \a separator (using TQStringList::join()), so none of the - strings in the list should contain the separator. If the list is - empty or null the key's value will be an empty string. - - \warning The list should not contain empty or null strings, as - readListEntry() will use TQStringList::split() to recreate the - list. As the documentation states, TQStringList::split() will omit - empty strings from the list. Because of this, it is impossible to - retrieve identical list data that is stored with this function. - We recommend using the writeEntry() and readListEntry() overloads - that do not take a \a separator argument. - - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise returns TRUE. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry(), TQStringList::join() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQStringList &value, - const TQChar &separator) -{ - TQString s(value.join(separator)); - return writeEntry(key, s); -} - -/*! - \overload - - Writes the string list entry \a value into key \a key. The \a key - is created if it doesn't exist. Any previous value is overwritten - by \a value. - - If an error occurs the settings are left unchanged and FALSE is - returned; otherwise returns TRUE. - - \sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry() -*/ -bool TQSettings::writeEntry(const TQString &key, const TQStringList &value) -{ - TQString s; - for (TQStringList::ConstIterator it=value.begin(); it!=value.end(); ++it) { - TQString el = *it; - if ( el.isNull() ) { - el = "^0"; - } else { - el.replace("^", "^^"); - } - s+=el; - s+="^e"; // end of element - } - return writeEntry(key, s); -} - - -/*! - \overload TQStringList TQSettings::readListEntry(const TQString &key, const TQChar &separator, bool *ok ) const - \obsolete - - Reads the entry specified by \a key as a string. The \a separator - is used to create a TQStringList by calling TQStringList::split(\a - separator, entry). If \a ok is not 0: \a *ok is set to TRUE - if the key was read, otherwise \a *ok is set to FALSE. - - \warning As the documentation states, TQStringList::split() will - omit empty strings from the list. Because of this, it is - impossible to retrieve identical list data with this function. We - recommend using the readListEntry() and writeEntry() overloads - that do not take a \a separator argument. - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = mySettings.readListEntry( "size", " " ); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry(), TQStringList::split() -*/ - -/*! - \internal -*/ -TQStringList TQSettings::readListEntry(const TQString &key, const TQChar &separator, bool *ok ) -{ - TQString value = readEntry( key, TQString::null, ok ); - if ( ok && !*ok ) - return TQStringList(); - - return TQStringList::split(separator, value); -} - -/*! - \fn TQStringList TQSettings::readListEntry(const TQString &key, bool *ok ) const - Reads the entry specified by \a key as a string. If \a ok is not - 0, \a *ok is set to TRUE if the key was read, otherwise \a *ok is - set to FALSE. - - Note that if you want to iterate over the list, you should iterate - over a copy, e.g. - \code - TQStringList list = mySettings.readListEntry( "recentfiles" ); - TQStringList::Iterator it = list.begin(); - while( it != list.end() ) { - myProcessing( *it ); - ++it; - } - \endcode - - \sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry(), TQStringList::split() -*/ - -/*! - \internal -*/ -TQStringList TQSettings::readListEntry(const TQString &key, bool *ok ) -{ - TQString value = readEntry( key, TQString::null, ok ); - if ( ok && !*ok ) - return TQStringList(); - TQStringList l; - TQString 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=TQString::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; -} - -#ifdef TQ_OS_MAC -void qt_setSettingsBasePath(const TQString &); //qsettings_mac.cpp -#endif - -/*! - Insert platform-dependent paths from platform-independent information. - - The \a domain should be an Internet domain name - controlled by the producer of the software, eg. Trolltech products - use "trolltech.com". - - The \a product should be the official name of the product. - - The \a scope should be - TQSettings::User for user-specific settings, or - TQSettings::Global for system-wide settings (generally - these will be read-only to many users). - - Not all information is relevant on all systems. -*/ - -void TQSettings::setPath( const TQString &domain, const TQString &product, Scope scope ) -{ -// On Windows, any trailing ".com(\..*)" is stripped from the domain. The -// Global scope corresponds to HKEY_LOCAL_MACHINE, and User corresponds to -// HKEY_CURRENT_USER. Note that on some installations, not all users can -// write to the Global scope. On UNIX, any trailing ".com(\..*)" is stripped -// from the domain. The Global scope corresponds to "/opt" (this would be -// configurable at library build time - eg. to "/usr/local" or "/usr"), -// while the User scope corresponds to $HOME/.*rc. -// Note that on most installations, not all users can write to the System -// scope. -// -// On MacOS X, if there is no "." in domain, append ".com", then reverse the -// order of the elements (Mac OS uses "com.apple.finder" as domain+product). -// The Global scope corresponds to /Library/Preferences/*.plist, while the -// User scope corresponds to ~/Library/Preferences/*.plist. -// Note that on most installations, not all users can write to the System -// scope. - d->globalScope = scope == Global; - - TQString actualSearchPath; - int lastDot = domain.findRev( '.' ); - -#if defined(TQ_WS_WIN) - actualSearchPath = "/" + domain.mid( 0, lastDot ) + "/" + product; - insertSearchPath( Windows, actualSearchPath ); -#elif !defined(TQWS) && defined(TQ_OS_MAC) - if(lastDot != -1) { - TQString topLevelDomain = domain.right( domain.length() - lastDot - 1 ) + "."; - if ( !topLevelDomain.isEmpty() ) - qt_setSettingsBasePath( topLevelDomain ); - } - actualSearchPath = "/" + domain.left( lastDot ) + "." + product; - insertSearchPath( Mac, actualSearchPath ); -#else - if (scope == User) - actualSearchPath = TQDir::homeDirPath() + "/."; - else - actualSearchPath = TQString(qInstallPathSysconf()) + "/"; - actualSearchPath += domain.mid( 0, lastDot ) + "/" + product; - insertSearchPath( Unix, actualSearchPath ); -#endif -} - -/*! - Appends \a group to the current key prefix. - - \code - TQSettings settings; - settings.beginGroup( "/MainWindow" ); - // read values - settings.endGroup(); - \endcode -*/ -void TQSettings::beginGroup( const TQString &group ) -{ - d->groupStack.push( group ); - d->groupDirty = TRUE; -} - -/*! - Undo previous calls to beginGroup(). Note that a single beginGroup("a/b/c") is undone - by a single call to endGroup(). - - \code - TQSettings settings; - settings.beginGroup( "/MainWindow/Geometry" ); - // read values - settings.endGroup(); - \endcode -*/ -void TQSettings::endGroup() -{ - d->groupStack.pop(); - d->groupDirty = TRUE; -} - -/*! - Set the current key prefix to the empty string. -*/ -void TQSettings::resetGroup() -{ - d->groupStack.clear(); - d->groupDirty = FALSE; - d->groupPrefix = TQString::null; -} - -/*! - Returns the current key prefix, or a null string if there is no key prefix set. - - \sa beginGroup(); -*/ -TQString TQSettings::group() const -{ - if ( d->groupDirty ) { - d->groupDirty = FALSE; - d->groupPrefix = TQString::null; - - TQValueStack::Iterator it = d->groupStack.begin(); - while ( it != d->groupStack.end() ) { - TQString group = *it; - ++it; - if ( group[0] != '/' ) - group.prepend( "/" ); - d->groupPrefix += group; - } - } - return d->groupPrefix; -} - -#endif -- cgit v1.2.3