]> git.saurik.com Git - wxWidgets.git/commitdiff
1) APPCONF_ constants renamed to wxCONFIG_
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 29 Jul 1998 12:03:42 +0000 (12:03 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 29 Jul 1998 12:03:42 +0000 (12:03 +0000)
2) wxConfig::Create() now chooses the best (native) implemenntation of
   wxConfig instead of calling wxApp::CreateConfig which was suppressed
3) wxFileConfig(const char *appname) ctor added which looks for the config
   file(s) in standard location(s)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@398 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/config.h
include/wx/fileconf.h
src/common/config.cpp
src/common/fileconf.cpp

index 00aaf1f233caf74cc16558667602a8d96a21aef2..ecb4782ebb3fc76cb2242547e83de2610923e6d8 100644 (file)
@@ -3,16 +3,16 @@
 // Purpose:     declaration of the base class of all config implementations
 //              (see also: fileconf.h and msw/regconf.h)
 // Author:      Karsten Ballüder & Vadim Zeitlin
 // Purpose:     declaration of the base class of all config implementations
 //              (see also: fileconf.h and msw/regconf.h)
 // Author:      Karsten Ballüder & Vadim Zeitlin
-// Modified by: 
+// Modified by:
 // Created:     07.04.98 (adapted from appconf.h)
 // RCS-ID:      $Id$
 // Created:     07.04.98 (adapted from appconf.h)
 // RCS-ID:      $Id$
-// Copyright:   (c) 1997 Karsten Ballüder   Ballueder@usa.net  
+// Copyright:   (c) 1997 Karsten Ballüder   Ballueder@usa.net
 //                       Vadim Zeitlin      <zeitlin@dptmaths.ens-cachan.fr>
 // Licence:     wxWindows license
 ///////////////////////////////////////////////////////////////////////////////
 
 //                       Vadim Zeitlin      <zeitlin@dptmaths.ens-cachan.fr>
 // Licence:     wxWindows license
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifndef   _APPCONF_H
-#define   _APPCONF_H
+#ifndef   _wxCONFIG_H
+#define   _wxCONFIG_H
 
 #ifdef __GNUG__
 #pragma interface "config.h"
 
 #ifdef __GNUG__
 #pragma interface "config.h"
 // ----------------------------------------------------------------------------
 
 /// shall we be case sensitive in parsing variable names?
 // ----------------------------------------------------------------------------
 
 /// shall we be case sensitive in parsing variable names?
-#ifndef APPCONF_CASE_SENSITIVE
-  #define  APPCONF_CASE_SENSITIVE       FALSE
+#ifndef wxCONFIG_CASE_SENSITIVE
+  #define  wxCONFIG_CASE_SENSITIVE       FALSE
 #endif
 
 #endif
 
-/// separates group and entry names
-#ifndef APPCONF_PATH_SEPARATOR
-  #define   APPCONF_PATH_SEPARATOR     '/'
+/// separates group and entry names (probably shouldn't be changed)
+#ifndef wxCONFIG_PATH_SEPARATOR
+  #define   wxCONFIG_PATH_SEPARATOR     '/'
 #endif
 
 /// introduces immutable entries
 #endif
 
 /// introduces immutable entries
-#ifndef APPCONF_IMMUTABLE_PREFIX
-  #define   APPCONF_IMMUTABLE_PREFIX   '!'
+// (i.e. the ones which can't be changed from the local config file)
+#ifndef wxCONFIG_IMMUTABLE_PREFIX
+  #define   wxCONFIG_IMMUTABLE_PREFIX   '!'
 #endif
 
 /// should we use registry instead of configuration files under Win32?
 #endif
 
 /// should we use registry instead of configuration files under Win32?
