X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f3943e0276719ed5fc94bb93765df69f91ba10c..431a3edc641e379b8f5d6010220250017e99a3ff:/src/msw/regconf.cpp diff --git a/src/msw/regconf.cpp b/src/msw/regconf.cpp index 01f2468803..9647ae1217 100644 --- a/src/msw/regconf.cpp +++ b/src/msw/regconf.cpp @@ -6,10 +6,10 @@ // Created: 27.04.98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "regconf.h" #endif @@ -33,8 +33,6 @@ #include "wx/config.h" -#ifndef __WIN16__ - #include "wx/msw/registry.h" #include "wx/msw/regconf.h" @@ -43,7 +41,7 @@ // ---------------------------------------------------------------------------- // we put our data in HKLM\SOFTWARE_KEY\appname -#define SOFTWARE_KEY wxString("Software\\") +#define SOFTWARE_KEY wxString(wxT("Software\\")) // ---------------------------------------------------------------------------- // global functions @@ -124,7 +122,7 @@ wxRegConfig::wxRegConfig(const wxString& appName, const wxString& vendorName, m_keyLocal.ReserveMemoryForName(MEMORY_PREALLOC); m_keyLocalRoot.SetName(wxRegKey::HKCU, SOFTWARE_KEY + str); - m_keyLocal.SetName(m_keyLocalRoot, _T("")); + m_keyLocal.SetName(m_keyLocalRoot, wxEmptyString); if ( bDoUseGlobal ) { @@ -134,7 +132,7 @@ wxRegConfig::wxRegConfig(const wxString& appName, const wxString& vendorName, m_keyGlobal.ReserveMemoryForName(MEMORY_PREALLOC); m_keyGlobalRoot.SetName(wxRegKey::HKLM, SOFTWARE_KEY + str); - m_keyGlobal.SetName(m_keyGlobalRoot, _T("")); + m_keyGlobal.SetName(m_keyGlobalRoot, wxEmptyString); } // Create() will Open() if key already exists @@ -148,8 +146,8 @@ wxRegConfig::wxRegConfig(const wxString& appName, const wxString& vendorName, if ( bDoUseGlobal ) { wxLogNull nolog; - m_keyGlobalRoot.Open(); - m_keyGlobal.Open(); + m_keyGlobalRoot.Open(wxRegKey::Read); + m_keyGlobal.Open(wxRegKey::Read); } } @@ -221,7 +219,11 @@ void wxRegConfig::SetPath(const wxString& strPath) { strFullPath.reserve(2*m_strPath.length()); - strFullPath << m_strPath << wxCONFIG_PATH_SEPARATOR << strPath; + strFullPath << m_strPath; + if ( strFullPath.Len() == 0 || + strFullPath.Last() != wxCONFIG_PATH_SEPARATOR ) + strFullPath << wxCONFIG_PATH_SEPARATOR; + strFullPath << strPath; } // simplify it: we need to handle ".." here @@ -241,7 +243,8 @@ void wxRegConfig::SetPath(const wxString& strPath) size_t len = strFullPath.length(); const wxChar *end = src + len; - wxChar *dst = m_strPath.GetWriteBuf(len); + wxStringBufferLength buf(m_strPath, len); + wxChar *dst = buf; wxChar *start = dst; for ( ; src < end; src++, dst++ ) @@ -270,6 +273,7 @@ void wxRegConfig::SetPath(const wxString& strPath) // check the boundary condition below // this is more efficient than strrchr() + dst--; while ( *dst != wxCONFIG_PATH_SEPARATOR ) { dst--; @@ -284,10 +288,13 @@ void wxRegConfig::SetPath(const wxString& strPath) posLastSlash = -1; } - // this shouldn't happen + // we must have found a slash one way or another! wxASSERT_MSG( *dst == wxCONFIG_PATH_SEPARATOR, _T("error in wxRegConfig::SetPath") ); + // stay at the same position + dst--; + // we killed one totalSlashes--; } @@ -305,8 +312,12 @@ void wxRegConfig::SetPath(const wxString& strPath) totalSlashes++; } - //else: nothing to do, we squeeze several subseuquent - // slashes into one + else // previous char was a slash too + { + // squeeze several subsequent slashes into one: i.e. + // just ignore this one + dst--; + } } } else // normal character @@ -325,8 +336,7 @@ void wxRegConfig::SetPath(const wxString& strPath) } *dst = _T('\0'); - - m_strPath.UngetWriteBuf(dst - start); + buf.SetLength(dst - start); } #ifdef WX_DEBUG_SET_PATH @@ -338,21 +348,25 @@ void wxRegConfig::SetPath(const wxString& strPath) // registry APIs want backslashes instead of slashes wxString strRegPath; - size_t len = m_strPath.length(); + if ( !m_strPath.empty() ) + { + size_t len = m_strPath.length(); - const wxChar *src = m_strPath.c_str(); - wxChar *dst = strRegPath.GetWriteBuf(len); + const wxChar *src = m_strPath.c_str(); + wxStringBufferLength buf(strRegPath, len); + wxChar *dst = buf; - const wxChar *end = src + len; - for ( ; src < end; src++, dst++ ) - { - if ( *src == wxCONFIG_PATH_SEPARATOR ) - *dst = _T('\\'); - else - *dst = *src; - } + const wxChar *end = src + len; + for ( ; src < end; src++, dst++ ) + { + if ( *src == wxCONFIG_PATH_SEPARATOR ) + *dst = _T('\\'); + else + *dst = *src; + } - strRegPath.UngetWriteBuf(len); + buf.SetLength(len); + } // this is not needed any longer as we don't create keys unnecessarily any // more (now it is done on demand, i.e. only when they're going to contain @@ -370,13 +384,14 @@ void wxRegConfig::SetPath(const wxString& strPath) // change current key(s) m_keyLocal.SetName(m_keyLocalRoot, strRegPath); - m_keyGlobal.SetName(m_keyGlobalRoot, strRegPath); - // don't create it right now, wait until it is accessed - //m_keyLocal.Create(); + if ( GetStyle() & wxCONFIG_USE_GLOBAL_FILE ) + { + m_keyGlobal.SetName(m_keyGlobalRoot, strRegPath); - wxLogNull nolog; - m_keyGlobal.Open(); + wxLogNull nolog; + m_keyGlobal.Open(wxRegKey::Read); + } } // ---------------------------------------------------------------------------- @@ -408,7 +423,7 @@ bool wxRegConfig::GetNextGroup(wxString& str, long& lIndex) const while ( m_keyGlobal.GetNextKey(str, lIndex) ) { if ( !m_keyLocal.Exists() || !LocalKey().HasSubKey(str) ) { // ok, found one - return it - return TRUE; + return true; } } @@ -418,7 +433,7 @@ bool wxRegConfig::GetNextGroup(wxString& str, long& lIndex) const // if we don't have the key at all, don't try to enumerate anything under it if ( !m_keyLocal.Exists() ) - return FALSE; + return false; // much easier with local entries: get the next one we find // (don't forget to clear our flag bit and set it again later) @@ -443,7 +458,7 @@ bool wxRegConfig::GetNextEntry(wxString& str, long& lIndex) const while ( m_keyGlobal.GetNextValue(str, lIndex) ) { if ( !m_keyLocal.Exists() || !LocalKey().HasValue(str) ) { // ok, found one - return it - return TRUE; + return true; } } @@ -453,7 +468,7 @@ bool wxRegConfig::GetNextEntry(wxString& str, long& lIndex) const // if we don't have the key at all, don't try to enumerate anything under it if ( !m_keyLocal.Exists() ) - return FALSE; + return false; // much easier with local entries: get the next one we find // (don't forget to clear our flag bit and set it again later) @@ -464,7 +479,7 @@ bool wxRegConfig::GetNextEntry(wxString& str, long& lIndex) const return bOk; } -size_t wxRegConfig::GetNumberOfEntries(bool bRecursive) const +size_t wxRegConfig::GetNumberOfEntries(bool WXUNUSED(bRecursive)) const { size_t nEntries = 0; @@ -481,7 +496,7 @@ size_t wxRegConfig::GetNumberOfEntries(bool bRecursive) const return nEntries; } -size_t wxRegConfig::GetNumberOfGroups(bool bRecursive) const +size_t wxRegConfig::GetNumberOfGroups(bool WXUNUSED(bRecursive)) const { size_t nGroups = 0; @@ -543,47 +558,13 @@ wxConfigBase::EntryType wxRegConfig::GetEntryType(const wxString& key) const // reading/writing // ---------------------------------------------------------------------------- -bool wxRegConfig::Read(const wxString& key, wxString *pStr) const +bool wxRegConfig::DoReadString(const wxString& key, wxString *pStr) const { - wxConfigPathChanger path(this, key); - - bool bQueryGlobal = TRUE; - - // if immutable key exists in global key we must check that it's not - // overriden by the local key with the same name - if ( IsImmutable(path.Name()) ) { - if ( TryGetValue(m_keyGlobal, path.Name(), *pStr) ) { - if ( m_keyLocal.Exists() && LocalKey().HasValue(path.Name()) ) { - wxLogWarning(wxT("User value for immutable key '%s' ignored."), - path.Name().c_str()); - } - *pStr = wxConfigBase::ExpandEnvVars(*pStr); - return TRUE; - } - else { - // don't waste time - it's not there anyhow - bQueryGlobal = FALSE; - } - } - - // first try local key - if ( (m_keyLocal.Exists() && TryGetValue(LocalKey(), path.Name(), *pStr)) || - (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), *pStr)) ) { - // nothing to do - - *pStr = wxConfigBase::ExpandEnvVars(*pStr); - return TRUE; - } - - return FALSE; -} + wxCHECK_MSG( pStr, false, _T("wxRegConfig::Read(): NULL param") ); -bool wxRegConfig::Read(const wxString& key, wxString *pStr, - const wxString& szDefault) const -{ wxConfigPathChanger path(this, key); - bool bQueryGlobal = TRUE; + bool bQueryGlobal = true; // if immutable key exists in global key we must check that it's not // overriden by the local key with the same name @@ -594,39 +575,33 @@ bool wxRegConfig::Read(const wxString& key, wxString *pStr, path.Name().c_str()); } - return TRUE; + return true; } else { // don't waste time - it's not there anyhow - bQueryGlobal = FALSE; + bQueryGlobal = false; } } // first try local key if ( (m_keyLocal.Exists() && TryGetValue(LocalKey(), path.Name(), *pStr)) || (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), *pStr)) ) { - *pStr = wxConfigBase::ExpandEnvVars(*pStr); - return TRUE; - } - else { - if ( IsRecordingDefaults() ) { - ((wxRegConfig*)this)->Write(key, szDefault); - } - - // default value - *pStr = szDefault; + return true; } - *pStr = wxConfigBase::ExpandEnvVars(*pStr); - - return FALSE; + return false; } -bool wxRegConfig::Read(const wxString& key, long *plResult) const +// this exactly reproduces the string version above except for ExpandEnvVars(), +// we really should avoid this code duplication somehow... + +bool wxRegConfig::DoReadLong(const wxString& key, long *plResult) const { + wxCHECK_MSG( plResult, false, _T("wxRegConfig::Read(): NULL param") ); + wxConfigPathChanger path(this, key); - bool bQueryGlobal = TRUE; + bool bQueryGlobal = true; // if immutable key exists in global key we must check that it's not // overriden by the local key with the same name @@ -637,41 +612,42 @@ bool wxRegConfig::Read(const wxString& key, long *plResult) const path.Name().c_str()); } - return TRUE; + return true; } else { // don't waste time - it's not there anyhow - bQueryGlobal = FALSE; + bQueryGlobal = false; } } // first try local key if ( (m_keyLocal.Exists() && TryGetValue(LocalKey(), path.Name(), plResult)) || (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), plResult)) ) { - return TRUE; + return true; } - return FALSE; + + return false; } -bool wxRegConfig::Write(const wxString& key, const wxString& szValue) +bool wxRegConfig::DoWriteString(const wxString& key, const wxString& szValue) { wxConfigPathChanger path(this, key); if ( IsImmutable(path.Name()) ) { wxLogError(wxT("Can't change immutable entry '%s'."), path.Name().c_str()); - return FALSE; + return false; } return LocalKey().SetValue(path.Name(), szValue); } -bool wxRegConfig::Write(const wxString& key, long lValue) +bool wxRegConfig::DoWriteLong(const wxString& key, long lValue) { wxConfigPathChanger path(this, key); if ( IsImmutable(path.Name()) ) { wxLogError(wxT("Can't change immutable entry '%s'."), path.Name().c_str()); - return FALSE; + return false; } return LocalKey().SetValue(path.Name(), lValue); @@ -685,85 +661,55 @@ bool wxRegConfig::RenameEntry(const wxString& oldName, const wxString& newName) { // check that the old entry exists... if ( !HasEntry(oldName) ) - return FALSE; + return false; // and that the new one doesn't if ( HasEntry(newName) ) - return FALSE; + return false; - // delete the old entry and create the new one - but do in the reverse - // order to not lose the data if Create() fails - - bool ok; - if ( m_keyLocal.IsNumericValue(oldName) ) - { - long val; - ok = m_keyLocal.QueryValue(oldName, &val) && - m_keyLocal.SetValue(newName, val); - } - else - { - wxString val; - ok = m_keyLocal.QueryValue(oldName, val) && - m_keyLocal.SetValue(newName, val); - } - - if ( !ok ) - return FALSE; - - if ( !m_keyLocal.DeleteValue(oldName) ) - { - m_keyLocal.DeleteValue(newName); - - return FALSE; - } - - return TRUE; + return m_keyLocal.RenameValue(oldName, newName); } bool wxRegConfig::RenameGroup(const wxString& oldName, const wxString& newName) { // check that the old group exists... if ( !HasGroup(oldName) ) - return FALSE; + return false; // and that the new one doesn't if ( HasGroup(newName) ) - return FALSE; + return false; - // TODO there is no way to rename a registry key - we must do a deep copy - // ourselves - wxFAIL_MSG(wxT("Registry key renaming not implemented")); - - return FALSE; + return wxRegKey(m_keyLocal, oldName).Rename(newName); } // ---------------------------------------------------------------------------- // deleting // ---------------------------------------------------------------------------- + bool wxRegConfig::DeleteEntry(const wxString& value, bool bGroupIfEmptyAlso) { wxConfigPathChanger path(this, value); if ( m_keyLocal.Exists() ) { if ( !m_keyLocal.DeleteValue(path.Name()) ) - return FALSE; + return false; - if ( m_keyLocal.IsEmpty() ) { + if ( bGroupIfEmptyAlso && m_keyLocal.IsEmpty() ) { wxString strKey = GetPath().AfterLast(wxCONFIG_PATH_SEPARATOR); - SetPath(".."); // changes m_keyLocal + SetPath(_T("..")); // changes m_keyLocal return LocalKey().DeleteKey(strKey); } } - return TRUE; + return true; } bool wxRegConfig::DeleteGroup(const wxString& key) { wxConfigPathChanger path(this, key); - return m_keyLocal.Exists() ? LocalKey().DeleteKey(path.Name()) : TRUE; + return m_keyLocal.Exists() ? LocalKey().DeleteKey(path.Name()) : true; } bool wxRegConfig::DeleteAll() @@ -781,8 +727,5 @@ bool wxRegConfig::DeleteAll() return bOk; } -#endif - // __WIN16__ - #endif // wxUSE_CONFIG