StreamCompressors.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace EdjCase.JsonRpc.Core.Tools
  8. {
  9. public interface IStreamCompressor
  10. {
  11. void Compress(Stream inputStream, Stream outputStream, CompressionType compressionType);
  12. void Decompress(Stream inputStream, Stream outputStream, CompressionType compressionType);
  13. }
  14. public class DefaultStreamCompressor : IStreamCompressor
  15. {
  16. /// <summary>
  17. /// Decompresses the input stream to the output stream.
  18. /// </summary>
  19. /// <param name="inputStream">The input stream to decompress.</param>
  20. /// <param name="inputStream">The output stream to write to.</param>
  21. /// <param name="compressionType">Type of the compression.</param>
  22. /// <returns></returns>
  23. public void Decompress(Stream inputStream, Stream outputStream, CompressionType compressionType)
  24. {
  25. Stream compressionStream = null;
  26. try
  27. {
  28. switch (compressionType)
  29. {
  30. case CompressionType.Gzip:
  31. compressionStream = new GZipStream(inputStream, CompressionMode.Decompress, leaveOpen: true);
  32. break;
  33. case CompressionType.Deflate:
  34. compressionStream = new DeflateStream(inputStream, CompressionMode.Decompress, leaveOpen: true);
  35. break;
  36. default:
  37. throw new ArgumentOutOfRangeException(nameof(compressionType), compressionType, null);
  38. }
  39. compressionStream.CopyTo(outputStream);
  40. outputStream.Position = 0;
  41. }
  42. finally
  43. {
  44. compressionStream?.Dispose();
  45. }
  46. }
  47. /// <summary>
  48. /// Compresses the input stream to the output stream.
  49. /// </summary>
  50. /// <param name="inputStream">The input stream to compress.</param>
  51. /// <param name="inputStream">The output stream to write to.</param>
  52. /// <param name="compressionType">Type of the compression.</param>
  53. /// <returns></returns>
  54. public void Compress(Stream inputStream, Stream outputStream, CompressionType compressionType)
  55. {
  56. long intialPosition = inputStream.Position;
  57. Stream compressionStream = null;
  58. try
  59. {
  60. compressionStream = new DeflateStream(outputStream, CompressionMode.Compress, leaveOpen: true);
  61. //switch (compressionType)
  62. //{
  63. // case CompressionType.Gzip:
  64. // compressionStream = new GZipStream(outputStream, CompressionMode.Compress, leaveOpen: true);
  65. // break;
  66. // case CompressionType.Deflate:
  67. // compressionStream = new DeflateStream(outputStream, CompressionMode.Compress, leaveOpen: true);
  68. // break;
  69. // default:
  70. // throw new ArgumentOutOfRangeException(nameof(compressionType), compressionType, null);
  71. //}
  72. inputStream.CopyTo(compressionStream);
  73. }
  74. catch(Exception e) {
  75. Console.WriteLine(e.StackTrace);
  76. }
  77. finally
  78. {
  79. //compressionStream?.Dispose();
  80. inputStream.Position = intialPosition;
  81. }
  82. }
  83. }
  84. }