@@ -7,6 +7,8 @@ namespace Kuoste.LasZipNetStandard
77 public class LasZip : IDisposable
88 {
99 private bool _disposed = false ;
10+ private bool _readerOpen ;
11+ private bool _writerOpen ;
1012 private const string _lasZipDll = "laszip64" ;
1113
1214 private IntPtr _pLasZipReader ;
@@ -83,33 +85,44 @@ public LasZip(out string Version)
8385
8486 if ( laszip_create ( ref _pLasZipWriter ) != 0 )
8587 {
88+ laszip_destroy ( _pLasZipReader ) ;
89+ _pLasZipReader = IntPtr . Zero ;
8690 throw new Exception ( "Failed to create LasZip writer pointer" ) ;
8791 }
8892 }
8993
9094 public bool OpenReader ( string filename )
9195 {
96+ ThrowIfDisposed ( ) ;
97+
9298 bool isCompressed = false ;
9399 if ( laszip_open_reader ( _pLasZipReader , filename , ref isCompressed ) != 0 )
94100 {
95101 return false ;
96102 }
97103
104+ _readerOpen = true ;
98105 return true ;
99106 }
100107
101108 public bool OpenWriter ( string filename , bool isCompressed )
102109 {
110+ ThrowIfDisposed ( ) ;
111+
103112 if ( laszip_open_writer ( _pLasZipWriter , filename , isCompressed ) != 0 )
104113 {
105114 return false ;
106115 }
107116
117+ _writerOpen = true ;
108118 return true ;
109119 }
110120
111121 public LaszipHeaderStruct GetReaderHeader ( )
112122 {
123+ ThrowIfDisposed ( ) ;
124+ ThrowIfReaderNotOpen ( ) ;
125+
113126 IntPtr pHeader = IntPtr . Zero ;
114127 if ( laszip_get_header_pointer ( _pLasZipReader , ref pHeader ) != 0 )
115128 {
@@ -122,6 +135,8 @@ public LaszipHeaderStruct GetReaderHeader()
122135
123136 public void SetWriterHeader ( LaszipHeaderStruct header )
124137 {
138+ ThrowIfDisposed ( ) ;
139+
125140 if ( laszip_get_header_pointer ( _pLasZipWriter , ref _pHeaderWriter ) != 0 )
126141 {
127142 throw new Exception ( "Failed to get LasZip header pointer" ) ;
@@ -140,6 +155,9 @@ public void SetWriterHeader(LaszipHeaderStruct header)
140155 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
141156 public unsafe void ReadPoint ( ref LasPoint point )
142157 {
158+ ThrowIfDisposed ( ) ;
159+ ThrowIfReaderNotOpen ( ) ;
160+
143161 // Get the memory location for the point in LasZip library
144162 if ( _pPointReader == IntPtr . Zero )
145163 {
@@ -168,6 +186,9 @@ public unsafe void ReadPoint(ref LasPoint point)
168186 /// <exception cref="Exception"> Writing failed. </exception>
169187 public unsafe void WritePoint ( ref LasPoint point )
170188 {
189+ ThrowIfDisposed ( ) ;
190+ ThrowIfWriterNotOpen ( ) ;
191+
171192 // Get the memory location for the point in LasZip library
172193 if ( _pPointWriter == IntPtr . Zero )
173194 {
@@ -190,43 +211,82 @@ public unsafe void WritePoint(ref LasPoint point)
190211
191212 public void CloseReader ( )
192213 {
193- if ( laszip_close_reader ( _pLasZipReader ) != 0 )
214+ ThrowIfDisposed ( ) ;
215+
216+ if ( _readerOpen && laszip_close_reader ( _pLasZipReader ) != 0 )
194217 {
195218 throw new Exception ( "Failed close reader" ) ;
196219 }
197220
198- _pPointReader = IntPtr . Zero ;
221+ _readerOpen = false ;
222+ _pPointReader = IntPtr . Zero ;
199223 }
200224
201225 public void DestroyReader ( )
202226 {
227+ ThrowIfDisposed ( ) ;
228+
203229 if ( laszip_destroy ( _pLasZipReader ) != 0 )
204230 {
205231 throw new Exception ( "Failed destroy reader" ) ;
206232 }
207233
234+ _readerOpen = false ;
208235 _pLasZipReader = IntPtr . Zero ;
236+ _pPointReader = IntPtr . Zero ;
209237 }
210238
211239 public void CloseWriter ( )
212240 {
213- if ( laszip_close_writer ( _pLasZipWriter ) != 0 )
241+ ThrowIfDisposed ( ) ;
242+
243+ if ( _writerOpen && laszip_close_writer ( _pLasZipWriter ) != 0 )
214244 {
215245 throw new Exception ( "Failed close writer" ) ;
216246 }
217247
248+ _writerOpen = false ;
218249 _pPointWriter = IntPtr . Zero ;
219250 _pHeaderWriter = IntPtr . Zero ;
220251 }
221252
222253 public void DestroyWriter ( )
223254 {
255+ ThrowIfDisposed ( ) ;
256+
224257 if ( laszip_destroy ( _pLasZipWriter ) != 0 )
225258 {
226259 throw new Exception ( "Failed destroy writer" ) ;
227260 }
228261
262+ _writerOpen = false ;
229263 _pLasZipWriter = IntPtr . Zero ;
264+ _pPointWriter = IntPtr . Zero ;
265+ _pHeaderWriter = IntPtr . Zero ;
266+ }
267+
268+ private void ThrowIfDisposed ( )
269+ {
270+ if ( _disposed )
271+ {
272+ throw new ObjectDisposedException ( nameof ( LasZip ) ) ;
273+ }
274+ }
275+
276+ private void ThrowIfReaderNotOpen ( )
277+ {
278+ if ( ! _readerOpen )
279+ {
280+ throw new InvalidOperationException ( ) ;
281+ }
282+ }
283+
284+ private void ThrowIfWriterNotOpen ( )
285+ {
286+ if ( ! _writerOpen )
287+ {
288+ throw new InvalidOperationException ( ) ;
289+ }
230290 }
231291
232292 /// <summary>
@@ -245,20 +305,32 @@ public void Dispose()
245305 protected virtual void Dispose ( bool disposing )
246306 {
247307 if ( _disposed )
308+ {
248309 return ;
310+ }
249311
250312 // Clean up unmanaged resources
251313 if ( _pLasZipReader != IntPtr . Zero )
252314 {
253- laszip_close_reader ( _pLasZipReader ) ;
315+ if ( _readerOpen )
316+ {
317+ laszip_close_reader ( _pLasZipReader ) ;
318+ _readerOpen = false ;
319+ }
320+
254321 laszip_destroy ( _pLasZipReader ) ;
255322 _pLasZipReader = IntPtr . Zero ;
256323 _pPointReader = IntPtr . Zero ;
257324 }
258325
259326 if ( _pLasZipWriter != IntPtr . Zero )
260327 {
261- laszip_close_writer ( _pLasZipWriter ) ;
328+ if ( _writerOpen )
329+ {
330+ laszip_close_writer ( _pLasZipWriter ) ;
331+ _writerOpen = false ;
332+ }
333+
262334 laszip_destroy ( _pLasZipWriter ) ;
263335 _pLasZipWriter = IntPtr . Zero ;
264336 _pPointWriter = IntPtr . Zero ;
0 commit comments