TAO_StreamCtrl Class Reference

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. More...

#include <AVStreams_i.h>

Inheritance diagram for TAO_StreamCtrl:

Inheritance graph
[legend]
Collaboration diagram for TAO_StreamCtrl:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_StreamCtrl (void)
 Default Constructor.

virtual ~TAO_StreamCtrl (void)
 virtual destructor.

virtual void stop (const AVStreams::flowSpec &the_spec)
virtual void start (const AVStreams::flowSpec &the_spec)
virtual void destroy (const AVStreams::flowSpec &the_spec)
virtual CORBA::Boolean bind_devs (AVStreams::MMDevice_ptr a_party, AVStreams::MMDevice_ptr b_party, AVStreams::streamQoS &the_qos, const AVStreams::flowSpec &the_flows)
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)
virtual void unbind_dev (AVStreams::MMDevice_ptr dev, const AVStreams::flowSpec &the_spec)
virtual void unbind_party (AVStreams::StreamEndPoint_ptr the_ep, const AVStreams::flowSpec &the_spec)
 Unbind the_ep from the stream. Empty the_spec means apply to all flows.

virtual void unbind (void)
 unbind the stream. Same effect as Basic_StreamCtrl::destroy ()

virtual AVStreams::VDev_ptr get_related_vdev (AVStreams::MMDevice_ptr adev, AVStreams::StreamEndPoint_out sep)
virtual CORBA::Boolean modify_QoS (AVStreams::streamQoS &new_qos, const AVStreams::flowSpec &the_spec)

Protected Types

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

Protected Attributes

MMDevice_Map mmdevice_a_map_
MMDevice_Map mmdevice_b_map_
TAO_MCastConfigIfmcastconfigif_
AVStreams::MCastConfigIf_var mcastconfigif_ptr_
AVStreams::StreamCtrl_var streamctrl_
CORBA::ULong source_id_

Detailed Description

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.

Definition at line 194 of file AVStreams_i.h.


Member Typedef Documentation

typedef ACE_Hash_Map_Manager<MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> TAO_StreamCtrl::MMDevice_Map [protected]
 

Definition at line 272 of file AVStreams_i.h.

typedef ACE_Hash_Map_Iterator<MMDevice_Map_Hash_Key,MMDevice_Map_Entry,ACE_Null_Mutex> TAO_StreamCtrl::MMDevice_Map_Iterator [protected]
 

Definition at line 273 of file AVStreams_i.h.

Referenced by destroy(), modify_QoS(), start(), stop(), and unbind().


Constructor & Destructor Documentation

TAO_StreamCtrl::TAO_StreamCtrl void   ) 
 

Default Constructor.

Definition at line 391 of file AVStreams_i.cpp.

References TAO_AV_RTCP::alloc_srcid(), ACE_OS::hostname(), ACE_OS::inet_addr(), source_id_, and streamctrl_.

00392   :mcastconfigif_ (0)
00393 {
00394   try
00395     {
00396       this->streamctrl_ = this->_this ();
00397       char buf [BUFSIZ];
00398       int result = ACE_OS::hostname (buf, BUFSIZ);
00399       unsigned long ipaddr = 0;
00400       if (result == 0)
00401         ipaddr = ACE_OS::inet_addr (buf);
00402       this->source_id_ = TAO_AV_RTCP::alloc_srcid (ipaddr);
00403     }
00404   catch (const CORBA::Exception& ex)
00405     {
00406       ex._tao_print_exception ("TAO_StreamCtrl::TAO_StreamCtrl");
00407     }
00408 }

TAO_StreamCtrl::~TAO_StreamCtrl void   )  [virtual]
 

virtual destructor.

Definition at line 410 of file AVStreams_i.cpp.

References mcastconfigif_.

00411 {
00412   delete this->mcastconfigif_;
00413 }


Member Function Documentation

CORBA::Boolean TAO_StreamCtrl::bind AVStreams::StreamEndPoint_A_ptr  a_party,
AVStreams::StreamEndPoint_B_ptr  b_party,
AVStreams::streamQoS the_qos,
const AVStreams::flowSpec the_flows
[virtual]
 

Establish a connection between two streamendpoints. This can be used if the streamendpoints have been created independent of a MMDevice

Definition at line 850 of file AVStreams_i.cpp.

References ACE_ASSERT, ACE_CString, ACE_DEBUG, ACE_ERROR_RETURN, ACE_NEW_RETURN, ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), FlowEndPoint_Map, FlowEndPoint_Map_Entry, FlowEndPoint_Map_Iterator, TAO_FlowSpec_Entry::flowname(), AVStreams::flowSpec, TAO_Basic_StreamCtrl::get_flow_connection(), TAO_AV_QoS::get_flow_qos(), ACE_Hash_Map_Entry< EXT_ID, INT_ID >::int_id_, CORBA::is_nil(), LM_DEBUG, LM_ERROR, ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next(), TAO_Forward_FlowSpec_Entry::parse(), AVStreams::QoS::QoSParams, AVStreams::QoS::QoSType, TAO_Basic_StreamCtrl::set_flow_connection(), AVStreams::streamQoS, CORBA::string_dup(), and TAO_debug_level.

Referenced by bind_devs().

