Add licensing info
[mono.git] / mcs / class / System.Web / System.Web.UI / PropertyConverter.cs
1
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining
4 // a copy of this software and associated documentation files (the
5 // "Software"), to deal in the Software without restriction, including
6 // without limitation the rights to use, copy, modify, merge, publish,
7 // distribute, sublicense, and/or sell copies of the Software, and to
8 // permit persons to whom the Software is furnished to do so, subject to
9 // the following conditions:
10 // 
11 // The above copyright notice and this permission notice shall be
12 // included in all copies or substantial portions of the Software.
13 // 
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 /**\r
23  * Namespace: System.Web.UI\r
24  * Class:     PropertyConverter\r
25  *\r
26  * Author:  Gaurav Vaish\r
27  * Maintainer: gvaish@iitk.ac.in\r
28  * Implementation: yes\r
29  * Contact: <gvaish@iitk.ac.in>\r
30  * Status:  100%\r
31  *\r
32  * (C) Gaurav Vaish (2001)\r
33  */\r
34 \r
35 using System;\r
36 using System.ComponentModel;\r
37 using System.Globalization;\r
38 using System.Reflection;\r
39 \r
40 namespace System.Web.UI\r
41 {\r
42         public sealed class PropertyConverter\r
43         {\r
44                 private static Type[] parseMethodTypes;\r
45                 private static Type[] parseMethodTypesWithSOP;\r
46 \r
47                 static PropertyConverter()\r
48                 {\r
49                         parseMethodTypes = new Type[1];\r
50                         parseMethodTypes[0] = typeof(string);\r
51                         parseMethodTypesWithSOP = new Type[2];\r
52                         parseMethodTypesWithSOP[0] = typeof(string);\r
53                         parseMethodTypesWithSOP[1] = typeof(IServiceProvider);\r
54                 }\r
55 \r
56                 private PropertyConverter()\r
57                 {\r
58                         // Prevent any instance\r
59                 }\r
60 \r
61                 public static object EnumFromString(Type enumType, string enumValue)\r
62                 {\r
63                         object retVal = null;\r
64                         try\r
65                         {\r
66                                 retVal = Enum.Parse(enumType, enumValue, true);\r
67                         } catch\r
68                         {\r
69                                 retVal = null;\r
70                         }\r
71                         return retVal;\r
72                 }\r
73 \r
74                 public static string EnumToString(Type enumType, object enumValue)\r
75                 {\r
76                         string retVal = Enum.Format(enumType, enumValue, "G");\r
77                         return retVal.Replace('_','-');\r
78                 }\r
79 \r
80                 public static object ObjectFromString(Type objType, MemberInfo propertyInfo, string objValue)\r
81                 {\r
82                         if(objValue == null)\r
83                                 return null;\r
84                         if(! (!objType.Equals(typeof(Boolean)) || objValue.Length > 0) )\r
85                         {\r
86                                 return null;\r
87                         }\r
88                         if(objType.IsEnum)\r
89                         {\r
90                                 return EnumFromString(objType, objValue);\r
91                         }\r
92                         if(objType.Equals(typeof(string)))\r
93                         {\r
94                                 return objValue;\r
95                         }\r
96                         PropertyDescriptor pc = null;\r
97                         if(propertyInfo != null)\r
98                         {\r
99                                 pc = (TypeDescriptor.GetProperties(propertyInfo.ReflectedType))[propertyInfo.Name];\r
100                         }\r
101                         if(pc != null)\r
102                         {\r
103                                 TypeConverter converter = pc.Converter;\r
104                                 if(converter!=null && converter.CanConvertFrom(typeof(string)))\r
105                                 {\r
106                                         return converter.ConvertFromInvariantString(objValue);\r
107                                 }\r
108                         }\r
109                         MethodInfo mi = objType.GetMethod("Parse", parseMethodTypesWithSOP);\r
110                         object o = null;\r
111                         if(mi != null)\r
112                         {\r
113                                 object[] parameters = new object[2];\r
114                                 parameters[0] = objValue;\r
115                                 parameters[1] = CultureInfo.InvariantCulture;\r
116                                 try\r
117                                 {\r
118                                         o = Utils.InvokeMethod(mi, null, parameters);\r
119                                 } catch\r
120                                 {\r
121                                 }\r
122                         }\r
123                         if(o == null)\r
124                         {\r
125                                 mi = objType.GetMethod("Parse", parseMethodTypes);\r
126                                 if(mi!=null)\r
127                                 {\r
128                                         object[] parameters = new object[1];\r
129                                         parameters[0] = objValue;\r
130                                         try\r
131                                         {\r
132                                                 o = Utils.InvokeMethod(mi, null, parameters);\r
133                                         } catch\r
134                                         {\r
135                                         }\r
136                                 }\r
137                         }\r
138                         if(o == null)\r
139                         {\r
140                                 throw new HttpException(/*HttpRuntime.FormatResourceString(*/"Type_not_creatable_from_string"/*, objType.FullName, objValue, propertyInfo.Name)*/);\r
141                         }\r
142                         return o;\r
143                 }\r
144         }\r
145 }\r