diff --git a/crypto/bzip2/src/CBZip2OutputStream.cs b/crypto/bzip2/src/CBZip2OutputStream.cs
index 73e6979d8..15e816f3a 100644
--- a/crypto/bzip2/src/CBZip2OutputStream.cs
+++ b/crypto/bzip2/src/CBZip2OutputStream.cs
@@ -386,6 +386,21 @@ namespace Org.BouncyCastle.Apache.Bzip2
// Close();
// }
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ if (closed)
+ return;
+
+ Finish();
+ closed = true;
+ Platform.Dispose(this.bsStream);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close() {
if (closed) {
return;
@@ -397,6 +412,7 @@ namespace Org.BouncyCastle.Apache.Bzip2
base.Close();
Platform.Dispose(this.bsStream);
}
+#endif
public void Finish() {
if (finished) {
diff --git a/crypto/src/asn1/BEROctetStringGenerator.cs b/crypto/src/asn1/BEROctetStringGenerator.cs
index 7468a6b0b..b2fbd47ae 100644
--- a/crypto/src/asn1/BEROctetStringGenerator.cs
+++ b/crypto/src/asn1/BEROctetStringGenerator.cs
@@ -102,7 +102,22 @@ namespace Org.BouncyCastle.Asn1
}
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ if (_off != 0)
+ {
+ DerOctetString.Encode(_derOut, _buf, 0, _off);
+ }
+
+ _gen.WriteBerEnd();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
if (_off != 0)
{
@@ -112,6 +127,7 @@ namespace Org.BouncyCastle.Asn1
_gen.WriteBerEnd();
base.Close();
}
+#endif
}
}
}
diff --git a/crypto/src/asn1/util/FilterStream.cs b/crypto/src/asn1/util/FilterStream.cs
index e280bf5b5..f7e8708f3 100644
--- a/crypto/src/asn1/util/FilterStream.cs
+++ b/crypto/src/asn1/util/FilterStream.cs
@@ -34,10 +34,21 @@ namespace Org.BouncyCastle.Asn1.Utilities
get { return s.Position; }
set { s.Position = value; }
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(s);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
Platform.Dispose(s);
}
+#endif
public override void Flush()
{
s.Flush();
diff --git a/crypto/src/bcpg/ArmoredInputStream.cs b/crypto/src/bcpg/ArmoredInputStream.cs
index 8d17bfa62..cfbf819e0 100644
--- a/crypto/src/bcpg/ArmoredInputStream.cs
+++ b/crypto/src/bcpg/ArmoredInputStream.cs
@@ -504,10 +504,21 @@ namespace Org.BouncyCastle.Bcpg
return pos - offset;
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(input);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
Platform.Dispose(input);
base.Close();
}
+#endif
}
}
diff --git a/crypto/src/bcpg/ArmoredOutputStream.cs b/crypto/src/bcpg/ArmoredOutputStream.cs
index 253c5d1fe..0f0d6896c 100644
--- a/crypto/src/bcpg/ArmoredOutputStream.cs
+++ b/crypto/src/bcpg/ArmoredOutputStream.cs
@@ -283,37 +283,60 @@ namespace Org.BouncyCastle.Bcpg
* <b>Note</b>: Close() does not close the underlying stream. So it is possible to write
* multiple objects using armoring to a single stream.
*/
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
{
- if (type != null)
+ if (disposing)
{
- if (bufPtr > 0)
- {
- Encode(outStream, buf, bufPtr);
- }
+ if (type == null)
+ return;
- DoWrite(nl + '=');
+ DoClose();
- int crcV = crc.Value;
-
- buf[0] = ((crcV >> 16) & 0xff);
- buf[1] = ((crcV >> 8) & 0xff);
- buf[2] = (crcV & 0xff);
+ type = null;
+ start = true;
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
+ if (type == null)
+ return;
- Encode(outStream, buf, 3);
+ DoClose();
- DoWrite(nl);
- DoWrite(footerStart);
- DoWrite(type);
- DoWrite(footerTail);
- DoWrite(nl);
+ type = null;
+ start = true;
- outStream.Flush();
+ base.Close();
+ }
+#endif
- type = null;
- start = true;
- base.Close();
+ private void DoClose()
+ {
+ if (bufPtr > 0)
+ {
+ Encode(outStream, buf, bufPtr);
}
+
+ DoWrite(nl + '=');
+
+ int crcV = crc.Value;
+
+ buf[0] = ((crcV >> 16) & 0xff);
+ buf[1] = ((crcV >> 8) & 0xff);
+ buf[2] = (crcV & 0xff);
+
+ Encode(outStream, buf, 3);
+
+ DoWrite(nl);
+ DoWrite(footerStart);
+ DoWrite(type);
+ DoWrite(footerTail);
+ DoWrite(nl);
+
+ outStream.Flush();
}
private void WriteHeaderEntry(
diff --git a/crypto/src/bcpg/BcpgInputStream.cs b/crypto/src/bcpg/BcpgInputStream.cs
index 37c259d42..59dd548ca 100644
--- a/crypto/src/bcpg/BcpgInputStream.cs
+++ b/crypto/src/bcpg/BcpgInputStream.cs
@@ -247,11 +247,22 @@ namespace Org.BouncyCastle.Bcpg
}
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(m_in);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
Platform.Dispose(m_in);
base.Close();
}
+#endif
/// <summary>
/// A stream that overlays our input stream, allowing the user to only read a segment of it.
diff --git a/crypto/src/bcpg/BcpgOutputStream.cs b/crypto/src/bcpg/BcpgOutputStream.cs
index 581897ece..c786a8fc0 100644
--- a/crypto/src/bcpg/BcpgOutputStream.cs
+++ b/crypto/src/bcpg/BcpgOutputStream.cs
@@ -380,12 +380,25 @@ namespace Org.BouncyCastle.Bcpg
}
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ this.Finish();
+ outStr.Flush();
+ Platform.Dispose(outStr);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
this.Finish();
outStr.Flush();
Platform.Dispose(outStr);
base.Close();
}
+#endif
}
}
diff --git a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
index a9879a6fc..591e36f2d 100644
--- a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs
@@ -252,7 +252,29 @@ namespace Org.BouncyCastle.Cms
macStream.Write(bytes, off, len);
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(macStream);
+
+ // TODO Parent context(s) should really be be closed explicitly
+
+ eiGen.Close();
+
+ // [TODO] auth attributes go here
+ byte[] macOctets = MacUtilities.DoFinal(mac);
+ authGen.AddObject(new DerOctetString(macOctets));
+ // [TODO] unauth attributes go here
+
+ authGen.Close();
+ cGen.Close();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Platform.Dispose(macStream);
@@ -268,6 +290,7 @@ namespace Org.BouncyCastle.Cms
authGen.Close();
cGen.Close();
}
+#endif
}
}
}
diff --git a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
index 73832f5f3..1fb8da756 100644
--- a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs
@@ -125,7 +125,23 @@ namespace Org.BouncyCastle.Cms
_out.Write(bytes, off, len);
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(_out);
+
+ // TODO Parent context(s) should really be be closed explicitly
+
+ _eiGen.Close();
+ _cGen.Close();
+ _sGen.Close();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Platform.Dispose(_out);
@@ -136,6 +152,7 @@ namespace Org.BouncyCastle.Cms
_sGen.Close();
base.Close();
}
+#endif
}
}
}
diff --git a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
index 17c49ed07..264161b73 100644
--- a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs
@@ -255,11 +255,37 @@ namespace Org.BouncyCastle.Cms
_out.Write(bytes, off, len);
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(_out);
+
+ // TODO Parent context(s) should really be closed explicitly
+
+ _eiGen.Close();
+
+ if (_outer.unprotectedAttributeGenerator != null)
+ {
+ Asn1.Cms.AttributeTable attrTable = _outer.unprotectedAttributeGenerator.GetAttributes(Platform.CreateHashtable());
+
+ Asn1Set unprotectedAttrs = new BerSet(attrTable.ToAsn1EncodableVector());
+
+ _envGen.AddObject(new DerTaggedObject(false, 1, unprotectedAttrs));
+ }
+
+ _envGen.Close();
+ _cGen.Close();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Platform.Dispose(_out);
- // TODO Parent context(s) should really be be closed explicitly
+ // TODO Parent context(s) should really be closed explicitly
_eiGen.Close();
@@ -276,6 +302,7 @@ namespace Org.BouncyCastle.Cms
_cGen.Close();
base.Close();
}
+#endif
}
}
}
diff --git a/crypto/src/cms/CMSSignedDataStreamGenerator.cs b/crypto/src/cms/CMSSignedDataStreamGenerator.cs
index 746538ebd..36e7a780c 100644
--- a/crypto/src/cms/CMSSignedDataStreamGenerator.cs
+++ b/crypto/src/cms/CMSSignedDataStreamGenerator.cs
@@ -809,8 +809,25 @@ namespace Org.BouncyCastle.Cms
_out.Write(bytes, off, len);
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ DoClose();
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
+ DoClose();
+ base.Close();
+ }
+#endif
+
+ private void DoClose()
+ {
Platform.Dispose(_out);
// TODO Parent context(s) should really be be closed explicitly
@@ -898,8 +915,7 @@ namespace Org.BouncyCastle.Cms
_sigGen.Close();
_sGen.Close();
- base.Close();
- }
+ }
private static void WriteToGenerator(
Asn1Generator ag,
diff --git a/crypto/src/crypto/io/CipherStream.cs b/crypto/src/crypto/io/CipherStream.cs
index 7fa9d3c5a..273413ea0 100644
--- a/crypto/src/crypto/io/CipherStream.cs
+++ b/crypto/src/crypto/io/CipherStream.cs
@@ -202,7 +202,23 @@ namespace Org.BouncyCastle.Crypto.IO
set { throw new NotSupportedException(); }
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ if (outCipher != null)
+ {
+ byte[] data = outCipher.DoFinal();
+ stream.Write(data, 0, data.Length);
+ stream.Flush();
+ }
+ Platform.Dispose(stream);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
if (outCipher != null)
{
@@ -212,6 +228,7 @@ namespace Org.BouncyCastle.Crypto.IO
}
Platform.Dispose(stream);
}
+#endif
public override void Flush()
{
diff --git a/crypto/src/crypto/io/DigestStream.cs b/crypto/src/crypto/io/DigestStream.cs
index 6f31b9560..3f5716d15 100644
--- a/crypto/src/crypto/io/DigestStream.cs
+++ b/crypto/src/crypto/io/DigestStream.cs
@@ -112,12 +112,23 @@ namespace Org.BouncyCastle.Crypto.IO
set { stream.Position = value; }
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(stream);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
Platform.Dispose(stream);
}
+#endif
- public override void Flush()
+ public override void Flush()
{
stream.Flush();
}
diff --git a/crypto/src/crypto/io/MacStream.cs b/crypto/src/crypto/io/MacStream.cs
index cbea1956f..f15e6d45a 100644
--- a/crypto/src/crypto/io/MacStream.cs
+++ b/crypto/src/crypto/io/MacStream.cs
@@ -111,10 +111,21 @@ namespace Org.BouncyCastle.Crypto.IO
set { stream.Position = value; }
}
- public override void Close()
- {
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(stream);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
Platform.Dispose(stream);
- }
+ }
+#endif
public override void Flush()
{
diff --git a/crypto/src/crypto/io/SignerStream.cs b/crypto/src/crypto/io/SignerStream.cs
index 2ff21f563..b9fadfc77 100644
--- a/crypto/src/crypto/io/SignerStream.cs
+++ b/crypto/src/crypto/io/SignerStream.cs
@@ -112,10 +112,21 @@ namespace Org.BouncyCastle.Crypto.IO
set { stream.Position = value; }
}
- public override void Close()
- {
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(stream);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
Platform.Dispose(stream);
- }
+ }
+#endif
public override void Flush()
{
diff --git a/crypto/src/crypto/operators/Asn1Signature.cs b/crypto/src/crypto/operators/Asn1Signature.cs
index d7af3ab13..311711e20 100644
--- a/crypto/src/crypto/operators/Asn1Signature.cs
+++ b/crypto/src/crypto/operators/Asn1Signature.cs
@@ -303,9 +303,19 @@ namespace Org.BouncyCastle.Crypto.Operators
set { throw new NotImplementedException (); }
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ return;
+
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
}
+#endif
public override void Flush()
{
diff --git a/crypto/src/crypto/tls/ByteQueueStream.cs b/crypto/src/crypto/tls/ByteQueueStream.cs
index bf603e006..9a8ca7d92 100644
--- a/crypto/src/crypto/tls/ByteQueueStream.cs
+++ b/crypto/src/crypto/tls/ByteQueueStream.cs
@@ -33,9 +33,19 @@ namespace Org.BouncyCastle.Crypto.Tls
get { return true; }
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ return;
+
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
}
+#endif
public override void Flush()
{
diff --git a/crypto/src/crypto/tls/TlsStream.cs b/crypto/src/crypto/tls/TlsStream.cs
index 7ff7184e3..bc2201cdb 100644
--- a/crypto/src/crypto/tls/TlsStream.cs
+++ b/crypto/src/crypto/tls/TlsStream.cs
@@ -28,10 +28,21 @@ namespace Org.BouncyCastle.Crypto.Tls
get { return !handler.IsClosed; }
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ handler.Close();
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
handler.Close();
}
+#endif
public override void Flush()
{
diff --git a/crypto/src/openpgp/PgpCompressedDataGenerator.cs b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
index 307fdbf08..ea366e0c6 100644
--- a/crypto/src/openpgp/PgpCompressedDataGenerator.cs
+++ b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
@@ -173,10 +173,21 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
{
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Finish();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Finish();
}
+#endif
}
private class SafeZOutputStream : ZOutputStream
@@ -186,11 +197,23 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
{
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Finish();
+ End();
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Finish();
End();
}
+#endif
}
}
}
diff --git a/crypto/src/openpgp/WrappedGeneratorStream.cs b/crypto/src/openpgp/WrappedGeneratorStream.cs
index cdc9befb3..ffa199255 100644
--- a/crypto/src/openpgp/WrappedGeneratorStream.cs
+++ b/crypto/src/openpgp/WrappedGeneratorStream.cs
@@ -17,9 +17,21 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
this.gen = gen;
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ gen.Close();
+ return;
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
gen.Close();
}
+#endif
}
}
diff --git a/crypto/src/util/io/BaseInputStream.cs b/crypto/src/util/io/BaseInputStream.cs
index 3ff4a1957..36725acd2 100644
--- a/crypto/src/util/io/BaseInputStream.cs
+++ b/crypto/src/util/io/BaseInputStream.cs
@@ -11,8 +11,24 @@ namespace Org.BouncyCastle.Utilities.IO
public sealed override bool CanRead { get { return !closed; } }
public sealed override bool CanSeek { get { return false; } }
public sealed override bool CanWrite { get { return false; } }
- public override void Close() { closed = true; }
- public sealed override void Flush() {}
+
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ closed = true;
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
+ closed = true;
+ }
+#endif
+
+ public sealed override void Flush() {}
public sealed override long Length { get { throw new NotSupportedException(); } }
public sealed override long Position
{
diff --git a/crypto/src/util/io/BaseOutputStream.cs b/crypto/src/util/io/BaseOutputStream.cs
index 6e6c6d346..d85ae8ae4 100644
--- a/crypto/src/util/io/BaseOutputStream.cs
+++ b/crypto/src/util/io/BaseOutputStream.cs
@@ -11,8 +11,24 @@ namespace Org.BouncyCastle.Utilities.IO
public sealed override bool CanRead { get { return false; } }
public sealed override bool CanSeek { get { return false; } }
public sealed override bool CanWrite { get { return !closed; } }
- public override void Close() { closed = true; }
- public override void Flush() {}
+
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ closed = true;
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
+ closed = true;
+ }
+#endif
+
+ public override void Flush() { }
public sealed override long Length { get { throw new NotSupportedException(); } }
public sealed override long Position
{
diff --git a/crypto/src/util/io/FilterStream.cs b/crypto/src/util/io/FilterStream.cs
index c5d6a1cba..be216254a 100644
--- a/crypto/src/util/io/FilterStream.cs
+++ b/crypto/src/util/io/FilterStream.cs
@@ -29,10 +29,21 @@ namespace Org.BouncyCastle.Utilities.IO
get { return s.Position; }
set { s.Position = value; }
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(s);
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
Platform.Dispose(s);
}
+#endif
public override void Flush()
{
s.Flush();
diff --git a/crypto/src/util/io/TeeInputStream.cs b/crypto/src/util/io/TeeInputStream.cs
index b344be8a8..4b3203d71 100644
--- a/crypto/src/util/io/TeeInputStream.cs
+++ b/crypto/src/util/io/TeeInputStream.cs
@@ -18,11 +18,23 @@ namespace Org.BouncyCastle.Utilities.IO
this.tee = tee;
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(input);
+ Platform.Dispose(tee);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Platform.Dispose(input);
Platform.Dispose(tee);
}
+#endif
public override int Read(byte[] buf, int off, int len)
{
diff --git a/crypto/src/util/io/TeeOutputStream.cs b/crypto/src/util/io/TeeOutputStream.cs
index 75d1d305d..7ad14a007 100644
--- a/crypto/src/util/io/TeeOutputStream.cs
+++ b/crypto/src/util/io/TeeOutputStream.cs
@@ -18,11 +18,23 @@ namespace Org.BouncyCastle.Utilities.IO
this.tee = tee;
}
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(output);
+ Platform.Dispose(tee);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
Platform.Dispose(output);
Platform.Dispose(tee);
}
+#endif
public override void Write(byte[] buffer, int offset, int count)
{
diff --git a/crypto/src/util/zlib/ZDeflaterOutputStream.cs b/crypto/src/util/zlib/ZDeflaterOutputStream.cs
index 7ff6d31c8..5a70df21d 100644
--- a/crypto/src/util/zlib/ZDeflaterOutputStream.cs
+++ b/crypto/src/util/zlib/ZDeflaterOutputStream.cs
@@ -136,6 +136,24 @@ namespace Org.BouncyCastle.Utilities.Zlib {
z=null;
}
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ try{
+ try{Finish();}
+ catch (IOException) {}
+ }
+ finally{
+ End();
+ Platform.Dispose(outp);
+ outp=null;
+ }
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close() {
try{
try{Finish();}
@@ -147,5 +165,6 @@ namespace Org.BouncyCastle.Utilities.Zlib {
outp=null;
}
}
+#endif
}
}
diff --git a/crypto/src/util/zlib/ZInflaterInputStream.cs b/crypto/src/util/zlib/ZInflaterInputStream.cs
index 170596e63..df51fc878 100644
--- a/crypto/src/util/zlib/ZInflaterInputStream.cs
+++ b/crypto/src/util/zlib/ZInflaterInputStream.cs
@@ -114,10 +114,22 @@ namespace Org.BouncyCastle.Utilities.Zlib {
public override void WriteByte(byte b) {
}
- public override void Close() {
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ Platform.Dispose(inp);
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
+ {
Platform.Dispose(inp);
}
-
+#endif
+
public override int ReadByte() {
if(Read(buf1, 0, 1)<=0)
return -1;
diff --git a/crypto/src/util/zlib/ZInputStream.cs b/crypto/src/util/zlib/ZInputStream.cs
index f0b3068fc..fe895a397 100644
--- a/crypto/src/util/zlib/ZInputStream.cs
+++ b/crypto/src/util/zlib/ZInputStream.cs
@@ -93,7 +93,21 @@ namespace Org.BouncyCastle.Utilities.Zlib
public sealed override bool CanSeek { get { return false; } }
public sealed override bool CanWrite { get { return false; } }
- public override void Close()
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ if (!closed)
+ {
+ closed = true;
+ Platform.Dispose(input);
+ }
+ }
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
if (!closed)
{
@@ -101,6 +115,7 @@ namespace Org.BouncyCastle.Utilities.Zlib
Platform.Dispose(input);
}
}
+#endif
public sealed override void Flush() {}
diff --git a/crypto/src/util/zlib/ZOutputStream.cs b/crypto/src/util/zlib/ZOutputStream.cs
index 7b49d6638..ca59d8e1f 100644
--- a/crypto/src/util/zlib/ZOutputStream.cs
+++ b/crypto/src/util/zlib/ZOutputStream.cs
@@ -95,32 +95,51 @@ namespace Org.BouncyCastle.Utilities.Zlib
public sealed override bool CanSeek { get { return false; } }
public sealed override bool CanWrite { get { return !closed; } }
+#if PORTABLE
+ protected override void Disposing(bool disposing)
+ {
+ if (disposing)
+ {
+ if (this.closed)
+ return;
+
+ DoClose();
+ }
+ base.Dispose(disposing);
+ }
+#else
public override void Close()
{
if (this.closed)
return;
- try
- {
- try
- {
- Finish();
- }
- catch (IOException)
- {
- // Ignore
- }
- }
- finally
- {
- this.closed = true;
- End();
- Platform.Dispose(output);
- output = null;
- }
+ DoClose();
}
+#endif
+
+ private void DoClose()
+ {
+ try
+ {
+ try
+ {
+ Finish();
+ }
+ catch (IOException)
+ {
+ // Ignore
+ }
+ }
+ finally
+ {
+ this.closed = true;
+ End();
+ Platform.Dispose(output);
+ output = null;
+ }
+ }
- public virtual void End()
+ public virtual void End()
{
if (z == null)
return;
diff --git a/crypto/test/src/util/test/UncloseableStream.cs b/crypto/test/src/util/test/UncloseableStream.cs
index 171198120..2a3b4229b 100644
--- a/crypto/test/src/util/test/UncloseableStream.cs
+++ b/crypto/test/src/util/test/UncloseableStream.cs
@@ -14,9 +14,21 @@ namespace Org.BouncyCastle.Utilities.Test
{
}
- public override void Close()
+#if PORTABLE
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ throw new Exception("UncloseableStream was disposed");
+ }
+
+ base.Dispose(disposing);
+ }
+#else
+ public override void Close()
{
throw new Exception("Close() called on UncloseableStream");
}
- }
+#endif
+ }
}
|