00854 {
00855   this->sep_a_ = AVStreams::StreamEndPoint_A::_duplicate(sep_a);
00856   this->sep_b_ = AVStreams::StreamEndPoint_B::_duplicate(sep_b);
00857 
00858   int result = 0;
00859   try
00860     {
00861       if (CORBA::is_nil (sep_a_.in() ) ||
00862           CORBA::is_nil (sep_b_.in() ))
00863         ACE_ERROR_RETURN ((LM_ERROR,
00864                            "(%P|%t) TAO_StreamCtrl::bind:"
00865                            "a_party or b_party null!"),
00866                           0);
00867 
00868       // Define each other as their peers.
00869       CORBA::Any sep_any;
00870       sep_any <<= sep_b;
00871       sep_a_->define_property ("PeerAdapter",
00872                               sep_any);
00873       sep_any <<= sep_a;
00874       sep_b_->define_property ("PeerAdapter",
00875                               sep_any);
00876       // since its full profile we do the viable stream setup algorithm.
00877       // get the flows for the A streamendpoint.
00878       // the flows spec is empty and hence we do a exhaustive match.
00879       AVStreams::flowSpec a_flows, b_flows;
00880       CORBA::Any_var flows_any;
00881       flows_any = sep_a_->get_property_value ("Flows");
00882       AVStreams::flowSpec *temp_flows;
00883       flows_any.in () >>= temp_flows;
00884       a_flows = *temp_flows;
00885       flows_any = sep_b_->get_property_value ("Flows");
00886       flows_any.in () >>= temp_flows;
00887       b_flows = *temp_flows;
00888       u_int i;
00889       FlowEndPoint_Map *a_fep_map;
00890       FlowEndPoint_Map *b_fep_map;
00891       ACE_NEW_RETURN (a_fep_map,
00892                       FlowEndPoint_Map,
00893                       0);
00894       ACE_NEW_RETURN (b_fep_map,
00895                       FlowEndPoint_Map,
00896                       0);
00897       for (i=0;i<a_flows.length ();i++)
00898         {
00899           const char *flowname = a_flows[i];
00900           // get the flowendpoint references.
00901           CORBA::Object_var fep_obj =
00902             sep_a_->get_fep (flowname);
00903           AVStreams::FlowEndPoint_var fep =
00904             AVStreams::FlowEndPoint::_narrow (fep_obj.in ());
00905           ACE_CString fep_key (flowname);
00906           result = a_fep_map->bind (fep_key, fep);
00907           if (result == -1)
00908             if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::bind failed for %s\n", flowname));
00909         }
00910       // get the flowendpoints for streamendpoint_b
00911       for (i=0;i<b_flows.length ();i++)
00912         {
00913           const char *flowname = b_flows[i];
00914           // get the flowendpoint references.
00915           CORBA::Object_var fep_obj =
00916             sep_b->get_fep (flowname);
00917           AVStreams::FlowEndPoint_var fep =
00918             AVStreams::FlowEndPoint::_narrow (fep_obj.in ());
00919           ACE_CString fep_key (flowname);
00920           result = b_fep_map->bind (fep_key, fep);
00921           if (result == -1)
00922             if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::bind failed for %s\n", flowname));
00923         }
00924       FlowEndPoint_Map *map_a = 0, *map_b = 0;
00925       if (flow_spec.length () == 0)
00926         {
00927           map_a = a_fep_map;
00928           map_b = b_fep_map;
00929         }
00930       else
00931         {
00932           FlowEndPoint_Map *spec_fep_map_a, *spec_fep_map_b;
00933           ACE_NEW_RETURN (spec_fep_map_a,
00934                           FlowEndPoint_Map,
00935                           0);
00936           ACE_NEW_RETURN (spec_fep_map_b,
00937                           FlowEndPoint_Map,
00938                           0);
00939           for (i=0; i< flow_spec.length ();i++)
00940             {
00941               TAO_Forward_FlowSpec_Entry *entry = 0;
00942               ACE_NEW_RETURN (entry,
00943                               TAO_Forward_FlowSpec_Entry,
00944                               0);
00945               entry->parse (flow_spec[i]);
00946               ACE_CString fep_key (entry->flowname ());
00947               AVStreams::FlowEndPoint_var fep;
00948               result = a_fep_map->find (fep_key, fep);
00949               if (result == -1)
00950                 ACE_ERROR_RETURN ((LM_ERROR, "Fep not found on A side for flowname: %s\n", flow_spec[i].in ()), 0);
00951 
00952               result = spec_fep_map_a->bind (fep_key, fep);
00953               if (result == -1)
00954                 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Bind failed for %s\n", flow_spec[i].in ()));
00955 
00956               result = b_fep_map->find (fep_key, fep);
00957               if (result == -1)
00958                 ACE_ERROR_RETURN ((LM_ERROR, "Fep not found on B side for flowname: %s\n", flow_spec[i].in ()), 0);
00959 
00960               result = spec_fep_map_b->bind (fep_key, fep);
00961               if (result == -1)
00962                 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Bind failed for %s\n", flow_spec[i].in ()));
00963             }
00964           map_a = spec_fep_map_a;
00965           map_b = spec_fep_map_b;
00966         }
00967 
00968       TAO_AV_QoS qos (stream_qos);
00969       // Now go thru the list of flow endpoint and match them.
00970       // uses the first match policy.
00971       FlowEndPoint_Map_Iterator a_feps_iterator (*map_a);
00972       FlowEndPoint_Map_Entry *a_feps_entry, *b_feps_entry;
00973       try
00974         {
00975 
00976           for (;a_feps_iterator.next (a_feps_entry) != 0;
00977                a_feps_iterator.advance ())
00978             {
00979               AVStreams::FlowEndPoint_var fep_a = a_feps_entry->int_id_;
00980               AVStreams::FlowEndPoint_var connected_to =
00981                 fep_a->get_connected_fep ();
00982 
00983               if (!CORBA::is_nil (connected_to.in ()))
00984                 {
00985                   // Skip this one, it is already connected...
00986                   continue;
00987                 }
00988 
00989               FlowEndPoint_Map_Iterator b_feps_iterator (*map_b);
00990               for (;b_feps_iterator.next (b_feps_entry) != 0;
00991                    b_feps_iterator.advance ())
00992                 {
00993                   AVStreams::FlowEndPoint_var fep_b = b_feps_entry->int_id_;
00994                   AVStreams::FlowConnection_var flow_connection;
00995 
00996                   AVStreams::FlowEndPoint_var connected_to =
00997                     fep_b->get_connected_fep ();
00998 
00999                   if (!CORBA::is_nil (connected_to.in ()))
01000                     {
01001                       // Skip this one, it is already connected...
01002                       continue;
01003                     }
01004 
01005                   if (fep_a->is_fep_compatible (fep_b.in()) == 1)
01006                     {
01007                       // assume that flow names are same so that we
01008                       // can use either of them.
01009                       CORBA::Object_var flow_connection_obj;
01010                       CORBA::Any_var flowname_any =
01011                         fep_a->get_property_value ("FlowName");
01012                       const char *flowname = 0;
01013                       flowname_any.in () >>= flowname;
01014                       try
01015                         {
01016                           flow_connection_obj =
01017                             this->get_flow_connection (flowname);
01018                           flow_connection =
01019                             AVStreams::FlowConnection::_narrow (flow_connection_obj.in ());
01020                         }
01021                       catch (const CORBA::Exception&)
01022                         {
01023                           TAO_FlowConnection *flowConnection;
01024                           ACE_NEW_RETURN (flowConnection,
01025                                           TAO_FlowConnection,
01026                                           0);
01027                           flow_connection = flowConnection->_this ();
01028                           this->set_flow_connection (flowname,
01029                                                      flow_connection.in ());
01030                         }
01031 
01032                       // make sure that a_feps is flow_producer
01033                       // and b_feps is flow_consumer
01034                       // There should be a way to find which flow
01035                       // endpoint is producer and which is
01036                       // consumer.
01037 
01038                       AVStreams::FlowProducer_var producer;
01039                       AVStreams::FlowConsumer_var consumer;
01040 
01041                       try
01042                         {
01043                           producer =
01044                             AVStreams::FlowProducer::_narrow (fep_a.in());
01045                           consumer =
01046                             AVStreams::FlowConsumer::_narrow (fep_b.in());
01047 
01048                           // If the types don't match then try in
01049                           // the opposite order
01050                           if (CORBA::is_nil (producer.in ()))
01051                             {
01052                               producer =
01053                                 AVStreams::FlowProducer::_narrow (fep_b.in());
01054                               consumer =
01055                                 AVStreams::FlowConsumer::_narrow (fep_a.in());
01056                             }
01057                           // At this point they should both be
01058                           // non-nil
01059                           // @@ raise an exception (which one?) if
01060                           // this is not true...
01061                           ACE_ASSERT (!CORBA::is_nil (producer.in ()));
01062                           ACE_ASSERT (!CORBA::is_nil (consumer.in ()));
01063                         }
01064                       catch (const CORBA::Exception&)
01065                         {
01066                           //Yamuna : Recheck this
01067                           throw;//_EX (producer_check);
01068                         }
01069                       CORBA::String_var fep_a_name, fep_b_name;
01070                       flowname_any = fep_a->get_property_value ("FlowName");
01071                       const char *temp_name;
01072                       flowname_any.in () >>= temp_name;
01073                       fep_a_name = CORBA::string_dup (temp_name);
01074                       flowname_any = fep_b->get_property_value ("FlowName");
01075                       flowname_any.in () >>= temp_name;
01076                       fep_b_name = CORBA::string_dup (temp_name);
01077                       AVStreams::QoS flow_qos;
01078                       flow_qos.QoSType = fep_a_name;
01079                       flow_qos.QoSParams.length (0);
01080                       result = qos.get_flow_qos (fep_a_name.in (), flow_qos);
01081                       if (result == -1)
01082                         {
01083                           flow_qos.QoSType = fep_b_name;
01084                           result = qos.get_flow_qos (fep_b_name.in (),
01085                                                      flow_qos);
01086                           if (result == -1 && TAO_debug_level > 0)
01087                             ACE_DEBUG ((LM_DEBUG,
01088                                         "No QoS Specified for this flow <%s>\n", flowname));
01089                         }
01090                       flow_connection->connect (producer.in (),
01091                                                 consumer.in (),
01092                                                 flow_qos);
01093                     }
01094                 }
01095             }
01096         }
01097       catch (const CORBA::Exception& ex)
01098         {
01099           ex._tao_print_exception ("TAO_StreamCtrl::bind:flow_connect block");
01100           return 0;
01101         }
01102     }
01103   catch (const CORBA::Exception&)
01104     {
01105       // error was thrown because one of the streamendpoints is light profile.
01106       // Now connect the streams together
01107       this->sep_a_->connect (this->sep_b_.in (),
01108                              stream_qos,
01109                              flow_spec);
01110     }
01111   return 1;
01112 }

