X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/855e92a8d9c1a389c09b7afd88dcc16fd4f055f9..b039c367cd7c1085d4175d3f87710a6f00e28fb4:/include/wx/config.h diff --git a/include/wx/config.h b/include/wx/config.h index 07ddc77804..f5b1b195eb 100644 --- a/include/wx/config.h +++ b/include/wx/config.h @@ -1,40 +1,58 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: -// Purpose: +// Name: config.h +// Purpose: declaration of the base class of all config implementations +// (see also: fileconf.h and msw/regconf.h) // Author: Karsten Ballüder & Vadim Zeitlin -// Modified by: +// Modified by: // Created: 07.04.98 (adapted from appconf.h) // RCS-ID: $Id$ -// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net +// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// -#ifndef _APPCONF_H -#define _APPCONF_H +#ifndef _wxCONFIG_H +#define _wxCONFIG_H + +#ifdef __GNUG__ +#pragma interface "config.h" +#endif + +// ---------------------------------------------------------------------------- +// compile options +// ---------------------------------------------------------------------------- + +// it won't compile without it anyhow +#ifndef USE_WXCONFIG + #error "Please define USE_WXCONFIG or remove config.cpp from your makefile" +#endif // USE_WXCONFIG // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- /// shall we be case sensitive in parsing variable names? -#ifndef APPCONF_CASE_SENSITIVE - #define APPCONF_CASE_SENSITIVE false +#ifndef wxCONFIG_CASE_SENSITIVE + #define wxCONFIG_CASE_SENSITIVE FALSE #endif -/// separates group and entry names -#ifndef APPCONF_PATH_SEPARATOR - #define APPCONF_PATH_SEPARATOR '/' +/// separates group and entry names (probably shouldn't be changed) +#ifndef wxCONFIG_PATH_SEPARATOR + #define wxCONFIG_PATH_SEPARATOR '/' #endif /// introduces immutable entries -#ifndef APPCONF_IMMUTABLE_PREFIX - #define APPCONF_IMMUTABLE_PREFIX '!' +// (i.e. the ones which can't be changed from the local config file) +#ifndef wxCONFIG_IMMUTABLE_PREFIX + #define wxCONFIG_IMMUTABLE_PREFIX '!' #endif /// should we use registry instead of configuration files under Win32? -#ifndef APPCONF_WIN32_NATIVE - #define APPCONF_WIN32_NATIVE true +// (i.e. whether wxConfigBase::Create() will create a wxFileConfig (if it's +// FALSE) or wxRegConfig (if it's true and we're under Win32) or wxIniConfig +// (under Win16)) +#ifndef wxCONFIG_WIN32_NATIVE + #define wxCONFIG_WIN32_NATIVE TRUE #endif // ---------------------------------------------------------------------------- @@ -46,41 +64,50 @@ $VARNAME or ${VARNAME} where VARNAME contains alphanumeric characters and '_' only. '$' must be escaped ('\$') in order to be taken literally. */ -extern wxString ExpandEnvVars(const wxString& str); +extern wxString wxExpandEnvVars(const wxString &sz); /* Split path into parts removing '..' in progress */ -extern void SplitPath(wxArrayString& aParts, const char *sz); +extern void wxSplitPath(wxArrayString& aParts, const char *sz); // ---------------------------------------------------------------------------- -// abstract base class wxConfig which defines the interface for derived classes +// abstract base class wxConfigBase which defines the interface for derived +// classes // -// wxConfig organizes the items in a tree-like structure (modeled after the -// Unix/Dos filesystem). There are groups (directories) and keys (files). +// wxConfig organizes the items in a tree-like structure (modeled after the +// Unix/Dos filesystem). There are groups (directories) and keys (files). // There is always one current group given by the current path. // // Keys are pairs "key_name = value" where value may be of string or integer // (long) type (@@@ doubles and other types such as wxDate coming soon). // ---------------------------------------------------------------------------- -class wxConfig +class wxConfigBase { public: // static functions // sets the config object, returns the previous pointer - static wxConfig *Set(wxConfig *pConfig); - // get the config object, creates it on demand - static wxConfig *Get() { if ( !ms_pConfig ) Create(); return ms_pConfig; } - // create a new config object - static void Create(); + static wxConfigBase *Set(wxConfigBase *pConfig); + // get the config object, creates it on demand unless DontCreateOnDemand + // was called + static wxConfigBase *Get() { if ( !ms_pConfig ) Create(); return ms_pConfig; } + // create a new config object: this function will create the "best" + // implementation of wxConfig available for the current platform, see + // comments near definition wxCONFIG_WIN32_NATIVE for details. It returns + // the created object and also sets it as ms_pConfig. + static wxConfigBase *Create(); + // should Get() try to create a new log object if the current one is NULL? + static void DontCreateOnDemand() { ms_bAutoCreate = FALSE; } // ctor & virtual dtor - wxConfig() { } - virtual ~wxConfig(); + // environment variable expansion is on by default + wxConfigBase() { m_bExpandEnvVars = TRUE; m_bRecordDefaults = FALSE; } + // empty but ensures that dtor of all derived classes is virtual + virtual ~wxConfigBase() { } // path management // set current path: if the first character is '/', it's the absolute path, - // otherwise it's a relative path. '..' is supported. If the strPath + // otherwise it's a relative path. '..' is supported. If the strPath // doesn't exist it is created. virtual void SetPath(const wxString& strPath) = 0; // retrieve the current path (always as absolute path) @@ -89,11 +116,24 @@ public: // enumeration: all functions here return false when there are no more items. // you must pass the same lIndex to GetNext and GetFirst (don't modify it) // enumerate subgroups - virtual bool GetFirstGroup(wxString& str, long& lIndex) = 0; - virtual bool GetNextGroup (wxString& str, long& lIndex) = 0; + virtual bool GetFirstGroup(wxString& str, long& lIndex) const = 0; + virtual bool GetNextGroup (wxString& str, long& lIndex) const = 0; // enumerate entries - virtual bool GetFirstEntry(wxString& str, long& lIndex) = 0; - virtual bool GetNextEntry (wxString& str, long& lIndex) = 0; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const = 0; + virtual bool GetNextEntry (wxString& str, long& lIndex) const = 0; + // get number of entries/subgroups in the current group, with or without + // it's subgroups + virtual uint GetNumberOfEntries(bool bRecursive = FALSE) const = 0; + virtual uint GetNumberOfGroups(bool bRecursive = FALSE) const = 0; + + // tests of existence + // returns TRUE if the group by this name exists + virtual bool HasGroup(const wxString& strName) const = 0; + // same as above, but for an entry + virtual bool HasEntry(const wxString& strName) const = 0; + // returns TRUE if either a group or an entry with a given name exist + bool Exists(const wxString& strName) const + { return HasGroup(strName) || HasEntry(strName); } // key access: returns TRUE if value was really read, FALSE if default used // (and if the key is not found the default value is returned.) @@ -105,7 +145,7 @@ public: virtual const char *Read(const char *szKey, const char *szDefault = NULL) const; // the same for longs - long Read(const char *szKey, long lDefault) const + virtual long Read(const char *szKey, long lDefault) const { long l; Read(&l, szKey, lDefault); return l; } // and another version: returns true if default value is returned virtual bool Read(long *pl, const char *szKey, long lDefault = 0) const = 0; @@ -114,50 +154,88 @@ public: virtual bool Write(const char *szKey, const char *szValue) = 0; virtual bool Write(const char *szKey, long lValue) = 0; // permanently writes all changes - virtual bool Flush(bool bCurrentOnly = false) = 0; + virtual bool Flush(bool bCurrentOnly = FALSE) = 0; // delete entries/groups // deletes the specified entry and the group it belongs to if // it was the last key in it and the second parameter is true virtual bool DeleteEntry(const char *szKey, - bool bDeleteGroupIfEmpty = true) = 0; + bool bDeleteGroupIfEmpty = TRUE) = 0; // delete the group (with all subgroups) virtual bool DeleteGroup(const char *szKey) = 0; // delete the whole underlying object (disk file, registry key, ...) // primarly for use by desinstallation routine. virtual bool DeleteAll() = 0; + // options + // we can automatically expand environment variables in the config entries + // (this option is on by default, you can turn it on/off at any time) + bool IsExpandingEnvVars() const { return m_bExpandEnvVars; } + void SetExpandEnvVars(bool bDoIt = TRUE) { m_bExpandEnvVars = bDoIt; } + // recording of default values + void SetRecordDefaults(bool bDoIt = TRUE) { m_bRecordDefaults = bDoIt; } + bool IsRecordingDefaults() const { return m_bRecordDefaults; } + // does expansion only if needed + wxString ExpandEnvVars(const wxString& str) const + { + wxString tmp; // Required for BC++ + if (IsExpandingEnvVars()) + tmp = wxExpandEnvVars(str); + else + tmp = str; + return tmp; + } + protected: - static bool IsImmutable(const char *szKey) - { return *szKey == APPCONF_IMMUTABLE_PREFIX; } + static bool IsImmutable(const char *szKey) + { return *szKey == wxCONFIG_IMMUTABLE_PREFIX; } // a handy little class which changes current path to the path of given entry // and restores it in dtor: so if you declare a local variable of this type, // you work in the entry directory and the path is automatically restored - // when function returns + // when the function returns class PathChanger { public: // ctor/dtor do path changing/restorin - PathChanger(const wxConfig *pContainer, const wxString& strEntry); + PathChanger(const wxConfigBase *pContainer, const wxString& strEntry); ~PathChanger(); // get the key name - const wxString& Name() const { return m_strName; } + const wxString& Name() const { return m_strName; } private: - wxConfig *m_pContainer; // object we live in - wxString m_strName, // name of entry (i.e. name only) - m_strOldPath; // saved path - bool m_bChanged; // was the path changed? + wxConfigBase *m_pContainer; // object we live in + wxString m_strName, // name of entry (i.e. name only) + m_strOldPath; // saved path + bool m_bChanged; // was the path changed? }; +private: // are we doing automatic environment variable expansion? bool m_bExpandEnvVars; - + // do we record default values? + bool m_bRecordDefaults; + // static variables - static wxConfig *ms_pConfig; + static wxConfigBase *ms_pConfig; + static bool ms_bAutoCreate; }; -#endif //_APPCONF_H +// ---------------------------------------------------------------------------- +// the native wxConfigBase implementation +// ---------------------------------------------------------------------------- + +// under Windows we prefer to use the native implementation +#if defined(__WXMSW__) && wxCONFIG_WIN32_NATIVE + #ifdef __WIN32__ + #define wxConfig wxRegConfig + #else //WIN16 + #define wxConfig wxIniConfig + #endif +#else // either we're under Unix or wish to use files even under Windows + #define wxConfig wxFileConfig +#endif + +#endif //_wxCONFIG_H