The "A" side of a streamendpoint. More...
#include <AVStreams_i.h>
Public Member Functions | |
TAO_StreamEndPoint_A (void) | |
Constructor. | |
virtual CORBA::Boolean | multiconnect (AVStreams::streamQoS &the_qos, AVStreams::flowSpec &the_spec) |
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) |
Used for ATM-style multicast. | |
virtual void | disconnect_leaf (AVStreams::StreamEndPoint_B_ptr the_ep, const AVStreams::flowSpec &theSpec) |
Used to remove a multicast leaf. | |
virtual | ~TAO_StreamEndPoint_A (void) |
Destructor. |
The "A" side of a streamendpoint.
Definition at line 582 of file AVStreams_i.h.
TAO_StreamEndPoint_A::TAO_StreamEndPoint_A | ( | void | ) |
Constructor.
Definition at line 2417 of file AVStreams_i.cpp.
{ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamEndPoint_A::TAO_StreamEndPoint_A: created\n")); }
TAO_StreamEndPoint_A::~TAO_StreamEndPoint_A | ( | void | ) | [virtual] |
CORBA::Boolean TAO_StreamEndPoint_A::connect_leaf | ( | AVStreams::StreamEndPoint_B_ptr | the_ep, | |
AVStreams::streamQoS & | the_qos, | |||
const AVStreams::flowSpec & | the_flows | |||
) | [virtual] |
Used for ATM-style multicast.
Definition at line 2596 of file AVStreams_i.cpp.
{ throw AVStreams::notSupported (); }
void TAO_StreamEndPoint_A::disconnect_leaf | ( | AVStreams::StreamEndPoint_B_ptr | the_ep, | |
const AVStreams::flowSpec & | theSpec | |||
) | [virtual] |
Used to remove a multicast leaf.
Definition at line 2605 of file AVStreams_i.cpp.
{ throw AVStreams::notSupported (); }
CORBA::Boolean TAO_StreamEndPoint_A::multiconnect | ( | AVStreams::streamQoS & | the_qos, | |
AVStreams::flowSpec & | the_spec | |||
) | [virtual] |
Used for ATM-style multicast.
Reimplemented from TAO_StreamEndPoint.
Definition at line 2424 of file AVStreams_i.cpp.
{ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPointA::multiconnect\n")); try { int result = 0; TAO_AV_QoS qos (stream_qos); for (u_int i=0;i< flow_spec.length ();i++) { TAO_Forward_FlowSpec_Entry *forward_entry = 0; ACE_NEW_RETURN (forward_entry, TAO_Forward_FlowSpec_Entry, 0); forward_entry->parse (flow_spec[i]); ACE_CString mcast_key (forward_entry->flowname ()); AVStreams::FlowEndPoint_var flow_endpoint; // @@Naga: There is a problem in the full profile case for multiconnect. Since // multiconnect on sep_a is called everytime a sink is added and if called for // the same flow twice, the following code will just call add producer on the flow connection. // It is however very hard to find out if the flow producer is already in the flow connection // since comparing object references will not work and the flowproducer reference is // generated by _narrow. Our only hope is that _narrow on the same fep will return the same // pointer for the flowproducer in which case we can find out if the flowproducer exists in // fep set for that flowconnection. if (this->fep_map_.find (mcast_key, flow_endpoint) == 0) { try { AVStreams::QoS flow_qos; result = qos.get_flow_qos (forward_entry->flowname (), flow_qos); if (result < 0) if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "QoS not found for %s\n", forward_entry->flowname ())); // Narrow it to FlowProducer. AVStreams::FlowProducer_var producer; producer = AVStreams::FlowProducer::_narrow (flow_endpoint.in()); // // Else narrow succeeeded. if (!CORBA::is_nil (producer.in ())) { AVStreams::FlowConnection_var flow_connection; try { if (CORBA::is_nil (this->streamctrl_.in ())) { CORBA::Any_var streamctrl_any; streamctrl_any = this->get_property_value ("Related_StreamCtrl"); AVStreams::StreamCtrl_ptr streamctrl; streamctrl_any.in () >>= streamctrl; this->streamctrl_ = AVStreams::StreamCtrl::_duplicate (streamctrl); } CORBA::Object_var flow_connection_obj = this->streamctrl_->get_flow_connection (forward_entry->flowname ()); flow_connection = AVStreams::FlowConnection::_narrow (flow_connection_obj.in ()); } catch (const CORBA::Exception&) { TAO_FlowConnection *flowConnection; ACE_NEW_RETURN (flowConnection, TAO_FlowConnection, 0); //@@ Strategize the multicast address allocation. flowConnection->set_mcast_addr (this->mcast_addr_, this->mcast_port_); this->mcast_port_++; flowConnection->set_protocol (forward_entry->carrier_protocol_str ()); flow_connection = flowConnection->_this (); this->streamctrl_->set_flow_connection (forward_entry->flowname (), flow_connection.in ()); } if (ACE_OS::strcmp (forward_entry->flow_protocol_str (), "") != 0) { CORBA::Any fp_settings; flow_connection->use_flow_protocol (forward_entry->flow_protocol_str (), fp_settings); } result = flow_connection->add_producer (producer.in (), flow_qos); if (result == 0) ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_A::multiconnect: add_producer failed\n"), 0); } } catch (const CORBA::Exception& ex) { // Narrow failed and since its not a flowproducer its an error. ex._tao_print_exception ( "FlowProducer::_narrow"); ACE_ERROR_RETURN ((LM_ERROR, "sep_a doesn't contain a flowproducer"), 0); } } else { ACE_INET_Addr *mcast_addr; TAO_FlowSpec_Entry *entry = 0; result = this->mcast_entry_map_.find (mcast_key, entry); if (result == 0) { mcast_addr = dynamic_cast<ACE_INET_Addr *> (entry->address ()); ACE_TCHAR str_addr [BUFSIZ]; result = mcast_addr->addr_to_string (str_addr, BUFSIZ); if (result < 0) ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPointA::multiconnect ::addr_to_string failed\n"), 0); if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint_A::multiconnect:%s\n", str_addr)); TAO_Forward_FlowSpec_Entry new_entry (entry->flowname (), entry->direction_str (), entry->format (), entry->flow_protocol_str (), entry->carrier_protocol_str (), entry->address ()); flow_spec[i] = CORBA::string_dup (new_entry.entry_to_string ()); } else { switch (forward_entry->direction ()) { case TAO_FlowSpec_Entry::TAO_AV_DIR_IN: { ACE_NEW_RETURN (mcast_addr, ACE_INET_Addr, 0); mcast_addr->set (this->mcast_port_, this->mcast_addr_.c_str ()); this->mcast_port_++; ACE_TCHAR buf[BUFSIZ]; mcast_addr->addr_to_string (buf, BUFSIZ); if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%s\n", buf)); TAO_Forward_FlowSpec_Entry *new_entry; ACE_NEW_RETURN (new_entry, TAO_Forward_FlowSpec_Entry (forward_entry->flowname (), forward_entry->direction_str (), forward_entry->format (), forward_entry->flow_protocol_str (), forward_entry->carrier_protocol_str (), mcast_addr), 0); flow_spec[i] = CORBA::string_dup (new_entry->entry_to_string ()); //new_entry->is_multicast (1); this->forward_flow_spec_set.insert (new_entry); TAO_AV_Acceptor_Registry *acceptor_registry = TAO_AV_CORE::instance ()->acceptor_registry (); result = acceptor_registry->open (this, TAO_AV_CORE::instance (), this->forward_flow_spec_set); if (result < 0) ACE_ERROR_RETURN ((LM_ERROR, "Acceptor_Registry::open failed\n"), 0); result = this->mcast_entry_map_.bind (mcast_key, new_entry); if (result < 0) ACE_ERROR_RETURN ((LM_ERROR, "mcast_entry::bind failed"), 0); } break; case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT: // OUT implies we're the sink. break; default: break; } } } } } catch (const CORBA::Exception& ex) { ex._tao_print_exception ( "TAO_StreamEndPoint_A::multiconnect"); return 0; } return 1; }