X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42841dfcaddc6045ffc618acbb620b1fde1bc618..b02dd12239c8a59b9a545d9fcb04974f8ad02c6b:/include/wx/confbase.h diff --git a/include/wx/confbase.h b/include/wx/confbase.h index 15c4919896..481723857e 100644 --- a/include/wx/confbase.h +++ b/include/wx/confbase.h @@ -1,27 +1,25 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: confbase.h +// 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 Ballüder & Vadim Zeitlin +// Author: Karsten Ballueder & Vadim Zeitlin // 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 Ballueder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifndef _WX_CONFBASE_H_ -#define _WX_CONFBASE_H_ - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma interface "confbase.h" -#endif +#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_BASE wxArrayString; +class WXDLLIMPEXP_FWD_BASE wxArrayString; // ---------------------------------------------------------------------------- // constants @@ -34,19 +32,17 @@ class WXDLLIMPEXP_BASE wxArrayString; /// separates group and entry names (probably shouldn't be changed) #ifndef wxCONFIG_PATH_SEPARATOR - #define wxCONFIG_PATH_SEPARATOR _T('/') + #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 _T('!') + #define wxCONFIG_IMMUTABLE_PREFIX wxT('!') #endif #if wxUSE_CONFIG -#include "wx/string.h" - /// 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)) @@ -54,13 +50,23 @@ class WXDLLIMPEXP_BASE wxArrayString; #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_NO_ESCAPE_CHARACTERS = 8, + wxCONFIG_USE_SUBDIR = 16 }; // ---------------------------------------------------------------------------- @@ -75,7 +81,7 @@ enum // (long) type (TODO doubles and other types such as wxDate coming soon). // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxConfigBase +class WXDLLIMPEXP_BASE wxConfigBase : public wxObject { public: // constants @@ -117,7 +123,7 @@ public: long style = 0); // empty but ensures that dtor of all derived classes is virtual - virtual ~wxConfigBase(){}; + virtual ~wxConfigBase(); // path management // set current path: if the first character is '/', it's the absolute path, @@ -167,7 +173,7 @@ public: bool Read(const wxString& key, long *pl) const; bool Read(const wxString& key, long *pl, long defVal) const; - // read an int + // 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; @@ -175,39 +181,138 @@ public: 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; - // convenience functions returning directly the value (we don't have them for - // int/double/bool as there would be ambiguities with the long one then) +#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 + bool Read(const wxString& key, T* value) const + { + wxString s; + if ( !Read(key, &s) ) + return false; + return wxFromString(s, value); + } + + template + 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; } - long Read(const wxString& key, long defVal) const + // 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; } - // write the value (return true on success) + 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 + 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, int value) - { return DoWriteInt(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 wxChar *value) + 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 + 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; @@ -229,7 +334,7 @@ public: // delete the group (with all subgroups) virtual bool DeleteGroup(const wxString& key) = 0; // delete the whole underlying object (disk file, registry key, ...) - // primarly for use by desinstallation routine. + // primarily for use by uninstallation routine. virtual bool DeleteAll() = 0; // options @@ -258,18 +363,29 @@ 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 DoReadInt(const wxString& key, int *pi) const; 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 DoWriteInt(const wxString& key, int value); 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? @@ -287,6 +403,8 @@ private: // Style flag long m_style; + + DECLARE_ABSTRACT_CLASS(wxConfigBase) }; // a handy little class which changes current path to the path of given entry @@ -297,35 +415,31 @@ private: class WXDLLIMPEXP_BASE wxConfigPathChanger { public: - // ctor/dtor do path changing/restorin + // 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? - DECLARE_NO_COPY_CLASS(wxConfigPathChanger) + wxDECLARE_NO_COPY_CLASS(wxConfigPathChanger); }; -// ---------------------------------------------------------------------------- -// the native wxConfigBase implementation -// ---------------------------------------------------------------------------- - -// under Windows we prefer to use the native implementation -// wxIniConfig isn't native anywhere after droping win16 in wxWidgets 2.6 -#if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE - #define wxConfig wxRegConfig -#else // either we're under Unix or wish to use files even under Windows - #define wxConfig wxFileConfig -#endif - #endif // wxUSE_CONFIG /* @@ -339,9 +453,7 @@ WXDLLIMPEXP_BASE wxString wxExpandEnvVars(const wxString &sz); /* Split path into parts removing '..' in progress */ -WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxChar *sz); - +WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxString& path); -#endif - // _WX_CONFIG_H_ +#endif // _WX_CONFBASE_H_