X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2049ba38adafa0ec146880de29f26e32dd69a125..6f34921d9369a31de14e4b07e4824e2d701710f0:/src/common/config.cpp diff --git a/src/common/config.cpp b/src/common/config.cpp index 9f70f2069f..2eb6facd54 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -1,11 +1,11 @@ /////////////////////////////////////////////////////////////////////////////// // Name: config.cpp -// Purpose: implementation of wxConfig class +// Purpose: implementation of wxConfigBase class // Author: Vadim Zeitlin -// Modified by: +// Modified by: // Created: 07.04.98 // RCS-ID: $Id$ -// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net +// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// @@ -18,7 +18,7 @@ // headers // ---------------------------------------------------------------------------- #ifdef __GNUG__ - #pragma implementation "config.h" + #pragma implementation "confbase.h" #endif #include "wx/wxprec.h" @@ -36,42 +36,64 @@ #include #include #include -#include -#include -#include +#include + +// we must include (one of) these files for wxConfigBase::Create +#if defined(__WXMSW__) && defined(wxCONFIG_WIN32_NATIVE) + #ifdef __WIN32__ + #include + #else //WIN16 + #include + #endif +#else // either we're under Unix or wish to use files even under Windows + #include +#endif +#include #include // for isalnum() // ---------------------------------------------------------------------------- // global and class static variables // ---------------------------------------------------------------------------- -wxConfig *wxConfig::ms_pConfig = NULL; +wxConfigBase *wxConfigBase::ms_pConfig = NULL; +bool wxConfigBase::ms_bAutoCreate = TRUE; // ============================================================================ // implementation // ============================================================================ // ---------------------------------------------------------------------------- -// wxConfig +// wxConfigBase // ---------------------------------------------------------------------------- -wxConfig::~wxConfig() -{ -} -wxConfig *wxConfig::Set(wxConfig *pConfig) +wxConfigBase *wxConfigBase::Set(wxConfigBase *pConfig) { - wxConfig *pOld = ms_pConfig; + wxConfigBase *pOld = ms_pConfig; ms_pConfig = pConfig; return pOld; } -void wxConfig::Create() +wxConfigBase *wxConfigBase::Create() { - ms_pConfig = wxTheApp->CreateConfig(); + if ( ms_bAutoCreate && ms_pConfig == NULL ) { + ms_pConfig = + #if defined(__WXMSW__) && defined(wxCONFIG_WIN32_NATIVE) + #ifdef __WIN32__ + new wxRegConfig(wxTheApp->GetVendorName() + '\\' + + wxTheApp->GetAppName()); + #else //WIN16 + 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 + } + + return ms_pConfig; } -const char *wxConfig::Read(const char *szKey, const char *szDefault) const +const char *wxConfigBase::Read(const char *szKey, const char *szDefault) const { static char s_szBuf[1024]; wxString s; @@ -85,22 +107,22 @@ const char *wxConfig::Read(const char *szKey, const char *szDefault) const // Config::PathChanger // ---------------------------------------------------------------------------- -wxConfig::PathChanger::PathChanger(const wxConfig *pContainer, +wxConfigBase::PathChanger::PathChanger(const wxConfigBase *pContainer, const wxString& strEntry) { - m_pContainer = (wxConfig *)pContainer; - wxString strPath = strEntry.Before(APPCONF_PATH_SEPARATOR); + m_pContainer = (wxConfigBase *)pContainer; + wxString strPath = strEntry.Before(wxCONFIG_PATH_SEPARATOR); // 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.IsEmpty()) && strEntry[0] == wxCONFIG_PATH_SEPARATOR )) + strPath = wxCONFIG_PATH_SEPARATOR; 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 += APPCONF_PATH_SEPARATOR; + m_strOldPath += wxCONFIG_PATH_SEPARATOR; m_pContainer->SetPath(strPath); } else { @@ -110,7 +132,7 @@ wxConfig::PathChanger::PathChanger(const wxConfig *pContainer, } } -wxConfig::PathChanger::~PathChanger() +wxConfigBase::PathChanger::~PathChanger() { // only restore path if it was changed if ( m_bChanged ) { @@ -125,24 +147,25 @@ wxConfig::PathChanger::~PathChanger() // understands both Unix and Windows (but only under Windows) environment // variables expansion: i.e. $var, $(var) and ${var} are always understood // and in addition under Windows %var% is also. -wxString ExpandEnvVars(const wxString& str) +wxString wxExpandEnvVars(const wxString& str) { wxString strResult; + strResult.Alloc(str.Len()); // don't change the values the enum elements: they must be equal // to the matching [closing] delimiter. enum Bracket - { - Bracket_None, - Bracket_Normal = ')', + { + Bracket_None, + Bracket_Normal = ')', Bracket_Curly = '}', #ifdef __WXMSW__ Bracket_Windows = '%' // yeah, Windows people are a bit strange ;-) #endif }; - uint m; - for ( uint n = 0; n < str.Len(); n++ ) { + size_t m; + for ( size_t n = 0; n < str.Len(); n++ ) { switch ( str[n] ) { #ifdef __WXMSW__ case '%': @@ -160,8 +183,8 @@ wxString ExpandEnvVars(const wxString& str) } else { switch ( str[n + 1] ) { - case '(': - bracket = Bracket_Normal; + case '(': + bracket = Bracket_Normal; n++; // skip the bracket break; @@ -199,11 +222,12 @@ wxString ExpandEnvVars(const wxString& str) // check the closing bracket if ( bracket != Bracket_None ) { if ( m == str.Len() || str[m] != (char)bracket ) { - wxLogWarning("missing '%c' at position %d in '%s'.", + wxLogWarning(_("Environment variables expansion failed: " + "missing '%c' at position %d in '%s'."), (char)bracket, m + 1, str.c_str()); } else { - // skip closing bracket + // skip closing bracket unless the variables wasn't expanded if ( pszValue == NULL ) strResult << (char)bracket; m++; @@ -215,8 +239,13 @@ wxString ExpandEnvVars(const wxString& str) break; case '\\': - n++; - // fall through + // backslash can be used to suppress special meaning of % and $ + if ( n != str.Len() && (str[n + 1] == '%' || str[n + 1] == '$') ) { + strResult += str[++n]; + + break; + } + //else: fall through default: strResult += str[n]; @@ -227,21 +256,21 @@ wxString ExpandEnvVars(const wxString& str) } // this function is used to properly interpret '..' in path -void SplitPath(wxArrayString& aParts, const char *sz) +void wxSplitPath(wxArrayString& aParts, const char *sz) { aParts.Empty(); wxString strCurrent; const char *pc = sz; for ( ;; ) { - if ( *pc == '\0' || *pc == APPCONF_PATH_SEPARATOR ) { + if ( *pc == '\0' || *pc == wxCONFIG_PATH_SEPARATOR ) { if ( strCurrent == "." ) { // ignore } else if ( strCurrent == ".." ) { // go up one level if ( aParts.IsEmpty() ) - wxLogWarning("'%s' has extra '..', ignored.", sz); + wxLogWarning(_("'%s' has extra '..', ignored."), sz); else aParts.Remove(aParts.Count() - 1);