| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/confbase.h
- // Purpose: declaration of the base class of all config implementations
- // (see also: fileconf.h and msw/regconf.h and iniconf.h)
- // Author: Karsten Ballueder & Vadim Zeitlin
- // Modified by:
- // Created: 07.04.98 (adapted from appconf.h)
- // Copyright: (c) 1997 Karsten Ballueder Ballueder@usa.net
- // Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_CONFBASE_H_
- #define _WX_CONFBASE_H_
- #include "wx/defs.h"
- #include "wx/string.h"
- #include "wx/object.h"
- #include "wx/base64.h"
- class WXDLLIMPEXP_FWD_BASE wxArrayString;
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- /// shall we be case sensitive in parsing variable names?
- #ifndef wxCONFIG_CASE_SENSITIVE
- #define wxCONFIG_CASE_SENSITIVE 0
- #endif
- /// separates group and entry names (probably shouldn't be changed)
- #ifndef wxCONFIG_PATH_SEPARATOR
- #define wxCONFIG_PATH_SEPARATOR wxT('/')
- #endif
- /// introduces immutable entries
- // (i.e. the ones which can't be changed from the local config file)
- #ifndef wxCONFIG_IMMUTABLE_PREFIX
- #define wxCONFIG_IMMUTABLE_PREFIX wxT('!')
- #endif
- #if wxUSE_CONFIG
- /// should we use registry instead of configuration files under Windows?
- // (i.e. whether wxConfigBase::Create() will create a wxFileConfig (if it's
- // false) or wxRegConfig (if it's true and we're under Win32))
- #ifndef wxUSE_CONFIG_NATIVE
- #define wxUSE_CONFIG_NATIVE 1
- #endif
- // not all compilers can deal with template Read/Write() methods, define this
- // symbol if the template functions are available
- #if (!defined(__VISUALC__) || __VISUALC__ > 1200) && \
- !defined( __VMS ) && \
- !(defined(__HP_aCC) && defined(__hppa)) && \
- !defined (__DMC__)
- #define wxHAS_CONFIG_TEMPLATE_RW
- #endif
- // Style flags for constructor style parameter
- enum
- {
- wxCONFIG_USE_LOCAL_FILE = 1,
- wxCONFIG_USE_GLOBAL_FILE = 2,
- wxCONFIG_USE_RELATIVE_PATH = 4,
- wxCONFIG_USE_NO_ESCAPE_CHARACTERS = 8,
- wxCONFIG_USE_SUBDIR = 16
- };
- // ----------------------------------------------------------------------------
- // abstract base class wxConfigBase which defines the interface for derived
- // classes
- //
- // wxConfig organizes the items in a tree-like structure (modelled 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 (TODO doubles and other types such as wxDate coming soon).
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_BASE wxConfigBase : public wxObject
- {
- public:
- // constants
- // the type of an entry
- enum EntryType
- {
- Type_Unknown,
- Type_String,
- Type_Boolean,
- Type_Integer, // use Read(long *)
- Type_Float // use Read(double *)
- };
- // static functions
- // sets the config object, returns the previous pointer
- static wxConfigBase *Set(wxConfigBase *pConfig);
- // get the config object, creates it on demand unless DontCreateOnDemand
- // was called
- static wxConfigBase *Get(bool createOnDemand = true)
- { if ( createOnDemand && (!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 wxUSE_CONFIG_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
- // ctor (can be used as default ctor too)
- //
- // Not all args will always be used by derived classes, but including
- // them all in each class ensures compatibility. If appName is empty,
- // uses wxApp name
- wxConfigBase(const wxString& appName = wxEmptyString,
- const wxString& vendorName = wxEmptyString,
- const wxString& localFilename = wxEmptyString,
- const wxString& globalFilename = wxEmptyString,
- long style = 0);
- // 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
- // doesn't exist it is created.
- virtual void SetPath(const wxString& strPath) = 0;
- // retrieve the current path (always as absolute path)
- virtual const wxString& GetPath() const = 0;
- // 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) const = 0;
- virtual bool GetNextGroup (wxString& str, long& lIndex) const = 0;
- // enumerate entries
- 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 size_t GetNumberOfEntries(bool bRecursive = false) const = 0;
- virtual size_t 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); }
- // get the entry type
- virtual EntryType GetEntryType(const wxString& name) const
- {
- // by default all entries are strings
- return HasEntry(name) ? Type_String : Type_Unknown;
- }
- // 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.)
- // read a string from the key
- bool Read(const wxString& key, wxString *pStr) const;
- bool Read(const wxString& key, wxString *pStr, const wxString& defVal) const;
- // read a number (long)
- bool Read(const wxString& key, long *pl) const;
- bool Read(const wxString& key, long *pl, long defVal) const;
- // read an int (wrapper around `long' version)
- bool Read(const wxString& key, int *pi) const;
- bool Read(const wxString& key, int *pi, int defVal) const;
- // read a double
- bool Read(const wxString& key, double* val) const;
- bool Read(const wxString& key, double* val, double defVal) const;
- // read a float
- bool Read(const wxString& key, float* val) const;
- bool Read(const wxString& key, float* val, float defVal) const;
- // read a bool
- bool Read(const wxString& key, bool* val) const;
- bool Read(const wxString& key, bool* val, bool defVal) const;
- #if wxUSE_BASE64
- // read a binary data block
- bool Read(const wxString& key, wxMemoryBuffer* data) const
- { return DoReadBinary(key, data); }
- // no default version since it does not make sense for binary data
- #endif // wxUSE_BASE64
- #ifdef wxHAS_CONFIG_TEMPLATE_RW
- // read other types, for which wxFromString is defined
- template <typename T>
- bool Read(const wxString& key, T* value) const
- {
- wxString s;
- if ( !Read(key, &s) )
- return false;
- return wxFromString(s, value);
- }
- template <typename T>
- bool Read(const wxString& key, T* value, const T& defVal) const
- {
- const bool found = Read(key, value);
- if ( !found )
- {
- if (IsRecordingDefaults())
- ((wxConfigBase *)this)->Write(key, defVal);
- *value = defVal;
- }
- return found;
- }
- #endif // wxHAS_CONFIG_TEMPLATE_RW
- // convenience functions returning directly the value
- wxString Read(const wxString& key,
- const wxString& defVal = wxEmptyString) const
- { wxString s; (void)Read(key, &s, defVal); return s; }
- // we have to provide a separate version for C strings as otherwise the
- // template Read() would be used
- wxString Read(const wxString& key, const char* defVal) const
- { return Read(key, wxString(defVal)); }
- wxString Read(const wxString& key, const wchar_t* defVal) const
- { return Read(key, wxString(defVal)); }
- long ReadLong(const wxString& key, long defVal) const
- { long l; (void)Read(key, &l, defVal); return l; }
- double ReadDouble(const wxString& key, double defVal) const
- { double d; (void)Read(key, &d, defVal); return d; }
- bool ReadBool(const wxString& key, bool defVal) const
- { bool b; (void)Read(key, &b, defVal); return b; }
- template <typename T>
- T ReadObject(const wxString& key, T const& defVal) const
- { T t; (void)Read(key, &t, defVal); return t; }
- // for compatibility with wx 2.8
- long Read(const wxString& key, long defVal) const
- { return ReadLong(key, defVal); }
- // write the value (return true on success)
- bool Write(const wxString& key, const wxString& value)
- { return DoWriteString(key, value); }
- bool Write(const wxString& key, long value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, double value)
- { return DoWriteDouble(key, value); }
- bool Write(const wxString& key, bool value)
- { return DoWriteBool(key, value); }
- #if wxUSE_BASE64
- bool Write(const wxString& key, const wxMemoryBuffer& buf)
- { return DoWriteBinary(key, buf); }
- #endif // wxUSE_BASE64
- // we have to provide a separate version for C strings as otherwise they
- // would be converted to bool and not to wxString as expected!
- bool Write(const wxString& key, const char *value)
- { return Write(key, wxString(value)); }
- bool Write(const wxString& key, const unsigned char *value)
- { return Write(key, wxString(value)); }
- bool Write(const wxString& key, const wchar_t *value)
- { return Write(key, wxString(value)); }
- // we also have to provide specializations for other types which we want to
- // handle using the specialized DoWriteXXX() instead of the generic template
- // version below
- bool Write(const wxString& key, char value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, unsigned char value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, short value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, unsigned short value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, unsigned int value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, int value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, unsigned long value)
- { return DoWriteLong(key, value); }
- bool Write(const wxString& key, float value)
- { return DoWriteDouble(key, value); }
- // Causes ambiguities in VC++ 6 and OpenVMS (at least)
- #if ( (!defined(__VISUALC__) || __VISUALC__ > 1200) && !defined( __VMS ) && !defined (__DMC__))
- // for other types, use wxToString()
- template <typename T>
- bool Write(const wxString& key, T const& value)
- { return Write(key, wxToString(value)); }
- #endif
- // permanently writes all changes
- virtual bool Flush(bool bCurrentOnly = false) = 0;
- // renaming, all functions return false on failure (probably because the new
- // name is already taken by an existing entry)
- // rename an entry
- virtual bool RenameEntry(const wxString& oldName,
- const wxString& newName) = 0;
- // rename a group
- virtual bool RenameGroup(const wxString& oldName,
- const wxString& newName) = 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 wxString& key,
- bool bDeleteGroupIfEmpty = true) = 0;
- // delete the group (with all subgroups)
- virtual bool DeleteGroup(const wxString& key) = 0;
- // delete the whole underlying object (disk file, registry key, ...)
- // primarily for use by uninstallation 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;
- // misc accessors
- wxString GetAppName() const { return m_appName; }
- wxString GetVendorName() const { return m_vendorName; }
- // Used wxIniConfig to set members in constructor
- void SetAppName(const wxString& appName) { m_appName = appName; }
- void SetVendorName(const wxString& vendorName) { m_vendorName = vendorName; }
- void SetStyle(long style) { m_style = style; }
- long GetStyle() const { return m_style; }
- protected:
- static bool IsImmutable(const wxString& key)
- { return !key.IsEmpty() && key[0] == wxCONFIG_IMMUTABLE_PREFIX; }
- // return the path without trailing separator, if any: this should be called
- // to sanitize paths referring to the group names before passing them to
- // wxConfigPathChanger as "/foo/bar/" should be the same as "/foo/bar" and it
- // isn't interpreted in the same way by it (and this can't be changed there
- // as it's not the same for the entries names)
- static wxString RemoveTrailingSeparator(const wxString& key);
- // do read/write the values of different types
- virtual bool DoReadString(const wxString& key, wxString *pStr) const = 0;
- virtual bool DoReadLong(const wxString& key, long *pl) const = 0;
- virtual bool DoReadDouble(const wxString& key, double* val) const;
- virtual bool DoReadBool(const wxString& key, bool* val) const;
- #if wxUSE_BASE64
- virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const = 0;
- #endif // wxUSE_BASE64
- virtual bool DoWriteString(const wxString& key, const wxString& value) = 0;
- virtual bool DoWriteLong(const wxString& key, long value) = 0;
- virtual bool DoWriteDouble(const wxString& key, double value);
- virtual bool DoWriteBool(const wxString& key, bool value);
- #if wxUSE_BASE64
- virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf) = 0;
- #endif // wxUSE_BASE64
- private:
- // are we doing automatic environment variable expansion?
- bool m_bExpandEnvVars;
- // do we record default values?
- bool m_bRecordDefaults;
- // static variables
- static wxConfigBase *ms_pConfig;
- static bool ms_bAutoCreate;
- // Application name and organisation name
- wxString m_appName;
- wxString m_vendorName;
- // Style flag
- long m_style;
- DECLARE_ABSTRACT_CLASS(wxConfigBase)
- };
- // 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 the function returns
- // Taken out of wxConfig since not all compilers can cope with nested classes.
- class WXDLLIMPEXP_BASE wxConfigPathChanger
- {
- public:
- // ctor/dtor do path changing/restoring of the path
- wxConfigPathChanger(const wxConfigBase *pContainer, const wxString& strEntry);
- ~wxConfigPathChanger();
- // get the key name
- const wxString& Name() const { return m_strName; }
- // this method must be called if the original path (i.e. the current path at
- // the moment of creation of this object) could have been deleted to prevent
- // us from restoring the not existing (any more) path
- //
- // if the original path doesn't exist any more, the path will be restored to
- // the deepest still existing component of the old path
- void UpdateIfDeleted();
- private:
- 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?
- wxDECLARE_NO_COPY_CLASS(wxConfigPathChanger);
- };
- #endif // wxUSE_CONFIG
- /*
- Replace environment variables ($SOMETHING) with their values. The format is
- $VARNAME or ${VARNAME} where VARNAME contains alphanumeric characters and
- '_' only. '$' must be escaped ('\$') in order to be taken literally.
- */
- WXDLLIMPEXP_BASE wxString wxExpandEnvVars(const wxString &sz);
- /*
- Split path into parts removing '..' in progress
- */
- WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxString& path);
- #endif // _WX_CONFBASE_H_
|