2 // HttpSimpleMethodStubInfo.cs: Information about a method and its mapping to a SOAP web service.
5 // Lluis Sanchez Gual (lluis@ximian.com)
7 // (C) 2003 Ximian, Inc.
10 using System.Reflection;
11 using System.Collections;
13 using System.Xml.Serialization;
14 using System.Web.Services;
15 using System.Web.Services.Description;
17 namespace System.Web.Services.Protocols
27 internal class HttpSimpleMethodStubInfo : MethodStubInfo
29 public MimeFormatterInfo ParameterWriterType;
30 public MimeFormatterInfo ParameterReaderType;
31 public MimeFormatterInfo ReturnReaderType;
32 public MimeFormatterInfo ReturnWriterType;
34 public MimeFormatterInfo GetFormatterInfo (FormatterKind kind)
38 case FormatterKind.ParameterWriter: return ParameterWriterType;
39 case FormatterKind.ParameterReader: return ParameterReaderType;
40 case FormatterKind.ReturnReader: return ReturnReaderType;
41 case FormatterKind.ReturnWriter: return ReturnWriterType;
46 public HttpSimpleMethodStubInfo (TypeStubInfo parent, LogicalMethodInfo source): base (parent, source)
48 object[] atts = source.CustomAttributeProvider.GetCustomAttributes (typeof(HttpMethodAttribute), true);
51 HttpMethodAttribute at = (HttpMethodAttribute) atts[0];
52 ParameterWriterType = new MimeFormatterInfo (at.ParameterFormatter);
53 ReturnReaderType = new MimeFormatterInfo (at.ReturnFormatter);
58 internal class MimeFormatterInfo
60 public MimeFormatterInfo (Type type) {
64 public MimeFormatter Create () {
65 return MimeFormatter.CreateInstance (Type, Initializer);
69 public object Initializer;
72 internal class HttpSimpleTypeStubInfo : TypeStubInfo
74 public HttpSimpleTypeStubInfo (Type t): base (t)
78 public override void BuildTypeMethods ()
80 base.BuildTypeMethods ();
82 BuildInitializers (FormatterKind.ParameterWriter);
83 BuildInitializers (FormatterKind.ParameterReader);
84 BuildInitializers (FormatterKind.ReturnReader);
85 BuildInitializers (FormatterKind.ReturnWriter);
88 void BuildInitializers (FormatterKind formatter)
90 Hashtable types = new Hashtable ();
92 foreach (HttpSimpleMethodStubInfo met in Methods)
93 AddType (types, met.GetFormatterInfo (formatter).Type, met);
95 foreach (DictionaryEntry ent in types)
97 Type t = (Type)ent.Key;
98 ArrayList list = (ArrayList)ent.Value;
99 LogicalMethodInfo[] mets = new LogicalMethodInfo [list.Count];
100 for (int n=0; n<list.Count; n++)
101 mets[n] = ((MethodStubInfo)list[n]).MethodInfo;
103 object[] inits = MimeFormatter.GetInitializers (t, mets);
105 for (int n=0; n<list.Count; n++)
106 ((HttpSimpleMethodStubInfo)list[n]).GetFormatterInfo (formatter).Initializer = inits[n];
110 void AddType (Hashtable types, Type type, HttpSimpleMethodStubInfo method)
112 ArrayList list = (ArrayList) types [type];
115 list = new ArrayList ();
121 protected override MethodStubInfo CreateMethodStubInfo (TypeStubInfo typeInfo, LogicalMethodInfo methodInfo, bool isClientProxy)
123 return new HttpSimpleMethodStubInfo (typeInfo, methodInfo);