-#ifndef   APPCONF_WIN32_NATIVE
-  #define APPCONF_WIN32_NATIVE          TRUE
+// (i.e. whether wxConfig::Create() will create a wxFileConfig (if it's FALSE) or
+// wxRegConfig (if it's true and we're under Win32) or wxIniConfig (Win16))
+#ifndef   wxCONFIG_WIN32_NATIVE
+  #define wxCONFIG_WIN32_NATIVE          TRUE
 #endif
 
 // ----------------------------------------------------------------------------
 #endif
 
 // ----------------------------------------------------------------------------
@@ -70,8 +73,8 @@ extern void wxSplitPath(wxArrayString& aParts, const char *sz);
 // ----------------------------------------------------------------------------
 // abstract base class wxConfig which defines the interface for derived classes
 //
 // ----------------------------------------------------------------------------
 // abstract base class wxConfig which defines the interface for derived classes
 //
-// wxConfig organizes the items in a tree-like structure (modeled after the 
-// Unix/Dos filesystem). There are groups (directories) and keys (files). 
+// wxConfig organizes the items in a tree-like structure (modeled after the
+// Unix/Dos filesystem). There are groups (directories) and keys (files).
 // There is always one current group given by the current path.
 //
 // Keys are pairs "key_name = value" where value may be of string or integer
 // There is always one current group given by the current path.
 //
 // Keys are pairs "key_name = value" where value may be of string or integer
@@ -85,16 +88,21 @@ public:
   static wxConfig *Set(wxConfig *pConfig);
     // get the config object, creates it on demand
   static wxConfig *Get() { if ( !ms_pConfig ) Create(); return ms_pConfig; }
   static wxConfig *Set(wxConfig *pConfig);
     // get the config object, creates it on demand
   static wxConfig *Get() { if ( !ms_pConfig ) Create(); return ms_pConfig; }
-    // create a new config object
-  static void Create();
+    // create a new config object: this function will create the "best"
+    // implementation of wxConfig available for the current platform, see
+    // comments near definition wxCONFIG_WIN32_NATIVE for details. It returns
+    // the created object and also sets it as ms_pConfig.
+  static wxConfig *Create();
 
   // ctor & virtual dtor
 
   // ctor & virtual dtor
+    // environment variable expansion is on by default
   wxConfig() { m_bExpandEnvVars = TRUE; }
   wxConfig() { m_bExpandEnvVars = TRUE; }
-  virtual ~wxConfig();
+    // empty but ensures that dtor of all derived classes is virtual
+  virtual ~wxConfig() { }
 
   // path management
     // set current path: if the first character is '/', it's the absolute path,
 
   // path management
     // set current path: if the first character is '/', it's the absolute path,
-    // otherwise it's a relative path. '..' is supported. If the strPath 
+    // otherwise it's a relative path. '..' is supported. If the strPath
     // doesn't exist it is created.
   virtual void SetPath(const wxString& strPath) = 0;
     // retrieve the current path (always as absolute path)
     // doesn't exist it is created.
   virtual void SetPath(const wxString& strPath) = 0;
     // retrieve the current path (always as absolute path)
@@ -171,8 +179,8 @@ public:
     }
 
 protected:
     }
 
 protected:
-  static bool IsImmutable(const char *szKey) 
-    { return *szKey == APPCONF_IMMUTABLE_PREFIX; }
+  static bool IsImmutable(const char *szKey)
+    { return *szKey == wxCONFIG_IMMUTABLE_PREFIX; }
 
   // a handy little class which changes current path to the path of given entry
   // and restores it in dtor: so if you declare a local variable of this type,
 
   // a handy little class which changes current path to the path of given entry
   // and restores it in dtor: so if you declare a local variable of this type,
@@ -186,7 +194,7 @@ protected:
    ~PathChanger();
 
     // get the key name
    ~PathChanger();
 
     // get the key name
-   const wxString& Name() const { return m_strName; }
+    const wxString& Name() const { return m_strName; }
 
   private:
     wxConfig *m_pContainer;   // object we live in
 
   private:
     wxConfig *m_pContainer;   // object we live in
@@ -203,5 +211,5 @@ private:
   static wxConfig *ms_pConfig;
 };
 
   static wxConfig *ms_pConfig;
 };
 
