#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
// ============================================================================
str.Truncate(str.Len() - 1);
}
-// ============================================================================
-// global public functions
-// ============================================================================
-
-bool GetExtensionFromMimeType(wxString *pExt, const wxString& strMimeType)
-{
- // @@@ VZ: I don't know of any official documentation which mentions this
- // location, but as a matter of fact IE uses it, so why not we?
- static const char *szMimeDbase = "MIME\\Database\\Content Type\\";
-
- wxString strKey = szMimeDbase;
- strKey << strMimeType;
-
- // suppress possible error messages
- wxLogNull nolog;
- wxRegKey key(wxRegKey::HKCR, strKey);
- if ( key.Open() ) {
- if ( key.QueryValue("Extension", *pExt) )
- return TRUE;
- }
-
- // no such MIME type or no extension for it
- return FALSE;
-}
-
-bool GetMimeTypeFromExtension(wxString *pMimeType, const wxString& strExt)
-{
- wxCHECK( !strExt.IsEmpty(), FALSE );
-
- // add the leading point if necessary
- wxString str;
- if ( strExt[0] != '.' ) {
- str = '.';
- }
- str << strExt;
-
- // suppress possible error messages
- wxLogNull nolog;
- wxRegKey key(wxRegKey::HKCR, str);
- if ( key.Open() ) {
- if ( key.QueryValue("Content Type", *pMimeType) )
- return TRUE;
- }
-
- // no such extension or no content-type
- return FALSE;
-}
-
-bool GetFileTypeFromExtension(wxString *pFileType, const wxString& strExt)
-{
- wxCHECK( !strExt.IsEmpty(), FALSE );
-
- // add the leading point if necessary
- wxString str;
- if ( strExt[0] != '.' ) {
- str = '.';
- }
- str << strExt;
-
- // suppress possible error messages
- wxLogNull nolog;
- wxRegKey key(wxRegKey::HKCR, str);
- if ( key.Open() ) {
- if ( key.QueryValue("", *pFileType) ) // it's the default value of the key
- return TRUE;
- }
-
- // no such extension or no value
- return FALSE;
-}
-
-bool GetFileTypeIcon(wxIcon *pIcon, const wxString& strFileType)
-{
- wxCHECK( !strFileType.IsEmpty(), FALSE );
-
- wxString strIconKey;
- strIconKey << strFileType << REG_SEPARATOR << "DefaultIcon";
-
- // suppress possible error messages
- wxLogNull nolog;
- wxRegKey key(wxRegKey::HKCR, strIconKey);
-
- if ( key.Open() ) {
- wxString strIcon;
- if ( key.QueryValue("", strIcon) ) { // it's the default value of the key
- // the format is the following: <full path to file>, <icon index>
- // NB: icon index may be negative as well as positive and the full path
- // may contain the environment variables inside '%'
- wxString strFullPath = strIcon.Before(','),
- strIndex = strIcon.Right(',');
-
- // index may be omitted, in which case Before(',') is empty and
- // Right(',') is the whole string
- if ( strFullPath.IsEmpty() ) {
- strFullPath = strIndex;
- strIndex = "0";
- }
-
- wxString strExpPath = wxExpandEnvVars(strFullPath);
- int nIndex = atoi(strIndex);
-
- HICON hIcon = ExtractIcon(GetModuleHandle(NULL), strExpPath, nIndex);
- switch ( (int)hIcon ) {
- case 0: // means no icons were found
- case 1: // means no such file or it wasn't a DLL/EXE/OCX/ICO/...
- wxLogDebug("incorrect registry entry '%s': no such icon.",
- GetFullName(&key));
- break;
-
- default:
- pIcon->SetHICON((WXHICON)hIcon);
- return TRUE;
- }
- }
- }
-
- // no such file type or no value or incorrect icon entry
- return FALSE;
-}
-
-bool GetFileTypeDescription(wxString *pDesc, const wxString& strFileType)
-{
- wxCHECK( !strFileType.IsEmpty(), FALSE );
-
- // suppress possible error messages
- wxLogNull nolog;
- wxRegKey key(wxRegKey::HKCR, strFileType);
-
- if ( key.Open() ) {
- if ( key.QueryValue("", *pDesc) ) // it's the default value of the key
- return TRUE;
- }
-
- // no such file type or no value
- return FALSE;
-}
-
+#endif
+ // __WIN16__