wfstream.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: wx/wfstream.h
  3. // Purpose: File stream classes
  4. // Author: Guilhem Lavaux
  5. // Modified by:
  6. // Created: 11/07/98
  7. // Copyright: (c) Guilhem Lavaux
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #ifndef _WX_WXFSTREAM_H__
  11. #define _WX_WXFSTREAM_H__
  12. #include "wx/defs.h"
  13. #if wxUSE_STREAMS
  14. #include "wx/object.h"
  15. #include "wx/string.h"
  16. #include "wx/stream.h"
  17. #include "wx/file.h"
  18. #include "wx/ffile.h"
  19. #if wxUSE_FILE
  20. // ----------------------------------------------------------------------------
  21. // wxFileStream using wxFile
  22. // ----------------------------------------------------------------------------
  23. class WXDLLIMPEXP_BASE wxFileInputStream : public wxInputStream
  24. {
  25. public:
  26. wxFileInputStream(const wxString& ifileName);
  27. wxFileInputStream(wxFile& file);
  28. wxFileInputStream(int fd);
  29. virtual ~wxFileInputStream();
  30. wxFileOffset GetLength() const;
  31. bool Ok() const { return IsOk(); }
  32. virtual bool IsOk() const;
  33. bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; }
  34. wxFile* GetFile() const { return m_file; }
  35. protected:
  36. wxFileInputStream();
  37. size_t OnSysRead(void *buffer, size_t size);
  38. wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
  39. wxFileOffset OnSysTell() const;
  40. protected:
  41. wxFile *m_file;
  42. bool m_file_destroy;
  43. wxDECLARE_NO_COPY_CLASS(wxFileInputStream);
  44. };
  45. class WXDLLIMPEXP_BASE wxFileOutputStream : public wxOutputStream
  46. {
  47. public:
  48. wxFileOutputStream(const wxString& fileName);
  49. wxFileOutputStream(wxFile& file);
  50. wxFileOutputStream(int fd);
  51. virtual ~wxFileOutputStream();
  52. void Sync();
  53. bool Close() { return m_file_destroy ? m_file->Close() : true; }
  54. wxFileOffset GetLength() const;
  55. bool Ok() const { return IsOk(); }
  56. virtual bool IsOk() const;
  57. bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; }
  58. wxFile* GetFile() const { return m_file; }
  59. protected:
  60. wxFileOutputStream();
  61. size_t OnSysWrite(const void *buffer, size_t size);
  62. wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
  63. wxFileOffset OnSysTell() const;
  64. protected:
  65. wxFile *m_file;
  66. bool m_file_destroy;
  67. wxDECLARE_NO_COPY_CLASS(wxFileOutputStream);
  68. };
  69. class WXDLLIMPEXP_BASE wxTempFileOutputStream : public wxOutputStream
  70. {
  71. public:
  72. wxTempFileOutputStream(const wxString& fileName);
  73. virtual ~wxTempFileOutputStream();
  74. bool Close() { return Commit(); }
  75. WXDLLIMPEXP_INLINE_BASE virtual bool Commit() { return m_file->Commit(); }
  76. WXDLLIMPEXP_INLINE_BASE virtual void Discard() { m_file->Discard(); }
  77. wxFileOffset GetLength() const { return m_file->Length(); }
  78. bool IsSeekable() const { return true; }
  79. protected:
  80. size_t OnSysWrite(const void *buffer, size_t size);
  81. wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode)
  82. { return m_file->Seek(pos, mode); }
  83. wxFileOffset OnSysTell() const { return m_file->Tell(); }
  84. private:
  85. wxTempFile *m_file;
  86. wxDECLARE_NO_COPY_CLASS(wxTempFileOutputStream);
  87. };
  88. class WXDLLIMPEXP_BASE wxFileStream : public wxFileInputStream,
  89. public wxFileOutputStream
  90. {
  91. public:
  92. wxFileStream(const wxString& fileName);
  93. virtual bool IsOk() const;
  94. // override (some) virtual functions inherited from both classes to resolve
  95. // ambiguities (this wouldn't be necessary if wxStreamBase were a virtual
  96. // base class but it isn't)
  97. virtual bool IsSeekable() const
  98. {
  99. return wxFileInputStream::IsSeekable();
  100. }
  101. virtual wxFileOffset GetLength() const
  102. {
  103. return wxFileInputStream::GetLength();
  104. }
  105. protected:
  106. virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode)
  107. {
  108. return wxFileInputStream::OnSysSeek(pos, mode);
  109. }
  110. virtual wxFileOffset OnSysTell() const
  111. {
  112. return wxFileInputStream::OnSysTell();
  113. }
  114. private:
  115. wxDECLARE_NO_COPY_CLASS(wxFileStream);
  116. };
  117. #endif //wxUSE_FILE
  118. #if wxUSE_FFILE
  119. // ----------------------------------------------------------------------------
  120. // wxFFileStream using wxFFile
  121. // ----------------------------------------------------------------------------
  122. class WXDLLIMPEXP_BASE wxFFileInputStream : public wxInputStream
  123. {
  124. public:
  125. wxFFileInputStream(const wxString& fileName, const wxString& mode = "rb");
  126. wxFFileInputStream(wxFFile& file);
  127. wxFFileInputStream(FILE *file);
  128. virtual ~wxFFileInputStream();
  129. wxFileOffset GetLength() const;
  130. bool Ok() const { return IsOk(); }
  131. virtual bool IsOk() const;
  132. bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; }
  133. wxFFile* GetFile() const { return m_file; }
  134. protected:
  135. wxFFileInputStream();
  136. size_t OnSysRead(void *buffer, size_t size);
  137. wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
  138. wxFileOffset OnSysTell() const;
  139. protected:
  140. wxFFile *m_file;
  141. bool m_file_destroy;
  142. wxDECLARE_NO_COPY_CLASS(wxFFileInputStream);
  143. };
  144. class WXDLLIMPEXP_BASE wxFFileOutputStream : public wxOutputStream
  145. {
  146. public:
  147. wxFFileOutputStream(const wxString& fileName, const wxString& mode = "wb");
  148. wxFFileOutputStream(wxFFile& file);
  149. wxFFileOutputStream(FILE *file);
  150. virtual ~wxFFileOutputStream();
  151. void Sync();
  152. bool Close() { return m_file_destroy ? m_file->Close() : true; }
  153. wxFileOffset GetLength() const;
  154. bool Ok() const { return IsOk(); }
  155. virtual bool IsOk() const;
  156. bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; }
  157. wxFFile* GetFile() const { return m_file; }
  158. protected:
  159. wxFFileOutputStream();
  160. size_t OnSysWrite(const void *buffer, size_t size);
  161. wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
  162. wxFileOffset OnSysTell() const;
  163. protected:
  164. wxFFile *m_file;
  165. bool m_file_destroy;
  166. wxDECLARE_NO_COPY_CLASS(wxFFileOutputStream);
  167. };
  168. class WXDLLIMPEXP_BASE wxFFileStream : public wxFFileInputStream,
  169. public wxFFileOutputStream
  170. {
  171. public:
  172. wxFFileStream(const wxString& fileName, const wxString& mode = "w+b");
  173. // override some virtual functions to resolve ambiguities, just as in
  174. // wxFileStream
  175. virtual bool IsOk() const;
  176. virtual bool IsSeekable() const
  177. {
  178. return wxFFileInputStream::IsSeekable();
  179. }
  180. virtual wxFileOffset GetLength() const
  181. {
  182. return wxFFileInputStream::GetLength();
  183. }
  184. protected:
  185. virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode)
  186. {
  187. return wxFFileInputStream::OnSysSeek(pos, mode);
  188. }
  189. virtual wxFileOffset OnSysTell() const
  190. {
  191. return wxFFileInputStream::OnSysTell();
  192. }
  193. private:
  194. wxDECLARE_NO_COPY_CLASS(wxFFileStream);
  195. };
  196. #endif //wxUSE_FFILE
  197. #endif // wxUSE_STREAMS
  198. #endif // _WX_WXFSTREAM_H__