X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd71293400b25ff967cd032b8e1998b403003890..438959cca892a7651634cc3a7aad4819ac49b23c:/include/wx/fileconf.h diff --git a/include/wx/fileconf.h b/include/wx/fileconf.h index 97c03c8ffa..c3dfb5d772 100644 --- a/include/wx/fileconf.h +++ b/include/wx/fileconf.h @@ -1,41 +1,38 @@ -/*****************************************************************************\ - * Project: CppLib: C++ library for Windows/UNIX platfroms * - * File: fileconf.h - file based implementation of Config * - *---------------------------------------------------------------------------* - * Language: C++ * - * Platfrom: Any * - *---------------------------------------------------------------------------* - * Classes: * - *---------------------------------------------------------------------------* - * Author: Vadim Zeitlin zeitlin@dptmaths.ens-cachan.fr> * - * adapted from earlier class by VZ & Karsten Ballüder * - * History: * - * 27.04.98 created * -\*****************************************************************************/ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fileconf.h +// Purpose: wxFileConfig derivation of wxConfigBase +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.cpp) +// RCS-ID: $Id$ +// Copyright: (c) 1997 Karsten Ballueder & Vadim Zeitlin +// Ballueder@usa.net +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// #ifndef _FILECONF_H #define _FILECONF_H -// ---------------------------------------------------------------------------- -// compile options -// ---------------------------------------------------------------------------- +#include "wx/defs.h" -// it won't compile without it anyhow -#ifndef USE_WXCONFIG - #error "Please define USE_WXCONFIG or remove fileconf.cpp from your makefile" -#endif // USE_WXCONFIG +#if wxUSE_CONFIG + +#include "wx/textfile.h" +#include "wx/string.h" +#include "wx/confbase.h" +#include "wx/filename.h" // ---------------------------------------------------------------------------- // wxFileConfig // ---------------------------------------------------------------------------- /* - wxFileConfig derives from base Config and implements file based config class, + wxFileConfig derives from base Config and implements file based config class, i.e. it uses ASCII disk files to store the information. These files are - alternatively called INI, .conf or .rc in the documentation. They are + alternatively called INI, .conf or .rc in the documentation. They are organized in groups or sections, which can nest (i.e. a group contains subgroups, which contain their own subgroups &c). Each group has some - number of entries, which are "key = value" pairs. More precisely, the format + number of entries, which are "key = value" pairs. More precisely, the format is: # comments are allowed after either ';' or '#' (Win/UNIX standard) @@ -79,10 +76,30 @@ and local value is ignored. Of course, the changes are always written to local file only. - @@@@ describe environment variable expansion + The names of these files can be specified in a number of ways. First of all, + you can use the standard convention: using the ctor which takes 'strAppName' + parameter will probably be sufficient for 90% of cases. If, for whatever + reason you wish to use the files with some other names, you can always use the + second ctor. + + wxFileConfig also may automatically expand the values of environment variables + in the entries it reads: for example, if you have an entry + score_file = $HOME/.score + a call to Read(&str, "score_file") will return a complete path to .score file + unless the expansion was previously disabled with SetExpandEnvVars(false) call + (it's on by default, the current status can be retrieved with + IsExpandingEnvVars function). */ +class WXDLLIMPEXP_FWD_BASE wxFileConfigGroup; +class WXDLLIMPEXP_FWD_BASE wxFileConfigEntry; +class WXDLLIMPEXP_FWD_BASE wxFileConfigLineList; + +#if wxUSE_STREAMS +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; +#endif // wxUSE_STREAMS -class wxFileConfig : public wxConfig +class WXDLLIMPEXP_BASE wxFileConfig : public wxConfigBase { public: // construct the "standard" full name for global (system-wide) and @@ -93,186 +110,155 @@ public: // Unix /etc/file.ext ~/.file // Win %windir%\file.ext %USERPROFILE%\file.ext // - // where file is the basename of szFile, ext is it's extension + // where file is the basename of szFile, ext is its extension // or .conf (Unix) or .ini (Win) if it has none - static wxString GetGlobalFileName(const char *szFile); - static wxString GetLocalFileName(const char *szFile); + static wxFileName GetGlobalFile(const wxString& szFile); + static wxFileName GetLocalFile(const wxString& szFile, int style = 0); + + static wxString GetGlobalFileName(const wxString& szFile) + { + return GetGlobalFile(szFile).GetFullPath(); + } + + static wxString GetLocalFileName(const wxString& szFile, int style = 0) + { + return GetLocalFile(szFile, style).GetFullPath(); + } // ctor & dtor - // if strGlobal is empty, only local config file is used - wxFileConfig(const wxString& strLocal, - const wxString& strGlobal = ""); + // New constructor: one size fits all. Specify wxCONFIG_USE_LOCAL_FILE or + // wxCONFIG_USE_GLOBAL_FILE to say which files should be used. + wxFileConfig(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_GLOBAL_FILE, + const wxMBConv& conv = wxConvAuto()); + +#if wxUSE_STREAMS + // ctor that takes an input stream. + wxFileConfig(wxInputStream &inStream, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS + // dtor will save unsaved data virtual ~wxFileConfig(); + // under Unix, set the umask to be used for the file creation, do nothing + // under other systems +#ifdef __UNIX__ + void SetUmask(int mode) { m_umask = mode; } +#else // !__UNIX__ + void SetUmask(int WXUNUSED(mode)) { } +#endif // __UNIX__/!__UNIX__ + // implement inherited pure virtual functions virtual void SetPath(const wxString& strPath); - virtual const wxString& GetPath() const { return m_strPath; } - - virtual bool GetFirstGroup(wxString& str, long& lIndex); - virtual bool GetNextGroup (wxString& str, long& lIndex); - virtual bool GetFirstEntry(wxString& str, long& lIndex); - virtual bool GetNextEntry (wxString& str, long& lIndex); - - virtual bool Read(wxString *pstr, const char *szKey, - const char *szDefault = 0) const; - virtual const char *Read(const char *szKey, - const char *szDefault = 0) const; - virtual bool Read(long *pl, const char *szKey, long lDefault) const; - virtual bool Write(const char *szKey, const char *szValue); - virtual bool Write(const char *szKey, long lValue); - virtual bool Flush(bool bCurrentOnly = FALSE); - - virtual bool DeleteEntry(const char *szKey, bool bGroupIfEmptyAlso); - virtual bool DeleteGroup(const char *szKey); + virtual const wxString& GetPath() const; + + virtual bool GetFirstGroup(wxString& str, long& lIndex) const; + virtual bool GetNextGroup (wxString& str, long& lIndex) const; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const; + virtual bool GetNextEntry (wxString& str, long& lIndex) const; + + virtual size_t GetNumberOfEntries(bool bRecursive = false) const; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const; + + virtual bool HasGroup(const wxString& strName) const; + virtual bool HasEntry(const wxString& strName) const; + + virtual bool Flush(bool bCurrentOnly = false); + + virtual bool RenameEntry(const wxString& oldName, const wxString& newName); + virtual bool RenameGroup(const wxString& oldName, const wxString& newName); + + virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso = true); + virtual bool DeleteGroup(const wxString& szKey); virtual bool DeleteAll(); -public: - // fwd decl - class ConfigGroup; - class ConfigEntry; + // additional, wxFileConfig-specific, functionality +#if wxUSE_STREAMS + // save the entire config file text to the given stream, note that the text + // won't be saved again in dtor when Flush() is called if you use this method + // as it won't be "changed" any more + virtual bool Save(wxOutputStream& os, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS - // we store all lines of the local config file as a linked list in memory - class LineList - { - public: - // ctor - LineList(const wxString& str, LineList *pNext = NULL) : m_strLine(str) - { SetNext(pNext); } - - // - LineList *Next() const { return m_pNext; } - void SetNext(LineList *pNext) { m_pNext = pNext; } - - // - void SetText(const wxString& str) { m_strLine = str; } - const wxString& Text() const { return m_strLine; } - - private: - wxString m_strLine; // line contents - LineList *m_pNext; // next node - }; - +public: // functions to work with this list - LineList *LineListAppend(const wxString& str); - LineList *LineListInsert(const wxString& str, - LineList *pLine); // NULL => Append() + wxFileConfigLineList *LineListAppend(const wxString& str); + wxFileConfigLineList *LineListInsert(const wxString& str, + wxFileConfigLineList *pLine); // NULL => Prepend() + void LineListRemove(wxFileConfigLineList *pLine); bool LineListIsEmpty(); +protected: + virtual bool DoReadString(const wxString& key, wxString *pStr) const; + virtual bool DoReadLong(const wxString& key, long *pl) const; +#if wxUSE_BASE64 + virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const; +#endif // wxUSE_BASE64 + + virtual bool DoWriteString(const wxString& key, const wxString& szValue); + virtual bool DoWriteLong(const wxString& key, long lValue); +#if wxUSE_BASE64 + virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf); +#endif // wxUSE_BASE64 + private: - // put the object in the initial state + // GetXXXFileName helpers: return ('/' terminated) directory names + static wxString GetGlobalDir(); + static wxString GetLocalDir(int style = 0); + + // common part of all ctors (assumes that m_str{Local|Global}File are already + // initialized void Init(); + // common part of from dtor and DeleteAll + void CleanUp(); + // parse the whole file - void Parse(wxTextFile& file, bool bLocal); + void Parse(const wxTextBuffer& buffer, bool bLocal); // the same as SetPath("/") void SetRootPath(); + // real SetPath() implementation, returns true if path could be set or false + // if path doesn't exist and createMissingComponents == false + bool DoSetPath(const wxString& strPath, bool createMissingComponents); + + // set/test the dirty flag + void SetDirty() { m_isDirty = true; } + void ResetDirty() { m_isDirty = false; } + bool IsDirty() const { return m_isDirty; } + + // member variables // ---------------- - LineList *m_linesHead, // head of the linked list - *m_linesTail; // tail + wxFileConfigLineList *m_linesHead, // head of the linked list + *m_linesTail; // tail - wxString m_strLocalFile, // local file name passed to ctor - m_strGlobalFile; // global - wxString m_strPath; // current path (not '/' terminated) + wxFileName m_fnLocalFile, // local file name passed to ctor + m_fnGlobalFile; // global + wxString m_strPath; // current path (not '/' terminated) - ConfigGroup *m_pRootGroup, // the top (unnamed) group - *m_pCurrentGroup; // the current group + wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group + *m_pCurrentGroup; // the current group -//protected: --- if wxFileConfig::ConfigEntry is not public, functions in -// ConfigGroup such as Find/AddEntry can't return "ConfigEntry *" -public: - WX_DEFINE_ARRAY(ConfigEntry *, ArrayEntries); - WX_DEFINE_ARRAY(ConfigGroup *, ArrayGroups); + wxMBConv *m_conv; - class ConfigEntry - { - private: - ConfigGroup *m_pParent; // group that contains us - wxString m_strName, // entry name - m_strValue; // value - bool m_bDirty, // changed since last read? - m_bImmutable; // can be overriden locally? - int m_nLine; // used if m_pLine == NULL only - LineList *m_pLine; // pointer to our line in the linked list - // or NULL if it was found in global file - - public: - ConfigEntry(ConfigGroup *pParent, const wxString& strName, int nLine); - - // simple accessors - const wxString& Name() const { return m_strName; } - const wxString& Value() const { return m_strValue; } - ConfigGroup *Group() const { return m_pParent; } - bool IsDirty() const { return m_bDirty; } - bool IsImmutable() const { return m_bImmutable; } - bool IsLocal() const { return m_pLine != 0; } - int Line() const { return m_nLine; } - LineList *GetLine() const { return m_pLine; } - - // modify entry attributes - void SetValue(const wxString& strValue, bool bUser = TRUE); - void SetDirty(); - void SetLine(LineList *pLine); - }; +#ifdef __UNIX__ + int m_umask; // the umask to use for file creation +#endif // __UNIX__ -protected: - class ConfigGroup - { - private: - wxFileConfig *m_pConfig; // config object we belong to - ConfigGroup *m_pParent; // parent group (NULL for root group) - ArrayEntries m_aEntries; // entries in this group - ArrayGroups m_aSubgroups; // subgroups - wxString m_strName; // group's name - bool m_bDirty; // if FALSE => all subgroups are not dirty - LineList *m_pLine; // pointer to our line in the linked list - int m_nLastEntry, // last here means "last added" - m_nLastGroup; // - - public: - // ctor - ConfigGroup(ConfigGroup *pParent, const wxString& strName, wxFileConfig *); - - // dtor deletes all entries and subgroups also - ~ConfigGroup(); - - // simple accessors - const wxString& Name() const { return m_strName; } - ConfigGroup *Parent() const { return m_pParent; } - wxFileConfig *Config() const { return m_pConfig; } - bool IsDirty() const { return m_bDirty; } - - bool IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); } - const ArrayEntries& Entries() const { return m_aEntries; } - const ArrayGroups& Groups() const { return m_aSubgroups; } - - // find entry/subgroup (NULL if not found) - ConfigGroup *FindSubgroup(const char *szName) const; - ConfigEntry *FindEntry (const char *szName) const; - - // delete entry/subgroup, return FALSE if doesn't exist - bool DeleteSubgroup(const char *szName); - bool DeleteEntry(const char *szName); - - // create new entry/subgroup returning pointer to newly created element - ConfigGroup *AddSubgroup(const wxString& strName); - ConfigEntry *AddEntry (const wxString& strName, int nLine = NOT_FOUND); - - // will also recursively set parent's dirty flag - void SetDirty(); - void SetLine(LineList *pLine); - - wxString GetFullName() const; - - // get the last line belonging to an entry/subgroup of this group - LineList *GetGroupLine(); - LineList *GetLastEntryLine(); - LineList *GetLastGroupLine(); - }; + bool m_isDirty; // if true, we have unsaved changes + + wxDECLARE_NO_COPY_CLASS(wxFileConfig); + DECLARE_ABSTRACT_CLASS(wxFileConfig) }; -#endif //_FILECONF_H +#endif + // wxUSE_CONFIG + +#endif + //_FILECONF_H