diff options
Diffstat (limited to 'TAO/tao/Queued_Message.cpp')
-rw-r--r-- | TAO/tao/Queued_Message.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/TAO/tao/Queued_Message.cpp b/TAO/tao/Queued_Message.cpp new file mode 100644 index 00000000000..94ad78e1662 --- /dev/null +++ b/TAO/tao/Queued_Message.cpp @@ -0,0 +1,112 @@ +// -*- C++ -*- +// $Id$ + +#include "Queued_Message.h" +#include "Message_Sent_Callback.h" + +#if !defined (__ACE_INLINE__) +# include "Queued_Message.inl" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(tao, Queued_Message, "$Id$") + +TAO_Queued_Message::TAO_Queued_Message (ACE_Message_Block *contents, + int own_contents, + TAO_Message_Sent_Callback *callback) + : contents_ (contents) + , own_contents_ (own_contents) + , callback_ (callback) + , current_block_ (contents) + , next_ (0) + , prev_ (0) +{ +} + +TAO_Queued_Message::~TAO_Queued_Message (void) +{ + if (this->own_contents_) + { + ACE_Message_Block *i = this->contents_; + while (i != 0) + { + ACE_Message_Block *cont = i->cont (); i->cont (0); + ACE_Message_Block::release (i); + i = cont; + } + } +} + +void +TAO_Queued_Message::connection_closed (void) +{ + if (this->callback_ != 0) + { + if (this->done ()) + { + this->callback_->connection_closed (); + } + else + { + this->callback_->send_failed (); + } + } +} + +void +TAO_Queued_Message::destroy (void) +{ + delete this; +} + +void +TAO_Queued_Message::bytes_transferred (size_t byte_count) +{ + while (!this->done () && byte_count > 0) + { + size_t l = this->current_block_->length (); + if (byte_count < l) + { + this->current_block_->rd_ptr (byte_count); + return; + } + byte_count -= l; + this->current_block_ = this->current_block_->cont (); + } +} + +void +TAO_Queued_Message::remove_from_list (TAO_Queued_Message *&head, + TAO_Queued_Message *&tail) +{ + if (this->prev_ != 0) + this->prev_->next_ = this->next_; + else + head = this->next_; + + if (this->next_ != 0) + this->next_->prev_ = this->prev_; + else + tail = this->prev_; + + this->next_ = 0; + this->prev_ = 0; +} + +void +TAO_Queued_Message::push_back (TAO_Queued_Message *&head, + TAO_Queued_Message *&tail) +{ + if (tail == 0) + { + tail = this; + head = this; + this->next_ = 0; + this->prev_ = 0; + return; + } + + tail->next_ = this; + this->prev_ = tail; + this->next_ = 0; + tail = this; +} |