]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/fileconf.h
Fix crash when editing wxDVC items in place in wxOSX/Cocoa.
[wxWidgets.git] / include / wx / fileconf.h
index a2bbecb415e2e7dc6938427d833c61489851e3cb..c3dfb5d772c4650c0e8dbeef4caff7d580e2480f 100644 (file)
@@ -1,45 +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     <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
 
 #ifndef   _FILECONF_H
 #define   _FILECONF_H
 
-#ifdef __GNUG__
-#pragma interface "fileconf.h"
-#endif
+#include "wx/defs.h"
 
-// ----------------------------------------------------------------------------
-// compile options
-// ----------------------------------------------------------------------------
+#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"
+#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)
   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;
 
-class wxFileConfig : public wxConfig
+#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
@@ -97,191 +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
-    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();
-  };
+  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