]> git.saurik.com Git - wxWidgets.git/commitdiff
1. registry files corresponding to the recent registry.h changes
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 23 Jan 1999 23:50:24 +0000 (23:50 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 23 Jan 1999 23:50:24 +0000 (23:50 +0000)
2. badly famous wxRegConfig::DeleteAll() bug corrected

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1456 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/registry.h
samples/config/conftest.cpp
src/msw/regconf.cpp
src/msw/registry.cpp

index f2386f65949bf863a640562f6c43d110eb0c5b9a..f4694aff5c11abdfc7a909ae1af81497baa477fc 100644 (file)
@@ -160,7 +160,21 @@ public:
 
   // access to values and subkeys
     // get value type
-  ValueType GetValueType(const char *szValue);
+  ValueType GetValueType(const char *szValue) const;
+    // returns TRUE if the value contains a number (else it's some string)
+  bool 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;
+      }
+  }
 
     // assignment operators set the default value of the key
   wxRegKey& operator=(const wxString& strValue)
index 4d485ac2694ef528d7104d16fb43a14ac70dbc77..6c47dc4bd61c551abe6ec20c01451ba31ff3ab66 100644 (file)
@@ -202,18 +202,16 @@ void MyFrame::OnAbout(wxCommandEvent&)
 
 void MyFrame::OnDelete(wxCommandEvent&)
 {
-  // VZ: it seems that DeleteAll() wreaks havoc on NT. Disabled until I
-  // investigate it further, do _not_ compile this code in meanwhile!
-  // JACS: wxRegConfig::DeleteAll is disabled, so it's safe to call DeleteAll,
-  // it just won't do anything useful on Win95/NT.
     if ( wxConfigBase::Get()->DeleteAll() ) {
-    wxLogMessage("Config file/registry key successfully deleted.");
-
-    delete wxConfigBase::Set((wxConfigBase *) NULL);
-    wxConfigBase::DontCreateOnDemand();
-  }
-  else
-    wxLogError("Deleting config file/registry key failed.");
+        wxLogMessage("Config file/registry key successfully deleted.");
+
+        delete wxConfigBase::Set((wxConfigBase *) NULL);
+        wxConfigBase::DontCreateOnDemand();
+    }
+    else
+    {
+        wxLogError("Deleting config file/registry key failed.");
+    }
 }
 
 MyFrame::~MyFrame()
index 4bc56da8b640542c17a45375c071ded36a5d5584..8943720d8f7a0e2d87d54dcc1694e3e4a7e961c0 100644 (file)
@@ -528,16 +528,15 @@ bool wxRegConfig::DeleteAll()
 {
   m_keyLocal.Close();
   m_keyGlobal.Close();
-#if 1
-  wxFAIL_MSG("wxRegConfig::DeleteAll will wipe out your entire registry, so please do not use until it's fixed!");
-  return FALSE;
-#else
+
   bool bOk = m_keyLocalRoot.DeleteSelf();
-  if ( bOk )
+
+  // make sure that we opened m_keyGlobalRoot and so it has a reasonable name:
+  // otherwise we will delete HKEY_CLASSES_ROOT recursively
+  if ( bOk && m_keyGlobalRoot.IsOpened() )
     bOk = m_keyGlobalRoot.DeleteSelf();
 
   return bOk;
-#endif
 }
 
 #endif
index 9ab127dd6739431553cf0b3040c6e0f87f0c8c8c..5d59c9ee38fae38795c75cd3b38934ae36b8d87d 100644 (file)
@@ -427,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;