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