00001 #ifndef CORELIB___RWSTREAMBUF__HPP
00002 #define CORELIB___RWSTREAMBUF__HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include <corelib/ncbistre.hpp>
00041 #include <corelib/reader_writer.hpp>
00042
00043 #ifdef NCBI_COMPILER_MIPSPRO
00044 # define CRWStreambufBase CMIPSPRO_ReadsomeTolerantStreambuf
00045 #else
00046 # define CRWStreambufBase CNcbiStreambuf
00047 # ifdef NCBI_COMPILER_MSVC
00048 # pragma warning(push)
00049 # pragma warning(disable:4996)
00050 # endif //NCBI_COMPILER_MSVC
00051 #endif //NCBI_COMPILER_MIPSPRO
00052
00053
00054 BEGIN_NCBI_SCOPE
00055
00056
00057
00058
00059 class CRWStreambuf : public CRWStreambufBase
00060 {
00061 public:
00062
00063
00064
00065
00066 enum EFlags {
00067 fOwnReader = 1 << 1,
00068 fOwnWriter = 1 << 2,
00069 fOwnAll = fOwnReader + fOwnWriter,
00070 fLogExceptions = 1 << 8
00071 };
00072 typedef int TFlags;
00073
00074
00075 CRWStreambuf(IReaderWriter* rw = 0,
00076 streamsize buf_size = 0,
00077 CT_CHAR_TYPE* buf = 0,
00078 TFlags flags = 0);
00079
00080 CRWStreambuf(IReader* r,
00081 IWriter* w,
00082 streamsize buf_size = 0,
00083 CT_CHAR_TYPE* buf = 0,
00084 TFlags flags = 0);
00085
00086 virtual ~CRWStreambuf();
00087
00088 protected:
00089 virtual CT_INT_TYPE overflow(CT_INT_TYPE c);
00090 virtual streamsize xsputn(const CT_CHAR_TYPE* buf, streamsize n);
00091
00092 virtual CT_INT_TYPE underflow(void);
00093 virtual streamsize xsgetn(CT_CHAR_TYPE* s, streamsize n);
00094 virtual streamsize showmanyc(void);
00095
00096 virtual int sync(void);
00097
00098
00099 virtual CNcbiStreambuf* setbuf(CT_CHAR_TYPE* buf, streamsize buf_size);
00100
00101
00102 virtual CT_POS_TYPE seekoff(CT_OFF_TYPE off, IOS_BASE::seekdir whence,
00103 IOS_BASE::openmode which =
00104 IOS_BASE::in | IOS_BASE::out);
00105 protected:
00106 CT_POS_TYPE x_GetGPos(void)
00107 { return x_GPos - (CT_OFF_TYPE)(gptr() ? egptr() - gptr() : 0); }
00108 CT_POS_TYPE x_GetPPos(void)
00109 { return x_PPos + (CT_OFF_TYPE)(pptr() ? pbase() - pptr() : 0); }
00110
00111 protected:
00112 TFlags m_Flags;
00113
00114 IReader* m_Reader;
00115 IWriter* m_Writer;
00116
00117 streamsize m_BufSize;
00118 CT_CHAR_TYPE* m_ReadBuf;
00119 CT_CHAR_TYPE* m_WriteBuf;
00120
00121 CT_CHAR_TYPE* m_pBuf;
00122 CT_CHAR_TYPE x_Buf;
00123
00124 CT_POS_TYPE x_GPos;
00125 CT_POS_TYPE x_PPos;
00126
00127 bool x_Err;
00128 CT_POS_TYPE x_ErrPos;
00129 };
00130
00131
00132 END_NCBI_SCOPE
00133
00134
00135 #ifdef NCBI_COMPILER_MSVC
00136 # pragma warning(pop)
00137 #endif //NCBI_COMPILER_MSVC
00138
00139 #endif
00140
00141