-#endif  //_APPCONF_H
+#endif  //_wxCONFIG_H
 
 
index 4b4d1a470d734c5225e8eea7dd6fedb21c5341cc..5ea1073489ca404fbf389b8d91049b426ec0a534 100644 (file)
@@ -1,17 +1,14 @@
-/*****************************************************************************\
- * 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:        fileconf.h
+// Purpose:     wxFileConfig derivation of wxConfig
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     07.04.98 (adapted from appconf.cpp)
+// RCS-ID:      $Id$
+// Copyright:   (c) 1997 Karsten Ballüder   &  Vadim Zeitlin
+//                       Ballueder@usa.net     <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows license
+///////////////////////////////////////////////////////////////////////////////
 
 #ifndef   _FILECONF_H
 #define   _FILECONF_H
 
 #ifndef   _FILECONF_H
 #define   _FILECONF_H
   and local value is ignored. Of course, the changes are always written to local
   file only.
 
   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 previousle disabled with SetExpandEnvVars(FALSE) call
+  (it's on by default, the current status can be retrieved with
+   IsExpandingEnvVars function).
 */
 
 class wxFileConfig : public wxConfig
 */
 
 class wxFileConfig : public wxConfig
@@ -103,9 +112,17 @@ public:
   static wxString GetLocalFileName(const char *szFile);
 
   // ctor & dtor
   static wxString GetLocalFileName(const char *szFile);
 
   // ctor & dtor
-    // if strGlobal is empty, only local config file is used
-  wxFileConfig(const wxString& strLocal,
-               const wxString& strGlobal = "");
+    // 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);
     // dtor will save unsaved data
   virtual ~wxFileConfig();
 
     // dtor will save unsaved data
   virtual ~wxFileConfig();
 
@@ -176,9 +193,17 @@ public:
   bool      LineListIsEmpty();
 
 private:
   bool      LineListIsEmpty();
 
 private:
-  // put the object in the initial state
+  // GetXXXFileame helpers: return ('/' terminated) directory names
+  static wxString GetGlobalDir();
+  static wxString GetLocalDir();
+
+  // common part of all ctors (assumes that m_str{Local|Global}File are already
+  // initialized
   void Init();
 
   void Init();
 
+  // common part of from dtor and DeleteAll
+  void CleanUp();
+
   // parse the whole file
   void Parse(wxTextFile& file, bool bLocal);
 
   // parse the whole file
   void Parse(wxTextFile& file, bool bLocal);
 
index d2cc81d6c1e92d037d590781c531e13ddc3186ac..f9d449b7f22138ec16b49329cf4aba5e933fe1b1 100644 (file)
 #include  <wx/log.h>
 #include  <wx/textfile.h>
 #include  <wx/config.h>
 #include  <wx/log.h>
 #include  <wx/textfile.h>
 #include  <wx/config.h>
-#include  <wx/fileconf.h>
-#include <stdlib.h>
 
 
+// we must include (one of) these files for wxConfig::Create
+#if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
+  #ifdef __WIN32__
+    #include  <wx/msw/regconf.h>
+  #else  //WIN16
+    #include  <wx/msw/iniconf.h>
+  #endif
+#else // either we're under Unix or wish to use files even under Windows
+  #include  <wx/fileconf.h>
+#endif
+
+#include  <stdlib.h>
 #include  <ctype.h>       // for isalnum()
 
 // ----------------------------------------------------------------------------
 #include  <ctype.h>       // for isalnum()
 
 // ----------------------------------------------------------------------------
@@ -55,9 +65,6 @@ wxConfig *wxConfig::ms_pConfig = NULL;
 // ----------------------------------------------------------------------------
 // wxConfig
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxConfig
 // ----------------------------------------------------------------------------
