//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
namespace System.Web.Services.Protocols {
using System.IO;
using System;
using System.Xml.Serialization;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Web.Services;
using System.Text;
using System.Security.Permissions;
///
///
/// [To be supplied.]
///
public abstract class ValueCollectionParameterReader : MimeParameterReader {
ParameterInfo[] paramInfos;
///
///
/// [To be supplied.]
///
public override void Initialize(object o) {
paramInfos = (ParameterInfo[])o;
}
///
///
/// [To be supplied.]
///
public override object GetInitializer(LogicalMethodInfo methodInfo) {
if (!IsSupported(methodInfo)) return null;
return methodInfo.InParameters;
}
///
///
/// [To be supplied.]
///
protected object[] Read(NameValueCollection collection) {
object[] parameters = new object[paramInfos.Length];
for (int i = 0; i < paramInfos.Length; i++) {
ParameterInfo paramInfo = paramInfos[i];
if (paramInfo.ParameterType.IsArray) {
string[] arrayValues = collection.GetValues(paramInfo.Name);
Type arrayType = paramInfo.ParameterType.GetElementType();
Array array = Array.CreateInstance(arrayType, arrayValues.Length);
for (int j = 0; j < arrayValues.Length; j++) {
string value = arrayValues[j];
array.SetValue(ScalarFormatter.FromString(value, arrayType), j);
}
parameters[i] = array;
}
else {
string value = collection[paramInfo.Name];
if (value == null) throw new InvalidOperationException(Res.GetString(Res.WebMissingParameter, paramInfo.Name));
parameters[i] = ScalarFormatter.FromString(value, paramInfo.ParameterType);
}
}
return parameters;
}
///
///
/// [To be supplied.]
///
static public bool IsSupported(LogicalMethodInfo methodInfo) {
if (methodInfo.OutParameters.Length > 0)
return false;
ParameterInfo[] paramInfos = methodInfo.InParameters;
for (int i = 0; i < paramInfos.Length; i++)
if (!IsSupported(paramInfos[i]))
return false;
return true;
}
///
///
/// [To be supplied.]
///
static public bool IsSupported(ParameterInfo paramInfo) {
Type type = paramInfo.ParameterType;
if (type.IsArray)
type = type.GetElementType();
return ScalarFormatter.IsTypeSupported(type);
}
}
}