MfcFileStream.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:2k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __MfcFileStream_h__
  3. #define __MfcFileStream_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include "../refcount.h"
  8. #include "IOException.h"
  9. #include "IStream.h"
  10. // #include "InputStream.h"
  11. // #include "OutputStream.h"
  12. #include <afx.h>
  13. namespace febird {
  14. class MfcFileStream 
  15. : public RefCounter
  16. , public IInputStream
  17. , public IOutputStream
  18. , public ISeekable
  19. {
  20. CFile* m_fp;
  21. public:
  22. typedef boost::mpl::true_ is_seekable;
  23. MfcFileStream(CFile* fp) : m_fp(fp) {}
  24. size_t read(void* vbuf, size_t length);
  25. size_t write(const void* vbuf, size_t length);
  26. bool seek(stream_offset_t offset, int origin);
  27. void flush();
  28. void ensureWrite(const void* vbuf, size_t length);
  29. void ensureRead(void* vbuf, size_t length);
  30. void writeByte(unsigned char b);
  31. int getByte();
  32. unsigned char readByte();
  33. };
  34. class MfcArchiveStream
  35. : public IInputStream
  36. , public IOutputStream
  37. , public ISeekable
  38. {
  39. CArchive* m_fp;
  40. public:
  41. typedef boost::mpl::false_ is_seekable;
  42. MfcArchiveStream(CArchive* fp) : m_fp(fp) {}
  43. size_t read(void* vbuf, size_t length);
  44. size_t write(const void* vbuf, size_t length);
  45. bool seek(stream_offset_t offset, int origin);
  46. void flush();
  47. void ensureWrite(const void* vbuf, size_t length);
  48. void ensureRead(void* vbuf, size_t length);
  49. void writeByte(unsigned char b);
  50. int getByte();
  51. unsigned char readByte();
  52. };
  53. //! @{
  54. //! serialize CString
  55. template<class Input>
  56. void DataIO_loadObject(Input& input, CString& x)
  57. {
  58. var_uint32_t size;
  59. input >> size;
  60. LPTSTR buf = x.GetBufferSetLength(size.t);
  61. buf[size] = 0;
  62. uint32_t size2 = input.read(buf, size.t);
  63. if (size2 != size.t)
  64. {
  65. throw EndOfFileException("when load CString");
  66. }
  67. x.ReleaseBuffer(size.t);
  68. }
  69. template<class Output>
  70. void DataIO_saveObject(Output& output, const CString& x)
  71. {
  72. var_uint32_t size(x.GetLength());
  73. output << size;
  74. uint32_t size2 = output.write(static_cast<LPCTSTR>(x), size.t);
  75. if (size2 != size.t)
  76. {
  77. throw OutOfSpaceException("when save CString");
  78. }
  79. }
  80. //! @}
  81. }
  82. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  83. # pragma warning(pop)
  84. #endif
  85. #endif // __MfcFileStream_h__