ZipPartStream.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // ZipPartStream.cs created with MonoDevelop
  2. // User: alan at 13:13 23/10/2008
  3. //
  4. // To change standard headers go to Edit->Preferences->Coding->Standard Headers
  5. //
  6. using System;
  7. using System.IO;
  8. using zipsharp;
  9. namespace System.IO.Packaging
  10. {
  11. internal class ZipPartStream : Stream
  12. {
  13. public MemoryStream BaseStream { get; private set; }
  14. public ZipPackage Package { get; private set; }
  15. public override bool CanRead {
  16. get {
  17. return BaseStream.CanRead;
  18. }
  19. }
  20. public override bool CanSeek {
  21. get {
  22. return BaseStream.CanSeek;
  23. }
  24. }
  25. public override bool CanTimeout {
  26. get { return BaseStream.CanTimeout; }
  27. }
  28. public override bool CanWrite {
  29. get { return Writeable; }
  30. }
  31. public override long Length {
  32. get { return BaseStream.Length; }
  33. }
  34. public override long Position {
  35. get; set;
  36. }
  37. public bool Writeable {
  38. get; set;
  39. }
  40. public override int WriteTimeout {
  41. get {
  42. return BaseStream.WriteTimeout;
  43. }
  44. set {
  45. BaseStream.WriteTimeout = value;
  46. }
  47. }
  48. public override int ReadTimeout {
  49. get {
  50. return BaseStream.ReadTimeout;
  51. }
  52. set {
  53. BaseStream.ReadTimeout = value;
  54. }
  55. }
  56. public ZipPartStream (ZipPackage package, MemoryStream stream, FileAccess access)
  57. {
  58. BaseStream = stream;
  59. Package = package;
  60. Writeable = access != FileAccess.Read;
  61. }
  62. public override void Flush ()
  63. {
  64. // If the user flushes any of the part streams,
  65. // we need to flush the entire package
  66. // FIXME: Ensure that this actually happens with a testcase
  67. // ...if possible
  68. Package.Flush ();
  69. }
  70. public override int Read (byte[] buffer, int offset, int count)
  71. {
  72. Seek (Position, SeekOrigin.Begin);
  73. int read = BaseStream.Read (buffer, offset, count);
  74. Position += read;
  75. return read;
  76. }
  77. public override long Seek (long offset, SeekOrigin origin)
  78. {
  79. Position = BaseStream.Seek (offset, origin);
  80. return Position;
  81. }
  82. public override void SetLength (long value)
  83. {
  84. if (!CanWrite)
  85. throw new InvalidOperationException ("Stream is not writeable");
  86. BaseStream.SetLength (value);
  87. }
  88. public override void Write(byte[] buffer, int offset, int count)
  89. {
  90. if (!CanWrite)
  91. throw new InvalidOperationException ("Stream is not writeable");
  92. Seek (Position, SeekOrigin.Begin);
  93. BaseStream.Write (buffer, offset, count);
  94. Position += count;
  95. }
  96. }
  97. }