New test.
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / MimeFormatter.cs
1 // \r
2 // System.Web.Services.Protocols.MimeFormatter.cs\r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Tim Coleman, 2002\r
9 //\r
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31 \r
32 using System.Web.Services;\r
33 using System.Xml;\r
34 \r
35 namespace System.Web.Services.Protocols {\r
36         public abstract class MimeFormatter {\r
37 \r
38                 #region Constructors\r
39 \r
40                 protected MimeFormatter () \r
41                 {\r
42                 }\r
43                 \r
44                 #endregion // Constructors\r
45 \r
46                 #region Methods\r
47 \r
48                 public static MimeFormatter CreateInstance (Type type, object initializer)\r
49                 {\r
50                         MimeFormatter ob = (MimeFormatter) Activator.CreateInstance (type);\r
51                         ob.Initialize (initializer);\r
52                         return ob;\r
53                 }\r
54 \r
55                 public abstract object GetInitializer (LogicalMethodInfo methodInfo);\r
56 \r
57                 public static object GetInitializer (Type type, LogicalMethodInfo methodInfo)\r
58                 {\r
59                         MimeFormatter ob = (MimeFormatter) Activator.CreateInstance (type);\r
60                         return ob.GetInitializer (methodInfo);\r
61                 }\r
62 \r
63                 public virtual object[] GetInitializers (LogicalMethodInfo[] methodInfos)\r
64                 {\r
65                         object[] initializers = new object [methodInfos.Length];\r
66                         for (int n=0; n<methodInfos.Length; n++)\r
67                                 initializers [n] = GetInitializer (methodInfos[n]);\r
68                                 \r
69                         return initializers;\r
70                 }\r
71 \r
72                 public static object[] GetInitializers (Type type, LogicalMethodInfo[] methodInfos)\r
73                 {\r
74                         MimeFormatter ob = (MimeFormatter) Activator.CreateInstance (type);\r
75                         return ob.GetInitializers (methodInfos);\r
76                 }\r
77 \r
78                 public abstract void Initialize (object initializer);   \r
79 \r
80                 internal static object StringToObj (Type type, string value)\r
81                 {
82                         if (type.IsEnum)
83                                 return Enum.Parse (type, value);
84                         \r
85                         switch (Type.GetTypeCode (type))\r
86                         {\r
87                                 case TypeCode.Boolean: return XmlConvert.ToBoolean (value);\r
88                                 case TypeCode.Byte: return XmlConvert.ToByte (value);\r
89                                 case TypeCode.DateTime: return XmlConvert.ToDateTime (value);\r
90                                 case TypeCode.Decimal: return XmlConvert.ToDecimal (value);\r
91                                 case TypeCode.Double: return XmlConvert.ToDouble (value);\r
92                                 case TypeCode.Int16: return XmlConvert.ToInt16 (value);\r
93                                 case TypeCode.Int32: return XmlConvert.ToInt32 (value);\r
94                                 case TypeCode.Int64: return XmlConvert.ToInt64 (value);\r
95                                 case TypeCode.SByte: return XmlConvert.ToSByte (value);\r
96                                 case TypeCode.Single: return XmlConvert.ToSingle (value);\r
97                                 case TypeCode.UInt16: return XmlConvert.ToUInt16 (value);\r
98                                 case TypeCode.UInt32: return XmlConvert.ToUInt32 (value);\r
99                                 case TypeCode.UInt64: return XmlConvert.ToUInt64 (value);\r
100                                 case TypeCode.String: return value;\r
101                                 case TypeCode.Char:\r
102                                         if (value.Length != 1) throw new InvalidOperationException ("Invalid char value");\r
103                                         return value [0];\r
104                         }\r
105                         throw new InvalidOperationException ("Type not supported");\r
106                 }\r
107 \r
108                 internal static string ObjToString (object value)\r
109                 {\r
110                         if (value == null) return "";\r
111                         switch (Type.GetTypeCode (value.GetType ()))\r
112                         {\r
113                                 case TypeCode.Boolean: return XmlConvert.ToString ((bool)value);\r
114                                 case TypeCode.Byte: return XmlConvert.ToString ((byte)value);\r
115                                 case TypeCode.Char: return XmlConvert.ToString ((char)value);\r
116                                 case TypeCode.DateTime: return XmlConvert.ToString ((DateTime)value);\r
117                                 case TypeCode.Decimal: return XmlConvert.ToString ((decimal)value);\r
118                                 case TypeCode.Double: return XmlConvert.ToString ((double)value);\r
119                                 case TypeCode.Int16: return XmlConvert.ToString ((Int16)value);\r
120                                 case TypeCode.Int32: return XmlConvert.ToString ((Int32)value);\r
121                                 case TypeCode.Int64: return XmlConvert.ToString ((Int64)value);\r
122                                 case TypeCode.SByte: return XmlConvert.ToString ((sbyte)value);\r
123                                 case TypeCode.Single: return XmlConvert.ToString ((Single)value);\r
124                                 case TypeCode.UInt16: return XmlConvert.ToString ((UInt16)value);\r
125                                 case TypeCode.UInt32: return XmlConvert.ToString ((UInt32)value);\r
126                                 case TypeCode.UInt64: return XmlConvert.ToString ((UInt64)value);\r
127                                 case TypeCode.String: return value as string;\r
128                         }
129                         if (value.GetType().IsEnum)
130                                 return value.ToString ();
131 \r
132                         throw new InvalidOperationException ("Type not supported");\r
133                 }\r
134                 \r
135                 #endregion // Methods\r
136         }\r
137 }