summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp
new file mode 100644
index 00000000000..bf301d061fe
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Message_Block_Data_Iterator.cpp
@@ -0,0 +1,86 @@
+// $Id$
+
+#include "UIPMC_Message_Block_Data_Iterator.h"
+
+UIPMC_Message_Block_Data_Iterator::UIPMC_Message_Block_Data_Iterator (iovec *iov, int iovcnt) :
+ iov_ (iov),
+ iovcnt_ (iovcnt),
+ iov_ptr_ (0),
+ iov_index_ (0),
+ iov_len_left_ (0),
+ state_ (INTER_BLOCK)
+{
+}
+
+size_t
+UIPMC_Message_Block_Data_Iterator::next_block (size_t max_length,
+ iovec &block)
+{
+ if (this->state_ == INTER_BLOCK)
+ {
+ // Check that there are some iovec buffers left.
+ if (this->iov_index_ >= this->iovcnt_)
+ return 0;
+
+
+ size_t current_iov_len =
+ this->iov_[this->iov_index_].iov_len;
+
+ if (current_iov_len <= max_length)
+ {
+ // Return the full data portion.
+ block.iov_len = ACE_static_cast (u_long, current_iov_len);
+ block.iov_base = this->iov_[this->iov_index_].iov_base;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ return current_iov_len;
+ }
+ else
+ {
+ // Let the caller use the first part of this
+ // message block.
+ block.iov_len = ACE_static_cast (u_long, max_length);
+ block.iov_base = this->iov_[this->iov_index_].iov_base;
+
+ // Break up the block.
+ this->iov_len_left_ = current_iov_len - max_length;
+ this->iov_ptr_ =
+ ACE_reinterpret_cast (char *,
+ ACE_reinterpret_cast (char *, block.iov_base)
+ + max_length);
+ this->state_ = INTRA_BLOCK;
+
+ return max_length;
+ }
+ }
+ else
+ {
+ // Currently scanning a split block.
+ if (this->iov_len_left_ <= max_length)
+ {
+ // Return everything that's left in the block.
+ block.iov_len = ACE_static_cast (u_long, this->iov_len_left_);
+ block.iov_base = this->iov_ptr_;
+
+ // Go to the next block.
+ this->iov_index_++;
+
+ // Update the state.
+ this->state_ = INTER_BLOCK;
+
+ return this->iov_len_left_;
+ }
+ else
+ {
+ // Split a little more off the block.
+ block.iov_len = ACE_static_cast (u_long, this->iov_len_left_);
+ block.iov_base = this->iov_ptr_;
+
+ this->iov_len_left_ -= max_length;
+ this->iov_ptr_ += max_length;
+ return max_length;
+ }
+ }
+}