summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h1536
1 files changed, 1536 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
new file mode 100644
index 00000000000..8e23294c9bc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
@@ -0,0 +1,1536 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file AVStreams_i.h
+ *
+ * $Id$
+ *
+ * @author Sumedh Mungee <sumedh@cs.wustl.edu>
+ * @author Nagarajan Surendran <naga@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef AVSTREAMS_I_H
+#define AVSTREAMS_I_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/AV/AV_Core.h"
+
+#include "orbsvcs/AV/AV_export.h"
+#include "orbsvcs/CosPropertyS.h"
+#include "orbsvcs/AVStreamsS.h"
+#include "orbsvcs/Property/CosPropertyService_i.h"
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/AV/AV_Core.h"
+#include "orbsvcs/AV/Endpoint_Strategy.h"
+#include "orbsvcs/Null_MediaCtrlS.h"
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+
+#include "ace/OS.h"
+#include "ace/SOCK_Dgram_Mcast.h"
+#include "ace/ATM_Addr.h"
+#include "ace/Containers_T.h"
+#include "ace/Process.h"
+#include "ace/SOCK_CODgram.h"
+#include "ace/SOCK_Connector.h"
+#include "ace/Connector.h"
+#include "ace/Acceptor.h"
+#include "ace/SOCK_Stream.h"
+#include "ace/Svc_Handler.h"
+#include "ace/SOCK_Acceptor.h"
+
+#define FLOWSPEC_MAX 5
+// for the Hash_Map helper classes.
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FlowEndPoint_var,ACE_Null_Mutex> FlowEndPoint_Map;
+typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FlowEndPoint_var> FlowEndPoint_Map_Entry;
+typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FlowEndPoint_var,ACE_Null_Mutex> FlowEndPoint_Map_Iterator;
+
+typedef ACE_Hash_Map_Manager <ACE_CString,TAO_AV_Flow_Handler*,ACE_Null_Mutex> Flow_Handler_Map;
+typedef ACE_Hash_Map_Entry <ACE_CString,TAO_AV_Flow_Handler*> Flow_Handler_Map_Entry;
+typedef ACE_Hash_Map_Iterator <ACE_CString,TAO_AV_Flow_Handler*,ACE_Null_Mutex> Flow_Handler_Map_Iterator;
+
+
+
+class TAO_AV_Export AV_Null_MediaCtrl
+ : public virtual POA_Null_MediaCtrl
+{
+public:
+ AV_Null_MediaCtrl (void);
+
+protected:
+
+ virtual ~AV_Null_MediaCtrl (void);
+
+};
+
+/**
+ * @class TAO_Basic_StreamCtrl
+ * @brief Base class for StreamCtrl, implements basic stream start
+ * and stop functionality.
+ */
+class TAO_AV_Export TAO_Basic_StreamCtrl
+ : public virtual POA_AVStreams::Basic_StreamCtrl,
+ public virtual TAO_PropertySet
+{
+
+public:
+ /// Default Constructor
+ TAO_Basic_StreamCtrl (void);
+
+ /// Stop the transfer of data of the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the transfer of data in the stream.
+ /// Empty the_spec means apply operation to all flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Tears down the stream. This will close the connection, and delete
+ * the streamendpoint and vdev associated with this stream
+ * Empty the_spec means apply operation to all flows
+ */
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Changes the QoS associated with the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Used by StreamEndPoint and VDev to inform StreamCtrl of events.
+ /// E.g., loss of flow, reestablishment of flow, etc..
+ virtual void push_event (const struct CosPropertyService::Property & the_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to control the flow protocol parameters.
+ virtual void set_FPStatus (const AVStreams::flowSpec &the_spec,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError));
+
+ /// Not implemented in the light profile, will raise the notsupported
+ /// exception
+ virtual CORBA::Object_ptr get_flow_connection (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+ /// Not implemented in the light profile, will raise the notsupported
+ /// exception
+ virtual void set_flow_connection (const char *flow_name,
+ CORBA::Object_ptr flow_connection
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+protected:
+
+ /// Destructor.
+ virtual ~TAO_Basic_StreamCtrl (void);
+
+
+ /// The Virtual Devices for this stream
+ AVStreams::VDev_var vdev_a_;
+ AVStreams::VDev_var vdev_b_;
+
+ /// The Endpoints for this stream
+ AVStreams::StreamEndPoint_A_var sep_a_;
+ AVStreams::StreamEndPoint_B_var sep_b_;
+
+ /// Hash table for the flow names and its corresponding flowconnection object reference.
+ typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FlowConnection_var,ACE_Null_Mutex> FlowConnection_Map;
+ typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FlowConnection_var,ACE_Null_Mutex> FlowConnection_Map_Iterator;
+ typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FlowConnection_var> FlowConnection_Map_Entry;
+ FlowConnection_Map flow_connection_map_;
+ AVStreams::FlowConnection_seq flowConnections_;
+
+ ///sequence of flow names.
+ u_int flow_count_;
+ AVStreams::flowSpec flows_;
+};
+
+class TAO_AV_Export TAO_Negotiator
+ : public POA_AVStreams::Negotiator
+{
+public:
+ virtual CORBA::Boolean negotiate (AVStreams::Negotiator_ptr remote_negotiator,
+ const AVStreams::streamQoS &qos_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+};
+
+class TAO_MCastConfigIf;
+
+class TAO_AV_Export MMDevice_Map_Hash_Key
+{
+public:
+ /// default constructor.
+ MMDevice_Map_Hash_Key (void);
+
+ /// constructor.
+ MMDevice_Map_Hash_Key (AVStreams::MMDevice_ptr mmdevice);
+
+ /// copy constructor.
+ MMDevice_Map_Hash_Key (const MMDevice_Map_Hash_Key&);
+
+ /// destructor.
+ ~MMDevice_Map_Hash_Key (void);
+
+ /// operator== needed by ACE_Hash_Map_Manager.
+ bool operator == (const MMDevice_Map_Hash_Key &hash_key) const;
+
+ /// operator== needed by ACE_Hash_Map_Manager.
+ friend bool operator < (const MMDevice_Map_Hash_Key &left,
+ const MMDevice_Map_Hash_Key &right);
+
+ /// hash function for this mmdevice.
+ u_long hash (void) const;
+
+ static const int hash_maximum_;
+protected:
+ AVStreams::MMDevice_ptr mmdevice_;
+};
+
+/**
+ * @class TAO_StreamCtrl
+ * @brief Implementation the A/V StreamCtrl class. this class
+ * is used to control the stream. It should be subclassed
+ * by applications that want to provide more control features.
+ */
+class TAO_AV_Export TAO_StreamCtrl
+ : public virtual POA_AVStreams::StreamCtrl,
+ public virtual TAO_Basic_StreamCtrl
+{
+
+public:
+
+ /// Default Constructor
+ TAO_StreamCtrl (void);
+
+ /// virtual destructor.
+ virtual ~TAO_StreamCtrl (void);
+
+ /// Stop the transfer of data of the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the transfer of data in the stream.
+ /// Empty the_spec means apply operation to all flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Tears down the stream. This will close the connection, and delete
+ * the streamendpoint and vdev associated with this stream
+ * Empty the_spec means apply operation to all flows
+ */
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /**
+ * Establish a stream between a_party and b_party,
+ * with qos the_qos, and for the flows in the_flows
+ * if the_flows is empty, bind all the flows
+ * Causes a connection to be established between the StreamEndpoints.
+ * Returns success/failure
+ */
+ virtual CORBA::Boolean bind_devs (AVStreams::MMDevice_ptr a_party,
+ AVStreams::MMDevice_ptr b_party,
+ AVStreams::streamQoS& the_qos,
+ const AVStreams::flowSpec& the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /**
+ * Establish a connection between two streamendpoints. This can
+ * be used if the streamendpoints have been created independent of
+ * a MMDevice
+ */
+ virtual CORBA::Boolean bind (AVStreams::StreamEndPoint_A_ptr a_party,
+ AVStreams::StreamEndPoint_B_ptr b_party,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ virtual void unbind_dev (AVStreams::MMDevice_ptr dev,
+ const AVStreams::flowSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow));
+
+ /// Unbind the_ep from the stream. Empty the_spec means apply to all flows.
+ virtual void unbind_party (AVStreams::StreamEndPoint_ptr the_ep,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow));
+
+ /// unbind the stream. Same effect as Basic_StreamCtrl::destroy ()
+ virtual void unbind (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed));
+
+ virtual AVStreams::VDev_ptr get_related_vdev (AVStreams::MMDevice_ptr adev,
+ AVStreams::StreamEndPoint_out sep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed));
+
+ /// Changes the QoS associated with the stream
+ /// Empty the_spec means apply operation to all flows
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+protected:
+
+ struct MMDevice_Map_Entry
+ {
+ AVStreams::StreamEndPoint_var sep_;
+ AVStreams::VDev_var vdev_;
+ AVStreams::flowSpec flowspec_;
+ AVStreams::streamQoS qos_;
+ };
+
+ typedef ACE_Hash_Map_Manager <MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> MMDevice_Map;
+ typedef ACE_Hash_Map_Iterator <MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> MMDevice_Map_Iterator;
+
+ MMDevice_Map mmdevice_a_map_;
+ MMDevice_Map mmdevice_b_map_;
+ TAO_MCastConfigIf *mcastconfigif_;
+ AVStreams::MCastConfigIf_var mcastconfigif_ptr_;
+ AVStreams::StreamCtrl_var streamctrl_;
+ CORBA::ULong source_id_;
+};
+
+class TAO_AV_Export TAO_MCastConfigIf
+ : public virtual POA_AVStreams::MCastConfigIf,
+ public virtual TAO_PropertySet
+{
+public:
+
+ enum Peer_Interface {VDEV = 0, FLOWENDPOINT=1};
+ struct Peer_Info
+ {
+ AVStreams::VDev_var peer_;
+ AVStreams::FlowEndPoint_var fep_;
+ AVStreams::streamQoS qos_;
+ AVStreams::flowSpec flow_spec_;
+ Peer_Interface interface_;
+ };
+
+ /// Default constructor.
+ TAO_MCastConfigIf (void);
+
+ /// Dtor
+ ~TAO_MCastConfigIf (void);
+
+ virtual CORBA::Boolean set_peer (CORBA::Object_ptr peer,
+ AVStreams::streamQoS & the_qos,
+ const AVStreams::flowSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ virtual void configure (const CosPropertyService::Property & a_configuration
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_initial_configuration (const CosPropertyService::Properties & initial
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void set_format (const char * flowName,
+ const char * format_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ virtual void set_dev_params (const char * flowName,
+ const CosPropertyService::Properties & new_params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+protected:
+ /// checks whether the flowname is in the flow_spec.
+ int in_flowSpec (const AVStreams::flowSpec& flow_spec, const char *flow_name);
+
+ /// Multicast socket.
+ ACE_SOCK_Dgram_Mcast sock_mcast_;
+
+ /// Initial configuration to be distributed to all B parties when they join.
+ CosPropertyService::Properties initial_configuration_;
+
+ ACE_DLList<Peer_Info> peer_list_;
+ ACE_DLList_Iterator<Peer_Info> peer_list_iterator_;
+};
+
+/**
+ * @class TAO_AV_QoS
+ * @brief Class for getting and setting the QoS characteristics of
+ * an AV Stream.
+ */
+class TAO_AV_Export TAO_AV_QoS
+{
+public:
+ /// constructor.
+ TAO_AV_QoS (void);
+
+ /// constructor taking a stream qos parameter.
+ TAO_AV_QoS (AVStreams::streamQoS &stream_qos);
+
+ /// sets the maps with the QoS paramter.
+ int set (AVStreams::streamQoS &stream_qos);
+
+ /// gets the flow_qos.
+ int get_flow_qos (const char *flowname,AVStreams::QoS &flow_qos);
+
+ /// converts the application level QoS to Network-level QoS.
+ int convert (AVStreams::streamQoS &network_qos);
+
+
+protected:
+ /// Stream Qos.
+ AVStreams::streamQoS stream_qos_;
+
+ ACE_Hash_Map_Manager<ACE_CString,AVStreams::QoS,ACE_Null_Mutex> qos_map_;
+};
+
+
+// Forward declarations.
+class TAO_AV_TCP_Flow_Handler;
+class TAO_AV_UDP_Flow_Handler;
+class TAO_AV_UDP_MCast_Flow_Handler;
+class TAO_AV_Protocol_Object;
+class TAO_AV_Callback;
+class TAO_AV_SourceManager;
+class TAO_AV_Source;
+class TAO_AV_RTP_State;
+class TAO_AV_Flow_Handler;
+
+/**
+ * @class TAO_Base_StreamEndPoint
+ *
+ * Base class for the A/V StreamEndPoint class. this class
+ * is used to control the stream. It should be subclassed
+ * by applications that want to provide more control features.
+ */
+class TAO_AV_Export TAO_Base_StreamEndPoint
+ :public virtual TAO_PropertySet
+{
+
+ // @@Naga: Rename this class to TAO_Base_EndPoint since both stream and flowendpoints derive from it.
+public:
+ TAO_Base_StreamEndPoint (void);
+ virtual ~TAO_Base_StreamEndPoint (void);
+
+ /// called when streamendpoint is instantiated
+ virtual int handle_open (void);
+
+ /// called when streamendpoint is being destructed
+ virtual int handle_close (void);
+
+ /// Application needs to define this
+ virtual int handle_stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual int handle_start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual int handle_destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_preconnect (AVStreams::flowSpec &the_spec);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_postconnect (AVStreams::flowSpec &the_spec);
+
+ /// Application needs to define this
+ virtual CORBA::Boolean handle_connection_requested (AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ virtual int get_callback (const char *flowname,
+ TAO_AV_Callback *&callback);
+
+ virtual int get_control_callback (const char *flowname,
+ TAO_AV_Callback *&callback);
+
+ virtual int set_protocol_object (const char *flowname,
+ TAO_AV_Protocol_Object *object);
+
+ virtual void set_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ virtual void set_control_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ TAO_AV_QoS &qos (void);
+
+ void protocol_object_set (void);
+ int is_protocol_object_set (void);
+
+protected:
+
+ TAO_AV_QoS qos_;
+ Flow_Handler_Map flow_handler_map_;
+ Flow_Handler_Map control_flow_handler_map_;
+ int protocol_object_set_;
+};
+
+// Forward declarations.
+class TAO_AV_Acceptor;
+class TAO_AV_Connector;
+class TAO_Forward_FlowSpec_Entry;
+class TAO_Reverse_FlowSpec_Entry;
+
+/**
+ * @class TAO_StreamEndPoint
+ * @brief The Stream EndPoint. Used to implement one endpoint of a stream
+ * that implements the transport layer.
+ */
+class TAO_AV_Export TAO_StreamEndPoint
+ : public virtual POA_AVStreams::StreamEndPoint,
+ public virtual TAO_Base_StreamEndPoint
+{
+
+public:
+ /// Constructor
+ TAO_StreamEndPoint (void);
+
+ /// Stop the stream. Empty the_spec means, for all the flows
+ virtual void stop (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Start the stream, Empty the_spec means, for all the flows
+ virtual void start (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Destroy the stream, Empty the_spec means, for all the flows
+ virtual void destroy (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow));
+
+ /// Called by StreamCtrl. responder is the peer to connect to
+ virtual CORBA::Boolean connect (AVStreams::StreamEndPoint_ptr responder,
+ AVStreams::streamQoS& qos_spec,
+ const AVStreams::flowSpec& the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Called by the peer StreamEndPoint. The flow_spec indicates the
+ /// flows (which contain transport addresses etc.)
+ virtual CORBA::Boolean request_connection (AVStreams::StreamEndPoint_ptr initiator,
+ CORBA::Boolean is_mcast,
+ AVStreams::streamQoS &qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpDenied,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError));
+
+ /// Change the transport qos on a stream
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ virtual int change_qos (AVStreams::streamQoS &new_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Used to restrict the set of protocols
+ virtual CORBA::Boolean set_protocol_restriction (const AVStreams::protocolSpec &the_pspec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// disconnect the flows
+ virtual void disconnect (const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed));
+
+ /// Used to control the flow
+ virtual void set_FPStatus (const AVStreams::flowSpec &the_spec,
+ const char *fp_name,
+ const CORBA::Any &fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::FPError));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual CORBA::Object_ptr get_fep (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual char * add_fep (CORBA::Object_ptr the_fep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Not implemented in the light profile, throws notsupported
+ virtual void remove_fep (const char *fep_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Used to "attach" a negotiator to the endpoint
+ virtual void set_negotiator (AVStreams::Negotiator_ptr new_negotiator
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used for public key encryption.
+ virtual void set_key (const char *flow_name,
+ const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Used to set a unique id for packets sent by this streamendpoint
+ virtual void set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint (void);
+
+ CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Helper methods to implement add_fep()
+ char* add_fep_i (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+ char* add_fep_i_add_property (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// translate from application level to network level qos.
+ int translate_qos (const AVStreams::streamQoS& application_qos,
+ AVStreams::streamQoS& network_qos);
+
+ /// Count of the number of flows in this streamendpoint, used to
+ /// generate unique names for the flows.
+ u_int flow_count_;
+
+ /// current flow number used for system generation of flow names.
+ u_int flow_num_;
+
+ /// hash table for the flownames and its corresponding flowEndpoint reference.
+ FlowEndPoint_Map fep_map_;
+
+ /// sequence of supported flow names.
+ AVStreams::flowSpec flows_;
+
+ /// source id used for multicast.
+ CORBA::Long source_id_;
+
+ /// our local negotiator for QoS.
+ AVStreams::Negotiator_var negotiator_;
+
+ /// Our available list of protocols.
+ AVStreams::protocolSpec protocols_;
+
+ /// Chosen protocol for this streamendpoint based on availableprotocols property.
+ CORBA::String_var protocol_;
+
+ /// Key used for encryption.
+ AVStreams::key key_;
+
+/// TAO_Forward_FlowSpec_Entry forward_entries_ [FLOWSPEC_MAX];
+/// TAO_Reverse_FlowSpec_Entry reverse_entries_ [FLOWSPEC_MAX];
+ u_short mcast_port_;
+ ACE_CString mcast_addr_;
+ ACE_Hash_Map_Manager <ACE_CString, TAO_FlowSpec_Entry*,ACE_Null_Mutex> mcast_entry_map_;
+ TAO_AV_FlowSpecSet forward_flow_spec_set;
+ TAO_AV_FlowSpecSet reverse_flow_spec_set;
+ AVStreams::StreamEndPoint_var peer_sep_;
+ AVStreams::SFPStatus *sfp_status_;
+ AVStreams::StreamCtrl_var streamctrl_;
+};
+
+/**
+ * @class TAO_StreamEndPoint_A
+ * @brief The "A" side of a streamendpoint
+ */
+class TAO_AV_Export TAO_StreamEndPoint_A :
+ public virtual POA_AVStreams::StreamEndPoint_A,
+ public virtual TAO_StreamEndPoint
+{
+
+public:
+ /// Constructor
+ TAO_StreamEndPoint_A (void);
+
+ /// Used for ATM-style multicast
+ virtual CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Used for ATM-style multicast
+ virtual CORBA::Boolean connect_leaf (AVStreams::StreamEndPoint_B_ptr the_ep,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_flows
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::notSupported));
+
+ /// Used to remove a multicast leaf
+ virtual void disconnect_leaf (AVStreams::StreamEndPoint_B_ptr the_ep,
+ const AVStreams::flowSpec &theSpec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::notSupported));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint_A (void);
+
+};
+
+// For backward compatibility.
+#define TAO_Client_StreamEndPoint TAO_StreamEndPoint_A
+#define TAO_Server_StreamEndPoint TAO_StreamEndPoint_B
+
+/**
+ * @class TAO_StreamEndPoint_B
+ * @brief The "B" side of a streamendpoint
+ */
+class TAO_AV_Export TAO_StreamEndPoint_B :
+ public virtual POA_AVStreams::StreamEndPoint_B,
+ public virtual TAO_StreamEndPoint
+{
+ // = DESCRIPTION
+ // The "B" side of a streamendpoint
+public:
+ /// Constructor
+ TAO_StreamEndPoint_B (void);
+
+ /// Used for internet-style multicast
+ virtual CORBA::Boolean multiconnect (AVStreams::streamQoS &the_qos,
+ AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::FPError));
+
+ /// Destructor
+ virtual ~TAO_StreamEndPoint_B (void);
+};
+
+/**
+ * @class TAO_VDev
+ * @brief Implements the VDev interface. One of these is created per
+ * connection, and represents device-specific parameters.
+ */
+class TAO_AV_Export TAO_VDev
+ :public virtual TAO_PropertySet,
+ public virtual POA_AVStreams::VDev
+{
+
+public:
+ /// Default Constructor
+ TAO_VDev (void);
+
+ /// Called to tell the vdev who the streamctrl, peer vdev is
+ virtual CORBA::Boolean set_peer (AVStreams::StreamCtrl_ptr the_ctrl,
+ AVStreams::VDev_ptr the_peer_dev,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Used to set the streamctrl and multicast device
+ virtual CORBA::Boolean set_Mcast_peer (AVStreams::StreamCtrl_ptr the_ctrl,
+ AVStreams::MCastConfigIf_ptr a_mcastconfigif,
+ AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// Called by the peer VDev to configure the device (catch all)
+ virtual void configure (const CosPropertyService::Property &the_config_mesg
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// Used to set a format on a flowname
+ virtual void set_format (const char *flowName,
+ const char *format_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// Used to set device parameters
+ virtual void set_dev_params (const char *flowName,
+ const CosPropertyService::Properties &new_params
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// Called to change QoS of the device
+ virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &the_qos,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+protected:
+ /// Destructor for a servant should be protected or private.
+ /// Use _remove_ref() to delete this servant.
+ virtual ~TAO_VDev (void);
+
+ /// hook called after set_peer is done to set the media ctrl of the peer vdev.
+ virtual CORBA::Boolean set_media_ctrl (CORBA::Object_ptr media_ctrl
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// My stream controller
+ AVStreams::StreamCtrl_var streamctrl_;
+
+ /// My peer
+ AVStreams::VDev_var peer_;
+
+ /// The multicast VDev peer.
+ AVStreams::MCastConfigIf_var mcast_peer_;
+};
+
+class TAO_AV_Endpoint_Strategy;
+
+/**
+ * @class TAO_MMDevice
+ * @brief Implements a factory to create Endpoints and VDevs
+ */
+class TAO_AV_Export TAO_MMDevice
+ :public virtual POA_AVStreams::MMDevice,
+ public virtual TAO_PropertySet
+{
+
+public:
+
+ /// Constructor
+ enum MMDevice_Type {MMDEVICE_A = 0,MMDEVICE_B = 1};
+ TAO_MMDevice (TAO_AV_Endpoint_Strategy *endpoint_strategy_);
+
+ virtual AVStreams::StreamEndPoint_ptr create_A_B (MMDevice_Type type,
+ AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Can be used to request the MMDevice to create a new StreamCtrl,
+ /// and call bind_devs on it
+ virtual AVStreams::StreamCtrl_ptr bind (AVStreams::MMDevice_ptr peer_device,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Multicast bind
+ virtual AVStreams::StreamCtrl_ptr bind_mcast (AVStreams::MMDevice_ptr first_peer,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out is_met,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::noSuchFlow,
+ AVStreams::QoSRequestFailed));
+
+ /// Called by StreamCtrl to create a "A" type streamandpoint and vdev
+ virtual AVStreams::StreamEndPoint_A_ptr create_A (AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow));
+
+ /// Called by StreamCtrl to create a "B" type streamandpoint and vdev
+ virtual AVStreams::StreamEndPoint_B_ptr create_B (AVStreams::StreamCtrl_ptr the_requester,
+ AVStreams::VDev_out the_vdev,
+ AVStreams::streamQoS &the_qos,
+ CORBA::Boolean_out met_qos,
+ char *&named_vdev,
+ const AVStreams::flowSpec &the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::notSupported,
+ AVStreams::QoSRequestFailed,
+ AVStreams::noSuchFlow));
+
+ /// Remove the StreamEndPoint and the related vdev
+ virtual void destroy (AVStreams::StreamEndPoint_ptr the_ep,
+ const char *vdev_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual char * add_fdev (CORBA::Object_ptr the_fdev
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual CORBA::Object_ptr get_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow));
+
+ /// Not supported in the light profile, raises notsupported
+ virtual void remove_fdev (const char *flow_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::noSuchFlow,
+ AVStreams::streamOpFailed));
+
+ /// Destructor
+ virtual ~TAO_MMDevice (void);
+
+protected:
+ /// Helper method to implement add_fdev()
+ char* add_fdev_i (AVStreams::FDev_ptr fdev
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported,
+ AVStreams::streamOpFailed));
+
+protected:
+
+ TAO_AV_Endpoint_Strategy *endpoint_strategy_;
+
+ /// Count of the number of flows in this MMDevice , used to
+ /// generate unique names for the flows.
+ u_int flow_count_;
+
+ /// current flow number used for system generation of flow names.
+ u_int flow_num_;
+
+ typedef ACE_Hash_Map_Manager <ACE_CString,AVStreams::FDev_var,ACE_Null_Mutex> FDev_Map;
+ typedef ACE_Hash_Map_Iterator <ACE_CString,AVStreams::FDev_var,ACE_Null_Mutex> FDev_Map_Iterator;
+ typedef ACE_Hash_Map_Entry <ACE_CString,AVStreams::FDev_var> FDev_Map_Entry;
+
+ /// hash table for the flownames and its corresponding flowEndpoint
+ /// reference.
+ FDev_Map fdev_map_;
+
+ /// sequence of supported flow names.
+ AVStreams::flowSpec flows_;
+
+ TAO_StreamCtrl *stream_ctrl_;
+};
+
+class TAO_FlowConsumer;
+class TAO_FlowProducer;
+
+/**
+ * @class TAO_FlowConnection
+ * @brief This class currently supports only one producer and one
+ * consumer per flow.
+ */
+class TAO_AV_Export TAO_FlowConnection
+ : public virtual POA_AVStreams::FlowConnection,
+ public virtual TAO_PropertySet
+{
+
+public:
+ /// default constructor.
+ TAO_FlowConnection (void);
+
+ /// stop this flow.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// destroy this flow.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// modify the QoS for this flow.
+ virtual CORBA::Boolean modify_QoS (AVStreams::QoS & new_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed));
+
+ /// use the specified flow protocol for this flow.
+ virtual CORBA::Boolean use_flow_protocol (const char * fp_name,
+ const CORBA::Any & fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported));
+
+ /// pushes an event , to be handled by the application.
+ virtual void push_event (const AVStreams::streamEvent & the_event
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// connect 2 Flow Devices.
+ virtual CORBA::Boolean connect_devs (AVStreams::FDev_ptr a_party,
+ AVStreams::FDev_ptr b_party,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::streamOpFailed,
+ AVStreams::streamOpDenied,
+ AVStreams::QoSRequestFailed));
+
+ /// Connect a flow producer and consumer under this flow connection.
+ virtual CORBA::Boolean connect (AVStreams::FlowProducer_ptr flow_producer,
+ AVStreams::FlowConsumer_ptr flow_consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::FEPMismatch,
+ AVStreams::alreadyConnected));
+
+ /// disconnect this flow connection.
+ virtual CORBA::Boolean disconnect (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// adds the producer to this flow connection.
+ virtual CORBA::Boolean add_producer (AVStreams::FlowProducer_ptr flow_producer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected,
+ AVStreams::notSupported));
+
+ /// adds a consumer to this flow connection.
+ virtual CORBA::Boolean add_consumer (AVStreams::FlowConsumer_ptr flow_consumer,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::alreadyConnected));
+
+ /// drops a flow endpoint from the flow.
+ virtual CORBA::Boolean drop (AVStreams::FlowEndPoint_ptr target
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected));
+
+ int set_mcast_addr (ACE_CString addr,u_short port);
+ void set_protocol (const char *protocol);
+protected:
+ typedef ACE_Unbounded_Set<AVStreams::FlowProducer_ptr> FlowProducer_Set;
+ typedef ACE_Unbounded_Set_Iterator<AVStreams::FlowProducer_ptr> FlowProducer_SetItor;
+ typedef ACE_Unbounded_Set<AVStreams::FlowConsumer_ptr> FlowConsumer_Set;
+ typedef ACE_Unbounded_Set_Iterator<AVStreams::FlowConsumer_ptr> FlowConsumer_SetItor;
+
+ /// The multicast address returned by the producer.
+ FlowProducer_Set flow_producer_set_;
+ FlowConsumer_Set flow_consumer_set_;
+ CORBA::String_var fp_name_;
+ CORBA::Any fp_settings_;
+ CORBA::String_var producer_address_;
+
+ /// IP Multicasting is used.
+ int ip_multicast_;
+ TAO_MCastConfigIf *mcastconfigif_i_;
+ AVStreams::MCastConfigIf_var mcastconfigif_;
+ u_short mcast_port_;
+ ACE_CString mcast_addr_;
+ CORBA::String_var protocol_;
+};
+
+/**
+ * @class TAO_FlowEndPoint
+ * @brief This class is used per flow e.g video flow and an audio flow
+ * to encapsulate the transport details.
+ */
+class TAO_AV_Export TAO_FlowEndPoint :
+ public virtual POA_AVStreams::FlowEndPoint,
+ public virtual TAO_Base_StreamEndPoint
+{
+
+public:
+
+ ///default constructor.
+ TAO_FlowEndPoint (void);
+
+ TAO_FlowEndPoint (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format);
+
+ int open (const char *flowname,
+ AVStreams::protocolSpec &protocols,
+ const char *format);
+
+ int set_flowname (const char *flowname);
+
+ virtual void set_flow_handler (const char *flowname,
+ TAO_AV_Flow_Handler *handler);
+
+ virtual int set_protocol_object (const char *flowname,
+ TAO_AV_Protocol_Object *object);
+
+ /// lock the flow endpoint for a particular flow.
+ virtual CORBA::Boolean lock (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// unlock the flow endpoint for subsequent use.
+ virtual void unlock (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+
+ /// destroy this flow.
+ virtual void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// get method for the related streamendpoint under which this
+ /// flowendpoint is.
+ virtual AVStreams::StreamEndPoint_ptr related_sep(ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// set method for the related streamendpoint under which this
+ /// flowendpoint is.
+ virtual void related_sep (AVStreams::StreamEndPoint_ptr related_sep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual AVStreams::FlowConnection_ptr related_flow_connection(ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ // accessor for the related flow connection attribute.
+
+ /// set method for the related flow connection attribute.
+ virtual void related_flow_connection (AVStreams::FlowConnection_ptr related_flow_connection
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// returns the other flowendpoint to which this is connected.
+ virtual AVStreams::FlowEndPoint_ptr get_connected_fep (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notConnected,
+ AVStreams::notSupported));
+
+ //// use the specified flow protocol.
+ virtual CORBA::Boolean use_flow_protocol (const char * fp_name,
+ const CORBA::Any & fp_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::FPError,
+ AVStreams::notSupported));
+
+ /// sets the data format.
+ virtual void set_format (const char * format
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// sets the device parameters.
+ virtual void set_dev_params (const CosPropertyService::Properties & new_settings
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::PropertyException,
+ AVStreams::streamOpFailed));
+
+ /// sets the list of protocols to be used.
+ virtual void set_protocol_restriction (const AVStreams::protocolSpec & the_spec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::notSupported));
+
+ /// checks whether the passed flowendpoint is compatible with this.
+ virtual CORBA::Boolean is_fep_compatible (AVStreams::FlowEndPoint_ptr fep
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::formatMismatch,
+ AVStreams::deviceQosMismatch));
+
+ /// sets the peer flowendpoint.
+ virtual CORBA::Boolean set_peer (AVStreams::FlowConnection_ptr the_fc,
+ AVStreams::FlowEndPoint_ptr the_peer_fep,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed,
+ AVStreams::streamOpFailed));
+
+ /// sets the multicast peer flowendpoint, not implemented.
+ virtual CORBA::Boolean set_Mcast_peer (AVStreams::FlowConnection_ptr the_fc,
+ AVStreams::MCastConfigIf_ptr a_mcastconfigif,
+ AVStreams::QoS & the_qos
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::QoSRequestFailed));
+
+
+ /**
+ * This should be implemented in both the FlowProducer and consumer and hence is
+ * pure virtual since we need to know the role of the flowendpoint to create appropriate
+ * protocol objects. eg. in SFP to create Producer Object/ Consumer Object.
+ */
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+
+ /// connect to the peer endpoint.
+ virtual CORBA::Boolean connect_to_peer_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ /**
+ * This should be implemented in both the FlowProducer and consumer and hence is
+ * pure virtual since we need to know the role of the flowendpoint to create appropriate
+ * protocol objects. eg. in SFP to create Producer Object/ Consumer Object.
+ */
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+
+ /// listen request from the peer.
+ virtual char * go_to_listen_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+
+protected:
+ /// The related streamendpoint.
+ AVStreams::StreamEndPoint_var related_sep_;
+
+ /// The related flow connection reference
+ AVStreams::FlowConnection_var related_flow_connection_;
+
+ /// The peer flowendpoint reference.
+ AVStreams::FlowEndPoint_var peer_fep_;
+
+ /// Available protocols for this flowendpoint.
+ AVStreams::protocolSpec protocols_;
+
+ /// Address information for the protocols.
+ AVStreams::protocolSpec protocol_addresses_;
+
+ /// The multicast peer endpoint.
+ AVStreams::MCastConfigIf_var mcast_peer_;
+
+ /// Lock.
+ CORBA::Boolean lock_;
+
+ CORBA::String_var format_;
+ CORBA::String_var flowname_;
+ CosPropertyService::Properties dev_params_;
+ TAO_AV_FlowSpecSet flow_spec_set_;
+ CORBA::String_var reverse_channel_;
+};
+
+class TAO_AV_Export TAO_FlowProducer:
+ public virtual POA_AVStreams::FlowProducer,
+ public virtual TAO_FlowEndPoint
+{
+public:
+ /// default constructor
+ TAO_FlowProducer (void);
+
+ TAO_FlowProducer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format);
+
+ /**
+ * get the reverse channel, to be used for feedback for protocols like UDP.
+ * @@Naga: In the spec this is defined in the TAO_FlowProducer but it seems more reasonable for this
+ * to be in a FlowEndPoint since any of the flowendpoints can be made to listen. So in the case of
+ * UDP if the producer is listening and the consumer connects (logically) then the producer needs to
+ * know the reverse channel on its peer fep to send data to.
+ */
+ virtual char * get_rev_channel (const char * pcol_name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// stop this flow, to be overridden by the application.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow, to be overridden by the application.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ /// connect to the multicast address, not implemented.
+ virtual char * connect_mcast (AVStreams::QoS & the_qos,
+ CORBA::Boolean_out is_met,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::notSupported,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+
+
+ /// sets the public key to be used for encryption of the data.
+ virtual void set_key (const AVStreams::key & the_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// sets the source id of this flow producer so that it can be used
+ /// to distinguish this producer from others in the multicast case.
+ virtual void set_source_id (CORBA::Long source_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+protected:
+ /// source id of this producer.
+ CORBA::Long source_id_;
+ CORBA::String_var peer_address_;
+};
+
+class TAO_AV_Export TAO_FlowConsumer :
+ public virtual POA_AVStreams::FlowConsumer,
+ public virtual TAO_FlowEndPoint
+{
+public:
+ /// default constructor.
+ TAO_FlowConsumer (void);
+
+ TAO_FlowConsumer (const char *flowname,
+ AVStreams::protocolSpec protocols,
+ const char *format);
+
+ /// stop this flow, to be overridden by the application.
+ virtual void stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// start this flow, to be overridden by the application.
+ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
+ virtual CORBA::Boolean connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+};
+
+/**
+ * @class TAO_MediaControl
+ * @brief Abstract Mediacontrol class.
+ * The following are to be handled by the specialized media control
+ * for the specific media like camera, speaker.
+ */
+class TAO_AV_Export TAO_MediaControl
+ :public virtual POA_AVStreams::MediaControl
+{
+
+public:
+ /// default constructor
+ TAO_MediaControl (void);
+
+ virtual AVStreams::Position get_media_position (AVStreams::PositionOrigin an_origin,
+ AVStreams::PositionKey a_key
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::MediaControl::PostionKeyNotSupported)) =0;
+
+ virtual void set_media_position (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::MediaControl::PostionKeyNotSupported,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void start (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void pause (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void resume (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+ virtual void stop (const AVStreams::Position & a_position
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::InvalidPosition)) =0;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include "orbsvcs/AV/Transport.h"
+
+#if defined (__ACE_INLINE__)
+#include "tao/debug.h"
+#include "orbsvcs/AV/AVStreams_i.i"
+#endif /* __ACE_INLINE__ */
+
+#include "orbsvcs/AV/Flows_T.h"
+
+#include /**/ "ace/post.h"
+#endif /* AVSTREAMS_I_H */