Add tests
[mono.git] / mcs / class / corlib / Microsoft.Win32 / Registry.cs
index 1f09402f26dd37667e5ab3c7e668004f0c141498..03251dad4ea66f932f0de51244badcff8aee84a7 100644 (file)
@@ -2,11 +2,12 @@
 // Microsoft.Win32.Registry.cs
 //
 // Author:
+//   Miguel de Icaza (miguel@novell.com)
 //   stubbed out by Alexandre Pigolkine (pigolkine@gmx.de)
 //
 
 //
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004, 2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -32,22 +33,111 @@ using System;
 
 namespace Microsoft.Win32
 {
-       public sealed class Registry
+       public
+#if NET_2_0
+       static
+#else
+       sealed
+#endif
+       class Registry
        {
+#if !NET_2_0
                private Registry () { }
+#endif
                public static readonly RegistryKey ClassesRoot = new RegistryKey (
-                               RegistryHive.ClassesRoot, "HKEY_CLASSES_ROOT");
+                               RegistryHive.ClassesRoot);
                public static readonly RegistryKey CurrentConfig = new RegistryKey (
-                               RegistryHive.CurrentConfig, "HKEY_CURRENT_CONFIG");
+                               RegistryHive.CurrentConfig);
                public static readonly RegistryKey CurrentUser = new RegistryKey (
-                               RegistryHive.CurrentUser, "HKEY_CURRENT_USER");
+                               RegistryHive.CurrentUser);
                public static readonly RegistryKey DynData = new RegistryKey (
-                               RegistryHive.DynData, "HKEY_DYN_DATA");
+                               RegistryHive.DynData);
                public static readonly RegistryKey LocalMachine = new RegistryKey (
-                               RegistryHive.LocalMachine, "HKEY_DYN_DATA");
+                               RegistryHive.LocalMachine);
                public static readonly RegistryKey PerformanceData = new RegistryKey (
-                               RegistryHive.PerformanceData, "HKEY_PERFORMANCE_DATA");
+                               RegistryHive.PerformanceData);
                public static readonly RegistryKey Users = new RegistryKey (
-                               RegistryHive.Users, "HKEY_USERS");
+                               RegistryHive.Users);
+
+#if NET_2_0
+               static RegistryKey ToKey (string keyName, bool setting)
+               {
+                       if (keyName == null)
+                               throw new ArgumentException ("Not a valid registry key name", "keyName");
+
+                       RegistryKey key = null;
+                       string [] keys = keyName.Split ('\\');
+
+                       switch (keys [0]){
+                       case "HKEY_CLASSES_ROOT":
+                               key = ClassesRoot;
+                               break;
+                       case "HKEY_CURRENT_CONFIG":
+                               key = CurrentConfig;
+                               break;
+                       case "HKEY_CURRENT_USER":
+                               key = CurrentUser;
+                               break;
+                       case "HKEY_DYN_DATA":
+                               key = DynData;
+                               break;
+                       case "HKEY_LOCAL_MACHINE":
+                               key = LocalMachine;
+                               break;
+                       case "HKEY_PERFORMANCE_DATA":
+                               key = PerformanceData;
+                               break;
+                       case "HKEY_USERS":
+                               key = Users;
+                               break;
+                       default:
+                               throw new ArgumentException ("Keyname does not start with a valid registry root", "keyName");
+                       }
+
+                       for (int i = 1; i < keys.Length; i++){
+                               RegistryKey nkey = key.OpenSubKey (keys [i], true);
+                               if (nkey == null){
+                                       if (!setting)
+                                               return null;
+                                       nkey = key.CreateSubKey (keys [i]);
+                               }
+                               key = nkey;
+                       }
+                       return key;
+               }
+               
+               public static void SetValue (string keyName, string valueName, object value)
+               {
+                       RegistryKey key = ToKey (keyName, true);
+                       if (valueName.Length > 255)
+                               throw new ArgumentException ("valueName is larger than 255 characters", "valueName");
+
+                       if (key == null)
+                               throw new ArgumentException ("cant locate that keyName", "keyName");
+
+                       key.SetValue (valueName, value);
+               }
+
+               public static void SetValue (string keyName, string valueName, object value, RegistryValueKind valueKind)
+               {
+                       RegistryKey key = ToKey (keyName, true);
+                       if (valueName.Length > 255)
+                               throw new ArgumentException ("valueName is larger than 255 characters", "valueName");
+
+                       if (key == null)
+                               throw new ArgumentException ("cant locate that keyName", "keyName");
+
+                       key.SetValue (valueName, value, valueKind);
+               }
+               
+               public static object GetValue (string keyName, string valueName, object defaultValue)
+               {
+                       RegistryKey key = ToKey (keyName, false);
+                       if (key == null)
+                               return defaultValue;
+                       
+                       return key.GetValue (valueName, defaultValue);
+               }
+#endif
        }
 }