CORBA::Boolean TAO_StreamCtrl::bind_devs AVStreams::MMDevice_ptr  a_party,
AVStreams::MMDevice_ptr  b_party,
AVStreams::streamQoS the_qos,
const AVStreams::flowSpec the_flows
[virtual]
 

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

Definition at line 515 of file AVStreams_i.cpp.

References ACE_DEBUG, ACE_ERROR_RETURN, ACE_NEW_RETURN, bind(), ACE_Hash_Map_Manager_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::bind(), ACE_Hash_Map_Manager_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::find(), AVStreams::flowSpec, TAO_StreamCtrl::MMDevice_Map_Entry::flowspec_, CORBA::is_nil(), LM_DEBUG, LM_ERROR, mcastconfigif_, mcastconfigif_ptr_, mmdevice_a_map_, mmdevice_b_map_, TAO_StreamCtrl::MMDevice_Map_Entry::qos_, TAO_StreamCtrl::MMDevice_Map_Entry::sep_, TAO_MCastConfigIf::set_peer(), streamctrl_, AVStreams::streamQoS, TAO_debug_level, TAO_ORB_Core_instance(), and TAO_StreamCtrl::MMDevice_Map_Entry::vdev_.

Referenced by TAO_MMDevice::bind().

00519 {
00520   try
00521     {
00522       if (CORBA::is_nil (a_party) && CORBA::is_nil (b_party))
00523         ACE_ERROR_RETURN ((LM_ERROR, "Both parties are nil\n"), 0);
00524       // Check to see if we have non-nil parties to bind!
00525       if (TAO_debug_level > 0)
00526         if (CORBA::is_nil (a_party) ||
00527             CORBA::is_nil (b_party))
00528           if (TAO_debug_level > 0)
00529             ACE_DEBUG ((LM_DEBUG,
00530                         "(%P|%t) TAO_StreamCtrl::bind_devs: "
00531                         "a_party or b_party is null"
00532                         "Multicast mode\n"));
00533 
00534       // Request a_party to create the endpoint and vdev
00535       CORBA::Boolean met_qos;
00536       CORBA::String_var named_vdev;
00537 
00538       if (!CORBA::is_nil (a_party))
00539         {
00540           MMDevice_Map_Hash_Key find_key (a_party);
00541           MMDevice_Map_Entry find_entry;
00542           int result =
00543             this->mmdevice_a_map_.find (find_key, find_entry);
00544           if (result == 0)
00545             {
00546               if (TAO_debug_level > 0)
00547                 {
00548                   // Already in the map.
00549                   if (TAO_debug_level > 0)
00550                     ACE_DEBUG ((LM_DEBUG, "mmdevice a_party is already bound\n"));
00551                 }
00552               return 1;
00553             }
00554           else
00555             {
00556               this->sep_a_ =
00557                 a_party-> create_A (this->streamctrl_.in (),
00558                                     this->vdev_a_.out (),
00559                                     the_qos,
00560                                     met_qos,
00561                                     named_vdev.inout (),
00562                                     the_flows);
00563 
00564               if (TAO_debug_level > 0)
00565                 ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_A: succeeded\n"));
00566               // Define ourselves as the related_streamctrl property of the sep.
00567               CORBA::Any streamctrl_any;
00568               streamctrl_any <<= this->streamctrl_.in ();
00569               this->sep_a_->define_property ("Related_StreamCtrl",
00570                                              streamctrl_any);
00571 
00572               CORBA::Any vdev_a_any;
00573               vdev_a_any <<= this->vdev_a_.in ();
00574               this->sep_a_->define_property ("Related_VDev",
00575                                              vdev_a_any);
00576 
00577               CORBA::Any streamendpoint_a_any;
00578               streamendpoint_a_any <<= this->sep_a_.in ();
00579               this->vdev_a_->define_property ("Related_StreamEndpoint",
00580                                               streamendpoint_a_any);
00581 
00582 
00583               CORBA::Any mmdevice_a_any;
00584               mmdevice_a_any <<= a_party;
00585               this->vdev_a_->define_property ("Related_MMDevice",
00586                                               mmdevice_a_any);
00587 
00588               // add the mmdevice, sep and vdev to the map.
00589               MMDevice_Map_Entry map_entry;
00590               MMDevice_Map_Hash_Key key (a_party);
00591               map_entry.sep_ = AVStreams::StreamEndPoint_A::_duplicate (this->sep_a_.in ());
00592               map_entry.vdev_ = AVStreams::VDev::_duplicate (this->vdev_a_.in ());
00593               map_entry.flowspec_ = the_flows;
00594               map_entry.qos_ = the_qos;
00595               result =
00596                 this->mmdevice_a_map_.bind (key, map_entry);
00597               if (result < 0)
00598                 if (TAO_debug_level > 0)
00599                   ACE_DEBUG ((LM_DEBUG, "Error binding mmdevice entry in the a_map"));
00600             }
00601         }
00602       // Request b_party to create the endpoint and vdev
00603       if (!CORBA::is_nil (b_party))
00604         {
00605           MMDevice_Map_Hash_Key find_key (b_party);
00606           MMDevice_Map_Entry find_entry;
00607           int result =
00608             this->mmdevice_b_map_.find (find_key, find_entry);
00609           if (result == 0)
00610             {
00611               // Already in the map.
00612               if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "mmdevice b_party is already bound\n"));
00613               return 1;
00614             }
00615           else
00616             {
00617               this->sep_b_ =
00618                 b_party-> create_B (this->streamctrl_.in (),
00619                                     this->vdev_b_.out (),
00620                                     the_qos,
00621                                     met_qos,
00622                                     named_vdev.inout (),
00623                                     the_flows);
00624 
00625               if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_B: succeeded\n"));
00626 
00627               if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
00628                           "\n(%P|%t)stream_endpoint_b_ = %s",
00629                           TAO_ORB_Core_instance ()->orb ()->object_to_string (this->sep_b_.in ())));
00630               // Define ourselves as the related_streamctrl property of the sep.
00631               CORBA::Any streamctrl_any;
00632               streamctrl_any <<= this->streamctrl_.in ();
00633               this->sep_b_->define_property ("Related_StreamCtrl",
00634                                              streamctrl_any);
00635 
00636               CORBA::Any vdev_b_any;
00637               vdev_b_any <<= this->vdev_b_.in ();
00638               this->sep_b_->define_property ("Related_VDev",
00639                                              vdev_b_any);
00640 
00641               CORBA::Any streamendpoint_b_any;
00642               streamendpoint_b_any <<= this->sep_b_.in ();
00643               this->vdev_b_->define_property ("Related_StreamEndpoint",
00644                                               streamendpoint_b_any);
00645 
00646 
00647               CORBA::Any mmdevice_b_any;
00648               mmdevice_b_any <<= b_party;
00649               this->vdev_b_->define_property ("Related_MMDevice",
00650                                               mmdevice_b_any);
00651               // add the mmdevice, sep and vdev to the map.
00652               MMDevice_Map_Entry map_entry;
00653               MMDevice_Map_Hash_Key key (b_party);
00654               map_entry.sep_ = AVStreams::StreamEndPoint::_duplicate (this->sep_b_.in ());
00655               map_entry.vdev_ = AVStreams::VDev::_duplicate(this->vdev_b_.in ());
00656               map_entry.flowspec_ = the_flows;
00657               map_entry.qos_ = the_qos;
00658               int result =
00659                 this->mmdevice_b_map_.bind (key, map_entry);
00660               if (result < 0)
00661                 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Error binding mmdevice entry in the b_map"));
00662             }
00663         }
00664 
00665       // Tell the endpoints about each other.
00666       if ((!CORBA::is_nil (a_party)) && (!CORBA::is_nil (b_party)))
00667         {
00668           CORBA::Any sep_a_peer_any;
00669           CORBA::Any sep_b_peer_any;
00670 
00671           sep_a_peer_any <<= this->sep_b_.in();
00672           sep_b_peer_any <<= this->sep_a_.in();
00673           this->sep_a_->define_property ("PeerAdapter",
00674                                           sep_a_peer_any);
00675 
00676           this->sep_b_->define_property ("PeerAdapter",
00677                                          sep_b_peer_any);
00678         }
00679 
00680       // In the full profile case there's no VDev.
00681       if (CORBA::is_nil (b_party) && (!CORBA::is_nil (this->vdev_a_.in ())))
00682         {
00683           // Now set the source id for this A endpoint.
00684           // If the sep contains flow producers then set the source ids for those
00685           // instead.
00686           try
00687             {
00688               CORBA::Any_ptr flows_any = this->sep_a_->get_property_value ("Flows");
00689               AVStreams::flowSpec_var flows;
00690               *flows_any >>= flows.out ();
00691               for (CORBA::ULong i=0; i< flows->length ();++i)
00692                 {
00693                   CORBA::Object_var fep_obj =
00694                     this->sep_a_->get_fep (flows [i]);
00695                   try
00696                     {
00697                       AVStreams::FlowProducer_var producer =
00698                         AVStreams::FlowProducer::_narrow (fep_obj.in ());
00699                       producer->set_source_id (this->source_id_++);
00700                     }
00701                   catch (const CORBA::Exception& ex)
00702                     {
00703                       if (TAO_debug_level > 0)
00704                         ACE_DEBUG ((LM_DEBUG, " %s ", static_cast<char const*>(flows[i])));
00705 
00706                       ex._tao_print_exception (
00707                         "producer_check: not a producer");
00708 
00709                     }
00710                 }
00711             }
00712           catch (const CORBA::Exception&)
00713             {
00714               // Since the full profile failed try setting the source id
00715               // for the sep instead.
00716               // @@Naga: What do we do if in the light profile the sep has
00717               // many producers who do not have flow interfaces. Then
00718               // the streamctrl has to give an array of source ids to
00719               // the sep.
00720               this->sep_a_->set_source_id (this->source_id_++);
00721             }
00722           if (!this->mcastconfigif_)
00723             {
00724               ACE_NEW_RETURN (this->mcastconfigif_,
00725                               TAO_MCastConfigIf,
00726                               0);
00727               // @@: Deactivating the object thru poa means calling remove_ref after _this.
00728               this->mcastconfigif_ptr_ = this->mcastconfigif_->_this ();
00729             }
00730           // Multicast source being added.
00731           CORBA::Boolean result = this->vdev_a_->set_Mcast_peer (this->streamctrl_.in (),
00732                                                                  this->mcastconfigif_ptr_.in (),
00733                                                                  the_qos,
00734                                                                  the_flows);
00735           if (!result)
00736             ACE_ERROR_RETURN ((LM_ERROR, "set_Mcast_peer failed\n"), 0);
00737         }
00738 
00739       if (CORBA::is_nil (a_party))
00740         {
00741           if (!CORBA::is_nil (this->vdev_b_.in ()))
00742             {
00743               // Multicast sink being added.
00744               if (!this->mcastconfigif_)
00745                 ACE_ERROR_RETURN ((LM_ERROR, "first add a source and then a sink\n"), 0);
00746               this->mcastconfigif_->set_peer (this->vdev_b_.in (),
00747                                               the_qos,
00748                                               the_flows);
00749             }
00750 
00751           int connect_leaf_success = 0;
00752           try
00753             {
00754               // @@: define null interfaces for Atm so that they can be implemented once
00755               //  ACE adds support for ATM multicast.
00756               connect_leaf_success = this->sep_a_->connect_leaf (this->sep_b_.in (),
00757                                                                  the_qos,
00758                                                                  the_flows);
00759               connect_leaf_success = 1;
00760             }
00761           catch (const AVStreams::notSupported&)
00762             {
00763               if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "connect_leaf failed\n"));
00764               connect_leaf_success = 0;
00765             }
00766           catch (const CORBA::Exception& ex)
00767             {
00768               ex._tao_print_exception (
00769                 "TAO_StreamCtrl::bind_devs");
00770             }
00771           if (!connect_leaf_success)
00772             {
00773               if (TAO_debug_level > 0)
00774                 ACE_DEBUG ((LM_DEBUG,"TAO_StreamCtrl::bind_devs Multiconnect\n"));
00775               AVStreams::flowSpec connect_flows = the_flows;
00776               this->sep_a_->multiconnect (the_qos, connect_flows);
00777               this->sep_b_->multiconnect (the_qos, connect_flows);
00778             }
00779         }
00780 
00781       if (!CORBA::is_nil (a_party) && !CORBA::is_nil (b_party))
00782         {
00783           // Check to see if the MMDevice contains FDev objects
00784           // If it contains FDev objects, then we are using the
00785           // Full profile, and we want to call bind() instead
00786           // of connect() on the the streamctrl
00787           if( a_party->is_property_defined("Flows") &&
00788               b_party->is_property_defined("Flows") )
00789           {
00790               if (TAO_debug_level > 0) {
00791                 //FUZZ: disable check_for_lack_ACE_OS
00792                 ACE_DEBUG ((LM_DEBUG, "(%N,%l) Full profile, invoking bind()\n"));
00793                 //FUZZ: enable check_for_lack_ACE_OS
00794               }
00795 
00796               // It is full profile
00797               // we have feps in the sep then dont call connect
00798               // instead call bind on the streamctrl.
00799               this->bind (this->sep_a_.in (),
00800                           this->sep_b_.in (),
00801                           the_qos,
00802                           the_flows);
00803 
00804 
00805 
00806           }
00807           // This is the light profile, call connect()
00808           else  if (!CORBA::is_nil (this->vdev_a_.in ()) && !CORBA::is_nil (this->vdev_b_.in ()))
00809           {
00810               if (TAO_debug_level > 0) {
00811                 //FUZZ: disable check_for_lack_ACE_OS
00812                 ACE_DEBUG ((LM_DEBUG, "(%N,%l) Light profile, invoking connect()\n"));
00813                 //FUZZ: enable check_for_lack_ACE_OS
00814               }
00815 
00816               // Tell the 2 VDev's about one another
00817               this->vdev_a_->set_peer (this->streamctrl_.in (),
00818                                        this->vdev_b_.in (),
00819                                        the_qos,
00820                                        the_flows);
00821 
00822               this->vdev_b_->set_peer (this->streamctrl_.in (),
00823                                        this->vdev_a_.in (),
00824                                        the_qos,
00825                                        the_flows);
00826 
00827 
00828               // Now connect the streams together. This will
00829               // establish the connection
00830               CORBA::Boolean result  =
00831                 this->sep_a_->connect (this->sep_b_.in (),
00832                                        the_qos,
00833                                        the_flows);
00834               if (result == 0)
00835                 ACE_ERROR_RETURN ((LM_ERROR, "sep_a->connect (sep_b) failed\n"), 0);
00836           }
00837         }
00838     }
00839   catch (const CORBA::Exception& ex)
00840     {
00841       ex._tao_print_exception ("TAO_StreamCtrl::bind_devs");
00842       return 0;
00843     }
00844   return 1;
00845 }

