X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce4169a4d129fc6cd165b2e9ccc5cf5d48356020..fdc62f44622dfcfea2f43910478fe5bb8ac0e938:/include/wx/fileconf.h diff --git a/include/wx/fileconf.h b/include/wx/fileconf.h index f6c4718919..140b707157 100644 --- a/include/wx/fileconf.h +++ b/include/wx/fileconf.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: fileconf.h +// Name: wx/fileconf.h // Purpose: wxFileConfig derivation of wxConfigBase // Author: Vadim Zeitlin // Modified by: @@ -7,22 +7,19 @@ // RCS-ID: $Id$ // Copyright: (c) 1997 Karsten Ballüder & Vadim Zeitlin // Ballueder@usa.net -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _FILECONF_H #define _FILECONF_H -#ifdef __GNUG__ -#pragma interface "fileconf.h" -#endif - #include "wx/defs.h" #if wxUSE_CONFIG #include "wx/textfile.h" #include "wx/string.h" +#include "wx/confbase.h" // ---------------------------------------------------------------------------- // wxFileConfig @@ -88,40 +85,20 @@ 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 previousle disabled with SetExpandEnvVars(FALSE) call + 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 wxFileConfig; -class ConfigGroup; -class ConfigEntry; - -// 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; } +class WXDLLIMPEXP_BASE wxFileConfigGroup; +class WXDLLIMPEXP_BASE wxFileConfigEntry; +class WXDLLIMPEXP_BASE wxFileConfigLineList; -private: - wxString m_strLine; // line contents - LineList *m_pNext, // next node - *m_pPrev; // previous one -}; +#if wxUSE_STREAMS +class WXDLLIMPEXP_BASE wxInputStream; +class WXDLLIMPEXP_BASE wxOutputStream; +#endif // wxUSE_STREAMS -class wxFileConfig : public wxConfigBase +class WXDLLIMPEXP_BASE wxFileConfig : public wxConfigBase { public: // construct the "standard" full name for global (system-wide) and @@ -132,7 +109,7 @@ 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 wxChar *szFile); static wxString GetLocalFileName(const wxChar *szFile); @@ -140,15 +117,29 @@ public: // 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, - const wxString& vendorName = _T(""), - const wxString& localFilename = _T(""), - const wxString& globalFilename = _T(""), - long style = wxCONFIG_USE_LOCAL_FILE); + 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; } @@ -158,60 +149,44 @@ public: 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 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(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); } - - virtual bool Flush(bool bCurrentOnly = FALSE); + 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); + 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 - LineList *LineListAppend(const wxString& str); - LineList *LineListInsert(const wxString& str, - LineList *pLine); // NULL => Prepend() - void LineListRemove(LineList *pLine); + 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; + + virtual bool DoWriteString(const wxString& key, const wxString& szValue); + virtual bool DoWriteLong(const wxString& key, long lValue); + private: // GetXXXFileName helpers: return ('/' terminated) directory names static wxString GetGlobalDir(); @@ -225,127 +200,47 @@ private: 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(); - // member variables - // ---------------- - LineList *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) - - ConfigGroup *m_pRootGroup, // the top (unnamed) group - *m_pCurrentGroup; // the current group + // 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); -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) - 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; } + // set/test the dirty flag + void SetDirty() { m_isDirty = true; } + void ResetDirty() { m_isDirty = false; } + bool IsDirty() const { return m_isDirty; } - 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; + // member variables + // ---------------- + wxFileConfigLineList *m_linesHead, // head of the linked list + *m_linesTail; // tail - // delete entry/subgroup, return FALSE if doesn't exist - bool DeleteSubgroupByName(const wxChar *szName); - bool DeleteEntry(const wxChar *szName); + wxString m_strLocalFile, // local file name passed to ctor + m_strGlobalFile; // global + wxString m_strPath; // current path (not '/' terminated) - // create new entry/subgroup returning pointer to newly created element - ConfigGroup *AddSubgroup(const wxString& strName); - ConfigEntry *AddEntry (const wxString& strName, int nLine = wxNOT_FOUND); + wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group + *m_pCurrentGroup; // the current group - // will also recursively set parent's dirty flag - void SetDirty(); - void SetLine(LineList *pLine); + wxMBConv *m_conv; - // rename: no checks are done to ensure that the name is unique! - void Rename(const wxString& newName); +#ifdef __UNIX__ + int m_umask; // the umask to use for file creation +#endif // __UNIX__ - // - wxString GetFullName() const; + bool m_isDirty; // if true, we have unsaved changes - // 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; } + DECLARE_NO_COPY_CLASS(wxFileConfig) }; #endif // wxUSE_CONFIG -#endif +#endif //_FILECONF_H