summaryrefslogtreecommitdiff
path: root/TAO/tao/Queued_Data.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Queued_Data.h')
-rw-r--r--TAO/tao/Queued_Data.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/TAO/tao/Queued_Data.h b/TAO/tao/Queued_Data.h
new file mode 100644
index 00000000000..3376cf48bff
--- /dev/null
+++ b/TAO/tao/Queued_Data.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Queued_Data.h
+ *
+ * $Id$
+ *
+ * @author Balachandran Natarajan <bala@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_QUEUED_DATA_H
+#define TAO_QUEUED_DATA_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/Pluggable_Messaging_Utils.h"
+#include "ace/Message_Block.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+class ACE_Allocator;
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Queued_Data
+ *
+ * @brief Represents a node in the queue of incoming messages.
+ *
+ * This class contains necessary information about a message that is
+ * stored in the queue. Such a node can be used by the incoming thread
+ * from the reactor to dequeue and process the message by sending it
+ * to the higher layers of the ORB.
+ *
+ * The ACE_Message_Block contained within this class may contain a chain
+ * of message blocks (usually when GIOP fragments are involved). In that
+ * case consolidate () needs to be called prior to being sent to higher
+ * layers of the ORB when the GIOP fragment chain is complete.
+ */
+
+class TAO_Export TAO_Queued_Data
+{
+public:
+ /// Default Constructor
+ TAO_Queued_Data (ACE_Allocator *alloc = 0);
+
+ /// Constructor.
+ TAO_Queued_Data (ACE_Message_Block *mb, ACE_Allocator *alloc = 0);
+
+ /// Copy constructor.
+ TAO_Queued_Data (const TAO_Queued_Data &qd);
+
+ /// Creation of a node in the queue.
+ static TAO_Queued_Data* make_queued_data (
+ ACE_Allocator *message_buffer_alloc = 0,
+ ACE_Allocator *input_cdr_alloc = 0,
+ ACE_Data_Block *db = 0);
+
+ /// Deletion of a node from the queue.
+ static void release (TAO_Queued_Data *qd);
+
+ /// Duplicate ourselves. This creates a copy of ourselves on the
+ /// heap and returns a pointer to the duplicated node.
+ static TAO_Queued_Data* duplicate (TAO_Queued_Data &qd);
+
+ /// Consolidate this fragments chained message blocks into one.
+ /// @return -1 if consolidation failed, eg out or memory, otherwise 0
+ int consolidate (void);
+
+public:
+
+ /// The message block that contains the message.
+ ACE_Message_Block *msg_block_;
+
+ /*!
+ @name Missing Data details
+
+ The \a missing_data_ member contains the number of bytes of
+ data missing from \a msg_block_.
+ */
+ //@{
+ /*! Data missing in the above message that hasn't been read or processed yet,
+ the value TAO_MISSING_DATA_UNDEFINED indicates it hasn't been processed yet,
+ otherwise greater or equal zero. */
+ size_t missing_data_;
+ //@}
+
+ /// Many protocols like GIOP have a major and minor version
+ /// information that would be needed to read and decipher the
+ /// message.
+ CORBA::Octet major_version_;
+ CORBA::Octet minor_version_;
+
+ /// The byte order of the message that is stored in the node.
+ CORBA::Octet byte_order_;
+
+ /// Some messages can be fragmented by the protocol (this is an ORB
+ /// level fragmentation on top of the TCP/IP fragmentation. This
+ /// member indicates whether the message that we have recd. and
+ /// queue already has more fragments that is missing..
+ CORBA::Octet more_fragments_;
+
+ /// The message type of the message
+ TAO_Pluggable_Message_Type msg_type_;
+
+ /// Pounter to the next element in the queue.
+ TAO_Queued_Data *next_;
+
+private:
+ /// Replace the datablock with a one allocated on the heap or
+ /// allocator
+ static void replace_data_block (ACE_Message_Block &mb);
+
+private:
+
+ /// The allocator used to allocate this class.
+ ACE_Allocator *allocator_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "tao/Queued_Data.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /*TAO_QUEUED_DATA_H*/