FileWebResponse.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //
  2. // System.Net.FileWebResponse
  3. //
  4. // Author:
  5. // Lawrence Pit ([email protected])
  6. //
  7. using System;
  8. using System.IO;
  9. using System.Runtime.Serialization;
  10. namespace System.Net
  11. {
  12. [Serializable]
  13. public class FileWebResponse : WebResponse, ISerializable, IDisposable
  14. {
  15. private Uri responseUri;
  16. private FileStream fileStream;
  17. private long contentLength;
  18. private WebHeaderCollection webHeaders;
  19. private bool disposed = false;
  20. // Constructors
  21. internal FileWebResponse (Uri responseUri, FileStream fileStream)
  22. {
  23. try {
  24. this.responseUri = responseUri;
  25. this.fileStream = fileStream;
  26. this.contentLength = fileStream.Length;
  27. this.webHeaders = new WebHeaderCollection ();
  28. this.webHeaders.Add ("Content-Length", Convert.ToString (contentLength));
  29. this.webHeaders.Add ("Content-Type", "binary/octet-stream");
  30. } catch (Exception e) {
  31. throw new WebException (e.Message, e);
  32. }
  33. }
  34. protected FileWebResponse (SerializationInfo serializationInfo, StreamingContext streamingContext)
  35. {
  36. SerializationInfo info = serializationInfo;
  37. responseUri = (Uri) info.GetValue ("responseUri", typeof (Uri));
  38. contentLength = info.GetInt64 ("contentLength");
  39. webHeaders = (WebHeaderCollection) info.GetValue ("webHeaders", typeof (WebHeaderCollection));
  40. }
  41. // Properties
  42. public override long ContentLength {
  43. get {
  44. CheckDisposed ();
  45. return this.contentLength;
  46. }
  47. }
  48. public override string ContentType {
  49. get {
  50. CheckDisposed ();
  51. return "binary/octet-stream";
  52. }
  53. }
  54. public override WebHeaderCollection Headers {
  55. get {
  56. CheckDisposed ();
  57. return this.webHeaders;
  58. }
  59. }
  60. public override Uri ResponseUri {
  61. get {
  62. CheckDisposed ();
  63. return this.responseUri;
  64. }
  65. }
  66. // Methods
  67. void ISerializable.GetObjectData (SerializationInfo serializationInfo, StreamingContext streamingContext)
  68. {
  69. SerializationInfo info = serializationInfo;
  70. info.AddValue ("responseUri", responseUri, typeof (Uri));
  71. info.AddValue ("contentLength", contentLength);
  72. info.AddValue ("webHeaders", webHeaders, typeof (WebHeaderCollection));
  73. }
  74. public override Stream GetResponseStream()
  75. {
  76. CheckDisposed ();
  77. return this.fileStream;
  78. }
  79. // Cleaning up stuff
  80. ~FileWebResponse ()
  81. {
  82. Dispose (false);
  83. }
  84. public override void Close()
  85. {
  86. ((IDisposable) this).Dispose ();
  87. }
  88. void IDisposable.Dispose()
  89. {
  90. Dispose (true);
  91. // see spec, suppress finalization of this object.
  92. GC.SuppressFinalize (this);
  93. }
  94. protected virtual void Dispose (bool disposing)
  95. {
  96. if (this.disposed)
  97. return;
  98. this.disposed = true;
  99. if (disposing) {
  100. // release managed resources
  101. this.responseUri = null;
  102. this.webHeaders = null;
  103. }
  104. // release unmanaged resources
  105. FileStream stream = fileStream;
  106. fileStream = null;
  107. if (stream != null)
  108. stream.Close (); // also closes webRequest
  109. }
  110. private void CheckDisposed ()
  111. {
  112. if (disposed)
  113. throw new ObjectDisposedException (GetType ().FullName);
  114. }
  115. }
  116. }