void TAO_StreamCtrl::destroy const AVStreams::flowSpec the_spec  )  [virtual]
 

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

Reimplemented from TAO_Basic_StreamCtrl.

Definition at line 479 of file AVStreams_i.cpp.

References ACE_DEBUG, ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), TAO_AV_Core::deactivate_servant(), TAO_Basic_StreamCtrl::destroy(), AVStreams::flowSpec, LM_DEBUG, MMDevice_Map_Iterator, ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next(), and TAO_debug_level.

00480 {
00481   try
00482     {
00483       TAO_Basic_StreamCtrl::destroy (flow_spec);
00484       if (this->flow_connection_map_.current_size () > 0)
00485         return;
00486 
00487       MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
00488       MMDevice_Map::ENTRY *entry = 0;
00489       for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
00490         {
00491           entry->int_id_.sep_->destroy (flow_spec);
00492         }
00493       MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
00494       for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
00495         {
00496           entry->int_id_.sep_->destroy (flow_spec);
00497         }
00498     }
00499   catch (const CORBA::Exception& ex)
00500     {
00501       ex._tao_print_exception ("TAO_StreamCtrl::destroy");
00502       return;
00503     }
00504 
00505   int result = TAO_AV_Core::deactivate_servant (this);
00506   if (result < 0)
00507     if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::destroy failed\n"));
00508 }

