2003-04-29 Miguel de Icaza <miguel@ximian.com>
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Protocols / SoapHttpClientProtocol.cs
1 // \r
2 // System.Web.Services.Protocols.SoapHttpClientProtocol.cs\r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //\r
7 // Copyright (C) Tim Coleman, 2002\r
8 //\r
9 \r
10 using System.IO;\r
11 using System.Net;\r
12 using System.Web;\r
13 using System.Reflection;\r
14 using System.Web.Services;\r
15 using System.Diagnostics;\r
16 \r
17 namespace System.Web.Services.Protocols {\r
18         public class SoapHttpClientProtocol : HttpWebClientProtocol {\r
19 \r
20                 #region Constructors\r
21 \r
22                 public SoapHttpClientProtocol () \r
23                 {\r
24                 }\r
25                 \r
26                 #endregion // Constructors\r
27 \r
28                 #region Methods\r
29 \r
30                 [MonoTODO]\r
31                 protected IAsyncResult BeginInvoke (string methodName, object[] parameters, AsyncCallback callback, object asyncState)\r
32                 {\r
33                         throw new NotImplementedException ();\r
34                 }\r
35 \r
36                 [MonoTODO]\r
37                 public void Discover ()\r
38                 {\r
39                         throw new NotImplementedException ();\r
40                 }\r
41 \r
42                 [MonoTODO]\r
43                 protected object[] EndInvoke (IAsyncResult asyncResult)\r
44                 {\r
45                         throw new NotImplementedException ();\r
46                 }\r
47 \r
48                 protected override WebRequest GetWebRequest (Uri uri)\r
49                 {\r
50                         return WebRequest.Create (uri);\r
51                 }\r
52 \r
53                 //\r
54                 // The `method_name' should be the name of our invoker, this is only used\r
55                 // for sanity checks, nothing else\r
56                 //\r
57                 MethodInfo GetCallerMethod (string method_name)\r
58                 {\r
59                         StackFrame stack_frame = new StackFrame (5, false);\r
60                         MethodInfo mi = (MethodInfo) stack_frame.GetMethod ();\r
61 \r
62                         //\r
63                         // A few sanity checks, just in case the code moves around later\r
64                         //\r
65                         if (!mi.DeclaringType.IsSubclassOf (typeof (System.Web.Services.Protocols.SoapHttpClientProtocol)))\r
66                                 throw new Exception ("We are pointing to the wrong method (T=" + mi.DeclaringType + ")");\r
67 \r
68                         if (mi.DeclaringType == typeof (System.Web.Services.Protocols.SoapHttpClientProtocol))\r
69                                 throw new Exception ("We are pointing to the wrong method (we are pointing to our Invoke)");\r
70 \r
71                         if (mi.Name != method_name)\r
72                                 throw new Exception ("The method we point to is: " + mi.Name);\r
73 \r
74                         return mi;\r
75                 }\r
76                 \r
77                 SoapClientMessage CreateMessage (string method_name, object [] parameters)\r
78                 {\r
79                         MethodInfo mi = GetCallerMethod (method_name);\r
80                         object [] attributes = mi.GetCustomAttributes (typeof (System.Web.Services.Protocols.SoapDocumentMethodAttribute), false);\r
81                         SoapDocumentMethodAttribute sma = (SoapDocumentMethodAttribute) attributes [0];\r
82 \r
83                         Console.WriteLine ("SMAA:    " + sma.Action);\r
84                         Console.WriteLine ("Binding: " + sma.Binding);\r
85                         Console.WriteLine ("OneWay:  " + sma.OneWay);\r
86                         Console.WriteLine ("PStyle:  " + sma.ParameterStyle);\r
87                         Console.WriteLine ("REN:     " + sma.RequestElementName);\r
88                         Console.WriteLine ("REN:     " + sma.RequestElementName);\r
89                         \r
90                         SoapClientMessage message = new SoapClientMessage (\r
91                                 this, sma, new LogicalMethodInfo (mi), sma.OneWay, Url);\r
92                         \r
93                         return null;\r
94                 }\r
95                 \r
96                 void SendMessage (WebRequest request, SoapClientMessage message)\r
97                 {\r
98                         \r
99                 }\r
100                 \r
101                 protected object[] Invoke (string method_name, object[] parameters)\r
102                 {\r
103                         SoapClientMessage message = CreateMessage (method_name, parameters);\r
104                         WebRequest request = GetWebRequest (uri);\r
105                         Stream s = request.GetRequestStream ();\r
106                         \r
107                         try {\r
108                                 SendMessage (request, message);\r
109                         } finally {\r
110                                 s.Close ();\r
111                         }\r
112 \r
113                         return null;\r
114                 }\r
115 \r
116                 #endregion // Methods\r
117         }\r
118 }\r