#pragma implementation "registry.h"
#endif
-// ============================================================================
-// declarations
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// headers
-// ----------------------------------------------------------------------------
-
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/string.h"
#include "wx/intl.h"
#include "wx/log.h"
-
#include "wx/config.h" // for wxExpandEnvVars
+#ifndef __WIN16__
+
// Windows headers
/*
#define STRICT
{
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 ||
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;
}
{
RemoveTrailingSeparator(m_strKey);
m_hRootKey = (WXHKEY) aStdKeys[keyParent].hkey;
- m_hKey = NULL;
+ m_hKey = (WXHKEY) NULL;
m_dwLastError = 0;
}
RemoveTrailingSeparator(m_strKey);
m_hRootKey = keyParent.m_hRootKey;
- m_hKey = NULL;
+ m_hKey = (WXHKEY) NULL;
m_dwLastError = 0;
}
ulong *pnMaxValueLen) const
#endif
{
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__TWIN32__)
m_dwLastError = ::RegQueryInfoKey
(
(HKEY) m_hKey,
}
}
+ // 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;
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());
#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
// 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;
// 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'"),
#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;
wxLogSysError(m_dwLastError, _("can't set value of '%s'"),
GetFullName(this, szValue));
return FALSE;
+#endif
}
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'"),
#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 ) {
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 )
if ( lIndex == -1 )
return FALSE;
- #ifdef __WIN32__
+#if defined( __WIN32__) && !defined(__TWIN32__)
char szValueName[1024]; // @@ use RegQueryInfoKey...
DWORD dwValueLen = WXSIZEOF(szValueName);
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
// ============================================================================
if ( !str.IsEmpty() && str.Last() == REG_SEPARATOR )
str.Truncate(str.Len() - 1);
}
+
+#endif
+ // __WIN16__
+