summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/AV/Transport.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/Transport.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.h345
1 files changed, 345 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.h b/TAO/orbsvcs/orbsvcs/AV/Transport.h
new file mode 100644
index 00000000000..c6e3f63ba57
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.h
@@ -0,0 +1,345 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Transport.h
+ *
+ * $Id$
+ *
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_AV_TRANSPORT_H
+#define TAO_AV_TRANSPORT_H
+#include /**/ "ace/pre.h"
+
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/AV_Core.h"
+
+#include "orbsvcs/AV/AV_export.h"
+
+#include "ace/Service_Object.h"
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Acceptor.h"
+#include "ace/SOCK_Connector.h"
+#include "ace/Connector.h"
+#include "ace/Addr.h"
+#include "ace/SOCK_Dgram.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward declarations.
+class TAO_AV_Core;
+class TAO_AV_Transport_Factory;
+class TAO_AV_Protocol_Object;
+class TAO_AV_Callback;
+class TAO_AV_Transport;
+
+/**
+ * @class TAO_AV_Transport_Item
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Transport_Item
+{
+public:
+ /// creator method, the Transport name can only be set when the
+ /// object is created.
+ TAO_AV_Transport_Item (const ACE_CString &name);
+
+ /// return a reference to the character representation of the Transport
+ /// factories name.
+ const ACE_CString &name (void);
+
+ /// return a pointer to the Transport factory.
+ TAO_AV_Transport_Factory *factory (void);
+
+ /// set the factory pointer's valus.
+ void factory (TAO_AV_Transport_Factory *factory);
+
+private:
+ /// Transport factory name.
+ ACE_CString name_;
+
+ /// pointer to factory object.
+ TAO_AV_Transport_Factory *factory_;
+};
+
+
+
+
+class TAO_AV_Flow_Protocol_Factory;
+
+/**
+ * @class TAO_AV_Flow_Protocol_Item
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Flow_Protocol_Item
+{
+public:
+ /// creator method, the Flow_Protocol name can only be set when the
+ /// object is created.
+ TAO_AV_Flow_Protocol_Item (const ACE_CString &name);
+
+ /// return a reference to the character representation of the Flow_Protocol
+ /// factories name.
+ const ACE_CString &name (void);
+
+ /// return a pointer to the Flow_Protocol factory.
+ TAO_AV_Flow_Protocol_Factory *factory (void);
+
+ /// set the factory pointer's valus.
+ void factory (TAO_AV_Flow_Protocol_Factory *factory);
+
+private:
+ /// Flow_Protocol factory name.
+ ACE_CString name_;
+
+ /// pointer to factory object.
+ TAO_AV_Flow_Protocol_Factory *factory_;
+};
+
+
+/**
+ * @class TAO_AV_Flow_Handler
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Flow_Handler
+{
+public:
+ /// Constructor.
+ TAO_AV_Flow_Handler (void);
+
+ virtual ~TAO_AV_Flow_Handler (void);
+ /// Start/stop the flow handler.
+ virtual int start (TAO_FlowSpec_Entry::Role role);
+ virtual int stop (TAO_FlowSpec_Entry::Role role);
+
+ /// Schedule timer. Uses the get_timeout method on the callback.
+ virtual int schedule_timer (void);
+ virtual int cancel_timer (void);
+
+ /// get the transport.
+ TAO_AV_Transport *transport (void);
+
+ /// set/get protocol_object.
+ TAO_AV_Protocol_Object* protocol_object (void);
+ void protocol_object (TAO_AV_Protocol_Object *protocol_object);
+
+ /// set the callback.
+ void callback (TAO_AV_Callback *callback);
+
+ /// Handle timeout. called from reactor.
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+
+ /// set the remote address.
+ virtual int set_remote_address (ACE_Addr *address);
+
+ /// get the underlying event handler. To be overridden by the derived clases.
+ virtual ACE_Event_Handler* event_handler (void) = 0;
+
+ virtual int change_qos (AVStreams::QoS);
+
+protected:
+ TAO_AV_Transport *transport_;
+ TAO_AV_Callback *callback_;
+ TAO_AV_Protocol_Object *protocol_object_;
+ long timer_id_;
+ ACE_Reactor *reactor_;
+ void *timeout_arg_;
+};
+
+// Transports
+/**
+ * @class TAO_AV_Transport
+ * @brief A Base class for the different transport protocols.
+ * All the different transports should derive and implement
+ * the open,close,send and recv methods.
+ */
+class TAO_AV_Export TAO_AV_Transport
+{
+public:
+ TAO_AV_Transport (void);
+
+ virtual ~TAO_AV_Transport (void);
+
+ virtual int open (ACE_Addr *address) = 0;
+
+ virtual int close (void) = 0;
+
+ /// Write the complete Message_Block chain to the connection.
+ virtual int mtu (void) = 0;
+ virtual ACE_Addr *get_peer_addr (void) = 0;
+ virtual ACE_Addr *get_local_addr (void);
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Write the contents of the buffer of length len to the connection.
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Write the contents of iovcnt iovec's to the connection.
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read len bytes from into buf.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read len bytes from into buf using flags.
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0) = 0;
+
+ /// Read received data into the iovec buffers.
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0) = 0;
+
+};
+
+class TAO_Base_StreamEndPoint;
+class TAO_AV_Core;
+class TAO_FlowSpec_Entry;
+
+/**
+ * @class TAO_AV_Acceptor
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Acceptor
+{
+public:
+ TAO_AV_Acceptor (void);
+ virtual ~TAO_AV_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp) = 0;
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory,
+ TAO_AV_Core::Flow_Component flow_comp) = 0;
+
+ const char *flowname ();
+ virtual int close (void) = 0;
+protected:
+ ACE_CString flowname_;
+ TAO_AV_Core *av_core_;
+ ACE_Addr *address_;
+};
+
+/**
+ * @class TAO_AV_Connector
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Connector
+{
+public:
+ TAO_AV_Connector (void);
+ virtual ~TAO_AV_Connector (void);
+ const char *flowname (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory) = 0;
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport,
+ TAO_AV_Core::Flow_Component flow_component) = 0;
+
+ virtual int close (void) = 0;
+protected:
+ ACE_CString flowname_;
+};
+
+
+typedef ACE_Unbounded_Set<TAO_AV_Connector*> TAO_AV_ConnectorSet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Connector*> TAO_AV_ConnectorSetItor;
+
+/**
+ * @class TAO_AV_Connector_Registry
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Connector_Registry
+{
+public:
+ /**
+ * int connect (TAO_FlowSpec_Entry *flowspec,
+ * TAO_AV_Transport *&transport);
+ * TAO_AV_Connector *get_connector (TAO_AV_Core::Protocol protocol);
+ * Return the connector bridges
+ */
+ TAO_AV_Connector_Registry (void);
+ ~TAO_AV_Connector_Registry (void);
+ int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set);
+ int close (TAO_AV_Connector *connector);
+ int close_all (void);
+ TAO_AV_ConnectorSetItor begin (void);
+ TAO_AV_ConnectorSetItor end (void);
+protected:
+ TAO_AV_ConnectorSet connectors_;
+};
+
+typedef ACE_Unbounded_Set<TAO_AV_Acceptor*> TAO_AV_AcceptorSet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Acceptor*> TAO_AV_AcceptorSetItor;
+
+/**
+ * @class TAO_AV_Acceptor_Registry
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Acceptor_Registry
+{
+public:
+ TAO_AV_Acceptor_Registry (void);
+ ~TAO_AV_Acceptor_Registry (void);
+ int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_FlowSpecSet &flow_spec_set);
+ int close (TAO_AV_Acceptor *acceptor);
+ int close_all (void);
+ TAO_AV_AcceptorSetItor begin (void);
+ TAO_AV_AcceptorSetItor end (void);
+protected:
+ int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry);
+ TAO_AV_AcceptorSet acceptors_;
+};
+
+/**
+ * @class TAO_AV_Transport_Factory
+ * @brief
+ */
+class TAO_AV_Export TAO_AV_Transport_Factory : public ACE_Service_Object
+{
+public:
+ /// Initialization hook.
+ TAO_AV_Transport_Factory (void);
+ virtual ~TAO_AV_Transport_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+ int ref_count;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/AV/Transport.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_AV_TRANSPORT_H */