diff --git a/crypto/src/openpgp/IStreamGenerator.cs b/crypto/src/openpgp/IStreamGenerator.cs
index 379213a66..df8ff75da 100644
--- a/crypto/src/openpgp/IStreamGenerator.cs
+++ b/crypto/src/openpgp/IStreamGenerator.cs
@@ -1,7 +1,9 @@
+using System;
+
namespace Org.BouncyCastle.Bcpg.OpenPgp
{
public interface IStreamGenerator
+ : IDisposable
{
- void Close();
}
}
diff --git a/crypto/src/openpgp/PgpCompressedDataGenerator.cs b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
index d13d7402b..271dfac7a 100644
--- a/crypto/src/openpgp/PgpCompressedDataGenerator.cs
+++ b/crypto/src/openpgp/PgpCompressedDataGenerator.cs
@@ -1,7 +1,6 @@
using System;
using System.IO;
-using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.IO.Compression;
using Org.BouncyCastle.Utilities.Zlib;
@@ -149,21 +148,33 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
}
}
- /// <summary>Close the compressed object.</summary>summary>
- public void Close()
- {
- if (dOut != null)
- {
- if (dOut != pkOut)
- {
- Platform.Dispose(dOut);
- }
- dOut = null;
-
- pkOut.Finish();
- pkOut.Flush();
- pkOut = null;
- }
- }
+ #region IDisposable
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (dOut != null)
+ {
+ if (dOut != pkOut)
+ {
+ dOut.Dispose();
+ }
+ dOut = null;
+
+ pkOut.Finish();
+ pkOut.Flush();
+ pkOut = null;
+ }
+ }
+ }
+
+ #endregion
}
}
diff --git a/crypto/src/openpgp/PgpEncryptedDataGenerator.cs b/crypto/src/openpgp/PgpEncryptedDataGenerator.cs
index 69e0d5dbc..b9473a32c 100644
--- a/crypto/src/openpgp/PgpEncryptedDataGenerator.cs
+++ b/crypto/src/openpgp/PgpEncryptedDataGenerator.cs
@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
-using Org.BouncyCastle.Asn1;
+
using Org.BouncyCastle.Asn1.Cryptlib;
using Org.BouncyCastle.Asn1.EdEC;
using Org.BouncyCastle.Crypto;
@@ -600,52 +600,55 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
return Open(outStr, 0, buffer);
}
- /// <summary>
- /// <p>
- /// Close off the encrypted object - this is equivalent to calling Close() on the stream
- /// returned by the Open() method.
- /// </p>
- /// <p>
- /// <b>Note</b>: This does not close the underlying output stream, only the stream on top of
- /// it created by the Open() method.
- /// </p>
- /// </summary>
- public void Close()
+ #region IDisposable
+
+ public void Dispose()
{
- if (cOut != null)
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
{
- // TODO Should this all be under the try/catch block?
- if (digestOut != null)
+ if (cOut != null)
{
- //
- // hand code a mod detection packet
- //
- BcpgOutputStream bOut = new BcpgOutputStream(
- digestOut, PacketTag.ModificationDetectionCode, 20);
-
- bOut.Flush();
- digestOut.Flush();
+ // TODO Should this all be under the try/catch block?
+ if (digestOut != null)
+ {
+ //
+ // hand code a mod detection packet
+ //
+ BcpgOutputStream bOut = new BcpgOutputStream(
+ digestOut, PacketTag.ModificationDetectionCode, 20);
+
+ bOut.Flush();
+ digestOut.Flush();
+
+ // TODO
+ byte[] dig = DigestUtilities.DoFinal(digestOut.WriteDigest);
+ cOut.Write(dig, 0, dig.Length);
+ }
- // TODO
- byte[] dig = DigestUtilities.DoFinal(digestOut.WriteDigest);
- cOut.Write(dig, 0, dig.Length);
- }
+ cOut.Flush();
- cOut.Flush();
+ try
+ {
+ pOut.Write(c.DoFinal());
+ pOut.Finish();
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.Message, e);
+ }
- try
- {
- pOut.Write(c.DoFinal());
- pOut.Finish();
- }
- catch (Exception e)
- {
- throw new IOException(e.Message, e);
+ cOut = null;
+ pOut = null;
}
-
- cOut = null;
- pOut = null;
}
- }
+ }
+
+ #endregion
}
}
diff --git a/crypto/src/openpgp/PgpLiteralDataGenerator.cs b/crypto/src/openpgp/PgpLiteralDataGenerator.cs
index f9a9e7cad..fd59c1ebe 100644
--- a/crypto/src/openpgp/PgpLiteralDataGenerator.cs
+++ b/crypto/src/openpgp/PgpLiteralDataGenerator.cs
@@ -1,6 +1,5 @@
using System;
using System.IO;
-using System.Text;
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.Date;
@@ -163,18 +162,27 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
return Open(outStr, format, file.Name, file.Length, file.LastWriteTime);
}
- /// <summary>
- /// Close the literal data packet - this is equivalent to calling Close()
- /// on the stream returned by the Open() method.
- /// </summary>
- public void Close()
+ #region IDisposable
+
+ public void Dispose()
{
- if (pkOut != null)
- {
- pkOut.Finish();
- pkOut.Flush();
- pkOut = null;
- }
- }
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (pkOut != null)
+ {
+ pkOut.Finish();
+ pkOut.Flush();
+ pkOut = null;
+ }
+ }
+ }
+
+ #endregion
}
}
diff --git a/crypto/src/openpgp/PgpUtilities.cs b/crypto/src/openpgp/PgpUtilities.cs
index 65f011994..f400d36cc 100644
--- a/crypto/src/openpgp/PgpUtilities.cs
+++ b/crypto/src/openpgp/PgpUtilities.cs
@@ -449,8 +449,8 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
{
Array.Clear(buf, 0, buf.Length);
- Platform.Dispose(pOut);
- Platform.Dispose(inputStream);
+ pOut.Dispose();
+ inputStream.Dispose();
}
}
diff --git a/crypto/src/openpgp/WrappedGeneratorStream.cs b/crypto/src/openpgp/WrappedGeneratorStream.cs
index 6f96dc9b8..c985a7a05 100644
--- a/crypto/src/openpgp/WrappedGeneratorStream.cs
+++ b/crypto/src/openpgp/WrappedGeneratorStream.cs
@@ -8,7 +8,7 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
internal sealed class WrappedGeneratorStream
: FilterStream
{
- private IStreamGenerator m_generator;
+ private readonly IStreamGenerator m_generator;
internal WrappedGeneratorStream(IStreamGenerator generator, Stream s)
: base(s)
@@ -18,14 +18,9 @@ namespace Org.BouncyCastle.Bcpg.OpenPgp
protected override void Dispose(bool disposing)
{
- if (m_generator != null)
+ if (disposing)
{
- if (disposing)
- {
- m_generator.Close();
- }
-
- m_generator = null;
+ m_generator.Dispose();
}
Detach(disposing);
|