X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f40ccee99b037cbb58bc3b34e577088738ab5ced..6f34921d9369a31de14e4b07e4824e2d701710f0:/src/common/config.cpp diff --git a/src/common/config.cpp b/src/common/config.cpp index d2cc81d6c1..2eb6facd54 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// // Name: config.cpp -// Purpose: implementation of wxConfig class +// Purpose: implementation of wxConfigBase class // Author: Vadim Zeitlin // Modified by: // Created: 07.04.98 @@ -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 ) { @@ -142,8 +164,8 @@ wxString wxExpandEnvVars(const wxString& str) #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 '%': @@ -200,11 +222,12 @@ wxString wxExpandEnvVars(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,6 +238,15 @@ wxString wxExpandEnvVars(const wxString& str) } break; + case '\\': + // 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]; } @@ -231,7 +263,7 @@ void wxSplitPath(wxArrayString& aParts, const char *sz) wxString strCurrent; const char *pc = sz; for ( ;; ) { - if ( *pc == '\0' || *pc == APPCONF_PATH_SEPARATOR ) { + if ( *pc == '\0' || *pc == wxCONFIG_PATH_SEPARATOR ) { if ( strCurrent == "." ) { // ignore }