]>
Commit | Line | Data |
---|---|---|
3d4c6a21 | 1 | ///////////////////////////////////////////////////////////////////////////// |
530ecef0 | 2 | // Name: src/common/fstream.cpp |
3d4c6a21 GL |
3 | // Purpose: "File stream" classes |
4 | // Author: Julian Smart | |
5 | // Modified by: | |
6 | // Created: 11/07/98 | |
7 | // RCS-ID: $Id$ | |
f6bcfd97 | 8 | // Copyright: (c) Guilhem Lavaux |
65571936 | 9 | // Licence: wxWindows licence |
3d4c6a21 GL |
10 | ///////////////////////////////////////////////////////////////////////////// |
11 | ||
79c3e0e1 GL |
12 | // For compilers that support precompilation, includes "wx.h". |
13 | #include "wx/wxprec.h" | |
3d4c6a21 | 14 | |
79c3e0e1 | 15 | #ifdef __BORLANDC__ |
530ecef0 | 16 | #pragma hdrstop |
79c3e0e1 GL |
17 | #endif |
18 | ||
85990624 | 19 | #if wxUSE_STREAMS |
ce4169a4 | 20 | |
d1af991f | 21 | #include "wx/wfstream.h" |
ce4169a4 | 22 | |
530ecef0 WS |
23 | #ifndef WX_PRECOMP |
24 | #include "wx/stream.h" | |
25 | #endif | |
26 | ||
27 | #include <stdio.h> | |
28 | ||
85990624 RN |
29 | #if wxUSE_FILE |
30 | ||
79c3e0e1 GL |
31 | // ---------------------------------------------------------------------------- |
32 | // wxFileInputStream | |
33 | // ---------------------------------------------------------------------------- | |
34 | ||
35 | wxFileInputStream::wxFileInputStream(const wxString& fileName) | |
25c70b07 | 36 | : wxInputStream() |
3d4c6a21 | 37 | { |
9adf4299 | 38 | m_file = new wxFile(fileName, wxFile::read); |
cab1a605 | 39 | m_file_destroy = true; |
b9698194 VZ |
40 | if ( !m_file->IsOpened() ) |
41 | m_lasterror = wxSTREAM_READ_ERROR; | |
3d4c6a21 GL |
42 | } |
43 | ||
25c70b07 GL |
44 | wxFileInputStream::wxFileInputStream() |
45 | : wxInputStream() | |
46 | { | |
cab1a605 | 47 | m_file_destroy = false; |
f6bcfd97 | 48 | m_file = NULL; |
25c70b07 GL |
49 | } |
50 | ||
0aca1ded GL |
51 | wxFileInputStream::wxFileInputStream(wxFile& file) |
52 | { | |
f6bcfd97 | 53 | m_file = &file; |
cab1a605 | 54 | m_file_destroy = false; |
0aca1ded GL |
55 | } |
56 | ||
57 | wxFileInputStream::wxFileInputStream(int fd) | |
58 | { | |
f6bcfd97 | 59 | m_file = new wxFile(fd); |
cab1a605 | 60 | m_file_destroy = true; |
0aca1ded GL |
61 | } |
62 | ||
79c3e0e1 | 63 | wxFileInputStream::~wxFileInputStream() |
3d4c6a21 | 64 | { |
f6bcfd97 BP |
65 | if (m_file_destroy) |
66 | delete m_file; | |
3d4c6a21 GL |
67 | } |
68 | ||
588066b7 | 69 | wxFileOffset wxFileInputStream::GetLength() const |
84b46c35 | 70 | { |
f6bcfd97 | 71 | return m_file->Length(); |
84b46c35 GL |
72 | } |
73 | ||
75ed1d15 | 74 | size_t wxFileInputStream::OnSysRead(void *buffer, size_t size) |
6d44bf31 | 75 | { |
f8a586e0 | 76 | ssize_t ret = m_file->Read(buffer, size); |
fae05df5 | 77 | |
e69a1ea8 | 78 | // NB: we can't use a switch here because HP-UX CC doesn't allow |
30984dea | 79 | // switching over long long (which size_t is in 64bit mode) |
9a26db9e | 80 | |
e69a1ea8 VZ |
81 | if ( !ret ) |
82 | { | |
83 | // nothing read, so nothing more to read | |
84 | m_lasterror = wxSTREAM_EOF; | |
85 | } | |
f8a586e0 | 86 | else if ( ret == wxInvalidOffset ) |
e69a1ea8 VZ |
87 | { |
88 | m_lasterror = wxSTREAM_READ_ERROR; | |
89 | ret = 0; | |
90 | } | |
91 | else | |
92 | { | |
93 | // normal case | |
94 | m_lasterror = wxSTREAM_NO_ERROR; | |
f6bcfd97 | 95 | } |
fae05df5 | 96 | |
f6bcfd97 | 97 | return ret; |
6d44bf31 GL |
98 | } |
99 | ||
4004775e | 100 | wxFileOffset wxFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) |
3d4c6a21 | 101 | { |
9a26db9e | 102 | return m_file->Seek(pos, mode); |
79c3e0e1 GL |
103 | } |
104 | ||
4004775e | 105 | wxFileOffset wxFileInputStream::OnSysTell() const |
79c3e0e1 | 106 | { |
f6bcfd97 | 107 | return m_file->Tell(); |
79c3e0e1 GL |
108 | } |
109 | ||
110 | // ---------------------------------------------------------------------------- | |
111 | // wxFileOutputStream | |
112 | // ---------------------------------------------------------------------------- | |
113 | ||
114 | wxFileOutputStream::wxFileOutputStream(const wxString& fileName) | |
25c70b07 | 115 | { |
9adf4299 | 116 | m_file = new wxFile(fileName, wxFile::write); |
cab1a605 | 117 | m_file_destroy = true; |
9a26db9e | 118 | |
942bef71 | 119 | if (!m_file->IsOpened()) |
942bef71 | 120 | m_lasterror = wxSTREAM_WRITE_ERROR; |
25c70b07 GL |
121 | } |
122 | ||
84b46c35 GL |
123 | wxFileOutputStream::wxFileOutputStream(wxFile& file) |
124 | { | |
f6bcfd97 | 125 | m_file = &file; |
cab1a605 | 126 | m_file_destroy = false; |
84b46c35 GL |
127 | } |
128 | ||
25c70b07 | 129 | wxFileOutputStream::wxFileOutputStream() |
9a26db9e | 130 | : wxOutputStream() |
79c3e0e1 | 131 | { |
cab1a605 | 132 | m_file_destroy = false; |
f6bcfd97 | 133 | m_file = NULL; |
3d4c6a21 GL |
134 | } |
135 | ||
0aca1ded GL |
136 | wxFileOutputStream::wxFileOutputStream(int fd) |
137 | { | |
f6bcfd97 | 138 | m_file = new wxFile(fd); |
cab1a605 | 139 | m_file_destroy = true; |
0aca1ded GL |
140 | } |
141 | ||
79c3e0e1 | 142 | wxFileOutputStream::~wxFileOutputStream() |
3d4c6a21 | 143 | { |
9a26db9e | 144 | if (m_file_destroy) |
f6bcfd97 BP |
145 | { |
146 | Sync(); | |
147 | delete m_file; | |
148 | } | |
79c3e0e1 | 149 | } |
3d4c6a21 | 150 | |
75ed1d15 | 151 | size_t wxFileOutputStream::OnSysWrite(const void *buffer, size_t size) |
79c3e0e1 | 152 | { |
f6bcfd97 | 153 | size_t ret = m_file->Write(buffer, size); |
9a26db9e VZ |
154 | |
155 | m_lasterror = m_file->Error() ? wxSTREAM_WRITE_ERROR : wxSTREAM_NO_ERROR; | |
156 | ||
f6bcfd97 | 157 | return ret; |
79c3e0e1 | 158 | } |
3d4c6a21 | 159 | |
4004775e | 160 | wxFileOffset wxFileOutputStream::OnSysTell() const |
79c3e0e1 | 161 | { |
f6bcfd97 | 162 | return m_file->Tell(); |
3d4c6a21 GL |
163 | } |
164 | ||
4004775e | 165 | wxFileOffset wxFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) |
3d4c6a21 | 166 | { |
f6bcfd97 | 167 | return m_file->Seek(pos, mode); |
3d4c6a21 GL |
168 | } |
169 | ||
79c3e0e1 | 170 | void wxFileOutputStream::Sync() |
3d4c6a21 | 171 | { |
f6bcfd97 BP |
172 | wxOutputStream::Sync(); |
173 | m_file->Flush(); | |
3d4c6a21 | 174 | } |
84b46c35 | 175 | |
588066b7 | 176 | wxFileOffset wxFileOutputStream::GetLength() const |
84b46c35 | 177 | { |
f6bcfd97 | 178 | return m_file->Length(); |
84b46c35 GL |
179 | } |
180 | ||
181 | // ---------------------------------------------------------------------------- | |
e1265174 MW |
182 | // wxTempFileOutputStream |
183 | // ---------------------------------------------------------------------------- | |
184 | ||
185 | wxTempFileOutputStream::wxTempFileOutputStream(const wxString& fileName) | |
186 | { | |
187 | m_file = new wxTempFile(fileName); | |
188 | ||
189 | if (!m_file->IsOpened()) | |
190 | m_lasterror = wxSTREAM_WRITE_ERROR; | |
191 | } | |
192 | ||
193 | wxTempFileOutputStream::~wxTempFileOutputStream() | |
194 | { | |
195 | if (m_file->IsOpened()) | |
196 | Discard(); | |
197 | delete m_file; | |
198 | } | |
199 | ||
200 | size_t wxTempFileOutputStream::OnSysWrite(const void *buffer, size_t size) | |
201 | { | |
202 | if (IsOk() && m_file->Write(buffer, size)) | |
203 | return size; | |
204 | m_lasterror = wxSTREAM_WRITE_ERROR; | |
205 | return 0; | |
206 | } | |
207 | ||
208 | // ---------------------------------------------------------------------------- | |
84b46c35 GL |
209 | // wxFileStream |
210 | // ---------------------------------------------------------------------------- | |
f6bcfd97 | 211 | |
84b46c35 | 212 | wxFileStream::wxFileStream(const wxString& fileName) |
f6bcfd97 | 213 | : wxFileInputStream(fileName) |
84b46c35 | 214 | { |
f6bcfd97 | 215 | wxFileOutputStream::m_file = wxFileInputStream::m_file; |
84b46c35 | 216 | } |
ce4169a4 | 217 | |
85990624 RN |
218 | #endif //wxUSE_FILE |
219 | ||
220 | #if wxUSE_FFILE | |
221 | ||
65045edd RR |
222 | // ---------------------------------------------------------------------------- |
223 | // wxFFileInputStream | |
224 | // ---------------------------------------------------------------------------- | |
225 | ||
5fec5bb6 VZ |
226 | wxFFileInputStream::wxFFileInputStream(const wxString& fileName, |
227 | const wxChar *mode) | |
228 | : wxInputStream() | |
65045edd | 229 | { |
5fec5bb6 | 230 | m_file = new wxFFile(fileName, mode); |
cab1a605 | 231 | m_file_destroy = true; |
ecc20148 MW |
232 | |
233 | if (!m_file->IsOpened()) | |
234 | m_lasterror = wxSTREAM_WRITE_ERROR; | |
65045edd RR |
235 | } |
236 | ||
237 | wxFFileInputStream::wxFFileInputStream() | |
5fec5bb6 | 238 | : wxInputStream() |
65045edd | 239 | { |
f6bcfd97 | 240 | m_file = NULL; |
5fec5bb6 | 241 | m_file_destroy = false; |
65045edd RR |
242 | } |
243 | ||
244 | wxFFileInputStream::wxFFileInputStream(wxFFile& file) | |
245 | { | |
f6bcfd97 | 246 | m_file = &file; |
cab1a605 | 247 | m_file_destroy = false; |
65045edd RR |
248 | } |
249 | ||
250 | wxFFileInputStream::wxFFileInputStream(FILE *file) | |
251 | { | |
f6bcfd97 | 252 | m_file = new wxFFile(file); |
cab1a605 | 253 | m_file_destroy = true; |
65045edd RR |
254 | } |
255 | ||
256 | wxFFileInputStream::~wxFFileInputStream() | |
257 | { | |
f6bcfd97 BP |
258 | if (m_file_destroy) |
259 | delete m_file; | |
65045edd RR |
260 | } |
261 | ||
588066b7 | 262 | wxFileOffset wxFFileInputStream::GetLength() const |
65045edd | 263 | { |
f6bcfd97 | 264 | return m_file->Length(); |
65045edd RR |
265 | } |
266 | ||
267 | size_t wxFFileInputStream::OnSysRead(void *buffer, size_t size) | |
268 | { | |
f8a586e0 | 269 | ssize_t ret = m_file->Read(buffer, size); |
65045edd | 270 | |
b9d84e4c DE |
271 | // It is not safe to call Eof() if the file is not opened. |
272 | if (!m_file->IsOpened() || m_file->Eof()) | |
2b5f62a0 | 273 | m_lasterror = wxSTREAM_EOF; |
f8a586e0 | 274 | if (ret == wxInvalidOffset) |
f6bcfd97 | 275 | { |
2b5f62a0 | 276 | m_lasterror = wxSTREAM_READ_ERROR; |
f6bcfd97 BP |
277 | ret = 0; |
278 | } | |
65045edd | 279 | |
f6bcfd97 | 280 | return ret; |
65045edd RR |
281 | } |
282 | ||
4004775e | 283 | wxFileOffset wxFFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) |
65045edd | 284 | { |
70a7bd90 | 285 | return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset; |
65045edd RR |
286 | } |
287 | ||
4004775e | 288 | wxFileOffset wxFFileInputStream::OnSysTell() const |
65045edd | 289 | { |
f6bcfd97 | 290 | return m_file->Tell(); |
65045edd RR |
291 | } |
292 | ||
293 | // ---------------------------------------------------------------------------- | |
294 | // wxFFileOutputStream | |
295 | // ---------------------------------------------------------------------------- | |
296 | ||
5fec5bb6 VZ |
297 | wxFFileOutputStream::wxFFileOutputStream(const wxString& fileName, |
298 | const wxChar *mode) | |
65045edd | 299 | { |
5fec5bb6 | 300 | m_file = new wxFFile(fileName, mode); |
cab1a605 | 301 | m_file_destroy = true; |
9a26db9e | 302 | |
942bef71 RR |
303 | if (!m_file->IsOpened()) |
304 | { | |
305 | m_lasterror = wxSTREAM_WRITE_ERROR; | |
306 | } | |
307 | else | |
308 | { | |
309 | if (m_file->Error()) | |
310 | m_lasterror = wxSTREAM_WRITE_ERROR; | |
311 | } | |
65045edd RR |
312 | } |
313 | ||
314 | wxFFileOutputStream::wxFFileOutputStream(wxFFile& file) | |
315 | { | |
f6bcfd97 | 316 | m_file = &file; |
cab1a605 | 317 | m_file_destroy = false; |
65045edd RR |
318 | } |
319 | ||
320 | wxFFileOutputStream::wxFFileOutputStream() | |
5fec5bb6 | 321 | : wxOutputStream() |
65045edd | 322 | { |
f6bcfd97 | 323 | m_file = NULL; |
5fec5bb6 | 324 | m_file_destroy = false; |
65045edd RR |
325 | } |
326 | ||
327 | wxFFileOutputStream::wxFFileOutputStream(FILE *file) | |
328 | { | |
f6bcfd97 | 329 | m_file = new wxFFile(file); |
cab1a605 | 330 | m_file_destroy = true; |
65045edd RR |
331 | } |
332 | ||
333 | wxFFileOutputStream::~wxFFileOutputStream() | |
334 | { | |
9a26db9e | 335 | if (m_file_destroy) |
f6bcfd97 BP |
336 | { |
337 | Sync(); | |
338 | delete m_file; | |
339 | } | |
65045edd RR |
340 | } |
341 | ||
342 | size_t wxFFileOutputStream::OnSysWrite(const void *buffer, size_t size) | |
343 | { | |
f6bcfd97 | 344 | size_t ret = m_file->Write(buffer, size); |
b9d84e4c DE |
345 | // It is not safe to call Error() if the file is not opened. |
346 | if (!m_file->IsOpened() || m_file->Error()) | |
2b5f62a0 | 347 | m_lasterror = wxSTREAM_WRITE_ERROR; |
f6bcfd97 | 348 | else |
2b5f62a0 | 349 | m_lasterror = wxSTREAM_NO_ERROR; |
f6bcfd97 | 350 | return ret; |
65045edd RR |
351 | } |
352 | ||
4004775e | 353 | wxFileOffset wxFFileOutputStream::OnSysTell() const |
65045edd | 354 | { |
f6bcfd97 | 355 | return m_file->Tell(); |
65045edd RR |
356 | } |
357 | ||
4004775e | 358 | wxFileOffset wxFFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) |
65045edd | 359 | { |
70a7bd90 | 360 | return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset; |
65045edd RR |
361 | } |
362 | ||
363 | void wxFFileOutputStream::Sync() | |
364 | { | |
f6bcfd97 BP |
365 | wxOutputStream::Sync(); |
366 | m_file->Flush(); | |
65045edd RR |
367 | } |
368 | ||
588066b7 | 369 | wxFileOffset wxFFileOutputStream::GetLength() const |
65045edd | 370 | { |
f6bcfd97 | 371 | return m_file->Length(); |
65045edd RR |
372 | } |
373 | ||
374 | // ---------------------------------------------------------------------------- | |
375 | // wxFFileStream | |
376 | // ---------------------------------------------------------------------------- | |
f6bcfd97 | 377 | |
65045edd | 378 | wxFFileStream::wxFFileStream(const wxString& fileName) |
f6bcfd97 | 379 | : wxFFileInputStream(fileName) |
65045edd | 380 | { |
f6bcfd97 | 381 | wxFFileOutputStream::m_file = wxFFileInputStream::m_file; |
65045edd | 382 | } |
f6bcfd97 | 383 | |
85990624 RN |
384 | #endif //wxUSE_FFILE |
385 | ||
386 | #endif // wxUSE_STREAMS |