* CADMessages.cs: improved argument smuggeling. Now it supports strings,
[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 //
12
13 using System;
14 using System.Threading;
15 using System.Runtime.CompilerServices;
16
17 namespace System.Runtime.Remoting.Messaging {
18
19 public class AsyncResult : IAsyncResult, IMessageSink {
20
21         object async_state;
22         WaitHandle handle;
23         object async_delegate;
24         IntPtr data;
25         bool sync_completed;
26         bool completed;
27         bool endinvoke_called;
28         MonoMethodMessage call_message;
29         IMessageCtrl message_ctrl;
30         IMessage reply_message;
31         
32         public virtual object AsyncState
33         {
34                 get {
35                         return async_state;
36                 }
37         }
38
39         public virtual WaitHandle AsyncWaitHandle
40         {
41                 get {
42                         return handle;
43                 }
44         }
45
46         public virtual bool CompletedSynchronously
47         {
48                 get {
49                         return sync_completed;
50                 }
51         }
52
53         public virtual bool IsCompleted
54         {
55                 get {
56                         return completed;
57                 }
58         }
59                 
60         public bool EndInvokeCalled
61         {
62                 get {
63                         return endinvoke_called;
64                 }
65                 set {
66                         endinvoke_called = value;
67                 }
68         }
69                 
70         public virtual object AsyncDelegate
71         {
72                 get {
73                         return async_delegate;
74                 }
75         }
76
77         public IMessageSink NextSink {
78                 get {
79                         return null;
80                 }
81         }
82
83         public virtual IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink)
84         {
85                 // Never called
86                 throw new NotSupportedException ();
87         }
88
89         public virtual IMessage GetReplyMessage()
90         {
91                 return reply_message;
92         }
93
94         public virtual void SetMessageCtrl (IMessageCtrl mc)
95         {
96                 message_ctrl = mc;
97         }
98
99         internal void SetCompletedSynchronously (bool completed)
100         {
101                 sync_completed = completed;
102         }
103
104         internal IMessage EndInvoke ()
105         {
106                 handle.WaitOne ();
107                 return reply_message;
108         }
109
110         public virtual IMessage SyncProcessMessage (IMessage msg)
111         {
112                 reply_message = msg;
113
114                 completed = true;
115                 NativeEventCalls.SetEvent_internal (handle.Handle);
116                 // TODO: invoke callback
117
118                 return null;
119         }
120         
121         internal MonoMethodMessage CallMessage
122         {
123                 get { return call_message; }
124                 set { call_message = value; }
125         }
126 }
127 }