2005-04-12 Dick Porter <dick@ximian.com>
[mono.git] / mcs / class / corlib / System.Threading / Overlapped.cs
1 //
2 // System.Threading.Overlapped.cs
3 //
4 // Authors:
5 //      Dick Porter (dick@ximian.com)
6 //      Gonzalo Paniagua Javier (gonzalo@ximian.com);
7 //
8 // (C) Ximian, Inc.  http://www.ximian.com
9 // (C) 2004 Novell, Inc. (http://www.novell.com)
10 //
11
12 //
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 //
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
22 // 
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 // 
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 //
34
35 using System.Runtime.InteropServices;
36 using System.Security.Permissions;
37
38 namespace System.Threading
39 {
40         public class Overlapped
41         {
42                 IAsyncResult ares;
43                 int offsetL;
44                 int offsetH;
45                 int evt;
46
47                 public Overlapped ()
48                 {
49                 }
50
51                 public Overlapped(int offsetLo, int offsetHi, int hEvent, IAsyncResult ar)
52                 {
53                         offsetL = offsetLo;
54                         offsetH = offsetHi;
55                         evt = hEvent;
56                         ares = ar;
57                 }
58
59                 [CLSCompliant(false)]
60                 unsafe public static void Free (NativeOverlapped *nativeOverlappedPtr)
61                 {
62                         if ((IntPtr) nativeOverlappedPtr == IntPtr.Zero)
63                                 throw new ArgumentNullException ("nativeOverlappedPtr");
64
65                         Marshal.FreeHGlobal ((IntPtr) nativeOverlappedPtr);
66                 }
67
68                 [CLSCompliant(false)]
69                 unsafe public static Overlapped Unpack (NativeOverlapped *nativeOverlappedPtr)
70                 {
71                         if ((IntPtr) nativeOverlappedPtr == IntPtr.Zero)
72                                 throw new ArgumentNullException ("nativeOverlappedPtr");
73
74                         Overlapped result = new Overlapped ();
75                         result.offsetL = nativeOverlappedPtr->OffsetLow;
76                         result.offsetH = nativeOverlappedPtr->OffsetHigh;
77                         result.evt = nativeOverlappedPtr->EventHandle;
78                         return result;
79                 }
80
81                 [CLSCompliant(false)]
82                 [MonoTODO ("Security - we need to propagate the call stack")]
83                 unsafe public NativeOverlapped *Pack (IOCompletionCallback iocb)
84                 {
85                         NativeOverlapped *result = (NativeOverlapped *) Marshal.AllocHGlobal (Marshal.SizeOf (typeof (NativeOverlapped)));
86                         result->OffsetLow = offsetL;
87                         result->OffsetHigh = offsetH;
88                         result->EventHandle = evt;
89                         return result;
90                 }
91                 
92                 [CLSCompliant(false)]
93                 [SecurityPermission (SecurityAction.Demand, ControlEvidence=true, ControlPolicy=true)]
94                 unsafe public NativeOverlapped *UnsafePack (IOCompletionCallback iocb)
95                 {
96                         // no need to propagate the call stack in the unsafe version
97                         return Pack (iocb);
98                 }
99
100                 public IAsyncResult AsyncResult {
101                         get { return ares; }
102                         set { ares = value; }
103                 }
104
105                 public int EventHandle {
106                         get { return evt; }
107                         set { evt = value; }
108                 }
109
110                 public int OffsetHigh {
111                         get { return offsetH; }
112                         set { offsetH = value; }
113                 }
114
115                 public int OffsetLow {
116                         get { return offsetL; }
117                         set { offsetL = value; }
118                 }
119         }
120 }
121