Remove redundant
[mono.git] / mcs / class / System.Data / System.Data.Odbc / NativeBuffer.cs
1 //
2 // NativeBuffer.cs: class for handling native pointers.
3 //
4 // Authors:
5 //   Brian Ritchie (brianlritchie@hotmail.com)
6 //   Sureshkumar T <tsureshkumar@novell.com>  2004.
7 //
8 // Copyright (C) Brian Ritchie, 2002
9 //
10
11 //
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 // 
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 // 
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 //
33
34 using System;
35 using System.Text;
36 using System.Data;
37 using System.Data.Common;
38
39 using System.Runtime.InteropServices;
40
41 namespace System.Data.Odbc
42 {
43         sealed class NativeBuffer : IDisposable
44         {
45                 private IntPtr _ptr;
46                 private int _length;
47                 private bool disposed;
48
49                 public NativeBuffer ()
50                 {
51                 }
52
53                 public IntPtr Handle
54                 {
55                         get { return _ptr; }
56                         set { _ptr = value; }
57                 }
58
59                 public int Size
60                 {
61                         get { return _length; }
62                 }
63
64                 public void AllocBuffer (int length)
65                 {
66                         FreeBuffer ();
67                         _ptr = Marshal.AllocCoTaskMem (length);
68                         _length = length;
69                 }
70
71                 public void FreeBuffer ()
72                 {
73                         if (_ptr == IntPtr.Zero)
74                                 return;
75
76                         Marshal.FreeCoTaskMem (_ptr);
77                         _length = 0;
78                         _ptr = IntPtr.Zero;
79                 }
80
81                 public void EnsureAlloc (int length)
82                 {
83                         if (Size == length && _ptr != IntPtr.Zero)
84                                 return;
85                         
86                         AllocBuffer (length);
87                 }
88
89                 public void Dispose (bool disposing)
90                 {
91                         if (disposed)
92                                 return;
93                         FreeBuffer ();
94                         _ptr = IntPtr.Zero;
95                         disposed = true;
96                 }
97
98                 public void Dispose ()
99                 {
100                         Dispose (true);
101                         GC.SuppressFinalize (this);
102                 }
103
104                 ~NativeBuffer ()
105                 {
106                         Dispose (false);
107                 }
108
109                 public static implicit operator IntPtr (NativeBuffer buf)
110                 {
111                         return buf.Handle;
112                 }
113         }
114 }