-wxConfig::~wxConfig()
-{
-}
 
 wxConfig *wxConfig::Set(wxConfig *pConfig)
 {
 
 wxConfig *wxConfig::Set(wxConfig *pConfig)
 {
@@ -66,9 +73,19 @@ wxConfig *wxConfig::Set(wxConfig *pConfig)
   return pOld;
 }
 
   return pOld;
 }
 
-void wxConfig::Create()
+wxConfig *wxConfig::Create()
 {
 {
-  ms_pConfig = wxTheApp->CreateConfig();
+  return ms_pConfig =
+#if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
+  #ifdef __WIN32__
+    new wxRegConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+  #else  //WIN16
+    #error "Sorry, no wxIniConfig yet..."
+    //new wxIniConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+  #endif
+#else // either we're under Unix or wish to use files even under Windows
+  new wxFileConfig(wxTheApp->GetAppName());
+#endif
 }
 
 const char *wxConfig::Read(const char *szKey, const char *szDefault) const
 }
 
 const char *wxConfig::Read(const char *szKey, const char *szDefault) const
@@ -89,18 +106,18 @@ wxConfig::PathChanger::PathChanger(const wxConfig *pContainer,
                                  const wxString& strEntry)
 {
   m_pContainer = (wxConfig *)pContainer;
                                  const wxString& strEntry)
 {
   m_pContainer = (wxConfig *)pContainer;
-  wxString strPath = strEntry.Before(APPCONF_PATH_SEPARATOR);
+  wxString strPath = strEntry.Before(wxCONFIG_PATH_SEPARATOR);
 
   // special case of "/keyname" when there is nothing before "/"
 
   // special case of "/keyname" when there is nothing before "/"
-  if ( strPath.IsEmpty() && strEntry[0] == APPCONF_PATH_SEPARATOR )
-    strPath = APPCONF_PATH_SEPARATOR;
+  if ( strPath.IsEmpty() && strEntry[0] == wxCONFIG_PATH_SEPARATOR )
+    strPath = wxCONFIG_PATH_SEPARATOR;
 
   if ( !strPath.IsEmpty() ) {
     // do change the path
     m_bChanged = TRUE;
 
   if ( !strPath.IsEmpty() ) {
     // do change the path
     m_bChanged = TRUE;
-    m_strName = strEntry.Right(APPCONF_PATH_SEPARATOR);
+    m_strName = strEntry.Right(wxCONFIG_PATH_SEPARATOR);
     m_strOldPath = m_pContainer->GetPath();
     m_strOldPath = m_pContainer->GetPath();
-    m_strOldPath += APPCONF_PATH_SEPARATOR;
+    m_strOldPath += wxCONFIG_PATH_SEPARATOR;
     m_pContainer->SetPath(strPath);
   }
   else {
     m_pContainer->SetPath(strPath);
   }
   else {
@@ -231,7 +248,7 @@ void wxSplitPath(wxArrayString& aParts, const char *sz)
   wxString strCurrent;
   const char *pc = sz;
   for ( ;; ) {
   wxString strCurrent;
   const char *pc = sz;
   for ( ;; ) {
-    if ( *pc == '\0' || *pc == APPCONF_PATH_SEPARATOR ) {
+    if ( *pc == '\0' || *pc == wxCONFIG_PATH_SEPARATOR ) {
       if ( strCurrent == "." ) {
         // ignore
       }
       if ( strCurrent == "." ) {
         // ignore
       }
index 5ae5d75b8ae165cbf2eec1564f720ceceecfbebe..ae3f3087dc6521bcf839eb4a696ff5fa73fa77f1 100644 (file)
@@ -58,7 +58,7 @@
 // ----------------------------------------------------------------------------
 
 // is 'c' a valid character in group name?
 // ----------------------------------------------------------------------------
 
 // is 'c' a valid character in group name?
-// NB: APPCONF_IMMUTABLE_PREFIX and APPCONF_PATH_SEPARATOR must be valid chars,
+// NB: wxCONFIG_IMMUTABLE_PREFIX and wxCONFIG_PATH_SEPARATOR must be valid chars,
 //     but _not_ ']' (group name delimiter)
 inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); }
 
 //     but _not_ ']' (group name delimiter)
 inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); }
 
@@ -79,60 +79,86 @@ static wxString FilterOut(const wxString& str);
 // ----------------------------------------------------------------------------
 // static functions
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // static functions
 // ----------------------------------------------------------------------------
-wxString wxFileConfig::GetGlobalFileName(const char *szFile)
+wxString wxFileConfig::GetGlobalDir()
 {
 {
-  wxString str;
-
-  bool bNoExt = strchr(szFile, '.') == NULL;
+  wxString strDir;
 
 
-  #ifdef  __UNIX__
-    str << "/etc/" << szFile;
-    if ( bNoExt )
-      str << ".conf";
-  #else   // Windows
+  #ifdef __UNIX__
+    strDir = "/etc/";
+  #else // Windows
     #ifndef _MAX_PATH
       #define _MAX_PATH 512
     #endif
 
     char szWinDir[_MAX_PATH];
     ::GetWindowsDirectory(szWinDir, _MAX_PATH);
     #ifndef _MAX_PATH
       #define _MAX_PATH 512
     #endif
 
     char szWinDir[_MAX_PATH];
     ::GetWindowsDirectory(szWinDir, _MAX_PATH);
-    str << szWinDir <<  "\\" << szFile;
-    if ( bNoExt )
-      str << ".ini";
-  #endif  // UNIX/Win
 
 
-  return str;
+    strDir = szWinDir;
+    strDir << '\\';
+  #endif // Unix/Windows
+
+  return strDir;
 }
 
 }
 
-wxString wxFileConfig::GetLocalFileName(const char *szFile)
+wxString wxFileConfig::GetLocalDir()
 {
 {
-  wxString str;
+  wxString strDir;
 
 
-  #ifdef  __UNIX__
+  #ifdef __UNIX__
     const char *szHome = getenv("HOME");
     if ( szHome == NULL ) {
       // we're homeless...
       wxLogWarning(_("can't find user's HOME, using current directory."));
     const char *szHome = getenv("HOME");
     if ( szHome == NULL ) {
       // we're homeless...
       wxLogWarning(_("can't find user's HOME, using current directory."));
-      szHome = ".";
+      strDir = ".";
     }
     }
-    str << szHome << "/." << szFile;
+    else
+      strDir = szHome;
   #else   // Windows
     #ifdef  __WIN32__
       const char *szHome = getenv("HOMEDRIVE");
       if ( szHome != NULL )
   #else   // Windows
     #ifdef  __WIN32__
       const char *szHome = getenv("HOMEDRIVE");
       if ( szHome != NULL )
-        str << szHome;
+        strDir << szHome;
       szHome = getenv("HOMEPATH");
       if ( szHome != NULL )
       szHome = getenv("HOMEPATH");
       if ( szHome != NULL )
-        str << szHome;
-      str << szFile;
-      if ( strchr(szFile, '.') == NULL )
-        str << ".ini";
+        strDir << szHome;
     #else   // Win16
       // Win16 has no idea about home, so use the current directory instead
     #else   // Win16
       // Win16 has no idea about home, so use the current directory instead
-      str << ".\\" << szFile;
+      strDir = ".\\";
     #endif  // WIN16/32
   #endif  // UNIX/Win
 
     #endif  // WIN16/32
   #endif  // UNIX/Win
 
+  return strDir;
+}
+
+wxString wxFileConfig::GetGlobalFileName(const char *szFile)
+{
+  wxString str = GetLocalDir();
+  str << szFile;
+
+  if ( strchr(szFile, '.') == NULL )
+  #ifdef  __UNIX__
+    str << ".conf";
+  #else   // Windows
+    str << ".ini";
+  #endif  // UNIX/Win
+
+  return str;
+}
+
+wxString wxFileConfig::GetLocalFileName(const char *szFile)
+{
+  wxString str = GetLocalDir();
+
+  #ifdef  __UNIX__
+    str << '.';
+  #endif
+
+  str << szFile;
+
+  #ifdef __WXMSW__
+    str << ".ini";
+  #endif
+
   return str;
 }
 
   return str;
 }
 
@@ -148,47 +174,64 @@ void wxFileConfig::Init()
   m_linesHead =
   m_linesTail = NULL;
 
   m_linesHead =
   m_linesTail = NULL;
 
-  m_strPath.Empty();
-}
-
-wxFileConfig::wxFileConfig(const wxString& strLocal, const wxString& strGlobal)
-            : m_strLocalFile(strLocal), m_strGlobalFile(strGlobal)
-{
-  Init();
-
   // it's not an error if (one of the) file(s) doesn't exist
 
   // parse the global file
   // it's not an error if (one of the) file(s) doesn't exist
 
   // parse the global file
-  if ( !strGlobal.IsEmpty() ) {
-    if ( wxFile::Exists(strGlobal) ) {
-      wxTextFile fileGlobal(strGlobal);
+  if ( !m_strGlobalFile.IsEmpty() && wxFile::Exists(m_strGlobalFile) ) {
+    wxTextFile fileGlobal(m_strGlobalFile);
 
 
-      if ( fileGlobal.Open() ) {
-        Parse(fileGlobal, FALSE /* global */);
-        SetRootPath();
-      }
-      else
-        wxLogWarning(_("can't open global configuration file '%s'."),
-                     strGlobal.c_str());
+    if ( fileGlobal.Open() ) {
+      Parse(fileGlobal, FALSE /* global */);
+      SetRootPath();
     }
     }
+    else
+      wxLogWarning(_("can't open global configuration file '%s'."),
+                   m_strGlobalFile.c_str());
   }
 
   // parse the local file
   }
 
   // parse the local file
-  if ( wxFile::Exists(strLocal) ) {
-    wxTextFile fileLocal(strLocal);
+  if ( !m_strLocalFile.IsEmpty() && wxFile::Exists(m_strLocalFile) ) {
+    wxTextFile fileLocal(m_strLocalFile);
     if ( fileLocal.Open() ) {
       Parse(fileLocal, TRUE /* local */);
       SetRootPath();
     }
     else
       wxLogWarning(_("can't open user configuration file '%s'."),
     if ( fileLocal.Open() ) {
       Parse(fileLocal, TRUE /* local */);
       SetRootPath();
     }
     else
       wxLogWarning(_("can't open user configuration file '%s'."),
-                   strLocal.c_str());
+                   m_strLocalFile.c_str());
   }
 }
 
   }
 }
 
-wxFileConfig::~wxFileConfig()
+wxFileConfig::wxFileConfig(const char *szAppName, bool bLocalOnly)
+{
+  wxASSERT( !IsEmpty(szAppName) ); // invent a name for your application!
+
+  m_strLocalFile = GetLocalFileName(szAppName);
+  if ( !bLocalOnly )
+    m_strGlobalFile = GetGlobalFileName(szAppName);
+  //else: it's going to be empty and we won't use the global file
+
+  Init();
+}
+
+wxFileConfig::wxFileConfig(const wxString& strLocal, const wxString& strGlobal)
+            : m_strLocalFile(strLocal), m_strGlobalFile(strGlobal)
+{
+  // if the path is not absolute, prepend the standard directory to it
+
+  if ( !strLocal.IsEmpty() && !wxIsPathSeparator(strLocal[0u]) )
+    m_strLocalFile = GetLocalDir();
+  m_strLocalFile << strLocal;
+
+  if ( !strGlobal.IsEmpty() && !wxIsPathSeparator(strGlobal[0u]) )
+    m_strGlobalFile = GetGlobalDir();
+  m_strGlobalFile << strGlobal;
+
+  Init();
+}
+
+void wxFileConfig::CleanUp()
 {
 {
-  Flush();
   delete m_pRootGroup;
 
   LineList *pCur = m_linesHead;
   delete m_pRootGroup;
 
   LineList *pCur = m_linesHead;
@@ -199,6 +242,13 @@ wxFileConfig::~wxFileConfig()
   }
 }
 
   }
 }
 
