#include <AVStreams_i.h>
Inheritance diagram for TAO_StreamEndPoint_A:
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. |
Definition at line 582 of file AVStreams_i.h.
|
Constructor.
Definition at line 2384 of file AVStreams_i.cpp. References ACE_DEBUG, LM_DEBUG, and TAO_debug_level.
02385 { 02386 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamEndPoint_A::TAO_StreamEndPoint_A: created\n")); 02387 } |
|
Destructor.
Definition at line 2581 of file AVStreams_i.cpp.
02582 { 02583 } |
|
Used for ATM-style multicast.
Definition at line 2563 of file AVStreams_i.cpp. References AVStreams::flowSpec, and AVStreams::streamQoS.
02566 { 02567 throw AVStreams::notSupported (); 02568 } |
|
Used to remove a multicast leaf.
Definition at line 2572 of file AVStreams_i.cpp. References AVStreams::flowSpec.
02575 { 02576 02577 throw AVStreams::notSupported (); 02578 02579 } |
|
Used for ATM-style multicast.
Reimplemented from TAO_StreamEndPoint. Definition at line 2391 of file AVStreams_i.cpp. References ACE_CString, ACE_DEBUG, ACE_ERROR_RETURN, ACE_NEW_RETURN, ACE_INET_Addr::addr_to_string(), TAO_FlowSpec_Entry::address(), ACE_Hash_Map_Manager_Ex< ACE_CString, TAO_FlowSpec_Entry *, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::bind(), TAO_FlowSpec_Entry::carrier_protocol_str(), TAO_FlowSpec_Entry::direction(), TAO_FlowSpec_Entry::direction_str(), TAO_Forward_FlowSpec_Entry::entry_to_string(), ACE_Hash_Map_Manager_Ex< ACE_CString, TAO_FlowSpec_Entry *, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::find(), TAO_FlowSpec_Entry::flow_protocol_str(), TAO_FlowSpec_Entry::flowname(), AVStreams::flowSpec, TAO_FlowSpec_Entry::format(), TAO_AV_QoS::get_flow_qos(), ACE_Unbounded_Set< T >::insert(), ACE_Singleton< TYPE, ACE_LOCK >::instance(), CORBA::is_nil(), LM_DEBUG, LM_ERROR, TAO_AV_Acceptor_Registry::open(), TAO_Forward_FlowSpec_Entry::parse(), TAO_Base_StreamEndPoint::qos(), ACE_INET_Addr::set(), TAO_FlowConnection::set_mcast_addr(), TAO_FlowConnection::set_protocol(), ACE_OS::strcmp(), AVStreams::streamQoS, CORBA::string_dup(), and TAO_debug_level.
02393 { 02394 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPointA::multiconnect\n")); 02395 try 02396 { 02397 int result = 0; 02398 TAO_AV_QoS qos (stream_qos); 02399 for (u_int i=0;i< flow_spec.length ();i++) 02400 { 02401 TAO_Forward_FlowSpec_Entry *forward_entry = 0; 02402 ACE_NEW_RETURN (forward_entry, 02403 TAO_Forward_FlowSpec_Entry, 02404 0); 02405 forward_entry->parse (flow_spec[i]); 02406 ACE_CString mcast_key (forward_entry->flowname ()); 02407 AVStreams::FlowEndPoint_var flow_endpoint; 02408 02409 // @@Naga: There is a problem in the full profile case for multiconnect. Since 02410 // multiconnect on sep_a is called everytime a sink is added and if called for 02411 // the same flow twice, the following code will just call add producer on the flow connection. 02412 // It is however very hard to find out if the flow producer is already in the flow connection 02413 // since comparing object references will not work and the flowproducer reference is 02414 // generated by _narrow. Our only hope is that _narrow on the same fep will return the same 02415 // pointer for the flowproducer in which case we can find out if the flowproducer exists in 02416 // fep set for that flowconnection. 02417 if (this->fep_map_.find (mcast_key, flow_endpoint) == 0) 02418 { 02419 try 02420 { 02421 AVStreams::QoS flow_qos; 02422 result = qos.get_flow_qos (forward_entry->flowname (), flow_qos); 02423 if (result < 0) 02424 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "QoS not found for %s\n", forward_entry->flowname ())); 02425 // Narrow it to FlowProducer. 02426 AVStreams::FlowProducer_var producer; 02427 producer = AVStreams::FlowProducer::_narrow (flow_endpoint.in()); 02428 // 02429 // Else narrow succeeeded. 02430 if (!CORBA::is_nil (producer.in ())) 02431 { 02432 AVStreams::FlowConnection_var flow_connection; 02433 try 02434 { 02435 if (CORBA::is_nil (this->streamctrl_.in ())) 02436 { 02437 CORBA::Any_var streamctrl_any; 02438 streamctrl_any = this->get_property_value ("Related_StreamCtrl"); 02439 AVStreams::StreamCtrl_ptr streamctrl; 02440 streamctrl_any.in () >>= streamctrl; 02441 this->streamctrl_ = AVStreams::StreamCtrl::_duplicate (streamctrl); 02442 } 02443 02444 CORBA::Object_var flow_connection_obj = 02445 this->streamctrl_->get_flow_connection (forward_entry->flowname ()); 02446 flow_connection = AVStreams::FlowConnection::_narrow (flow_connection_obj.in ()); 02447 } 02448 catch (const CORBA::Exception&) 02449 { 02450 TAO_FlowConnection *flowConnection; 02451 ACE_NEW_RETURN (flowConnection, 02452 TAO_FlowConnection, 02453 0); 02454 //@@ Strategize the multicast address allocation. 02455 flowConnection->set_mcast_addr (this->mcast_addr_, this->mcast_port_); 02456 this->mcast_port_++; 02457 flowConnection->set_protocol (forward_entry->carrier_protocol_str ()); 02458 flow_connection = flowConnection->_this (); 02459 this->streamctrl_->set_flow_connection (forward_entry->flowname (), 02460 flow_connection.in ()); 02461 } 02462 if (ACE_OS::strcmp (forward_entry->flow_protocol_str (), "") != 0) 02463 { 02464 CORBA::Any fp_settings; 02465 flow_connection->use_flow_protocol (forward_entry->flow_protocol_str (), 02466 fp_settings); 02467 } 02468 result = flow_connection->add_producer (producer.in (), 02469 flow_qos); 02470 if (result == 0) 02471 ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPoint_A::multiconnect: add_producer failed\n"), 0); 02472 } 02473 } 02474 catch (const CORBA::Exception& ex) 02475 { 02476 // Narrow failed and since its not a flowproducer its an error. 02477 ex._tao_print_exception ( 02478 "FlowProducer::_narrow"); 02479 ACE_ERROR_RETURN ((LM_ERROR, "sep_a doesn't contain a flowproducer"), 0); 02480 } 02481 } 02482 else 02483 { 02484 ACE_INET_Addr *mcast_addr; 02485 TAO_FlowSpec_Entry *entry = 0; 02486 result = this->mcast_entry_map_.find (mcast_key, entry); 02487 if (result == 0) 02488 { 02489 mcast_addr = dynamic_cast<ACE_INET_Addr *> (entry->address ()); 02490 char str_addr [BUFSIZ]; 02491 result = mcast_addr->addr_to_string (str_addr, BUFSIZ); 02492 if (result < 0) 02493 ACE_ERROR_RETURN ((LM_ERROR, "TAO_StreamEndPointA::multiconnect ::addr_to_string failed\n"), 0); 02494 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamEndPoint_A::multiconnect:%s\n", str_addr)); 02495 TAO_Forward_FlowSpec_Entry new_entry (entry->flowname (), 02496 entry->direction_str (), 02497 entry->format (), 02498 entry->flow_protocol_str (), 02499 entry->carrier_protocol_str (), 02500 entry->address ()); 02501 flow_spec[i] = CORBA::string_dup (new_entry.entry_to_string ()); 02502 } 02503 else 02504 { 02505 02506 switch (forward_entry->direction ()) 02507 { 02508 case TAO_FlowSpec_Entry::TAO_AV_DIR_IN: 02509 { 02510 ACE_NEW_RETURN (mcast_addr, 02511 ACE_INET_Addr, 02512 0); 02513 mcast_addr->set (this->mcast_port_, this->mcast_addr_.c_str ()); 02514 this->mcast_port_++; 02515 char buf[BUFSIZ]; 02516 mcast_addr->addr_to_string (buf, BUFSIZ); 02517 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "%s\n", buf)); 02518 TAO_Forward_FlowSpec_Entry *new_entry; 02519 ACE_NEW_RETURN (new_entry, 02520 TAO_Forward_FlowSpec_Entry (forward_entry->flowname (), 02521 forward_entry->direction_str (), 02522 forward_entry->format (), 02523 forward_entry->flow_protocol_str (), 02524 forward_entry->carrier_protocol_str (), 02525 mcast_addr), 02526 0); 02527 flow_spec[i] = CORBA::string_dup (new_entry->entry_to_string ()); 02528 //new_entry->is_multicast (1); 02529 02530 this->forward_flow_spec_set.insert (new_entry); 02531 TAO_AV_Acceptor_Registry *acceptor_registry = TAO_AV_CORE::instance ()->acceptor_registry (); 02532 result = acceptor_registry->open (this, 02533 TAO_AV_CORE::instance (), 02534 this->forward_flow_spec_set); 02535 if (result < 0) 02536 ACE_ERROR_RETURN ((LM_ERROR, "Acceptor_Registry::open failed\n"), 0); 02537 result = this->mcast_entry_map_.bind (mcast_key, new_entry); 02538 if (result < 0) 02539 ACE_ERROR_RETURN ((LM_ERROR, "mcast_entry::bind failed"), 0); 02540 } 02541 break; 02542 case TAO_FlowSpec_Entry::TAO_AV_DIR_OUT: 02543 // OUT implies we're the sink. 02544 break; 02545 default: 02546 break; 02547 } 02548 } 02549 } 02550 } 02551 } 02552 catch (const CORBA::Exception& ex) 02553 { 02554 ex._tao_print_exception ( 02555 "TAO_StreamEndPoint_A::multiconnect"); 02556 return 0; 02557 } 02558 return 1; 02559 } |