AVStreams::VDev_ptr TAO_StreamCtrl::get_related_vdev AVStreams::MMDevice_ptr  adev,
AVStreams::StreamEndPoint_out  sep
[virtual]
 

Definition at line 1157 of file AVStreams_i.cpp.

References ACE_Hash_Map_Manager_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::find(), mmdevice_a_map_, TAO_StreamCtrl::MMDevice_Map_Entry::sep_, and TAO_StreamCtrl::MMDevice_Map_Entry::vdev_.

01159 {
01160   MMDevice_Map_Hash_Key key (adev);
01161   MMDevice_Map_Entry entry;
01162   int result = -1;
01163   result = this->mmdevice_a_map_.find (key, entry);
01164   if (result < 0)
01165     {
01166       result = this->mmdevice_a_map_.find (key, entry);
01167       if (result < 0)
01168         return AVStreams::VDev::_nil ();
01169     }
01170   sep = AVStreams::StreamEndPoint::_duplicate (entry.sep_.in ());
01171   return AVStreams::VDev::_duplicate (entry.vdev_.in ());
01172 }

CORBA::Boolean TAO_StreamCtrl::modify_QoS AVStreams::streamQoS new_qos,
const AVStreams::flowSpec the_spec
[virtual]
 

Changes the QoS associated with the stream Empty the_spec means apply operation to all flows