+wxFileConfig::~wxFileConfig()
+{
+  Flush();
+
+  CleanUp();
+}
+
 // ----------------------------------------------------------------------------
 // parse a config file
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // parse a config file
 // ----------------------------------------------------------------------------
@@ -242,7 +292,7 @@ void wxFileConfig::Parse(wxTextFile& file, bool bLocal)
       // group name here is always considered as abs path
       wxString strGroup;
       pStart++;
       // group name here is always considered as abs path
       wxString strGroup;
       pStart++;
-      strGroup << APPCONF_PATH_SEPARATOR << wxString(pStart, pEnd - pStart);
+      strGroup << wxCONFIG_PATH_SEPARATOR << wxString(pStart, pEnd - pStart);
 
       // will create it if doesn't yet exist
       SetPath(strGroup);
 
       // will create it if doesn't yet exist
       SetPath(strGroup);
@@ -349,14 +399,14 @@ void wxFileConfig::SetPath(const wxString& strPath)
     return;
   }
 
     return;
   }
 
-  if ( strPath[0] == APPCONF_PATH_SEPARATOR ) {
+  if ( strPath[0] == wxCONFIG_PATH_SEPARATOR ) {
     // absolute path
     wxSplitPath(aParts, strPath);
   }
   else {
     // relative path, combine with current one
     wxString strFullPath = m_strPath;
     // absolute path
     wxSplitPath(aParts, strPath);
   }
   else {
     // relative path, combine with current one
     wxString strFullPath = m_strPath;
-    strFullPath << APPCONF_PATH_SEPARATOR << strPath;
+    strFullPath << wxCONFIG_PATH_SEPARATOR << strPath;
     wxSplitPath(aParts, strFullPath);
   }
 
     wxSplitPath(aParts, strFullPath);
   }
 
