// $Id$ #ifndef ACE_IOS_BIDIR_STREAM_BUFFER_CPP #define ACE_IOS_BIDIR_STREAM_BUFFER_CPP #include "ace/INet/BidirStreamBuffer.h" #include "ace/OS_Memory.h" #include "ace/OS_NS_string.h" ACE_BEGIN_VERSIONED_NAMESPACE_DECL namespace ACE { namespace IOS { template BasicBidirStreamBuffer::BasicBidirStreamBuffer ( STREAM_HANDLER* sh, std::streamsize bufsz, openmode mode) : bufsize_ (bufsz), mode_ (mode), stream_ (sh), interceptor_ (0) { this->stream_->add_reference (); char_type* p = 0; ACE_NEW_NORETURN (p, char_type [bufsz]); this->read_buffer_.reset (p); p = 0; ACE_NEW_NORETURN (p, char_type [bufsz]); this->write_buffer_.reset (p); this->reset_buffers (); } template BasicBidirStreamBuffer::~BasicBidirStreamBuffer () { this->close_stream (); } template typename BasicBidirStreamBuffer::int_type BasicBidirStreamBuffer::overflow (int_type c) { if (!(this->mode_ & ios_type::out)) return char_traits::eof (); if (c != char_traits::eof ()) { *this->pptr () = char_traits::to_char_type (c); this->pbump (1); } if (this->flush_buffer () == std::streamsize (-1)) return char_traits::eof (); return c; } template typename BasicBidirStreamBuffer::int_type BasicBidirStreamBuffer::underflow () { if (!(this->mode_ & ios_type::in)) return char_traits::eof (); if (this->gptr () && (this->gptr () < this->egptr ())) return char_traits::to_int_type (*this->gptr ()); int putback = int (this->gptr () - this->eback ()); if (putback > 4) putback = 4; ACE_OS::memmove (this->read_buffer_.get () + (4 - putback), this->gptr () - putback, putback * sizeof (char_type)); if (this->interceptor_) this->interceptor_->before_read (this->bufsize_ - 4); int n = this->read_from_stream (this->read_buffer_.get () + 4, this->bufsize_ - 4); if (this->interceptor_) this->interceptor_->after_read (this->read_buffer_.get () + 4, n); if (n <= 0) { if (this->interceptor_) this->interceptor_->on_eof (); return char_traits::eof (); } this->setg (this->read_buffer_.get () + (4 - putback), this->read_buffer_.get () + 4, this->read_buffer_.get () + 4 + n); // return next character return char_traits::to_int_type (*this->gptr ()); } template int BasicBidirStreamBuffer::sync () { if (this->pptr () && this->pptr () > this->pbase ()) { if (this->flush_buffer () == -1) return -1; } return 0; } template const STREAM_HANDLER& BasicBidirStreamBuffer::stream () const { return *this->stream_; } template void BasicBidirStreamBuffer::close_stream () { if (this->stream_ != 0) { ACE_Errno_Guard eguard (errno); this->stream_->remove_reference (); this->stream_ = 0; } } template void BasicBidirStreamBuffer::set_interceptor (interceptor_type& interceptor) { this->interceptor_ = &interceptor; } template void BasicBidirStreamBuffer::set_mode (openmode mode) { this->mode_ = mode; } template typename BasicBidirStreamBuffer::openmode BasicBidirStreamBuffer::get_mode () const { return this->mode_; } template void BasicBidirStreamBuffer::reset_buffers() { this->setg (this->read_buffer_.get () + 4, this->read_buffer_.get () + 4, this->read_buffer_.get () + 4); this->setp (this->write_buffer_.get (), this->write_buffer_.get () + (this->bufsize_ - 1)); } template int BasicBidirStreamBuffer::read_from_stream (char_type* buffer, std::streamsize length) { return this->stream_ == 0 ? 0 : this->stream_->read_from_stream (buffer, length, sizeof(char_type)); } template int BasicBidirStreamBuffer::write_to_stream (const char_type* buffer, std::streamsize length) { return this->stream_ == 0 ? 0 : this->stream_->write_to_stream (buffer, length, sizeof(char_type)); } template int BasicBidirStreamBuffer::flush_buffer () { int n = int (this->pptr () - this->pbase ()); if (this->interceptor_) this->interceptor_->before_write (this->pbase (), n); int n_out = this->write_to_stream (this->pbase (), n); if (this->interceptor_) this->interceptor_->after_write (n_out); if (n_out == n) { this->pbump (-n); return n; } return -1; } template BidirStreamBuffer::BidirStreamBuffer ( STREAM_HANDLER* sh, std::streamsize bufsz, openmode mode) : BasicBidirStreamBuffer (sh, bufsz, mode) { } template BidirStreamBuffer::~BidirStreamBuffer () { } } } ACE_END_VERSIONED_NAMESPACE_DECL #endif /* ACE_IOS_BIDIR_STREAM_BUFFER_CPP */