Reimplemented from TAO_Basic_StreamCtrl.

Definition at line 1176 of file AVStreams_i.cpp.

References ACE_DEBUG, ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), TAO_FlowSpec_Entry::direction(), TAO_Forward_FlowSpec_Entry::entry_to_string(), AVStreams::flowSpec, LM_DEBUG, mcastconfigif_, MMDevice_Map_Iterator, ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next(), TAO_Forward_FlowSpec_Entry::parse(), AVStreams::streamQoS, CORBA::string_dup(), and TAO_debug_level.

01178 {
01179   if (TAO_debug_level > 0)
01180   ACE_DEBUG ((LM_DEBUG,
01181               "TAO_StreamCtrl::modify_QoS\n"));
01182 
01183 
01184   if (this->mcastconfigif_ != 0)
01185     {
01186       // call modify_Qos on the root VDev which is the mcast configif.
01187       if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Cannot Modify the Qos for multipoint streams\n"));
01188     }
01189   else
01190     {
01191       try
01192         {
01193           AVStreams::flowSpec in_flowspec;
01194           AVStreams::flowSpec out_flowspec;
01195 
01196           in_flowspec.length (0);
01197           out_flowspec.length (0);
01198 
01199           int in_index = 0;
01200           int out_index = 0;
01201 
01202           AVStreams::flowSpec flowspec;
01203           if (the_spec.length () == 0)
01204             {
01205               // Apply modify_qos to all the flows
01206               flowspec = this->flows_;
01207               MMDevice_Map_Iterator iterator (this->mmdevice_a_map_);
01208               MMDevice_Map::ENTRY *entry = 0;
01209               for (;iterator.next (entry) !=  0;iterator.advance ())
01210                 {
01211                   flowspec = entry->int_id_.flowspec_;
01212                 }
01213             }
01214           else
01215             {
01216               flowspec = the_spec;
01217             }
01218 
01219           if (TAO_debug_level > 0)
01220             ACE_DEBUG ((LM_DEBUG,
01221                         "TAO_StreamCtrl::modify_QoS\n"));
01222 
01223 
01224           for (u_int i=0;i < flowspec.length ();i++)
01225             {
01226               TAO_Forward_FlowSpec_Entry entry;
01227               entry.parse (flowspec [i]);
01228               int direction = entry.direction ();
01229               if (direction == 0)
01230                 {
01231                   in_flowspec.length (in_index + 1);
01232                   in_flowspec [in_index++] = CORBA::string_dup (entry.entry_to_string ());
01233                 }
01234               else
01235                 {
01236                   out_flowspec.length (out_index + 1);
01237                   out_flowspec [out_index++] = CORBA::string_dup (entry.entry_to_string ());
01238                 }
01239             }
01240 
01241           if (in_flowspec.length () != 0)
01242             {
01243               this->vdev_a_->modify_QoS (new_qos, in_flowspec);
01244             }
01245 
01246           if (out_flowspec.length () != 0)
01247             {
01248               this->vdev_b_->modify_QoS (new_qos, out_flowspec);
01249             }
01250         }
01251       catch (const CORBA::Exception& ex)
01252         {
01253           ex._tao_print_exception ("TAO_StreamCtrl::modify_QoS");
01254           return 0;
01255         }
01256 
01257     }
01258   return 1;
01259 }

