X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da468d387db3b7e22b008bf08be2ff6b202508fb..a7642be106b7d31cb7eb7b55ef74ec4072dce3a2:/include/wx/fileconf.h?ds=sidebyside diff --git a/include/wx/fileconf.h b/include/wx/fileconf.h index 5ea1073489..b7cc9c2cdc 100644 --- a/include/wx/fileconf.h +++ b/include/wx/fileconf.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // Name: fileconf.h -// Purpose: wxFileConfig derivation of wxConfig +// Purpose: wxFileConfig derivation of wxConfigBase // Author: Vadim Zeitlin // Modified by: // Created: 07.04.98 (adapted from appconf.cpp) @@ -17,14 +17,12 @@ #pragma interface "fileconf.h" #endif -// ---------------------------------------------------------------------------- -// compile options -// ---------------------------------------------------------------------------- +#include "wx/defs.h" + +#if wxUSE_CONFIG -// 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 +#include "wx/textfile.h" +#include "wx/string.h" // ---------------------------------------------------------------------------- // wxFileConfig @@ -94,8 +92,36 @@ (it's on by default, the current status can be retrieved with IsExpandingEnvVars function). */ +class wxFileConfig; +class ConfigGroup; +class ConfigEntry; -class wxFileConfig : public wxConfig +// we store all lines of the local config file as a linked list in memory +class LineList +{ +public: + void SetNext(LineList *pNext) { m_pNext = pNext; } + void SetPrev(LineList *pPrev) { m_pPrev = pPrev; } + + // ctor + LineList(const wxString& str, LineList *pNext = (LineList *) NULL) : m_strLine(str) + { SetNext(pNext); SetPrev((LineList *) NULL); } + + // + LineList *Next() const { return m_pNext; } + LineList *Prev() const { return m_pPrev; } + + // + 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 + *m_pPrev; // previous one +}; + +class WXDLLEXPORT wxFileConfig : public wxConfigBase { public: // construct the "standard" full name for global (system-wide) and @@ -108,83 +134,87 @@ public: // // where file is the basename of szFile, ext is it's extension // or .conf (Unix) or .ini (Win) if it has none - static wxString GetGlobalFileName(const char *szFile); - static wxString GetLocalFileName(const char *szFile); + static wxString GetGlobalFileName(const wxChar *szFile); + static wxString GetLocalFileName(const wxChar *szFile); // ctor & dtor - // the names of local and global (if not disabled) config files are - // constructed using Get{Local|Global}FileName functions described above - // (szAppName is just the (short) name of your application) - wxFileConfig(const char *szAppName, bool bLocalOnly = FALSE); - // this ctor allows you to specify custom names for both files (if strGlobal - // isn't a full path, it's considered to be relative to the standard - // directory, i.e. /etc under Unix and %windir% under Windows, if strLocal - // is not an absolute path, it's considered to be relative to the user's - // directory). If either of strings is empty, the corresponding file is not - // 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, + const wxString& vendorName = wxT(""), + const wxString& localFilename = wxT(""), + const wxString& globalFilename = wxT(""), + long style = wxCONFIG_USE_LOCAL_FILE); + // 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 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 uint GetNumberOfEntries(bool bRecursive = FALSE) const; - virtual uint GetNumberOfGroups(bool bRecursive = FALSE) 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 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 long Read(const char *szKey, long lDefault) const - { return wxConfig::Read(szKey, lDefault); } - virtual bool Write(const char *szKey, const char *szValue); - virtual bool Write(const char *szKey, long lValue); + virtual bool Read(const wxString& key, wxString *pStr) const; + virtual bool Read(const wxString& key, wxString *pStr, const wxString& defValue) const; + virtual bool Read(const wxString& key, long *pl) const; + + // The following are necessary to satisfy the compiler + wxString Read(const wxString& key, const wxString& defVal) const + { return wxConfigBase::Read(key, defVal); } + bool Read(const wxString& key, long *pl, long defVal) const + { return wxConfigBase::Read(key, pl, defVal); } + long Read(const wxString& key, long defVal) const + { return wxConfigBase::Read(key, defVal); } + bool Read(const wxString& key, int *pi, int defVal) const + { return wxConfigBase::Read(key, pi, defVal); } + bool Read(const wxString& key, int *pi) const + { return wxConfigBase::Read(key, pi); } + bool Read(const wxString& key, double* val) const + { return wxConfigBase::Read(key, val); } + bool Read(const wxString& key, double* val, double defVal) const + { return wxConfigBase::Read(key, val, defVal); } + bool Read(const wxString& key, bool* val) const + { return wxConfigBase::Read(key, val); } + bool Read(const wxString& key, bool* val, bool defVal) const + { return wxConfigBase::Read(key, val, defVal); } + + virtual bool Write(const wxString& key, const wxString& szValue); + virtual bool Write(const wxString& key, long lValue); + bool Write(const wxString& key, double value) + { return wxConfigBase::Write(key, value); } + bool Write(const wxString& key, bool value) + { return wxConfigBase::Write(key, value); } + bool Write(const wxString& key, const wxChar* value) + { return wxConfigBase::Write(key, value); } + virtual bool Flush(bool bCurrentOnly = FALSE); - virtual bool DeleteEntry(const char *szKey, bool bGroupIfEmptyAlso); - virtual bool DeleteGroup(const char *szKey); + 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); + virtual bool DeleteGroup(const wxString& szKey); virtual bool DeleteAll(); public: - // fwd decl - class ConfigGroup; - class ConfigEntry; - - // 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); SetPrev(NULL); } - - // - LineList *Next() const { return m_pNext; } - LineList *Prev() const { return m_pPrev; } - void SetNext(LineList *pNext) { m_pNext = pNext; } - void SetPrev(LineList *pPrev) { m_pPrev = pPrev; } - - // - 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 - *m_pPrev; // previous one - }; - // functions to work with this list LineList *LineListAppend(const wxString& str); LineList *LineListInsert(const wxString& str, @@ -193,7 +223,7 @@ public: bool LineListIsEmpty(); private: - // GetXXXFileame helpers: return ('/' terminated) directory names + // GetXXXFileName helpers: return ('/' terminated) directory names static wxString GetGlobalDir(); static wxString GetLocalDir(); @@ -222,102 +252,114 @@ private: ConfigGroup *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 *" +#ifdef __UNIX__ + int m_umask; // the umask to use for file creation +#endif // __UNIX__ + public: WX_DEFINE_SORTED_ARRAY(ConfigEntry *, ArrayEntries); WX_DEFINE_SORTED_ARRAY(ConfigGroup *, ArrayGroups); +}; - 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); - }; - - 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 - ConfigEntry *m_pLastEntry; // last entry of this group in the local file - ConfigGroup *m_pLastGroup; // last subgroup - - 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); - - // the new entries in this subgroup will be inserted after the last subgroup - // or, if there is none, after the last entry - void SetLastEntry(ConfigEntry *pLastEntry) { m_pLastEntry = pLastEntry; } - void SetLastGroup(ConfigGroup *pLastGroup) { m_pLastGroup = pLastGroup; } - - wxString GetFullName() const; - - // get the last line belonging to an entry/subgroup of this group - LineList *GetGroupLine(); - LineList *GetLastEntryLine(); - LineList *GetLastGroupLine(); - }; +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); +}; + +class ConfigGroup +{ +private: + wxFileConfig *m_pConfig; // config object we belong to + ConfigGroup *m_pParent; // parent group (NULL for root group) + wxFileConfig::ArrayEntries m_aEntries; // entries in this group + wxFileConfig::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 + ConfigEntry *m_pLastEntry; // last entry/subgroup of this group in the + ConfigGroup *m_pLastGroup; // local file (we insert new ones after it) + + // DeleteSubgroupByName helper + bool DeleteSubgroup(ConfigGroup *pGroup); + +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; } + + const wxFileConfig::ArrayEntries& Entries() const { return m_aEntries; } + const wxFileConfig::ArrayGroups& Groups() const { return m_aSubgroups; } + bool IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); } + + // find entry/subgroup (NULL if not found) + ConfigGroup *FindSubgroup(const wxChar *szName) const; + ConfigEntry *FindEntry (const wxChar *szName) const; + + // delete entry/subgroup, return FALSE if doesn't exist + bool DeleteSubgroupByName(const wxChar *szName); + bool DeleteEntry(const wxChar *szName); + + // create new entry/subgroup returning pointer to newly created element + ConfigGroup *AddSubgroup(const wxString& strName); + ConfigEntry *AddEntry (const wxString& strName, int nLine = wxNOT_FOUND); + + // will also recursively set parent's dirty flag + void SetDirty(); + void SetLine(LineList *pLine); + + // rename: no checks are done to ensure that the name is unique! + void Rename(const wxString& newName); + + // + wxString GetFullName() const; + + // get the last line belonging to an entry/subgroup of this group + LineList *GetGroupLine(); // line which contains [group] + LineList *GetLastEntryLine(); // after which our subgroups start + LineList *GetLastGroupLine(); // after which the next group starts + + // called by entries/subgroups when they're created/deleted + void SetLastEntry(ConfigEntry *pEntry) { m_pLastEntry = pEntry; } + void SetLastGroup(ConfigGroup *pGroup) { m_pLastGroup = pGroup; } }; -#endif //_FILECONF_H +#endif + // wxUSE_CONFIG + +#endif + //_FILECONF_H