summary refs log tree commit diff
path: root/Crypto/src/util/Enums.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Crypto/src/util/Enums.cs')
-rw-r--r--Crypto/src/util/Enums.cs72
1 files changed, 72 insertions, 0 deletions
diff --git a/Crypto/src/util/Enums.cs b/Crypto/src/util/Enums.cs
new file mode 100644
index 000000000..abab5266b
--- /dev/null
+++ b/Crypto/src/util/Enums.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Text;
+
+#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
+using System.Collections;
+using System.Reflection;
+#endif
+
+using Org.BouncyCastle.Utilities.Date;
+
+namespace Org.BouncyCastle.Utilities
+{
+    internal sealed class Enums
+    {
+        private Enums()
+        {
+        }
+
+		internal static Enum GetEnumValue(System.Type enumType, string s)
+		{
+			if (!enumType.IsEnum)
+				throw new ArgumentException("Not an enumeration type", "enumType");
+
+			// We only want to parse single named constants
+			if (s.Length > 0 && char.IsLetter(s[0]) && s.IndexOf(',') < 0)
+			{
+				s = s.Replace('-', '_');
+
+#if NETCF_1_0
+				FieldInfo field = enumType.GetField(s, BindingFlags.Static | BindingFlags.Public);
+				if (field != null)
+				{
+					return (Enum)field.GetValue(null);
+				}
+#else
+				return (Enum)Enum.Parse(enumType, s, false);
+#endif		
+			}
+
+			throw new ArgumentException();
+		}
+
+		internal static Array GetEnumValues(System.Type enumType)
+		{
+			if (!enumType.IsEnum)
+				throw new ArgumentException("Not an enumeration type", "enumType");
+
+#if NETCF_1_0 || NETCF_2_0 || SILVERLIGHT || PORTABLE
+            IList result = Platform.CreateArrayList();
+			FieldInfo[] fields = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
+			foreach (FieldInfo field in fields)
+			{
+                // Note: Argument to GetValue() ignored since the fields are static,
+                //     but Silverlight for Windows Phone throws exception if we pass null
+				result.Add(field.GetValue(enumType));
+			}
+            object[] arr = new object[result.Count];
+            result.CopyTo(arr, 0);
+            return arr;
+#else
+			return Enum.GetValues(enumType);
+#endif
+		}
+
+		internal static Enum GetArbitraryValue(System.Type enumType)
+		{
+			Array values = GetEnumValues(enumType);
+			int pos = (int)(DateTimeUtilities.CurrentUnixMs() & int.MaxValue) % values.Length;
+			return (Enum)values.GetValue(pos);
+		}
+	}
+}