X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3b466481eac25cbef1d35aaf6ee9d94167a07b9..9a48c2ba3dc319c2cea520ca9ac54d2081362a39:/src/msw/registry.cpp diff --git a/src/msw/registry.cpp b/src/msw/registry.cpp index 114169fad1..099b376cfd 100644 --- a/src/msw/registry.cpp +++ b/src/msw/registry.cpp @@ -27,9 +27,10 @@ #include "wx/string.h" #include "wx/intl.h" #include "wx/log.h" - #include "wx/config.h" // for wxExpandEnvVars +#ifndef __WIN16__ + // Windows headers /* #define STRICT @@ -144,7 +145,7 @@ wxRegKey::StdKey wxRegKey::ExtractKeyName(wxString& strKey) { wxString strRoot = strKey.Left(REG_SEPARATOR); - HKEY hRootKey; + HKEY hRootKey = 0; size_t ui; for ( ui = 0; ui < nStdKeys; ui++ ) { if ( strRoot.CmpNoCase(aStdKeys[ui].szName) == 0 || @@ -194,7 +195,7 @@ wxRegKey::wxRegKey() wxRegKey::wxRegKey(const wxString& strKey) : m_strKey(strKey) { m_hRootKey = (WXHKEY) aStdKeys[ExtractKeyName(m_strKey)].hkey; - m_hKey = NULL; + m_hKey = (WXHKEY) NULL; m_dwLastError = 0; } @@ -203,7 +204,7 @@ wxRegKey::wxRegKey(StdKey keyParent, const wxString& strKey) : m_strKey(strKey) { RemoveTrailingSeparator(m_strKey); m_hRootKey = (WXHKEY) aStdKeys[keyParent].hkey; - m_hKey = NULL; + m_hKey = (WXHKEY) NULL; m_dwLastError = 0; } @@ -221,7 +222,7 @@ wxRegKey::wxRegKey(const wxRegKey& keyParent, const wxString& strKey) RemoveTrailingSeparator(m_strKey); m_hRootKey = keyParent.m_hRootKey; - m_hKey = NULL; + m_hKey = (WXHKEY) NULL; m_dwLastError = 0; } @@ -313,7 +314,7 @@ bool wxRegKey::GetKeyInfo(ulong *pnSubKeys, ulong *pnMaxValueLen) const #endif { -#ifdef __WIN32__ +#if defined(__WIN32__) && !defined(__TWIN32__) m_dwLastError = ::RegQueryInfoKey ( (HKEY) m_hKey, @@ -426,6 +427,18 @@ bool wxRegKey::DeleteSelf() } } + // prevent a buggy program from erasing one of the root registry keys or an + // immediate subkey (i.e. one which doesn't have '\\' inside) of any other + // key except HKCR (HKCR has some "deleteable" subkeys) + if ( m_strKey.IsEmpty() || (m_hRootKey != HKCR && + m_strKey.Find(REG_SEPARATOR) == wxNOT_FOUND) ) { + wxLogError(_("Registry key '%s' is needed for normal system operation,\n" + "deleting it will leave your system in unusable state:\n" + "operation aborted."), GetFullName(this)); + + return FALSE; + } + // we can't delete keys while enumerating because it confuses GetNextKey, so // we first save the key names and then delete them all wxArrayString astrSubkeys; @@ -473,8 +486,8 @@ bool wxRegKey::DeleteValue(const char *szValue) if ( !Open() ) return FALSE; - #ifdef __WIN32__ - m_dwLastError = RegDeleteValue((HKEY) m_hKey, szValue); +#if defined(__WIN32__) && !defined(__TWIN32__) + m_dwLastError = RegDeleteValue((HKEY) m_hKey, (char*) (const char*) szValue); if ( m_dwLastError != ERROR_SUCCESS ) { wxLogSysError(m_dwLastError, _("can't delete value '%s' from key '%s'"), szValue, GetName().c_str()); @@ -508,7 +521,7 @@ bool wxRegKey::HasValue(const char *szValue) const #ifdef __WIN32__ if ( CONST_CAST Open() ) { - return RegQueryValueEx((HKEY) m_hKey, szValue, RESERVED, + return RegQueryValueEx((HKEY) m_hKey, (char*) (const char*) szValue, RESERVED, NULL, NULL, NULL) == ERROR_SUCCESS; } else @@ -522,6 +535,9 @@ bool wxRegKey::HasValue(const char *szValue) const // returns TRUE if this key has any subkeys bool wxRegKey::HasSubkeys() const { + // suppress possible messages from GetFirstKey() + wxLogNull nolog; + // just call GetFirstKey with dummy parameters wxString str; long l; @@ -531,20 +547,23 @@ bool wxRegKey::HasSubkeys() const // returns TRUE if given subkey exists bool wxRegKey::HasSubKey(const char *szKey) const { + // this function should be silent, so suppress possible messages from Open() + wxLogNull nolog; + if ( CONST_CAST Open() ) return KeyExists(m_hKey, szKey); else return FALSE; } -wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue) +wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue) const { #ifdef __WIN32__ - if ( !Open() ) + if ( ! CONST_CAST Open() ) return Type_None; DWORD dwType; - m_dwLastError = RegQueryValueEx((HKEY) m_hKey, szValue, RESERVED, + m_dwLastError = RegQueryValueEx((HKEY) m_hKey, (char*) (const char*) szValue, RESERVED, &dwType, NULL, NULL); if ( m_dwLastError != ERROR_SUCCESS ) { wxLogSysError(m_dwLastError, _("can't read value of key '%s'"), @@ -561,8 +580,12 @@ wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue) #ifdef __WIN32__ bool wxRegKey::SetValue(const char *szValue, long lValue) { +#ifdef __TWIN32__ + wxFAIL_MSG("RegSetValueEx not implemented by TWIN32"); + return FALSE; +#else if ( CONST_CAST Open() ) { - m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, RESERVED, REG_DWORD, + m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_DWORD, (RegString)&lValue, sizeof(lValue)); if ( m_dwLastError == ERROR_SUCCESS ) return TRUE; @@ -571,6 +594,7 @@ bool wxRegKey::SetValue(const char *szValue, long lValue) wxLogSysError(m_dwLastError, _("can't set value of '%s'"), GetFullName(this, szValue)); return FALSE; +#endif } bool wxRegKey::QueryValue(const char *szValue, long *plValue) const @@ -578,7 +602,7 @@ bool wxRegKey::QueryValue(const char *szValue, long *plValue) const if ( CONST_CAST Open() ) { DWORD dwType, dwSize = sizeof(DWORD); RegString pBuf = (RegString)plValue; - m_dwLastError = RegQueryValueEx((HKEY) m_hKey, szValue, RESERVED, + m_dwLastError = RegQueryValueEx((HKEY) m_hKey, (char*) (const char*) szValue, RESERVED, &dwType, pBuf, &dwSize); if ( m_dwLastError != ERROR_SUCCESS ) { wxLogSysError(m_dwLastError, _("can't read value of key '%s'"), @@ -605,11 +629,11 @@ bool wxRegKey::QueryValue(const char *szValue, wxString& strValue) const #ifdef __WIN32__ // first get the type and size of the data DWORD dwType, dwSize; - m_dwLastError = RegQueryValueEx((HKEY) m_hKey, szValue, RESERVED, + m_dwLastError = RegQueryValueEx((HKEY) m_hKey, (char*) (const char*) szValue, RESERVED, &dwType, NULL, &dwSize); if ( m_dwLastError == ERROR_SUCCESS ) { RegString pBuf = (RegString)strValue.GetWriteBuf(dwSize); - m_dwLastError = RegQueryValueEx((HKEY) m_hKey, szValue, RESERVED, + m_dwLastError = RegQueryValueEx((HKEY) m_hKey, (char*) (const char*) szValue, RESERVED, &dwType, pBuf, &dwSize); strValue.UngetWriteBuf(); if ( m_dwLastError == ERROR_SUCCESS ) { @@ -639,8 +663,8 @@ bool wxRegKey::QueryValue(const char *szValue, wxString& strValue) const bool wxRegKey::SetValue(const char *szValue, const wxString& strValue) { if ( CONST_CAST Open() ) { - #ifdef __WIN32__ - m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, RESERVED, REG_SZ, +#if defined( __WIN32__) && !defined(__TWIN32__) + m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_SZ, (RegString)strValue.c_str(), strValue.Len() + 1); if ( m_dwLastError == ERROR_SUCCESS ) @@ -690,7 +714,7 @@ bool wxRegKey::GetNextValue(wxString& strValueName, long& lIndex) const if ( lIndex == -1 ) return FALSE; - #ifdef __WIN32__ +#if defined( __WIN32__) && !defined(__TWIN32__) char szValueName[1024]; // @@ use RegQueryInfoKey... DWORD dwValueLen = WXSIZEOF(szValueName); @@ -764,6 +788,21 @@ bool wxRegKey::GetNextKey(wxString& strKeyName, long& lIndex) const return TRUE; } +// returns TRUE if the value contains a number (else it's some string) +bool wxRegKey::IsNumericValue(const char *szValue) const + { + ValueType type = GetValueType(szValue); + switch ( type ) { + case Type_Dword: + case Type_Dword_little_endian: + case Type_Dword_big_endian: + return TRUE; + + default: + return FALSE; + } + } + // ============================================================================ // implementation of global private functions // ============================================================================ @@ -793,3 +832,7 @@ void RemoveTrailingSeparator(wxString& str) if ( !str.IsEmpty() && str.Last() == REG_SEPARATOR ) str.Truncate(str.Len() - 1); } + +#endif + // __WIN16__ +