2007-05-30 21:56:52 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
2003-10-08 21:59:23 +00:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
2014-02-18 01:34:18 +00:00
*
2003-10-08 21:59:23 +00:00
* 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 .
2014-02-18 01:34:18 +00:00
*
2003-10-08 21:59:23 +00:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2005-10-18 01:30:26 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2003-10-08 21:59:23 +00:00
*
*/
2005-04-23 17:33:28 +00:00
# ifndef COMMON_CONFIG_MANAGER_H
# define COMMON_CONFIG_MANAGER_H
2003-10-08 21:59:23 +00:00
2004-04-09 15:10:23 +00:00
# include "common/array.h"
2006-03-31 23:10:24 +00:00
# include "common/hashmap.h"
2003-10-08 21:59:23 +00:00
# include "common/singleton.h"
# include "common/str.h"
2006-07-30 12:21:54 +00:00
# include "common/hash-str.h"
2003-10-08 21:59:23 +00:00
namespace Common {
2020-07-08 21:30:36 +00:00
/**
* @ defgroup common_config Configuration manager
* @ ingroup common
*
2020-10-16 23:21:42 +00:00
* @ brief The ( singleton ) configuration manager , used to query and set configuration
2020-07-08 21:30:36 +00:00
* values using string keys .
*
* @ {
*/
2007-03-08 16:43:33 +00:00
class WriteStream ;
2008-08-03 16:54:18 +00:00
class SeekableReadStream ;
2007-03-08 16:43:33 +00:00
2003-10-08 21:59:23 +00:00
/**
* The ( singleton ) configuration manager , used to query & set configuration
* values using string keys .
*
2020-09-19 22:48:24 +00:00
* TBD : Implement the callback based notification system ( outlined below )
2003-10-08 21:59:23 +00:00
* which sends out notifications to interested parties whenever the value
* of some specific ( or any ) configuration key changes .
*/
class ConfigManager : public Singleton < ConfigManager > {
2005-07-30 21:11:48 +00:00
2003-10-08 21:59:23 +00:00
public :
2005-07-30 21:11:48 +00:00
2013-08-08 01:14:23 +00:00
class Domain {
2004-03-28 20:28:45 +00:00
private :
2020-07-31 22:54:37 +00:00
StringMap _entries ;
StringMap _keyValueComments ;
2020-10-19 16:33:45 +00:00
String _domainComment ;
2004-03-29 19:15:23 +00:00
2003-10-08 21:59:23 +00:00
public :
2013-08-08 01:14:23 +00:00
typedef StringMap : : const_iterator const_iterator ;
2020-10-16 23:21:42 +00:00
const_iterator begin ( ) const { return _entries . begin ( ) ; } /*!< Return the beginning position of configuration entries. */
const_iterator end ( ) const { return _entries . end ( ) ; } /*!< Return the ending position of configuration entries. */
bool empty ( ) const { return _entries . empty ( ) ; } /*!< Return true if the configuration is empty, i.e. has no [key, value] pairs, and false otherwise. */
bool contains ( const String & key ) const { return _entries . contains ( key ) ; } /*!< Check whether the domain contains a @p key. */
2021-04-15 19:20:04 +00:00
/** Return the configuration value for the given key.
2020-10-16 23:21:42 +00:00
* If no entry exists for the given key in the configuration , it is created .
*/
/** Return the configuration value for the given key.
* @ note This function does * not * create a configuration entry
* for the given key if it does not exist .
*/
2020-10-19 16:33:45 +00:00
const String & operator [ ] ( const String & key ) const { return _entries [ key ] ; }
2020-10-16 23:21:42 +00:00
void setVal ( const String & key , const String & value ) { _entries . setVal ( key , value ) ; } /*!< Assign a @p value to a @p key. */
2020-10-19 16:33:45 +00:00
String & getOrCreateVal ( const String & key ) { return _entries . getOrCreateVal ( key ) ; }
2020-10-16 23:21:42 +00:00
String & getVal ( const String & key ) { return _entries . getVal ( key ) ; } /*!< Retrieve the value of a @p key. */
const String & getVal ( const String & key ) const { return _entries . getVal ( key ) ; } /*!< @overload */
2021-04-15 19:20:04 +00:00
/**
* Retrieve the value of @ p key if it exists and leave the referenced variable unchanged if the key does not exist .
* @ return True if the key exists , false otherwise .
* You can use this method if you frequently attempt to access keys that do not exist .
*/
2020-10-20 00:29:18 +00:00
const String & getValOrDefault ( const String & key ) const { return _entries . getValOrDefault ( key ) ; }
2020-10-19 16:33:45 +00:00
bool tryGetVal ( const String & key , String & out ) const { return _entries . tryGetVal ( key , out ) ; }
2020-10-16 23:21:42 +00:00
void clear ( ) { _entries . clear ( ) ; } /*!< Clear all configuration entries in the domain. */
void erase ( const String & key ) { _entries . erase ( key ) ; } /*!< Remove a key from the domain. */
void setDomainComment ( const String & comment ) ; /*!< Add a @p comment for this configuration domain. */
const String & getDomainComment ( ) const ; /*!< Retrieve the comment of this configuration domain. */
void setKVComment ( const String & key , const String & comment ) ; /*!< Add a key-value @p comment to a @p key. */
const String & getKVComment ( const String & key ) const ; /*!< Retrieve the key-value comment of a @p key. */
bool hasKVComment ( const String & key ) const ; /*!< Check whether a @p key has a key-value comment. */
2003-10-08 21:59:23 +00:00
} ;
2020-10-19 16:33:45 +00:00
2020-10-16 23:21:42 +00:00
/** A hash map of existing configuration domains. */
2006-04-01 22:31:45 +00:00
typedef HashMap < String , Domain , IgnoreCase_Hash , IgnoreCase_EqualTo > DomainMap ;
2003-11-07 00:03:55 +00:00
2003-10-08 21:59:23 +00:00
/** The name of the application domain (normally 'scummvm'). */
2011-08-06 08:01:34 +00:00
static char const * const kApplicationDomain ;
2003-10-08 21:59:23 +00:00
2003-11-10 23:17:11 +00:00
/** The transient (pseudo) domain. */
2011-08-06 08:01:34 +00:00
static char const * const kTransientDomain ;
2008-01-27 19:47:41 +00:00
2020-10-16 23:21:42 +00:00
/** The name of keymapper domain used to store the key maps. */
2011-08-06 08:01:34 +00:00
static char const * const kKeymapperDomain ;
2003-11-10 23:17:11 +00:00
2016-05-18 08:08:05 +00:00
# ifdef USE_CLOUD
2020-10-16 23:21:42 +00:00
/** The name of cloud domain used to store the user's tokens. */
2016-05-18 08:08:05 +00:00
static char const * const kCloudDomain ;
# endif
2020-10-07 07:57:06 +00:00
void loadDefaultConfigFile ( ) ; /*!< Load the default configuration file. */
void loadConfigFile ( const String & filename ) ; /*!< Load a specific configuration file. */
2004-02-07 04:53:59 +00:00
2006-04-15 13:12:03 +00:00
/**
* Retrieve the config domain with the given name .
2020-09-19 22:48:24 +00:00
* @ param domName Name of the domain to retrieve .
* @ return Pointer to the domain , or 0 if the domain does not exist .
2006-04-15 13:12:03 +00:00
*/
2020-07-31 22:54:37 +00:00
Domain * getDomain ( const String & domName ) ;
2020-10-07 07:57:06 +00:00
const Domain * getDomain ( const String & domName ) const ; /*!< @overload */
2006-04-15 13:12:03 +00:00
2021-04-15 19:20:04 +00:00
/**
2020-09-19 22:48:24 +00:00
* @ name Generic access methods
* @ brief No domain specified , use the values from the
* various domains in the order of their priority .
* @ {
*/
2008-01-27 19:47:41 +00:00
2020-10-16 23:21:42 +00:00
bool hasKey ( const String & key ) const ; /*!< Check if a given @p key exists. */
const String & get ( const String & key ) const ; /*!< Get the value of a @p key. */
void set ( const String & key , const String & value ) ; /*!< Assign a @p value to a @p key. */
2021-04-15 19:20:04 +00:00
/** @} */
2020-07-31 22:54:37 +00:00
2020-06-05 17:43:03 +00:00
/**
* Update a configuration entry for the active domain and flush
2020-09-19 22:48:24 +00:00
* the configuration file to disk if the value changed .
2020-06-05 17:43:03 +00:00
*/
2020-07-31 22:54:37 +00:00
void setAndFlush ( const String & key , const Common : : String & value ) ;
2020-06-05 17:43:03 +00:00
2006-04-15 13:12:03 +00:00
# if 1
2021-04-15 19:20:04 +00:00
/**
2020-09-19 22:48:24 +00:00
* @ name Domain - specific access methods
* @ brief Access one specific domain and modify it .
*
* TBD : Get rid of most of those if possible , or at least reduce
* their usage , by using getDomain as often as possible . For example in the
* options dialog code .
* @ {
*/
2006-04-15 13:12:03 +00:00
2020-10-16 23:21:42 +00:00
bool hasKey ( const String & key , const String & domName ) const ; /*!< Check if a given @p key exists in the @p domName domain. */
const String & get ( const String & key , const String & domName ) const ; /*!< Get the value of a @p key from the @p domName domain. */
void set ( const String & key , const String & value , const String & domName ) ; /*!< Assign a @p value to a @p key in the @p domName domain. */
2006-04-15 13:12:03 +00:00
2020-10-16 23:21:42 +00:00
void removeKey ( const String & key , const String & domName ) ; /*!< Remove a @p key to a @p key from the @p domName domain. */
2020-09-19 22:48:24 +00:00
/** @} */
2006-04-15 13:12:03 +00:00
# endif
2003-11-05 00:57:00 +00:00
2021-04-15 19:20:04 +00:00
/**
2020-09-19 22:48:24 +00:00
* @ name Additional convenience accessors
* @ {
*/
2020-10-07 07:57:06 +00:00
int getInt ( const String & key , const String & domName = String ( ) ) const ; /*!< Get integer value. */
bool getBool ( const String & key , const String & domName = String ( ) ) const ; /*!< Get Boolean value. */
void setInt ( const String & key , int value , const String & domName = String ( ) ) ; /*!< Set integer value. */
2020-10-16 23:21:42 +00:00
void setBool ( const String & key , bool value , const String & domName = String ( ) ) ; /*!< Set Boolean value. */
2003-10-08 21:59:23 +00:00
2020-10-16 23:21:42 +00:00
void registerDefault ( const String & key , const String & value ) ; /*!< Register a value as the default. */
void registerDefault ( const String & key , const char * value ) ; /*!< @overload */
void registerDefault ( const String & key , int value ) ; /*!< @overload */
void registerDefault ( const String & key , bool value ) ; /*!< @overload */
2003-10-08 21:59:23 +00:00
2020-10-07 07:57:06 +00:00
void flushToDisk ( ) ; /*!< Flush configuration to disk. */
2003-10-08 21:59:23 +00:00
2020-10-07 07:57:06 +00:00
void setActiveDomain ( const String & domName ) ; /*!< Set the given domain as active. */
Domain * getActiveDomain ( ) { return _activeDomain ; } /*!< Get the active domain. */
const Domain * getActiveDomain ( ) const { return _activeDomain ; } /*!< @overload */
const String & getActiveDomainName ( ) const { return _activeDomainName ; } /*!< Get the name of the active domain. */
2003-10-08 21:59:23 +00:00
2020-10-07 07:57:06 +00:00
void addGameDomain ( const String & domName ) ; /*!< Add a new game domain. */
void removeGameDomain ( const String & domName ) ; /*!< Remove a game domain. */
void renameGameDomain ( const String & oldName , const String & newName ) ; /*!< Rename a game domain. */
2010-12-29 15:16:31 +00:00
2020-10-07 07:57:06 +00:00
void addMiscDomain ( const String & domName ) ; /*!< Add a miscellaneous domain. */
void removeMiscDomain ( const String & domName ) ; /*!< Remove a miscellaneous domain. */
void renameMiscDomain ( const String & oldName , const String & newName ) ; /*!< Rename a miscellaneous domain. */
2010-12-29 15:16:31 +00:00
2020-10-16 23:21:42 +00:00
bool hasGameDomain ( const String & domName ) const ; /*!< Check if a specific game domain exists in the DomainMap. */
bool hasMiscDomain ( const String & domName ) const ; /*!< Check if a specific miscellaneous domain exists in the DomainMap. */
2010-12-29 15:16:31 +00:00
2020-10-16 23:21:42 +00:00
const DomainMap & getGameDomains ( ) const { return _gameDomains ; } /*!< Return all game domains in the DomainMap. */
DomainMap : : iterator beginGameDomains ( ) { return _gameDomains . begin ( ) ; } /*!< Return the beginning position of game domains. */
DomainMap : : iterator endGameDomains ( ) { return _gameDomains . end ( ) ; } /*!< Return the ending position of game domains. */
2008-01-27 19:47:41 +00:00
2021-04-01 19:17:43 +00:00
const String & getCustomConfigFileName ( ) { return _filename ; } /*!< Return the custom config file being used, or an empty string when using the default config file */
2020-10-16 23:21:42 +00:00
static void defragment ( ) ; /*!< Move the configuration in memory to reduce fragmentation. */
void copyFrom ( ConfigManager & source ) ; /*!< Copy from a ConfigManager instance. */
2020-09-19 22:48:24 +00:00
/** @} */
2003-10-08 21:59:23 +00:00
private :
2005-01-06 18:38:34 +00:00
friend class Singleton < SingletonBaseType > ;
2003-10-08 21:59:23 +00:00
ConfigManager ( ) ;
2020-07-31 22:54:37 +00:00
void loadFromStream ( SeekableReadStream & stream ) ;
void addDomain ( const String & domainName , const Domain & domain ) ;
void writeDomain ( WriteStream & stream , const String & name , const Domain & domain ) ;
void renameDomain ( const String & oldName , const String & newName , DomainMap & map ) ;
2005-07-30 21:11:48 +00:00
2020-07-31 22:54:37 +00:00
Domain _transientDomain ;
DomainMap _gameDomains ;
DomainMap _miscDomains ; // Any other domains
Domain _appDomain ;
Domain _defaultsDomain ;
2005-07-30 21:11:48 +00:00
2020-07-31 22:54:37 +00:00
Domain _keymapperDomain ;
2009-05-10 17:33:31 +00:00
2016-05-18 08:08:05 +00:00
# ifdef USE_CLOUD
2020-07-31 22:54:37 +00:00
Domain _cloudDomain ;
2016-05-18 08:08:05 +00:00
# endif
2020-07-31 22:54:37 +00:00
Array < String > _domainSaveOrder ;
2004-09-28 12:10:49 +00:00
2020-07-31 22:54:37 +00:00
String _activeDomainName ;
Domain * _activeDomain ;
2006-04-15 13:12:03 +00:00
2020-07-31 22:54:37 +00:00
String _filename ;
2003-10-08 21:59:23 +00:00
} ;
2020-07-08 21:30:36 +00:00
/** @} */
2013-01-26 18:33:27 +00:00
} // End of namespace Common
2003-10-08 21:59:23 +00:00
/** Shortcut for accessing the configuration manager. */
2020-07-31 22:54:37 +00:00
# define ConfMan Common::ConfigManager::instance()
2003-10-08 21:59:23 +00:00
# endif