@@ -373,7 +423,7 @@ void wxFileConfig::SetPath(const wxString& strPath)
   // recombine path parts in one variable
   m_strPath.Empty();
   for ( n = 0; n < aParts.Count(); n++ ) {
   // recombine path parts in one variable
   m_strPath.Empty();
   for ( n = 0; n < aParts.Count(); n++ ) {
-    m_strPath << APPCONF_PATH_SEPARATOR << aParts[n];
+    m_strPath << wxCONFIG_PATH_SEPARATOR << aParts[n];
   }
 }
 
   }
 }
 
@@ -527,9 +577,9 @@ bool wxFileConfig::Write(const char *szKey, const char *szValue)
     // writing an entry
 
     // check that the name is reasonable
     // writing an entry
 
     // check that the name is reasonable
-    if ( strName[0u] == APPCONF_IMMUTABLE_PREFIX ) {
+    if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX ) {
       wxLogError(_("Entry name can't start with '%c'."),
       wxLogError(_("Entry name can't start with '%c'."),
-                 APPCONF_IMMUTABLE_PREFIX);
+                 wxCONFIG_IMMUTABLE_PREFIX);
       return FALSE;
     }
 
       return FALSE;
     }
 
@@ -614,10 +664,13 @@ bool wxFileConfig::DeleteGroup(const char *szKey)
 
 bool wxFileConfig::DeleteAll()
 {
 
 bool wxFileConfig::DeleteAll()
 {
-  const char *szFile = m_strLocalFile;
-  delete m_pRootGroup;
+  CleanUp();
+
+  m_strLocalFile = m_strGlobalFile = "";
   Init();
 
   Init();
 
+  const char *szFile = m_strLocalFile;
+
   if ( remove(szFile) == -1 )
     wxLogSysError(_("can't delete user configuration file '%s'"), szFile);
 
   if ( remove(szFile) == -1 )
     wxLogSysError(_("can't delete user configuration file '%s'"), szFile);
 
@@ -849,7 +902,7 @@ wxFileConfig::LineList *wxFileConfig::ConfigGroup::GetLastEntryLine()
 wxString wxFileConfig::ConfigGroup::GetFullName() const
 {
   if ( Parent() )
 wxString wxFileConfig::ConfigGroup::GetFullName() const
 {
   if ( Parent() )
-    return Parent()->GetFullName() + APPCONF_PATH_SEPARATOR + Name();
+    return Parent()->GetFullName() + wxCONFIG_PATH_SEPARATOR + Name();
   else
     return "";
 }
   else
     return "";
 }
@@ -872,7 +925,7 @@ wxFileConfig::ConfigGroup::FindEntry(const char *szName) const
     i = (lo + hi)/2;
     pEntry = m_aEntries[i];
 
     i = (lo + hi)/2;
     pEntry = m_aEntries[i];
 
-    #if APPCONF_CASE_SENSITIVE
+    #if wxCONFIG_CASE_SENSITIVE
       res = strcmp(pEntry->Name(), szName);
     #else
       res = Stricmp(pEntry->Name(), szName);
       res = strcmp(pEntry->Name(), szName);
     #else
       res = Stricmp(pEntry->Name(), szName);
@@ -902,7 +955,7 @@ wxFileConfig::ConfigGroup::FindSubgroup(const char *szName) const
     i = (lo + hi)/2;
     pGroup = m_aSubgroups[i];
 
     i = (lo + hi)/2;
     pGroup = m_aSubgroups[i];
 
-    #if APPCONF_CASE_SENSITIVE
+    #if wxCONFIG_CASE_SENSITIVE
       res = strcmp(pGroup->Name(), szName);
     #else
       res = Stricmp(pGroup->Name(), szName);
       res = strcmp(pGroup->Name(), szName);
     #else
       res = Stricmp(pGroup->Name(), szName);
@@ -1097,7 +1150,7 @@ wxFileConfig::ConfigEntry::ConfigEntry(wxFileConfig::ConfigGroup *pParent,
 
   m_bDirty  = FALSE;
 
 
   m_bDirty  = FALSE;
 
-  m_bImmutable = strName[0] == APPCONF_IMMUTABLE_PREFIX;
+  m_bImmutable = strName[0] == wxCONFIG_IMMUTABLE_PREFIX;
   if ( m_bImmutable )
     m_strName.erase(0, 1);  // remove first character
 }
   if ( m_bImmutable )
     m_strName.erase(0, 1);  // remove first character
 }
@@ -1172,7 +1225,7 @@ void wxFileConfig::ConfigEntry::SetDirty()
 int CompareEntries(wxFileConfig::ConfigEntry *p1,
                    wxFileConfig::ConfigEntry *p2)
 {
 int CompareEntries(wxFileConfig::ConfigEntry *p1,
                    wxFileConfig::ConfigEntry *p2)
 {
-  #if APPCONF_CASE_SENSITIVE
+  #if wxCONFIG_CASE_SENSITIVE
     return strcmp(p1->Name(), p2->Name());
   #else
     return Stricmp(p1->Name(), p2->Name());
     return strcmp(p1->Name(), p2->Name());
   #else
     return Stricmp(p1->Name(), p2->Name());
@@ -1182,7 +1235,7 @@ int CompareEntries(wxFileConfig::ConfigEntry *p1,
 int CompareGroups(wxFileConfig::ConfigGroup *p1,
                   wxFileConfig::ConfigGroup *p2)
 {
 int CompareGroups(wxFileConfig::ConfigGroup *p1,
                   wxFileConfig::ConfigGroup *p2)
 {
-  #if APPCONF_CASE_SENSITIVE
+  #if wxCONFIG_CASE_SENSITIVE
     return strcmp(p1->Name(), p2->Name());
   #else
     return Stricmp(p1->Name(), p2->Name());
     return strcmp(p1->Name(), p2->Name());
   #else
     return Stricmp(p1->Name(), p2->Name());