merge -r 58060:58217
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Messaging / AsyncResult.cs
1 // 
2 // System.Runtime.Remoting.Messaging/AsyncResult.cs 
3 //
4 // Authors:
5 //   Joe Shaw (joe@ximian.com)
6 //   Martin Baulig (martin@gnome.org)
7 //   Dietmar Maurer (dietmar@ximian.com)
8 //   Duncan Mak (duncan@ximian.com)
9 //
10 // (C) 2001 Ximian, Inc.  http://www.ximian.com
11 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
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 using System;
34 using System.Threading;
35 using System.Runtime.CompilerServices;
36
37 namespace System.Runtime.Remoting.Messaging {
38
39 public class AsyncResult : IAsyncResult, IMessageSink {
40
41         object async_state;
42         WaitHandle handle;
43         object async_delegate;
44         IntPtr data;
45         bool sync_completed;
46         bool completed;
47         bool endinvoke_called;
48         object async_callback;
49         ExecutionContext current;
50         ExecutionContext original;
51
52         // not part of MonoAsyncResult...
53         MonoMethodMessage call_message;
54         IMessageCtrl message_ctrl;
55         IMessage reply_message;
56         
57         internal AsyncResult ()
58         {
59         }
60         
61         public virtual object AsyncState
62         {
63                 get {
64                         return async_state;
65                 }
66         }
67
68         public virtual WaitHandle AsyncWaitHandle {
69                 get {
70                         lock (this) {
71                                 if (handle == null)
72                                         handle = new ManualResetEvent (completed);
73
74                                 return handle;
75                         }
76                 }
77         }
78
79         public virtual bool CompletedSynchronously
80         {
81                 get {
82                         return sync_completed;
83                 }
84         }
85
86         public virtual bool IsCompleted
87         {
88                 get {
89                         return completed;
90                 }
91         }
92                 
93         public bool EndInvokeCalled
94         {
95                 get {
96                         return endinvoke_called;
97                 }
98                 set {
99                         endinvoke_called = value;
100                 }
101         }
102                 
103         public virtual object AsyncDelegate
104         {
105                 get {
106                         return async_delegate;
107                 }
108         }
109
110         public IMessageSink NextSink {
111                 get {
112                         return null;
113                 }
114         }
115
116         public virtual IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink)
117         {
118                 // Never called
119                 throw new NotSupportedException ();
120         }
121
122         public virtual IMessage GetReplyMessage()
123         {
124                 return reply_message;
125         }
126
127         public virtual void SetMessageCtrl (IMessageCtrl mc)
128         {
129                 message_ctrl = mc;
130         }
131
132         internal void SetCompletedSynchronously (bool completed)
133         {
134                 sync_completed = completed;
135         }
136
137         internal IMessage EndInvoke ()
138         {
139                 handle.WaitOne ();
140                 return reply_message;
141         }
142
143         public virtual IMessage SyncProcessMessage (IMessage msg)
144         {
145                 reply_message = msg;
146
147                 completed = true;
148                 NativeEventCalls.SetEvent_internal (handle.Handle);
149                 
150                 if (async_callback != null)
151                 {
152                         AsyncCallback ac = (AsyncCallback) async_callback;
153                         ac (this);
154                 }
155
156                 return null;
157         }
158         
159         internal MonoMethodMessage CallMessage
160         {
161                 get { return call_message; }
162                 set { call_message = value; }
163         }
164 }
165 }