Skip to content

Commit 394e25f

Browse files
committed
Adding safety checks for Disposed and if the reader/writer is not opened
1 parent adb5065 commit 394e25f

3 files changed

Lines changed: 141 additions & 7 deletions

File tree

LasZipNetStandard.Tests/LasZip.Tests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,67 @@ public void WriteFile()
105105
lasZip.CloseReader();
106106
lasZip.DestroyReader();
107107
}
108+
109+
[Fact]
110+
public void OpenReaderAfterDisposeThrowsObjectDisposedException()
111+
{
112+
LasZip lasZip = new(out _);
113+
114+
lasZip.Dispose();
115+
116+
Assert.Throws<ObjectDisposedException>(() => lasZip.OpenReader(_sSampleFilename));
117+
}
118+
119+
[Fact]
120+
public void OpenWriterAfterDisposeThrowsObjectDisposedException()
121+
{
122+
LasZip lasZip = new(out _);
123+
124+
lasZip.Dispose();
125+
126+
Assert.Throws<ObjectDisposedException>(() => lasZip.OpenWriter(_sOutputFilename, true));
127+
}
128+
129+
[Fact]
130+
public void GetReaderHeaderAfterDisposeThrowsObjectDisposedException()
131+
{
132+
LasZip lasZip = new(out _);
133+
134+
lasZip.Dispose();
135+
136+
Assert.Throws<ObjectDisposedException>(() => lasZip.GetReaderHeader());
137+
}
138+
139+
[Fact]
140+
public void GetReaderHeaderWithoutOpenReaderThrowsInvalidOperationException()
141+
{
142+
LasZip lasZip = new(out _);
143+
144+
Assert.Throws<InvalidOperationException>(() => lasZip.GetReaderHeader());
145+
146+
lasZip.Dispose();
147+
}
148+
149+
[Fact]
150+
public void ReadPointWithoutOpenReaderThrowsInvalidOperationException()
151+
{
152+
LasZip lasZip = new(out _);
153+
LasPoint point = new();
154+
155+
Assert.Throws<InvalidOperationException>(() => lasZip.ReadPoint(ref point));
156+
157+
lasZip.Dispose();
158+
}
159+
160+
[Fact]
161+
public void WritePointWithoutOpenWriterThrowsInvalidOperationException()
162+
{
163+
LasZip lasZip = new(out _);
164+
LasPoint point = new();
165+
166+
Assert.Throws<InvalidOperationException>(() => lasZip.WritePoint(ref point));
167+
168+
lasZip.Dispose();
169+
}
108170
}
109171
}

LasZipNetStandard.Tests/LasZipNetStandard.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<IsPackable>false</IsPackable>

LasZipNetStandard/LasZip.cs

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)