svn path=/trunk/mcs/; revision=104772
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / ValueCollectionParameterReader.cs
index 8de1703f178b5d7db309d309d12b68b76f7eeeeb..0d626ae77157f299f8b36f003b048651d138d5ed 100644 (file)
@@ -1,12 +1,12 @@
-// \r
-// System.Web.Services.Protocols.ValueCollectionParameterReader.cs\r
-//\r
-// Author:\r
-//   Tim Coleman (tim@timcoleman.com)\r
-//   Lluis Sanchez Gual (lluis@ximian.com)\r
-//\r
-// Copyright (C) Tim Coleman, 2002\r
-//\r
+// 
+// System.Web.Services.Protocols.ValueCollectionParameterReader.cs
+//
+// Author:
+//   Tim Coleman (tim@timcoleman.com)
+//   Lluis Sanchez Gual (lluis@ximian.com)
+//
+// Copyright (C) Tim Coleman, 2002
+//
 
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-\r
-using System.Collections.Specialized;\r
-using System.Reflection;\r
-using System.Web;\r
-using System.Xml;\r
-\r
-namespace System.Web.Services.Protocols {\r
-       public abstract class ValueCollectionParameterReader : MimeParameterReader {\r
-\r
-               ParameterInfo[] parameters;\r
-\r
-               #region Constructors\r
-\r
-               protected ValueCollectionParameterReader () \r
-               {\r
-               }\r
-               \r
-               #endregion // Constructors\r
-\r
-               #region Methods\r
-\r
-               public override object GetInitializer (LogicalMethodInfo methodInfo)\r
-               {\r
-                       if (IsSupported (methodInfo)) return methodInfo.Parameters;\r
-                       else return null;\r
-               }\r
-\r
-               public override void Initialize (object o)\r
-               {\r
-                       parameters = (ParameterInfo[]) o;\r
-               }\r
-\r
-               public static bool IsSupported (LogicalMethodInfo methodInfo)\r
-               {\r
-                       foreach (ParameterInfo param in methodInfo.Parameters)\r
-                               if (!IsSupported (param)) return false;\r
-                       return true;\r
-               }\r
-\r
-               public static bool IsSupported (ParameterInfo paramInfo)\r
-               {\r
-                       Type type = paramInfo.ParameterType;\r
-                       if (type.IsByRef || paramInfo.IsOut) return false;\r
-                       if (type.IsArray) return IsSupportedPrimitive (type.GetElementType());\r
-                       else return IsSupportedPrimitive (type);\r
-               }\r
-               \r
-               internal static bool IsSupportedPrimitive (Type type)\r
-               {\r
+
+using System.Collections.Specialized;
+using System.Reflection;
+using System.Web;
+using System.Xml;
+
+namespace System.Web.Services.Protocols {
+       public abstract class ValueCollectionParameterReader : MimeParameterReader {
+
+               ParameterInfo[] parameters;
+
+               #region Constructors
+
+               protected ValueCollectionParameterReader () 
+               {
+               }
+               
+               #endregion // Constructors
+
+               #region Methods
+
+               public override object GetInitializer (LogicalMethodInfo methodInfo)
+               {
+                       if (IsSupported (methodInfo)) return methodInfo.Parameters;
+                       else return null;
+               }
+
+               public override void Initialize (object o)
+               {
+                       parameters = (ParameterInfo[]) o;
+               }
+
+               public static bool IsSupported (LogicalMethodInfo methodInfo)
+               {
+                       foreach (ParameterInfo param in methodInfo.Parameters)
+                               if (!IsSupported (param)) return false;
+                       return true;
+               }
+
+               public static bool IsSupported (ParameterInfo paramInfo)
+               {
+                       Type type = paramInfo.ParameterType;
+                       if (type.IsByRef || paramInfo.IsOut) return false;
+                       if (type.IsArray) return IsSupportedPrimitive (type.GetElementType());
+                       else return IsSupportedPrimitive (type);
+               }
+               
+               internal static bool IsSupportedPrimitive (Type type)
+               {
                        return ( type.IsPrimitive || 
-                                        type.IsEnum ||\r
-                                        type == typeof(string) ||\r
-                                        type == typeof(DateTime) ||\r
-                                        type == typeof(Decimal)\r
-                                        );\r
-               }\r
-\r
-               protected object[] Read (NameValueCollection collection)\r
-               {\r
-                       object[] res = new object [parameters.Length];\r
-                       for (int n=0; n<res.Length; n++)\r
-                       {\r
-                               string val = collection [parameters[n].Name];\r
-                               if (val == null) throw new InvalidOperationException ("Missing parameter: " + parameters[n].Name);\r
-                               try\r
-                               {\r
-                                       res [n] = StringToObj (parameters[n].ParameterType, val);\r
-                               }\r
-                               catch (Exception ex)\r
-                               {\r
-                                       string error = "Cannot convert '" + val + "' to " + parameters[n].ParameterType.FullName + "\n";\r
-                                       error += "Parameter name: " + parameters[n].Name + " --> " + ex.Message;\r
-                                       throw new InvalidOperationException (error);\r
-                               }\r
-                       }\r
-                       return res;\r
-               }\r
-               #endregion // Methods\r
-       }\r
+                                        type.IsEnum ||
+                                        type == typeof(string) ||
+                                        type == typeof(DateTime) ||
+                                        type == typeof(Decimal)
+                                        );
+               }
+
+               protected object[] Read (NameValueCollection collection)
+               {
+                       object[] res = new object [parameters.Length];
+                       for (int n=0; n<res.Length; n++)
+                       {
+                               ParameterInfo pi = parameters [n];
+
+                               if (pi.ParameterType.IsArray) {
+                                       string[] values = collection.GetValues (pi.Name);
+                                       if (values == null)
+                                               throw new InvalidOperationException ("Missing parameter: " + pi.Name);
+                                       Type elemType = pi.ParameterType.GetElementType ();
+                                       Array a = Array.CreateInstance (elemType, values.Length);
+                                       for (int i = 0; i < values.Length; i++) {
+                                               try {
+                                                       a.SetValue (StringToObj (elemType, values [i]), i);                                                     
+                                               } catch (Exception ex) {
+                                                       string error = "Cannot convert '" + values [i] + "' to " + elemType + "\n";
+                                                       error += "Parameter name: " + pi.Name + " --> " + ex.Message;
+                                                       throw new InvalidOperationException (error);
+                                               }
+                                       }
+                                       res [n] = a;
+                               } else {
+                                       string val = collection [pi.Name];
+                                       if (val == null)
+                                               throw new InvalidOperationException ("Missing parameter: " + pi.Name);
+                                       try
+                                       {
+                                               res [n] = StringToObj (pi.ParameterType, val);
+                                       }
+                                       catch (Exception ex)
+                                       {
+                                               string error = "Cannot convert '" + val + "' to " + pi.ParameterType + "\n";
+                                               error += "Parameter name: " + pi.Name + " --> " + ex.Message;
+                                               throw new InvalidOperationException (error);
+                                       }
+                               }       
+                       }
+                       return res;
+               }
+               #endregion // Methods
+       }
 }