diff options
Diffstat (limited to 'ACE/protocols/ace/INet/BidirStreamBuffer.cpp')
-rw-r--r-- | ACE/protocols/ace/INet/BidirStreamBuffer.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/ACE/protocols/ace/INet/BidirStreamBuffer.cpp b/ACE/protocols/ace/INet/BidirStreamBuffer.cpp new file mode 100644 index 00000000000..3ac0551fcf3 --- /dev/null +++ b/ACE/protocols/ace/INet/BidirStreamBuffer.cpp @@ -0,0 +1,219 @@ +// $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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::~BasicBidirStreamBuffer () + { + this->close_stream (); + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + typename BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::int_type + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + typename BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::int_type + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + int + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::sync () + { + if (this->pptr () && this->pptr () > this->pbase ()) + { + if (this->flush_buffer () == -1) return -1; + } + return 0; + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + const STREAM_HANDLER& + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::stream () const + { + return *this->stream_; + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + void + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::close_stream () + { + if (this->stream_ != 0) + { + ACE_Errno_Guard eguard (errno); + this->stream_->remove_reference (); + this->stream_ = 0; + } + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + void + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::set_interceptor (interceptor_type& interceptor) + { + this->interceptor_ = &interceptor; + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + void + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::set_mode (openmode mode) + { + this->mode_ = mode; + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + typename BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::openmode + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::get_mode () const + { + return this->mode_; + } + + template <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + void + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + int + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + int + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class ACE_CHAR_T, class STREAM_HANDLER, class TR> + int + BasicBidirStreamBuffer<ACE_CHAR_T, STREAM_HANDLER, TR>::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 <class STREAM_HANDLER> + BidirStreamBuffer<STREAM_HANDLER>::BidirStreamBuffer ( + STREAM_HANDLER* sh, + std::streamsize bufsz, + openmode mode) + : BasicBidirStreamBuffer<char, STREAM_HANDLER> (sh, bufsz, mode) + { + } + + template <class STREAM_HANDLER> + BidirStreamBuffer<STREAM_HANDLER>::~BidirStreamBuffer () + { + } + + } +} + +ACE_END_VERSIONED_NAMESPACE_DECL + +#endif /* ACE_IOS_BIDIR_STREAM_BUFFER_CPP */ |