* Makefile: Add a System.Core.dll reference; embed monodoc.xml as a
[mono.git] / mcs / class / System.Runtime.Remoting / MonoHttp / ListenerAsyncResult.cs
1 #define EMBEDDED_IN_1_0
2
3 //
4 // System.Net.ListenerAsyncResult
5 //
6 // Authors:
7 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 //
9 // Copyright (c) 2005 Ximian, Inc (http://www.ximian.com)
10 //
11
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 #if EMBEDDED_IN_1_0
34
35 using System.Threading;
36 using System; using System.Net; namespace MonoHttp {
37         class ListenerAsyncResult : IAsyncResult {
38                 ManualResetEvent handle;
39                 bool synch;
40                 bool completed;
41                 AsyncCallback cb;
42                 object state;
43                 Exception exception;
44                 HttpListenerContext context;
45                 object locker = new object ();
46
47                 public ListenerAsyncResult (AsyncCallback cb, object state)
48                 {
49                         this.cb = cb;
50                         this.state = state;
51                 }
52
53                 internal void Complete (string error)
54                 {
55                         //FIXME: error_code?
56                         exception = new HttpListenerException (0, error);
57                         lock (locker) {
58                                 completed = true;
59                                 if (handle != null)
60                                         handle.Set ();
61
62                                 if (cb != null)
63                                         ThreadPool.QueueUserWorkItem (InvokeCallback, this);
64                         }
65                 }
66
67                 static void InvokeCallback (object o)
68                 {
69                         ListenerAsyncResult ares = (ListenerAsyncResult) o;
70                         ares.cb (ares);
71                 }
72
73                 internal void Complete (HttpListenerContext context)
74                 {
75                         Complete (context, false);
76                 }
77
78                 internal void Complete (HttpListenerContext context, bool synch)
79                 {
80                         this.synch = synch;
81                         this.context = context;
82                         lock (locker) {
83                                 completed = true;
84                                 if (handle != null)
85                                         handle.Set ();
86
87                                 if ((context.Listener.AuthenticationSchemes == AuthenticationSchemes.Basic || context.Listener.AuthenticationSchemes == AuthenticationSchemes.Negotiate) && context.Request.Headers ["Authorization"] == null) {
88                                         context.Listener.EndGetContext (this);
89                                         context.Response.StatusCode = 401;
90                                         context.Response.Headers ["WWW-Authenticate"] = AuthenticationSchemes.Basic + " realm=\"\"";
91                                         context.Response.OutputStream.Close ();
92                                         context.Listener.BeginGetContext (cb, state);
93                                 } else if (cb != null)
94                                         ThreadPool.QueueUserWorkItem (InvokeCallback, this);
95                         }
96                 }
97
98                 internal HttpListenerContext GetContext ()
99                 {
100                         if (exception != null)
101                                 throw exception;
102
103                         return context;
104                 }
105                 
106                 public object AsyncState {
107                         get { return state; }
108                 }
109
110                 public WaitHandle AsyncWaitHandle {
111                         get {
112                                 lock (locker) {
113                                         if (handle == null)
114                                                 handle = new ManualResetEvent (completed);
115                                 }
116                                 
117                                 return handle;
118                         }
119                 }
120
121                 public bool CompletedSynchronously {
122                         get { return synch; }
123                 }
124
125                 public bool IsCompleted {
126                         get {
127                                 lock (locker) {
128                                         return completed;
129                                 }
130                         }
131                 }
132         }
133 }
134 #endif
135