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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #include "ZlibStream.h"
  3. #include <assert.h>
  4. #include <string.h>
  5. #include <sstream>
  6. #if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64)
  7. # include <io.h>
  8. #   pragma comment(lib, "zlib.lib")
  9. #else
  10. # include <unistd.h>
  11. # include <sys/stat.h>
  12. # include <sys/types.h>
  13. # include <fcntl.h>
  14. # include <errno.h>
  15. #endif
  16. #include <zlib.h>
  17. #include "byte_io_impl.h"
  18. namespace febird {
  19. void ZlibStreamBase::ThrowOpenFileException(const char* fpath, const char* mode)
  20. {
  21. std::ostringstream oss;
  22. oss << "mode=" << mode;
  23. throw OpenFileException(fpath, oss.str().c_str());
  24. }
  25. // only can call on unopened ZlibInputStream
  26. void ZlibStreamBase::open(const char* fpath, const char* mode)
  27. {
  28. assert(0 == m_fp);
  29. m_fp = gzopen(fpath, mode);
  30. if (0 == m_fp)
  31. ThrowOpenFileException(fpath, mode);
  32. }
  33. bool ZlibStreamBase::xopen(const char* fpath, const char* mode)
  34. {
  35. assert(0 == m_fp);
  36. m_fp = gzopen(fpath, mode);
  37. return 0 != m_fp;
  38. }
  39. void ZlibStreamBase::dopen(int fd, const char* mode)
  40. {
  41. assert(0 == m_fp);
  42. m_fp = gzdopen(fd, mode);
  43. if (0 == m_fp)
  44. {
  45. char szbuf[64];
  46. sprintf(szbuf, "fd=%d", fd);
  47. ThrowOpenFileException(szbuf, mode);
  48. }
  49. }
  50. void ZlibStreamBase::close()
  51. {
  52. assert(m_fp);
  53. gzclose((gzFile)m_fp);
  54. m_fp = 0;
  55. }
  56. ZlibStreamBase::~ZlibStreamBase()
  57. {
  58. if (m_fp)
  59. gzclose((gzFile)m_fp);
  60. }
  61. ///////////////////////////////////////////////////////////////////////////////////////
  62. ZlibInputStream::ZlibInputStream(const char* fpath, const char* mode)
  63. {
  64. m_fp = 0;
  65.     open(fpath, mode);
  66. }
  67. ZlibInputStream::ZlibInputStream(int fd, const char* mode)
  68. {
  69. m_fp = 0;
  70.     dopen(fd, mode);
  71. }
  72. bool ZlibInputStream::eof() const
  73. {
  74. return !!gzeof((gzFile)m_fp);
  75. }
  76. size_t ZlibInputStream::read(void* buf, size_t size) throw()
  77. {
  78. assert(m_fp);
  79. return gzread((gzFile)m_fp, buf, size);
  80. }
  81. FEBIRD_GEN_ensureRead (ZlibInputStream::)
  82. ///////////////////////////////////////////////////////
  83. ZlibOutputStream::ZlibOutputStream(const char* fpath, const char* mode)
  84. {
  85. m_fp = 0;
  86.     open(fpath, mode);
  87. }
  88. ZlibOutputStream::ZlibOutputStream(int fd, const char* mode)
  89. {
  90. m_fp = 0;
  91.     dopen(fd, mode);
  92. }
  93. void ZlibOutputStream::flush()
  94. {
  95. assert(m_fp);
  96. if (gzflush((gzFile)m_fp, Z_SYNC_FLUSH) == EOF)
  97. throw DelayedWriteFailException(BOOST_CURRENT_FUNCTION);
  98. }
  99. size_t ZlibOutputStream::write(const void* buf, size_t size) throw()
  100. {
  101. assert(m_fp);
  102. return gzwrite((gzFile)m_fp, buf, size);
  103. }
  104. FEBIRD_GEN_ensureWrite(ZlibOutputStream::)
  105. } // namespace febird