| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/fileconf.h
- // Purpose: wxFileConfig derivation of wxConfigBase
- // Author: Vadim Zeitlin
- // Modified by:
- // Created: 07.04.98 (adapted from appconf.cpp)
- // Copyright: (c) 1997 Karsten Ballueder & Vadim Zeitlin
- // Ballueder@usa.net <zeitlin@dptmaths.ens-cachan.fr>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _FILECONF_H
- #define _FILECONF_H
- #include "wx/defs.h"
- #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,
- 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
- 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
- is:
- # comments are allowed after either ';' or '#' (Win/UNIX standard)
- # blank lines (as above) are ignored
- # global entries are members of special (no name) top group
- written_for = Windows
- platform = Linux
- # the start of the group 'Foo'
- [Foo] # may put comments like this also
- # following 3 lines are entries
- key = value
- another_key = " strings with spaces in the beginning should be quoted, \
- otherwise the spaces are lost"
- last_key = but you don't have to put " normally (nor quote them, like here)
- # subgroup of the group 'Foo'
- # (order is not important, only the name is: separator is '/', as in paths)
- [Foo/Bar]
- # entries prefixed with "!" are immutable, i.e. can't be changed if they are
- # set in the system-wide config file
- !special_key = value
- bar_entry = whatever
- [Foo/Bar/Fubar] # depth is (theoretically :-) unlimited
- # may have the same name as key in another section
- bar_entry = whatever not
- You have {read/write/delete}Entry functions (guess what they do) and also
- setCurrentPath to select current group. enum{Subgroups/Entries} allow you
- to get all entries in the config file (in the current group). Finally,
- flush() writes immediately all changed entries to disk (otherwise it would
- be done automatically in dtor)
- wxFileConfig manages not less than 2 config files for each program: global
- and local (or system and user if you prefer). Entries are read from both of
- them and the local entries override the global ones unless the latter is
- immutable (prefixed with '!') in which case a warning message is generated
- and local value is ignored. Of course, the changes are always written to local
- file only.
- 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 WXDLLIMPEXP_BASE wxFileConfig : public wxConfigBase
- {
- public:
- // construct the "standard" full name for global (system-wide) and
- // local (user-specific) config files from the base file name.
- //
- // the following are the filenames returned by this functions:
- // global local
- // Unix /etc/file.ext ~/.file
- // Win %windir%\file.ext %USERPROFILE%\file.ext
- //
- // where file is the basename of szFile, ext is its extension
- // or .conf (Unix) or .ini (Win) if it has none
- 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
- // 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;
- 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();
- // 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
- public:
- // functions to work with this list
- 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:
- // 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(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
- // ----------------
- wxFileConfigLineList *m_linesHead, // head of the linked list
- *m_linesTail; // tail
- wxFileName m_fnLocalFile, // local file name passed to ctor
- m_fnGlobalFile; // global
- wxString m_strPath; // current path (not '/' terminated)
- wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group
- *m_pCurrentGroup; // the current group
- wxMBConv *m_conv;
- #ifdef __UNIX__
- int m_umask; // the umask to use for file creation
- #endif // __UNIX__
- bool m_isDirty; // if true, we have unsaved changes
- wxDECLARE_NO_COPY_CLASS(wxFileConfig);
- DECLARE_ABSTRACT_CLASS(wxFileConfig)
- };
- #endif
- // wxUSE_CONFIG
- #endif
- //_FILECONF_H
|