+bool wxRegKey::Rename(const wxString& szNewName)
+{
+ wxCHECK_MSG( !m_strKey.empty(), false, _T("registry hives can't be renamed") );
+
+ if ( !Exists() ) {
+ wxLogError(_("Registry key '%s' does not exist, cannot rename it."),
+ GetFullName(this));
+
+ return false;
+ }
+
+ // do we stay in the same hive?
+ bool inSameHive = !wxStrchr(szNewName, REG_SEPARATOR);
+
+ // construct the full new name of the key
+ wxRegKey keyDst;
+
+ if ( inSameHive ) {
+ // rename the key to the new name under the same parent
+ wxString strKey = m_strKey.BeforeLast(REG_SEPARATOR);
+ if ( !strKey.empty() ) {
+ // don't add '\\' in the start if strFullNewName is empty
+ strKey += REG_SEPARATOR;
+ }
+
+ strKey += szNewName;
+
+ keyDst.SetName(GetStdKeyFromHkey(m_hRootKey), strKey);
+ }
+ else {
+ // this is the full name already
+ keyDst.SetName(szNewName);
+ }
+
+ bool ok = keyDst.Create(false /* fail if alredy exists */);
+ if ( !ok ) {
+ wxLogError(_("Registry key '%s' already exists."),
+ GetFullName(&keyDst));
+ }
+ else {
+ ok = Copy(keyDst) && DeleteSelf();
+ }
+
+ if ( !ok ) {
+ wxLogError(_("Failed to rename the registry key '%s' to '%s'."),
+ GetFullName(this), GetFullName(&keyDst));
+ }
+ else {
+ m_hRootKey = keyDst.m_hRootKey;
+ m_strKey = keyDst.m_strKey;
+ }
+
+ return ok;
+}
+
+bool wxRegKey::Copy(const wxString& szNewName)
+{
+ // create the new key first
+ wxRegKey keyDst(szNewName);
+ bool ok = keyDst.Create(false /* fail if alredy exists */);
+ if ( ok ) {
+ ok = Copy(keyDst);
+
+ // we created the dest key but copying to it failed - delete it
+ if ( !ok ) {
+ (void)keyDst.DeleteSelf();
+ }
+ }
+
+ return ok;
+}
+
+bool wxRegKey::Copy(wxRegKey& keyDst)
+{
+ bool ok = true;
+
+ // copy all sub keys to the new location
+ wxString strKey;
+ long lIndex;
+ bool bCont = GetFirstKey(strKey, lIndex);
+ while ( ok && bCont ) {
+ wxRegKey key(*this, strKey);
+ wxString keyName;
+ keyName << GetFullName(&keyDst) << REG_SEPARATOR << strKey;
+ ok = key.Copy(keyName);
+
+ if ( ok )
+ bCont = GetNextKey(strKey, lIndex);
+ else
+ wxLogError(_("Failed to copy the registry subkey '%s' to '%s'."),
+ GetFullName(&key), keyName.c_str());
+
+ }
+
+ // copy all values
+ wxString strVal;
+ bCont = GetFirstValue(strVal, lIndex);
+ while ( ok && bCont ) {
+ ok = CopyValue(strVal, keyDst);
+
+ if ( !ok ) {
+ wxLogSysError(m_dwLastError,
+ _("Failed to copy registry value '%s'"),
+ strVal.c_str());
+ }
+ else {
+ bCont = GetNextValue(strVal, lIndex);
+ }
+ }
+
+ if ( !ok ) {
+ wxLogError(_("Failed to copy the contents of registry key '%s' to '%s'."),
+ GetFullName(this), GetFullName(&keyDst));
+ }
+
+ return ok;
+}
+
+// ----------------------------------------------------------------------------
+// delete keys/values
+// ----------------------------------------------------------------------------