void TAO_StreamCtrl::start const AVStreams::flowSpec the_spec  )  [virtual]
 

Start the transfer of data in the stream. Empty the_spec means apply operation to all flows

Reimplemented from TAO_Basic_StreamCtrl.

Definition at line 448 of file AVStreams_i.cpp.

References ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), AVStreams::flowSpec, MMDevice_Map_Iterator, ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next(), and TAO_Basic_StreamCtrl::start().

00449 {
00450   try
00451     {
00452       TAO_Basic_StreamCtrl::start (flow_spec);
00453       if (this->flow_connection_map_.current_size () > 0)
00454         return;
00455 
00456       MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
00457       MMDevice_Map::ENTRY *entry = 0;
00458       for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
00459         {
00460           entry->int_id_.sep_->start (flow_spec);
00461         }
00462       MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
00463       for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
00464         {
00465           entry->int_id_.sep_->start (flow_spec);
00466         }
00467     }
00468   catch (const CORBA::Exception& ex)
00469     {
00470       ex._tao_print_exception ("TAO_StreamCtrl::start");
00471       return;
00472     }
00473 }

void TAO_StreamCtrl::stop const AVStreams::flowSpec the_spec  )  [virtual]
 

Stop the transfer of data of the stream Empty the_spec means apply operation to all flows

Reimplemented from TAO_Basic_StreamCtrl.

Definition at line 419 of file AVStreams_i.cpp.

References ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), AVStreams::flowSpec, MMDevice_Map_Iterator, ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next(), and TAO_Basic_StreamCtrl::stop().

00420 {
00421   try
00422     {
00423       TAO_Basic_StreamCtrl::stop (flow_spec);
00424       if (this->flow_connection_map_.current_size () > 0)
00425         return;
00426       MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
00427       MMDevice_Map::ENTRY *entry = 0;
00428       for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
00429         {
00430           entry->int_id_.sep_->stop (flow_spec);
00431         }
00432       MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
00433       for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
00434         {
00435           entry->int_id_.sep_->stop (flow_spec);
00436         }
00437     }
00438   catch (const CORBA::Exception& ex)
00439     {
00440       ex._tao_print_exception ("TAO_Basic_StreamCtrl::stop");
00441       return;
00442     }
00443 }

void TAO_StreamCtrl::unbind void   )  [virtual]
 

unbind the stream. Same effect as Basic_StreamCtrl::destroy ()

Definition at line 1115 of file AVStreams_i.cpp.

References ACE_Hash_Map_Iterator_Ex< EXT_ID, INT_ID, ACE_Hash< EXT_ID >, ACE_Equal_To< EXT_ID >, ACE_LOCK >::advance(), AVStreams::flowSpec, MMDevice_Map_Iterator, and ACE_Hash_Map_Iterator_Base_Ex< EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK >::next().

01116 {
01117   try
01118     {
01119       if (this->flow_connection_map_.current_size () > 0)
01120         return;
01121 
01122       AVStreams::flowSpec flow_spec;
01123       flow_spec.length(0);
01124 
01125       MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
01126       MMDevice_Map::ENTRY *entry = 0;
01127       for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
01128         {
01129           entry->int_id_.sep_->destroy (flow_spec);
01130         }
01131       MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
01132       for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
01133         {
01134           entry->int_id_.sep_->destroy (flow_spec);
01135         }
01136     }
01137   catch (const CORBA::Exception& ex)
01138     {
01139       ex._tao_print_exception ("TAO_StreamCtrl::unbind");
01140       return;
01141     }
01142 }

void TAO_StreamCtrl::unbind_dev AVStreams::MMDevice_ptr  dev,
const AVStreams::flowSpec the_spec
[virtual]
 

Definition at line 1151 of file AVStreams_i.cpp.

References AVStreams::flowSpec.

01153 {
01154 }

void TAO_StreamCtrl::unbind_party AVStreams::StreamEndPoint_ptr  the_ep,
const AVStreams::flowSpec the_spec
[virtual]
 

Unbind the_ep from the stream. Empty the_spec means apply to all flows.

Definition at line 1145 of file AVStreams_i.cpp.

References AVStreams::flowSpec.

01147 {
01148 }


Member Data Documentation

TAO_MCastConfigIf* TAO_StreamCtrl::mcastconfigif_ [protected]
 

Definition at line 277 of file AVStreams_i.h.

Referenced by bind_devs(), modify_QoS(), and ~TAO_StreamCtrl().

AVStreams::MCastConfigIf_var TAO_StreamCtrl::mcastconfigif_ptr_ [protected]
 

Definition at line 278 of file AVStreams_i.h.

Referenced by bind_devs().

MMDevice_Map TAO_StreamCtrl::mmdevice_a_map_ [protected]
 

Definition at line 275 of file AVStreams_i.h.

Referenced by bind_devs(), and get_related_vdev().

MMDevice_Map TAO_StreamCtrl::mmdevice_b_map_ [protected]
 

Definition at line 276 of file AVStreams_i.h.

Referenced by bind_devs().

CORBA::ULong TAO_StreamCtrl::source_id_ [protected]
 

Definition at line 280 of file AVStreams_i.h.

Referenced by TAO_StreamCtrl().

AVStreams::StreamCtrl_var TAO_StreamCtrl::streamctrl_ [protected]
 

Definition at line 279 of file AVStreams_i.h.

Referenced by bind_devs(), and TAO_StreamCtrl().


The documentation for this class was generated from the following files:
Generated on Sun Jan 27 16:08:12 2008 for TAO_AV by doxygen 1.3.6