summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaga <naga@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-08-09 20:25:22 +0000
committernaga <naga@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-08-09 20:25:22 +0000
commitb768d641012224b889c2cc7121d3d8f696986b73 (patch)
tree21a36e93511e5f69d0d9a7624743c04ca4c202ec
parent28ef634864453c998a6d19d0be6d7b2680f6d73e (diff)
downloadATCD-b768d641012224b889c2cc7121d3d8f696986b73.tar.gz
Split the Transport files for different protocols like UDP and TCP seperate
files. Also added a new Protocol_Factory.{h,cpp} which contains the factory information. Added new flow protocol classes and remodelled the architecture with true layering between the Protocol_Object and the Transport class.
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp349
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h94
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/AV_Core.h82
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp58
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h6
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i6
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/MCast.cpp322
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/MCast.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Nil.cpp160
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Nil.h74
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.cpp101
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.h78
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Policy.i16
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp157
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h117
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP.cpp438
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTCP.h171
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTP.cpp905
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/RTP.h171
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/TCP.cpp664
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/TCP.h233
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.cpp1865
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.h430
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Transport.i64
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.cpp733
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.h215
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/UDP.i20
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/sfp.cpp853
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/sfp.h142
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/source.cpp22
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/source.h12
31 files changed, 4374 insertions, 4256 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp
index 219d4ff5b9b..f12a7b83547 100644
--- a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.cpp
@@ -1551,31 +1551,15 @@ TAO_Base_StreamEndPoint::set_protocol_object (const char */*flowname*/,
}
int
-TAO_Base_StreamEndPoint::set_rtcp_info (const char */* flowname */,
- TAO_AV_SourceManager *,
- TAO_AV_RTP_State *)
+TAO_Base_StreamEndPoint::get_callback (const char */*flowname*/,
+ TAO_AV_Callback *&/*sfp_callback*/)
{
return -1;
}
int
-TAO_Base_StreamEndPoint::get_rtp_source (TAO_AV_Source *&source,
- const char *flowname,
- ACE_UINT32 srcid,
- ACE_UINT32 ssrc,
- ACE_UINT32 addr)
-{
- ACE_NEW_RETURN (source,
- TAO_AV_Source (srcid,
- ssrc,
- addr),
- -1);
- return 0;
-}
-
-int
-TAO_Base_StreamEndPoint::get_callback (const char */*flowname*/,
- TAO_AV_Callback *&/*sfp_callback*/)
+TAO_Base_StreamEndPoint::get_control_callback (const char */*flowname*/,
+ TAO_AV_Callback *&/*sfp_callback*/)
{
return -1;
}
@@ -1689,12 +1673,12 @@ TAO_StreamEndPoint::connect (AVStreams::StreamEndPoint_ptr responder,
"TAO_StreamEndPoint::connect:%s\n",
flow_spec[i].in ()));
TAO_Forward_FlowSpec_Entry *entry = 0;
- if (i >= FLOWSPEC_MAX)
+ // if (i >= FLOWSPEC_MAX)
ACE_NEW_RETURN (entry,
TAO_Forward_FlowSpec_Entry,
0);
- else
- entry = &this->forward_entries_[i];
+// else
+// entry = &this->forward_entries_[i];
if (entry->parse (flow_spec[i]) == -1)
return 0;
this->forward_flow_spec_set.insert (entry);
@@ -1716,15 +1700,17 @@ TAO_StreamEndPoint::connect (AVStreams::StreamEndPoint_ptr responder,
ACE_TRY_ENV);
ACE_TRY_CHECK;
+ if (retv == 0)
+ return retv;
for (i=0;i<flow_spec.length ();i++)
{
TAO_Reverse_FlowSpec_Entry *entry = 0;
- if (i >= FLOWSPEC_MAX)
+ // if (i >= FLOWSPEC_MAX)
ACE_NEW_RETURN (entry,
TAO_Reverse_FlowSpec_Entry,
0);
- else
- entry = &this->reverse_entries_[i];
+// else
+// entry = &this->reverse_entries_[i];
if (entry->parse (flow_spec[i].in ()) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"Reverse_Flow_Spec_Set::parse failed\n"),0);
this->reverse_flow_spec_set.insert (entry);
@@ -1868,7 +1854,7 @@ TAO_StreamEndPoint::destroy (const AVStreams::flowSpec &flow_spec,
TAO_FlowSpec_Entry *entry = *begin;
if (ACE_OS::strcmp (entry->flowname (),flow_spec [i]) == 0)
{
- entry->protocol_object ()->end_stream ();
+ entry->protocol_object ()->destroy ();
break;
}
}
@@ -1881,7 +1867,7 @@ TAO_StreamEndPoint::destroy (const AVStreams::flowSpec &flow_spec,
begin != end; ++begin)
{
TAO_FlowSpec_Entry *entry = *begin;
- entry->protocol_object ()->end_stream ();
+ entry->protocol_object ()->destroy ();
}
}
@@ -1928,10 +1914,12 @@ TAO_StreamEndPoint::request_connection (AVStreams::StreamEndPoint_ptr /*initiato
return 0;
this->forward_flow_spec_set.insert (entry);
}
- TAO_AV_CORE::instance ()->init_forward_flows (this,
- this->forward_flow_spec_set,
- TAO_AV_Core::TAO_AV_ENDPOINT_B,
- flow_spec);
+ result = TAO_AV_CORE::instance ()->init_forward_flows (this,
+ this->forward_flow_spec_set,
+ TAO_AV_Core::TAO_AV_ENDPOINT_B,
+ flow_spec);
+ if (result < 0)
+ return 0;
// Make the upcall to the app
result = this->handle_connection_requested (flow_spec,ACE_TRY_ENV);
ACE_TRY_CHECK;
@@ -2221,22 +2209,22 @@ TAO_StreamEndPoint::~TAO_StreamEndPoint (void)
// or is it an implementation fact of ACE containers.
for ( ; begin != end; ++begin,++i)
{
- if (i >= FLOWSPEC_MAX)
- {
+// if (i >= FLOWSPEC_MAX)
+// {
TAO_FlowSpec_Entry *entry = *begin;
delete entry;
- }
+ // }
}
begin = this->reverse_flow_spec_set.begin ();
end = this->reverse_flow_spec_set.end ();
i = 0;
for (; begin != end; ++begin)
{
- if (i >= FLOWSPEC_MAX)
- {
+// if (i >= FLOWSPEC_MAX)
+// {
TAO_FlowSpec_Entry *entry = *begin;
delete entry;
- }
+ // }
}
}
@@ -2270,6 +2258,14 @@ TAO_StreamEndPoint_A::multiconnect (AVStreams::streamQoS &stream_qos,
forward_entry->parse (flow_spec[i]);
TAO_String_Hash_Key mcast_key (forward_entry->flowname ());
AVStreams::FlowEndPoint_ptr flow_endpoint = AVStreams::FlowEndPoint::_nil ();
+ // @@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)
{
ACE_TRY_EX (narrow)
@@ -3609,7 +3605,30 @@ TAO_FlowConnection::add_producer (AVStreams::FlowProducer_ptr producer,
{
AVStreams::FlowProducer_ptr flow_producer =
AVStreams::FlowProducer::_duplicate (producer);
- this->flow_producer_set_.insert (flow_producer);
+ // @@Naga:Sometimes the same producer could be added with a different object reference.
+ // There's no portable way of comparing obj refs. but we have to do this till we find
+ // a permanent solution.For eg. 2 different flowproducers for the same flow in a
+ // Multipoint to Multipoint binding will have the same flowname and hence cannot be
+ // used for resolving ties.
+ FlowProducer_SetItor begin = this->flow_producer_set_.begin ();
+ FlowProducer_SetItor end = this->flow_producer_set_.end ();
+ for (; begin != end; ++begin)
+ {
+ if ((*begin)->_is_equivalent (producer,
+ ACE_TRY_ENV))
+ // producer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING,"TAO_FlowConnection::add_producer: producer already exists\n"),1);
+ }
+ // We need to check the return value of the insert into the flow producer
+ // set, since multiconnect could be called many times which will lead to
+ // a call to add_producer every time a sink is added. If the producer is already
+ // present in our list we just return immediately.
+ int result = this->flow_producer_set_.insert (flow_producer);
+ if (result == 1)
+ {
+ // producer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING,"TAO_FlowConnection::add_producer: producer already exists\n"),1);
+ }
CORBA::Boolean met_qos;
char mcast_address[BUFSIZ];
if (this->producer_address_.in () == 0)
@@ -3680,12 +3699,28 @@ TAO_FlowConnection::add_consumer (AVStreams::FlowConsumer_ptr consumer,
{
AVStreams::FlowConsumer_ptr flow_consumer =
AVStreams::FlowConsumer::_duplicate (consumer);
- this->flow_consumer_set_.insert (flow_consumer);
- FlowProducer_SetItor begin = this->flow_producer_set_.begin ();
+ FlowConsumer_SetItor begin = this->flow_consumer_set_.begin ();
+ FlowConsumer_SetItor end = this->flow_consumer_set_.end ();
+ for (; begin != end; ++begin)
+ {
+ if ((*begin)->_is_equivalent (consumer,
+ ACE_TRY_ENV))
+ // Consumer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING,"TAO_FlowConnection::add_Consumer: Consumer already exists\n"),1);
+ }
+ int result = this->flow_consumer_set_.insert (flow_consumer);
+ if (result == 1)
+ {
+ // consumer exists in the set, a duplicate.
+ ACE_ERROR_RETURN ((LM_WARNING,"TAO_FlowConnection::add_consumer: consumer already exists\n"),1);
+ }
+
+ FlowProducer_SetItor producer_begin = this->flow_producer_set_.begin ();
// @@Lets take that the first entry as the only producer. We're
// not sure if we can have multiple flow producers in a
- // flowconnection.
- AVStreams::FlowProducer_ptr flow_producer = (*begin);
+ // flowconnection. We can have multiple producer in the MtM binding,
+ // in which case the first producer that gets added is the leader.
+ AVStreams::FlowProducer_ptr flow_producer = (*producer_begin);
AVStreams::protocolSpec protocols (1);
protocols.length (1);
@@ -3778,7 +3813,6 @@ void
TAO_FlowEndPoint::set_handler (const char *flowname,
TAO_AV_Flow_Handler *handler)
{
- this->handler_ = handler;
}
int
@@ -3866,7 +3900,10 @@ TAO_FlowEndPoint::destroy (CORBA::Environment &/*ACE_TRY_ENV*/)
int result = deactivate_servant (this);
if (result < 0)
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_StreamEndPoint::destroy failed\n"));
- this->protocol_object_->end_stream ();
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ (*begin)->protocol_object ()->destroy ();
}
AVStreams::StreamEndPoint_ptr
@@ -4134,16 +4171,29 @@ TAO_FlowEndPoint::set_Mcast_peer (AVStreams::FlowConnection_ptr /* the_fc */,
}
char *
-TAO_FlowEndPoint::go_to_listen (AVStreams::QoS & /*the_qos*/,
- CORBA::Boolean is_mcast,
- AVStreams::FlowEndPoint_ptr peer_fep,
- char *& flowProtocol,
- CORBA::Environment &ACE_TRY_ENV)
+TAO_FlowEndPoint::go_to_listen_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & /*the_qos*/,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol,
+ CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::failedToListen,
AVStreams::FPError,
AVStreams::QoSRequestFailed))
{
+ char direction [BUFSIZ];
+ switch (role)
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ ACE_OS::strcpy (direction,"IN");
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_CONSUMER:
+ ACE_OS::strcpy (direction,"OUT");
+ break;
+ default:
+ break;
+ }
AVStreams::protocolSpec my_protocol_spec,peer_protocol_spec;
AVStreams::protocolSpec_ptr temp_protocols;
CORBA::Any_var AvailableProtocols_ptr =
@@ -4189,18 +4239,17 @@ TAO_FlowEndPoint::go_to_listen (AVStreams::QoS & /*the_qos*/,
TAO_Forward_FlowSpec_Entry *entry;
ACE_NEW_RETURN (entry,
TAO_Forward_FlowSpec_Entry (this->flowname_.in (),
- CORBA::string_dup (""),
+ direction,
this->format_.in (),
flowProtocol,
this->protocol_addresses_ [j]),
0);
TAO_AV_Acceptor_Registry *acceptor_registry = TAO_AV_CORE::instance ()->acceptor_registry ();
- TAO_AV_FlowSpecSet flow_spec_set;
- flow_spec_set.insert (entry);
+ this->flow_spec_set_.insert (entry);
int result = acceptor_registry->open (this,
TAO_AV_CORE::instance (),
- flow_spec_set);
+ this->flow_spec_set_);
if (result < 0)
return 0;
char *listen_address = entry->get_local_addr_str ();
@@ -4216,29 +4265,41 @@ TAO_FlowEndPoint::go_to_listen (AVStreams::QoS & /*the_qos*/,
CORBA::Boolean
-TAO_FlowEndPoint::connect_to_peer (AVStreams::QoS & /*the_qos*/,
- const char * address,
- const char * use_flow_protocol,
- CORBA::Environment &/*ACE_TRY_ENV*/)
+TAO_FlowEndPoint::connect_to_peer_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & /*the_qos*/,
+ const char * address,
+ const char * use_flow_protocol,
+ CORBA::Environment &/*ACE_TRY_ENV*/)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::failedToConnect,
AVStreams::FPError,
AVStreams::QoSRequestFailed))
{
+ char direction [BUFSIZ];
+ switch (role)
+ {
+ case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
+ ACE_OS::strcpy (direction,"IN");
+ break;
+ case TAO_FlowSpec_Entry::TAO_AV_CONSUMER:
+ ACE_OS::strcpy (direction,"OUT");
+ break;
+ default:
+ break;
+ }
TAO_Forward_FlowSpec_Entry *entry;
ACE_NEW_RETURN (entry,
TAO_Forward_FlowSpec_Entry (this->flowname_.in (),
- "OUT",
+ direction,
this->format_.in (),
use_flow_protocol,
address),
0);
- TAO_AV_FlowSpecSet flow_spec_set;
- flow_spec_set.insert (entry);
+ this->flow_spec_set_.insert (entry);
TAO_AV_Connector_Registry *connector_registry = TAO_AV_CORE::instance ()->connector_registry ();
int result = connector_registry->open (this,
TAO_AV_CORE::instance (),
- flow_spec_set);
+ this->flow_spec_set_);
if (result < 0)
ACE_ERROR_RETURN ((LM_ERROR,"TAO_FlowEndPoint::connector_registry::open failed\n"),0);
this->reverse_channel_ = entry->get_local_addr_str ();
@@ -4246,11 +4307,9 @@ TAO_FlowEndPoint::connect_to_peer (AVStreams::QoS & /*the_qos*/,
}
int
-TAO_FlowEndPoint::set_protocol_object (const char */*flowname*/,
+TAO_FlowEndPoint::set_protocol_object (const char *flowname,
TAO_AV_Protocol_Object *object)
{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_FlowEndPoint::set_protocol_object\n"));
- this->protocol_object_ = object;
return 0;
}
@@ -4285,19 +4344,64 @@ void
TAO_FlowProducer::stop (CORBA::Environment &/*ACE_TRY_ENV*/)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- // this->protocol_object_->stop ();
- this->handler_->stop (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = (*begin);
+ entry->handler ()->stop (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ }
}
void
TAO_FlowProducer::start (CORBA::Environment &/*ACE_TRY_ENV*/)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- // this->protocol_object_->start ();
- this->handler_->start (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ {
+ TAO_FlowSpec_Entry *entry = (*begin);
+ entry->handler ()->start (TAO_FlowSpec_Entry::TAO_AV_PRODUCER);
+ }
+}
+
+char *
+TAO_FlowProducer::go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->go_to_listen_i (TAO_FlowSpec_Entry::TAO_AV_PRODUCER,
+ the_qos,
+ is_mcast,
+ peer_fep,
+ flowProtocol,
+ ACE_TRY_ENV);
}
-// multicast is currently not supported
+CORBA::Boolean
+TAO_FlowProducer::connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->connect_to_peer_i (TAO_FlowSpec_Entry::TAO_AV_PRODUCER,
+ the_qos,
+ address,
+ use_flow_protocol,
+ ACE_TRY_ENV);
+}
+// Connect to a IP multicast address.
char *
TAO_FlowProducer::connect_mcast (AVStreams::QoS & /* the_qos */,
CORBA::Boolean_out /* is_met */,
@@ -4315,23 +4419,26 @@ TAO_FlowProducer::connect_mcast (AVStreams::QoS & /* the_qos */,
{
// choose the protocol which supports multicast.
}
- TAO_Forward_FlowSpec_Entry entry (this->flowname_.in (),
- "IN",
- this->format_.in (),
- use_flow_protocol,
- address);
- TAO_AV_FlowSpecSet mcast_set;
- mcast_set.insert (&entry);
+ TAO_Forward_FlowSpec_Entry *entry;
+ ACE_NEW_RETURN (entry,
+ TAO_Forward_FlowSpec_Entry(this->flowname_.in (),
+ "IN",
+ this->format_.in (),
+ use_flow_protocol,
+ address),
+ 0);
+
+ this->flow_spec_set_.insert (entry);
TAO_AV_Acceptor_Registry *acceptor_registry =
TAO_AV_CORE::instance ()->acceptor_registry ();
int result = acceptor_registry->open (this,
TAO_AV_CORE::instance (),
- mcast_set);
+ this->flow_spec_set_);
if (result < 0)
ACE_ERROR_RETURN ((LM_ERROR,"TAO_FlowProducer::connect_mcast:acceptor_registry open failed\n"),0);
// Now remove our handler from the reactor since we're a producer and dont want to get called for
// multicast packets.
- ACE_Event_Handler *event_handler = entry.handler ()->event_handler ();
+ ACE_Event_Handler *event_handler = entry->handler ()->event_handler ();
event_handler->reactor ()->remove_handler (event_handler,
ACE_Event_Handler::READ_MASK);
return CORBA::string_dup (address);
@@ -4391,16 +4498,56 @@ void
TAO_FlowConsumer::stop (CORBA::Environment &/*ACE_TRY_ENV*/)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- // this->protocol_object_->stop ();
- this->handler_->stop (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ (*begin)->handler ()->stop (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
}
void
TAO_FlowConsumer::start (CORBA::Environment &/*ACE_TRY_ENV*/)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- // this->protocol_object_->start ();
- this->handler_->start (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+ TAO_AV_FlowSpecSetItor end = this->flow_spec_set_.end ();
+ for (TAO_AV_FlowSpecSetItor begin = this->flow_spec_set_.begin ();
+ begin != end; ++begin)
+ (*begin)->handler ()->start (TAO_FlowSpec_Entry::TAO_AV_CONSUMER);
+}
+
+char *
+TAO_FlowConsumer::go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer_fep,
+ char *& flowProtocol,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->go_to_listen_i (TAO_FlowSpec_Entry::TAO_AV_CONSUMER,
+ the_qos,
+ is_mcast,
+ peer_fep,
+ flowProtocol,
+ ACE_TRY_ENV);
+}
+
+CORBA::Boolean
+TAO_FlowConsumer::connect_to_peer (AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol,
+ CORBA::Environment &ACE_TRY_ENV)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed))
+{
+ return this->connect_to_peer_i (TAO_FlowSpec_Entry::TAO_AV_CONSUMER,
+ the_qos,
+ address,
+ use_flow_protocol,
+ ACE_TRY_ENV);
}
//------------------------------------------------------------
@@ -4617,15 +4764,23 @@ template class ACE_DLList_Iterator <TAO_FlowConsumer>;
template class ACE_Node <TAO_FlowSpec_Entry*>;
template class ACE_Unbounded_Set <TAO_FlowSpec_Entry*>;
template class ACE_Unbounded_Set_Iterator <TAO_FlowSpec_Entry*>;
-template class ACE_Node <TAO_AV_Protocol_Item*>;
+
+template class ACE_Node <TAO_AV_Transport_Item*>;
+template class ACE_Unbounded_Set<TAO_AV_Transport_Item*>;
+template class ACE_Unbounded_Set_Iterator<TAO_AV_Transport_Item*>;
+
+template class ACE_Node <TAO_AV_Flow_Protocol_Item*>;
+template class ACE_Unbounded_Set<TAO_AV_Flow_Protocol_Item*>;
+template class ACE_Unbounded_Set_Iterator<TAO_AV_Flow_Protocol_Item*>;
+
template class ACE_Node<AVStreams::FlowProducer *>;
-template class ACE_Node<AVStreams::FlowConsumer *>;
-template class ACE_Unbounded_Set<TAO_AV_Protocol_Item*>;
-template class ACE_Unbounded_Set<AVStreams::FlowConsumer *>;
template class ACE_Unbounded_Set<AVStreams::FlowProducer *>;
-template class ACE_Unbounded_Set_Iterator<TAO_AV_Protocol_Item*>;
template class ACE_Unbounded_Set_Iterator<AVStreams::FlowProducer *>;
+
+template class ACE_Node<AVStreams::FlowConsumer *>;
+template class ACE_Unbounded_Set<AVStreams::FlowConsumer *>;
template class ACE_Unbounded_Set_Iterator<AVStreams::FlowConsumer *>;
+
template class ACE_Map_Manager<int, ACE_Svc_Tuple<TAO_AV_TCP_Flow_Handler> *, ACE_RW_SYNCH_MUTEX>;
template class ACE_Svc_Tuple<TAO_AV_TCP_Flow_Handler>;
@@ -4743,14 +4898,22 @@ template class ACE_Svc_Tuple<TAO_AV_TCP_Flow_Handler>;
#pragma instantiate ACE_Node <TAO_FlowSpec_Entry*>
#pragma instantiate ACE_Unbounded_Set <TAO_FlowSpec_Entry*>
#pragma instantiate ACE_Unbounded_Set_Iterator <TAO_FlowSpec_Entry*>
-#pragma instantiate ACE_Node <TAO_AV_Protocol_Item*>
+
+#pragma instantiate ACE_Node <TAO_AV_Transport_Item*>
+#pragma instantiate ACE_Unbounded_Set<TAO_AV_Transport_Item*>
+#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_AV_Transport_Item*>
+
+#pragma instantiate ACE_Node <TAO_AV_Flow_Protocol_Item*>
+#pragma instantiate ACE_Unbounded_Set<TAO_AV_Flow_Protocol_Item*>
+#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_AV_Transport_Item*>
+
#pragma instantiate ACE_Node<AVStreams::FlowProducer *>
+#pragma instantiate ACE_Unbounded_Set<AVStreams::FlowProducer *>
+#pragma instantiate ACE_Unbounded_Set_Iterator<AVStreams::FlowProducer *>
+
#pragma instantiate ACE_Node<AVStreams::FlowConsumer *>
-#pragma instantiate ACE_Unbounded_Set<TAO_AV_Protocol_Item*>
-#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_AV_Protocol_Item*>
#pragma instantiate ACE_Unbounded_Set<AVStreams::FlowConsumer *>
-#pragma instantiate ACE_Unbounded_Set<AVStreams::FlowProducer *>
#pragma instantiate ACE_Unbounded_Set_Iterator<AVStreams::FlowConsumer *>
-#pragma instantiate ACE_Unbounded_Set_Iterator<AVStreams::FlowProducer *>
+
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
index fcffee3852c..ed6a1050f3c 100644
--- a/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
+++ b/TAO/orbsvcs/orbsvcs/AV/AVStreams_i.h
@@ -48,6 +48,10 @@
#include "FlowSpec_Entry.h"
+#if defined(sun) || defined(__osf__)
+extern "C" int gethostname(char* name, int len);
+#endif
+
#define FLOWSPEC_MAX 5
// for the Hash_Map helper classes.
@@ -508,18 +512,12 @@ public:
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 int set_rtcp_info (const char *flowname,
- TAO_AV_SourceManager *source_manager,
- TAO_AV_RTP_State *state);
-
- virtual int get_rtp_source (TAO_AV_Source *&source,
- const char *flowname,
- ACE_UINT32 srcid,
- ACE_UINT32 ssrc,
- ACE_UINT32 addr);
virtual void set_handler (const char *flowname,
TAO_AV_Flow_Handler *handler);
};
@@ -697,8 +695,8 @@ protected:
AVStreams::StreamEndPoint_var peer_sep_;
AVStreams::SFPStatus *sfp_status_;
AVStreams::StreamCtrl_var streamctrl_;
- TAO_Forward_FlowSpec_Entry forward_entries_ [FLOWSPEC_MAX];
- TAO_Reverse_FlowSpec_Entry reverse_entries_ [FLOWSPEC_MAX];
+// TAO_Forward_FlowSpec_Entry forward_entries_ [FLOWSPEC_MAX];
+// TAO_Reverse_FlowSpec_Entry reverse_entries_ [FLOWSPEC_MAX];
};
@@ -1252,6 +1250,20 @@ public:
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::failedToConnect,
AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+ // 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_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ const char * address,
+ const char * use_flow_protocol,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
AVStreams::QoSRequestFailed));
// connect to the peer endpoint.
@@ -1264,6 +1276,21 @@ public:
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::failedToListen,
AVStreams::FPError,
+ AVStreams::QoSRequestFailed)) = 0;
+ // 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_i (TAO_FlowSpec_Entry::Role role,
+ AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToListen,
+ AVStreams::FPError,
AVStreams::QoSRequestFailed));
// listen request from the peer.
@@ -1293,8 +1320,7 @@ protected:
CORBA::String_var format_;
CORBA::String_var flowname_;
CosPropertyService::Properties dev_params_;
- TAO_AV_Protocol_Object *protocol_object_;
- TAO_AV_Flow_Handler *handler_;
+ TAO_AV_FlowSpecSet flow_spec_set_;
CORBA::String_var reverse_channel_;
};
@@ -1330,6 +1356,27 @@ public:
ACE_THROW_SPEC ((CORBA::SystemException));
// start this flow, to be overridden by the application.
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ 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,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
+
virtual char * connect_mcast (AVStreams::QoS & the_qos,
CORBA::Boolean_out is_met,
const char * address,
@@ -1383,6 +1430,27 @@ public:
CORBA::Environment::default_environment ())
ACE_THROW_SPEC ((CORBA::SystemException));
// start this flow, to be overridden by the application.
+
+ virtual char * go_to_listen (AVStreams::QoS & the_qos,
+ CORBA::Boolean is_mcast,
+ AVStreams::FlowEndPoint_ptr peer,
+ char *& flowProtocol,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ 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,
+ CORBA::Environment &env =
+ CORBA::Environment::default_environment ())
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ AVStreams::failedToConnect,
+ AVStreams::FPError,
+ AVStreams::QoSRequestFailed));
};
diff --git a/TAO/orbsvcs/orbsvcs/AV/AV_Core.h b/TAO/orbsvcs/orbsvcs/AV/AV_Core.h
index bc9f7371317..f98863df02a 100644
--- a/TAO/orbsvcs/orbsvcs/AV/AV_Core.h
+++ b/TAO/orbsvcs/orbsvcs/AV/AV_Core.h
@@ -30,41 +30,73 @@ class TAO_AV_Connector;
class TAO_FlowSpec_Entry;
//forward declaration.
-class TAO_AV_Protocol_Factory;
+class TAO_AV_Transport_Factory;
-class TAO_Export TAO_AV_Protocol_Item
+class TAO_Export TAO_AV_Transport_Item
{
public:
- TAO_AV_Protocol_Item (const ACE_CString &name);
- // creator method, the protocol name can only be set when the
+ TAO_AV_Transport_Item (const ACE_CString &name);
+ // creator method, the Transport name can only be set when the
// object is created.
- const ACE_CString &protocol_name (void);
- // return a reference to the character representation of the protocol
+ const ACE_CString &name (void);
+ // return a reference to the character representation of the Transport
// factories name.
- TAO_AV_Protocol_Factory *factory (void);
- // return a pointer to the protocol factory.
+ TAO_AV_Transport_Factory *factory (void);
+ // return a pointer to the Transport factory.
- void factory (TAO_AV_Protocol_Factory *factory);
+ void factory (TAO_AV_Transport_Factory *factory);
// set the factory pointer's valus.
private:
ACE_CString name_;
- // protocol factory name.
+ // Transport factory name.
- TAO_AV_Protocol_Factory *factory_;
+ TAO_AV_Transport_Factory *factory_;
// pointer to factory object.
};
-// typedefs for containers containing the list of loaded protocol
+class TAO_AV_Flow_Protocol_Factory;
+
+class TAO_Export TAO_AV_Flow_Protocol_Item
+{
+public:
+ TAO_AV_Flow_Protocol_Item (const ACE_CString &name);
+ // creator method, the Flow_Protocol name can only be set when the
+ // object is created.
+
+ const ACE_CString &name (void);
+ // return a reference to the character representation of the Flow_Protocol
+ // factories name.
+
+ TAO_AV_Flow_Protocol_Factory *factory (void);
+ // return a pointer to the Flow_Protocol factory.
+
+ void factory (TAO_AV_Flow_Protocol_Factory *factory);
+ // set the factory pointer's valus.
+
+private:
+ ACE_CString name_;
+ // Flow_Protocol factory name.
+
+ TAO_AV_Flow_Protocol_Factory *factory_;
+ // pointer to factory object.
+};
+
+// typedefs for containers containing the list of loaded Flow_Protocol
// factories.
-typedef ACE_Unbounded_Set<TAO_AV_Protocol_Item*>
- TAO_AV_ProtocolFactorySet;
+typedef ACE_Unbounded_Set<TAO_AV_Flow_Protocol_Item*>
+ TAO_AV_Flow_ProtocolFactorySet;
+
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Flow_Protocol_Item*>
+ TAO_AV_Flow_ProtocolFactorySetItor;
-typedef ACE_Unbounded_Set_Iterator<TAO_AV_Protocol_Item*>
- TAO_AV_ProtocolFactorySetItor;
+typedef ACE_Unbounded_Set<TAO_AV_Transport_Item*>
+ TAO_AV_TransportFactorySet;
+typedef ACE_Unbounded_Set_Iterator<TAO_AV_Transport_Item*>
+ TAO_AV_TransportFactorySetItor;
typedef ACE_Unbounded_Set <TAO_FlowSpec_Entry*> TAO_AV_FlowSpecSet;
typedef ACE_Unbounded_Set_Iterator <TAO_FlowSpec_Entry*> TAO_AV_FlowSpecSetItor;
@@ -92,13 +124,13 @@ public:
};
TAO_AV_Core (void);
- // = Get the connector registry
+ // Default constructor.
~TAO_AV_Core (void);
// Destructor.
int init (int &argc,
- char **argv,
+ char *argv [],
CORBA::Environment &env);
int run (void);
int stop_run (void);
@@ -110,7 +142,8 @@ public:
TAO_AV_FlowSpecSet &forward_flow_spec_set,
TAO_AV_FlowSpecSet &reverse_flow_spec_set,
EndPoint direction);
- int init_protocol_factories (void);
+ int init_transport_factories (void);
+ int init_flow_protocol_factories (void);
TAO_AV_Acceptor *get_acceptor (const char *flowname);
TAO_AV_Connector *get_connector (const char *flowname);
@@ -121,11 +154,13 @@ public:
TAO_AV_Acceptor_Registry *acceptor_registry (void);
// = Get the protocol factories
- TAO_AV_ProtocolFactorySet *protocol_factories (void);
+ TAO_AV_Flow_ProtocolFactorySet *flow_protocol_factories (void);
+ TAO_AV_TransportFactorySet *transport_factories (void);
// = Set/get the <ACE_Reactor>.
void reactor (ACE_Reactor *r);
ACE_Reactor *reactor (void);
TAO_ORB_Manager *orb_manager (void);
+
protected:
TAO_AV_Connector_Registry *connector_registry_;
// The connector registry which all active connecters must register
@@ -135,8 +170,11 @@ protected:
// The registry which maintains a list of acceptor factories for each
// loaded protocol.
- TAO_AV_ProtocolFactorySet protocol_factories_;
- // Pointer to the list of protocol loaded into this ORB instance.
+ TAO_AV_TransportFactorySet transport_factories_;
+ // Pointer to the list of transports loaded into this AV_Core instance.
+
+ TAO_AV_Flow_ProtocolFactorySet flow_protocol_factories_;
+ // Pointer to the list of flow protocol loaded into this AV_Core instance.
ACE_Reactor *reactor_;
CORBA::ORB_var orb_;
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
index e2a68cc6afb..b1e2917f794 100644
--- a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
@@ -25,7 +25,8 @@ TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (void)
local_addr_ (0),
transport_ (0),
handler_ (0),
- protocol_object_ (0)
+ protocol_object_ (0),
+ is_multicast_ (0)
{
}
@@ -49,10 +50,12 @@ TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
local_addr_ (0),
transport_ (0),
handler_ (0),
- protocol_object_ (0)
+ protocol_object_ (0),
+ is_multicast_ (0)
{
this->set_protocol ();
this->set_direction (this->direction_str_);
+ this->parse_flow_protocol_string (this->flow_protocol_);
}
TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
@@ -73,7 +76,8 @@ TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
local_addr_ (0),
transport_ (0),
handler_ (0),
- protocol_object_ (0)
+ protocol_object_ (0),
+ is_multicast_ (0)
{
ACE_CString cstring(this->address_str_,0,0);
int colon_pos = cstring.find (':');
@@ -141,6 +145,7 @@ TAO_FlowSpec_Entry::set_protocol (void)
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_FlowSpec_Entry::set_protocol:%s\n",buf));
if (IN_CLASSD (inet_addr->get_ip_address ()))
{
+ this->is_multicast_ = 1;
switch (this->protocol_)
{
case TAO_AV_Core::TAO_AV_UDP:
@@ -194,20 +199,23 @@ TAO_FlowSpec_Entry::parse_address (char *address)
-1);
this->address_ = inet_addr;
if (IN_CLASSD (inet_addr->get_ip_address ()))
- switch (this->protocol_)
- {
- case TAO_AV_Core::TAO_AV_UDP:
- this->protocol_ = TAO_AV_Core::TAO_AV_UDP_MCAST;
- break;
- case TAO_AV_Core::TAO_AV_RTP_UDP:
- this->protocol_ = TAO_AV_Core::TAO_AV_RTP_UDP_MCAST;
- break;
- case TAO_AV_Core::TAO_AV_SFP_UDP:
- this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP_MCAST;
- break;
- default:
- break;
- }
+ {
+ this->is_multicast_ = 1;
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_UDP_MCAST;
+ break;
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
}
break;
default:
@@ -297,14 +305,14 @@ TAO_Forward_FlowSpec_Entry::parse (const char *flowSpec_entry)
if (tokenizer [TAO_AV_FORMAT] != 0)
this->format_ = tokenizer [TAO_AV_FORMAT];
- if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
- if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
- return -1;
-
if (tokenizer [TAO_AV_ADDRESS] != 0)
if (this->parse_address (tokenizer [TAO_AV_ADDRESS]) < 0)
return -1;
+ if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
+ if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
+ return -1;
+
return 0;
}
@@ -439,14 +447,14 @@ TAO_Reverse_FlowSpec_Entry::parse (const char *flowSpec_entry)
TAO_Tokenizer tokenizer (flowSpec_entry,'\\');
this->flowname_ = tokenizer [TAO_AV_FLOWNAME];
- if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
- if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
- return -1;
-
if (tokenizer [TAO_AV_ADDRESS] != 0)
if (this->parse_address (tokenizer [TAO_AV_ADDRESS]) < 0)
return -1;
+ if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
+ if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
+ return -1;
+
if (tokenizer [TAO_AV_DIRECTION] != 0)
this->set_direction (tokenizer [TAO_AV_DIRECTION]);
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h
index 4a2d686f656..3ecff97e0e0 100644
--- a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.h
@@ -142,7 +142,12 @@ public:
int parse_address (char *format_string);
// sets the address for this flow.
+
+ int is_multicast (void);
+ // returns true for a multicast address.
+
protected:
+
int parse_flow_protocol_string (char *flow_options_string);
// parses the flow protocol string with tokens separated by :
@@ -184,6 +189,7 @@ protected:
char *entry_;
// The flowspec entry;
+ int is_multicast_;
ACE_Addr *peer_addr_;
ACE_Addr *local_addr_;
TAO_AV_Transport *transport_;
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i
index cf39fb3f7bc..404e58d1f1c 100644
--- a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.i
@@ -186,3 +186,9 @@ TAO_FlowSpec_Entry::protocol_object (TAO_AV_Protocol_Object *object)
this->protocol_object_ = object;
}
+ACE_INLINE
+int
+TAO_FlowSpec_Entry::is_multicast (void)
+{
+ return this->is_multicast_;
+}
diff --git a/TAO/orbsvcs/orbsvcs/AV/MCast.cpp b/TAO/orbsvcs/orbsvcs/AV/MCast.cpp
index 28fbfafd541..6deb81ea0af 100644
--- a/TAO/orbsvcs/orbsvcs/AV/MCast.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/MCast.cpp
@@ -5,268 +5,15 @@
#include "AVStreams_i.h"
//------------------------------------------------------------
-// TAO_AV_UDP_MCast_Acceptor
-//------------------------------------------------------------
-
-TAO_AV_UDP_MCast_Acceptor::TAO_AV_UDP_MCast_Acceptor (void)
-{
-}
-
-TAO_AV_UDP_MCast_Acceptor::~TAO_AV_UDP_MCast_Acceptor (void)
-{
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&mcast_handler)
-{
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (mcast_handler,
- TAO_AV_UDP_MCast_Flow_Handler (callback),
- -1);
- callback->transport (mcast_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_UDP_MCast_Object (callback,
- mcast_handler->transport ()),
- -1);
- mcast_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),mcast_handler);
- this->entry_->protocol_object (object);
- this->entry_->handler (mcast_handler);
- }
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::open_i (ACE_Reactor *reactor,
- ACE_INET_Addr *&mcast_addr,
- TAO_AV_UDP_MCast_Flow_Handler *&handler)
-
-{
- this->make_svc_handler (handler);
- int result = handler->get_mcast_socket ()->subscribe (*mcast_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_connector::open failed\n"),-1);
- // Now disable Multicast loopback.
- // @@Should we make this a policy?
- if (handler->get_mcast_socket ()->set_option (IP_MULTICAST_LOOP,
- 0) < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::multicast loop disable failed\n"));
- // @@ This should also be policies.
- int bufsize = 80 * 1024;
- if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
- SO_RCVBUF,
- (char *)&bufsize,
- sizeof(bufsize)) < 0)
- {
- bufsize = 32 * 1024;
- if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
- SO_RCVBUF,
- (char *)&bufsize,
- sizeof(bufsize)) < 0)
- perror("SO_RCVBUF");
- }
-
- result = this->activate_svc_handler (handler);
- if (result < 0)
- return result;
-// ACE_INET_Addr *local_addr = 0;
-// ACE_NEW_RETURN (local_addr,
-// ACE_INET_Addr,
-// -1);
-// handler->get_mcast_socket ()->get_local_addr (*local_addr);
-// mcast_addr = local_addr;
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- this->av_core_ = av_core;
- this->endpoint_ = endpoint;
- this->entry_ = entry;
-
- ACE_INET_Addr *mcast_addr = ACE_dynamic_cast (ACE_INET_Addr*,entry->address ());
- this->open_i (av_core->reactor (),
- mcast_addr,
- this->handler_);
-
- entry->handler (this->handler_);
- entry->set_local_addr (mcast_addr);
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::open_default (TAO_Base_StreamEndPoint */*endpoint*/,
- TAO_AV_Core */*av_core*/,
- TAO_FlowSpec_Entry */*entry*/)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::open_default\n"));
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::activate_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *handler)
-{
- ACE_Event_Handler *event_handler = handler;
- // ACE_HANDLE fd = event_handler->get_handle ();
- int result = this->av_core_->reactor ()->register_handler (event_handler,
- ACE_Event_Handler::READ_MASK);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Acceptor::activate_svc_handler failed\n"),result);
- event_handler->reactor (this->av_core_->reactor ());
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Acceptor::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_MCast_Connector
-//------------------------------------------------------------
-TAO_AV_UDP_MCast_Connector::TAO_AV_UDP_MCast_Connector (void)
-{
-}
-
-TAO_AV_UDP_MCast_Connector::~TAO_AV_UDP_MCast_Connector (void)
-{
-}
-
-int
-TAO_AV_UDP_MCast_Connector::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&mcast_handler)
-{
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (mcast_handler,
- TAO_AV_UDP_MCast_Flow_Handler (callback),
- -1);
- callback->transport (mcast_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_UDP_MCast_Object (callback,
- mcast_handler->transport ()),
- -1);
- mcast_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),mcast_handler);
- this->entry_->protocol_object (object);
- this->entry_->handler (mcast_handler);
- }
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Connector::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Connector::open "));
- this->endpoint_ = endpoint;
- this->av_core_ = av_core;
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Connector::connect_i (ACE_Reactor *reactor,
- ACE_INET_Addr *&mcast_addr,
- TAO_AV_UDP_MCast_Flow_Handler *&handler)
-{
- this->make_svc_handler (handler);
- int result = handler->get_mcast_socket ()->subscribe (*mcast_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_connector::open failed\n"),-1);
- // Now disable Multicast loopback.
- // @@Should we make this a policy?
- if (handler->get_mcast_socket ()->set_option (IP_MULTICAST_LOOP,
- 0) < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::multicast loop disable failed\n"));
- int bufsize = 80 * 1024;
- if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
- SO_RCVBUF,
- (char *)&bufsize,
- sizeof(bufsize)) < 0)
- {
- bufsize = 32 * 1024;
- if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
- SO_RCVBUF,
- (char *)&bufsize,
- sizeof(bufsize)) < 0)
- perror("SO_RCVBUF");
- }
-
- result = this->activate_svc_handler (handler);
- if (result < 0)
- return result;
-// ACE_INET_Addr *local_addr = 0;
-// ACE_NEW_RETURN (local_addr,
-// ACE_INET_Addr,
-// -1);
-// handler->get_mcast_socket ()->get_local_addr (*local_addr);
-// mcast_addr = local_addr;
-}
-
-int
-TAO_AV_UDP_MCast_Connector::connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport)
-{
- this->entry_ = entry;
- ACE_INET_Addr *mcast_addr = ACE_dynamic_cast (ACE_INET_Addr *,entry->address ());
- this->connect_i (this->av_core_->reactor (),
- mcast_addr,
- this->handler_);
- entry->handler (this->handler_);
- transport = this->handler_->transport ();
- entry->set_local_addr (mcast_addr);
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Connector::activate_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *handler)
-{
- ACE_Event_Handler *event_handler = handler;
- // ACE_HANDLE fd = event_handler->get_handle ();
- int result = this->av_core_->reactor ()->register_handler (event_handler,
- ACE_Event_Handler::READ_MASK);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Acceptor::activate_svc_handler failed\n"),result);
- event_handler->reactor (this->av_core_->reactor ());
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Connector::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
//TAO_AV_UDP_MCast_Flow_Handler
//------------------------------------------------------------
-TAO_AV_UDP_MCast_Flow_Handler::TAO_AV_UDP_MCast_Flow_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback)
+TAO_AV_UDP_MCast_Flow_Handler::TAO_AV_UDP_MCast_Flow_Handler (void)
{
ACE_NEW (transport_,
TAO_AV_UDP_MCast_Transport (this));
ACE_NEW (dgram_mcast_,
ACE_SOCK_Dgram_Mcast);
-
}
TAO_AV_UDP_MCast_Flow_Handler::~TAO_AV_UDP_MCast_Flow_Handler (void)
@@ -279,19 +26,7 @@ TAO_AV_UDP_MCast_Flow_Handler::~TAO_AV_UDP_MCast_Flow_Handler (void)
int
TAO_AV_UDP_MCast_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
{
- size_t size = 2*this->transport_->mtu ();
- ACE_Message_Block *frame = 0;
- ACE_NEW_RETURN (frame,
- ACE_Message_Block (size),
- -1);
- int n = this->transport_->recv (frame->rd_ptr (),
- frame->size ());
- if (n == -1)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_Flow_Handler::handle_input recv failed\n"),-1);
- if (n == -1)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_Flow_Handler::handle_input connection closed\n"),-1);
- frame->wr_ptr (n);
- this->callback_->receive_frame (frame);
+ this->protocol_object_->handle_input ();
return 0;
}
@@ -441,17 +176,6 @@ TAO_AV_UDP_MCast_Transport::mtu (void)
}
-//ACE_INLINE ssize_t
-//TAO_AV_UDP_MCast_Transport::send (const iovec *iov,
-// int iovcnt,
-// ACE_Time_Value *)
-//{
-// return this->handler_->get_mcast_socket ()->send (iov,
-// iovcnt,
-// 0);
-//
-//}
-//
ACE_INLINE ssize_t
TAO_AV_UDP_MCast_Transport::recv (char *buf,
size_t len,
@@ -481,45 +205,3 @@ TAO_AV_UDP_MCast_Transport::recv (iovec *iov,
{
return handler_->get_mcast_socket ()->recv (iov,this->peer_addr_,0,timeout);
}
-
-
-//------------------------------------------------------------
-// TAO_AV_UDP_MCast_Protocol_Factory
-//------------------------------------------------------------
-
-TAO_AV_UDP_MCast_Protocol_Factory::TAO_AV_UDP_MCast_Protocol_Factory (void)
-{
-}
-
-TAO_AV_UDP_MCast_Protocol_Factory::~TAO_AV_UDP_MCast_Protocol_Factory (void)
-{
-}
-
-int
-TAO_AV_UDP_MCast_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_UDP_MCAST);
-}
-
-
-TAO_AV_Acceptor*
-TAO_AV_UDP_MCast_Protocol_Factory::make_acceptor (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Protocol_Factory::make_acceptor "));
- TAO_AV_Acceptor *acceptor = 0;
- ACE_NEW_RETURN (acceptor,
- TAO_AV_UDP_MCast_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector*
-TAO_AV_UDP_MCast_Protocol_Factory::make_connector (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Protocol_Factory::make_connector "));
- TAO_AV_Connector *connector = 0;
- ACE_NEW_RETURN (connector,
- TAO_AV_UDP_MCast_Connector,
- 0);
- return connector;
-}
diff --git a/TAO/orbsvcs/orbsvcs/AV/MCast.h b/TAO/orbsvcs/orbsvcs/AV/MCast.h
index 3f3a13e465c..530163eaa49 100644
--- a/TAO/orbsvcs/orbsvcs/AV/MCast.h
+++ b/TAO/orbsvcs/orbsvcs/AV/MCast.h
@@ -16,11 +16,11 @@
//
// ============================================================================
-
#ifndef TAO_AV_MCAST_H
#define TAO_AV_MCAST_H
#include "FlowSpec_Entry.h"
+#include "Protocol_Factory.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Dgram_Mcast.h"
@@ -30,10 +30,10 @@ class TAO_AV_UDP_MCast_Transport
:public TAO_AV_Transport
{
// = TITLE
- // A transport abstraction for socket streams.
+ // A transport abstraction for Multicast dgram sockets.
//
// = DESCRIPTION
- // Uses the ACE_SOCK_Stream to send the data.
+ // Uses the ACE_SOCK_Dgram_Mcast to send the data.
public:
TAO_AV_UDP_MCast_Transport (void);
@@ -84,65 +84,12 @@ protected:
ACE_INET_Addr local_addr_;
};
-class TAO_AV_UDP_MCast_Acceptor
- :public TAO_AV_Acceptor
-{
-public:
- TAO_AV_UDP_MCast_Acceptor (void);
- virtual ~TAO_AV_UDP_MCast_Acceptor (void);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int open_i (ACE_Reactor *reactor,
- ACE_INET_Addr *&address,
- TAO_AV_UDP_MCast_Flow_Handler *&handler);
-
- virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&udp_handler);
- virtual int activate_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *handler);
-protected:
- TAO_FlowSpec_Entry *entry_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_AV_Core *av_core_;
- TAO_AV_UDP_MCast_Flow_Handler *handler_;
-};
-
-class TAO_AV_UDP_MCast_Connector
- :public TAO_AV_Connector
-{
-public:
- TAO_AV_UDP_MCast_Connector (void);
- virtual ~TAO_AV_UDP_MCast_Connector (void);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core);
-
- virtual int connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport);
-
- int connect_i (ACE_Reactor *reactor,
- ACE_INET_Addr *&address,
- TAO_AV_UDP_MCast_Flow_Handler *&handler);
-
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&udp_handler);
- virtual int activate_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *handler);
-protected:
- ACE_CString flowname_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_AV_Core *av_core_;
- TAO_FlowSpec_Entry *entry_;
- TAO_AV_UDP_MCast_Flow_Handler *handler_;
-};
-
class TAO_AV_UDP_MCast_Flow_Handler
:public virtual TAO_AV_Flow_Handler,
public virtual ACE_Event_Handler
{
public:
- TAO_AV_UDP_MCast_Flow_Handler (TAO_AV_Callback *callback);
+ TAO_AV_UDP_MCast_Flow_Handler (void);
// Ctor
~TAO_AV_UDP_MCast_Flow_Handler (void);
// Dtor
@@ -156,17 +103,6 @@ protected:
ACE_SOCK_Dgram_Mcast *dgram_mcast_;
};
-class TAO_AV_UDP_MCast_Protocol_Factory
- :public TAO_AV_Protocol_Factory
-{
-public:
- TAO_AV_UDP_MCast_Protocol_Factory (void);
- virtual ~TAO_AV_UDP_MCast_Protocol_Factory (void);
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- virtual TAO_AV_Acceptor *make_acceptor (void);
- virtual TAO_AV_Connector *make_connector (void);
-};
-
#if defined(__ACE_INLINE__)
#include "MCast.i"
#endif /* __ACE_INLINE__ */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Nil.cpp b/TAO/orbsvcs/orbsvcs/AV/Nil.cpp
index 719db950241..d084789c6b3 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Nil.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/Nil.cpp
@@ -3,123 +3,43 @@
#include "Nil.h"
#include "FlowSpec_Entry.h"
-//------------------------------------------------------------
-// TAO_AV_TCP_Object
-//------------------------------------------------------------
-
-int
-TAO_AV_TCP_Object::send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info)
-{
- int result = this->transport_->send (frame);
- if (result < 0)
- return result;
- return 0;
-}
-
-int
-TAO_AV_TCP_Object::send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info)
-{
- return this->transport_->send (iov,iovcnt);
-}
-
-TAO_AV_TCP_Object::TAO_AV_TCP_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport)
- :TAO_AV_Protocol_Object (callback,transport)
-{
-}
-
-TAO_AV_TCP_Object::~TAO_AV_TCP_Object (void)
-{
- // No-op
-}
-int
-TAO_AV_TCP_Object::end_stream (void)
-{
- this->callback_->handle_end_stream ();
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_Object
-//------------------------------------------------------------
-
-int
-TAO_AV_UDP_Object::send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Object::send_frame\n"));
- int result = this->transport_->send (frame);
- if (result < 0)
- return result;
- return 0;
-}
-
-int
-TAO_AV_UDP_Object::send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info)
-{
- return this->transport_->send (iov,iovcnt);
-}
-
-TAO_AV_UDP_Object::TAO_AV_UDP_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport)
- :TAO_AV_Protocol_Object (callback,transport)
-{
-}
-
-TAO_AV_UDP_Object::~TAO_AV_UDP_Object (void)
-{
- //no-op
-}
-
-int
-TAO_AV_UDP_Object::end_stream (void)
-{
- this->callback_->handle_end_stream ();
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_MCast_Object
-//------------------------------------------------------------
-
-
-TAO_AV_UDP_MCast_Object::TAO_AV_UDP_MCast_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport)
- :TAO_AV_Protocol_Object (callback,transport)
-{
-}
-
-TAO_AV_UDP_MCast_Object::~TAO_AV_UDP_MCast_Object (void)
-{
- //no-op
-}
-
-int
-TAO_AV_UDP_MCast_Object::send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info)
-{
- int result = this->transport_->send (frame);
- if (result < 0)
- return result;
- return 0;
-}
-
-int
-TAO_AV_UDP_MCast_Object::send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info)
-{
- return this->transport_->send (iov,iovcnt);
-}
-
-int
-TAO_AV_UDP_MCast_Object::end_stream (void)
-{
- this->callback_->handle_end_stream ();
- return 0;
-}
+// //------------------------------------------------------------
+// // TAO_AV_UDP_MCast_Object
+// //------------------------------------------------------------
+
+
+// TAO_AV_UDP_MCast_Object::TAO_AV_UDP_MCast_Object (TAO_AV_Callback *callback,
+// TAO_AV_Transport *transport)
+// :TAO_AV_Protocol_Object (callback,transport)
+// {
+// }
+
+// TAO_AV_UDP_MCast_Object::~TAO_AV_UDP_MCast_Object (void)
+// {
+// //no-op
+// }
+
+// int
+// TAO_AV_UDP_MCast_Object::send_frame (ACE_Message_Block *frame,
+// TAO_AV_frame_info *frame_info)
+// {
+// int result = this->transport_->send (frame);
+// if (result < 0)
+// return result;
+// return 0;
+// }
+
+// int
+// TAO_AV_UDP_MCast_Object::send_frame (const iovec *iov,
+// int iovcnt,
+// TAO_AV_frame_info *frame_info)
+// {
+// return this->transport_->send (iov,iovcnt);
+// }
+
+// int
+// TAO_AV_UDP_MCast_Object::end_stream (void)
+// {
+// this->callback_->handle_end_stream ();
+// return 0;
+// }
diff --git a/TAO/orbsvcs/orbsvcs/AV/Nil.h b/TAO/orbsvcs/orbsvcs/AV/Nil.h
index 7542e42afa7..350b038ad07 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Nil.h
+++ b/TAO/orbsvcs/orbsvcs/AV/Nil.h
@@ -21,67 +21,25 @@
#include "Policy.h"
-class TAO_ORBSVCS_Export TAO_AV_TCP_Object : public TAO_AV_Protocol_Object
-{
-public:
- TAO_AV_TCP_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport = 0);
+// class TAO_ORBSVCS_Export TAO_AV_UDP_MCast_Object : public TAO_AV_Protocol_Object
+// {
+// public:
+// TAO_AV_UDP_MCast_Object (TAO_AV_Callback *callback,
+// TAO_AV_Transport *transport = 0);
- virtual ~TAO_AV_TCP_Object (void);
- // Dtor
+// virtual ~TAO_AV_UDP_MCast_Object (void);
+// // Dtor
- virtual int send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info = 0);
- // send a data frame.
+// virtual int send_frame (ACE_Message_Block *frame,
+// TAO_AV_frame_info *frame_info = 0);
+// // send a data frame.
- virtual int send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info = 0);
+// virtual int send_frame (const iovec *iov,
+// int iovcnt,
+// TAO_AV_frame_info *frame_info = 0);
- virtual int end_stream (void);
- // end the stream.
+// virtual int end_stream (void);
+// // end the stream.
+// };
-};
-
-class TAO_ORBSVCS_Export TAO_AV_UDP_Object : public TAO_AV_Protocol_Object
-{
-public:
- TAO_AV_UDP_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport = 0);
-
- virtual ~TAO_AV_UDP_Object (void);
- // Dtor
-
- virtual int send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info = 0);
- // send a data frame.
-
- virtual int send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info = 0);
-
- virtual int end_stream (void);
- // end the stream.
-};
-
-class TAO_ORBSVCS_Export TAO_AV_UDP_MCast_Object : public TAO_AV_Protocol_Object
-{
-public:
- TAO_AV_UDP_MCast_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport = 0);
-
- virtual ~TAO_AV_UDP_MCast_Object (void);
- // Dtor
-
- virtual int send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info = 0);
- // send a data frame.
-
- virtual int send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info = 0);
-
- virtual int end_stream (void);
- // end the stream.
-};
#endif /* TAO_AV_NIL_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.cpp b/TAO/orbsvcs/orbsvcs/AV/Policy.cpp
index e511082e09c..b024cb15d7a 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Policy.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.cpp
@@ -1,6 +1,7 @@
// $Id$
#include "Policy.h"
+#include "FlowSpec_Entry.h"
TAO_AV_Policy::TAO_AV_Policy (TAO_AV_Policy::PolicyType type)
:type_ (type)
@@ -66,59 +67,24 @@ TAO_AV_Policy_Manager::create_policy (TAO_AV_Policy::PolicyType type,
return policy;
}
-TAO_AV_Protocol_Object::TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport)
- :transport_ (transport),
- callback_ (callback)
-{
-}
-
-TAO_AV_Protocol_Object::~TAO_AV_Protocol_Object (void)
-{
- //no-op
-}
-
-int
-TAO_AV_Protocol_Object::start (void)
-{
- return this->callback_->handle_start ();
-}
+// TAO_AV_Callback
-int
-TAO_AV_Protocol_Object::stop (void)
+TAO_AV_Callback::TAO_AV_Callback (void)
+ // :transport_ (0),
+ :protocol_object_ (0)
{
- return this->callback_->handle_stop ();
}
-// int
-// TAO_AV_Protocol_Object::send_frame (const iovec *iov,
-// int iovcnt,
-// TAO_AV_frame_info *frame_info)
-// {
-// ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Protocol_Object::send_frame\n"),-1);
-// }
-
int
-TAO_AV_Protocol_Object::set_policies (const PolicyList &policy_list)
+TAO_AV_Callback::open (TAO_AV_Protocol_Object *object,
+ TAO_AV_Flow_Handler *handler)
{
- this->policy_list_ = policy_list;
+ this->protocol_object_ = object;
+ this->handler_ = handler;
+ handler->callback (this);
return 0;
}
-PolicyList
-TAO_AV_Protocol_Object::get_policies (void)
-{
- return this->policy_list_;
-}
-
-// TAO_AV_Callback
-
-TAO_AV_Callback::TAO_AV_Callback (void)
- :transport_ (0),
- protocol_object_ (0)
-{
-}
-
int
TAO_AV_Callback::handle_start (void)
{
@@ -135,14 +101,22 @@ TAO_AV_Callback::handle_stop (void)
int
TAO_AV_Callback::receive_frame (ACE_Message_Block */*frame*/,
- TAO_AV_frame_info *)
+ TAO_AV_frame_info *,
+ const ACE_Addr &)
{
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::receive_frame\n"));
return -1;
}
int
-TAO_AV_Callback::handle_end_stream (void)
+TAO_AV_Callback::receive_control_frame (ACE_Message_Block *,
+ const ACE_Addr& )
+{
+ return 0;
+}
+
+int
+TAO_AV_Callback::handle_destroy (void)
{
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Callback::handle_end_stream\n"));
return -1;
@@ -162,24 +136,17 @@ TAO_AV_Callback::handle_timeout (void *arg)
return 0;
}
-// int
-// TAO_AV_Callback::get_frame (ACE_Message_Block *&frame,
-// TAO_AV_frame_info *&frame_info)
+// TAO_AV_Transport*
+// TAO_AV_Callback::transport (void)
// {
-// return -1;
+// return this->transport_;
// }
-TAO_AV_Transport*
-TAO_AV_Callback::transport (void)
-{
- return this->transport_;
-}
-
-void
-TAO_AV_Callback::transport (TAO_AV_Transport *transport)
-{
- this->transport_ = transport;
-}
+// void
+// TAO_AV_Callback::transport (TAO_AV_Transport *transport)
+// {
+// this->transport_ = transport;
+// }
TAO_AV_Protocol_Object*
TAO_AV_Callback::protocol_object (void)
@@ -187,10 +154,16 @@ TAO_AV_Callback::protocol_object (void)
return this->protocol_object_;
}
-void
-TAO_AV_Callback::protocol_object (TAO_AV_Protocol_Object *object)
+// void
+// TAO_AV_Callback::protocol_object (TAO_AV_Protocol_Object *object)
+// {
+// this->protocol_object_ = object;
+// }
+
+int
+TAO_AV_Callback::schedule_timer (void)
{
- this->protocol_object_ = object;
+ return this->handler_->schedule_timer ();
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.h b/TAO/orbsvcs/orbsvcs/AV/Policy.h
index 7d7997f39c1..926f9c711b1 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Policy.h
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.h
@@ -19,6 +19,7 @@
#ifndef TAO_AV_POLICY_H
#define TAO_AV_POLICY_H
+#include "ace/Addr.h"
#include "tao/TAO.h"
#include "tao/debug.h"
#include "orbsvcs/orbsvcs_export.h"
@@ -26,6 +27,8 @@
struct TAO_AV_frame_info
{
CORBA::Boolean boundary_marker;
+ CORBA::Octet format;
+ // @@ Shouldn't this be a string.
CORBA::ULong timestamp;
CORBA::ULong ssrc;
CORBA::ULong sequence_num;
@@ -48,6 +51,7 @@ public:
TAO_AV_RTCP_SDES_POLICY,
TAO_AV_TIMESTAMP_POLICY
};
+
TAO_AV_Policy (PolicyType type);
PolicyType type (void);
protected:
@@ -110,13 +114,20 @@ public:
class TAO_AV_Protocol_Object;
class TAO_AV_Transport;
+class TAO_AV_Flow_Handler;
class TAO_AV_Callback
{
- //@@coryan:Document this class.
-
+ // = TITLE
+ // Callback class that the user will be implementing for receiving
+ // frames from the network and also for timer events.
public:
TAO_AV_Callback (void);
+
+ int open (TAO_AV_Protocol_Object *object,
+ TAO_AV_Flow_Handler *handler);
+ // Called for opening the callback.
+
virtual int handle_start (void);
// Called during Streamctrl->start.
@@ -126,67 +137,32 @@ public:
virtual int handle_timeout (void *arg);
// Called during timeout for Flow Producers.
+ virtual int schedule_timer (void);
+
virtual int receive_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info = 0);
+ TAO_AV_frame_info *frame_info = 0,
+ const ACE_Addr &address = ACE_Addr::sap_any);
+
// Called when a frame arrives for a FlowConsumer.
- virtual int handle_end_stream (void);
+ virtual int receive_control_frame (ACE_Message_Block *frame,
+ const ACE_Addr &address = ACE_Addr::sap_any);
+ // address from which the frame was received.
+
+ virtual int handle_destroy (void);
// Called during Streamctrl->destroy i.e tear_down of the stream
- // @@coryan:Call it handle_destroy or handle_close.
virtual void get_timeout (ACE_Time_Value *&tv,
void *&arg);
// Called to get the timeout. If tv is 0 then the framework stop
- // calling this.
+ // calling this. This will be called during the start of the frame
+ // and also if schedule_timer is called to get the timeout.
-// virtual int get_frame (ACE_Message_Block *&frame,
-// TAO_AV_frame_info *&frame_info);
- // @@: Should these be in the open method??
- TAO_AV_Transport *transport (void);
- void transport (TAO_AV_Transport *transport);
TAO_AV_Protocol_Object *protocol_object (void);
- void protocol_object (TAO_AV_Protocol_Object *object);
+ // Accessor to protocol object.
protected:
- TAO_AV_Transport *transport_;
TAO_AV_Protocol_Object *protocol_object_;
-};
-
-class TAO_AV_Protocol_Object
-{
-public:
- TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport = 0);
- // constructor.
-
- virtual ~TAO_AV_Protocol_Object (void);
- // Destructor
-
- virtual int set_policies (const PolicyList &policy_list);
- virtual PolicyList get_policies (void);
- // set/get policies.
-
- virtual int start (void);
- virtual int stop (void);
- // start/stop the flow.
-
- virtual int send_frame (ACE_Message_Block *frame,
- TAO_AV_frame_info *frame_info = 0) = 0;
- // send a data frame.
-
- virtual int send_frame (const iovec *iov,
- int iovcnt,
- TAO_AV_frame_info *frame_info = 0) = 0;
- // @@Naga: We might need to make this pure virtual
- void transport (TAO_AV_Transport *transport);
- TAO_AV_Transport *transport (void);
- // set/get the transport.
-
- virtual int end_stream (void) = 0;
- // end the stream.
-protected:
- TAO_AV_Transport *transport_;
- PolicyList policy_list_;
- TAO_AV_Callback *callback_;
+ TAO_AV_Flow_Handler *handler_;
};
#if defined(__ACE_INLINE__)
diff --git a/TAO/orbsvcs/orbsvcs/AV/Policy.i b/TAO/orbsvcs/orbsvcs/AV/Policy.i
index fb652bad800..e2dd0de51be 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Policy.i
+++ b/TAO/orbsvcs/orbsvcs/AV/Policy.i
@@ -55,22 +55,6 @@ TAO_AV_Timestamp_Policy::value (void)
return this->timestamp_;
}
-//--------------------------------------------------
-// TAO_AV_Protocol_Object
-//--------------------------------------------------
-
-ACE_INLINE TAO_AV_Transport*
-TAO_AV_Protocol_Object::transport (void)
-{
- return this->transport_;
-}
-
-ACE_INLINE void
-TAO_AV_Protocol_Object::transport (TAO_AV_Transport *transport)
-{
- this->transport_ = transport;
-}
-
// TAO_AV_RTCP_Sdes_Policy
ACE_INLINE TAO_AV_Policy::sdes &
TAO_AV_RTCP_Sdes_Policy::value (void)
diff --git a/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp
new file mode 100644
index 00000000000..5314a9c4f43
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.cpp
@@ -0,0 +1,157 @@
+// $Id$
+
+
+#include "Protocol_Factory.h"
+#include "ace/Dynamic_Service.h"
+
+TAO_AV_Transport_Factory::TAO_AV_Transport_Factory (void)
+{
+}
+
+TAO_AV_Transport_Factory::~TAO_AV_Transport_Factory (void)
+{
+}
+
+int
+TAO_AV_Transport_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return -1;
+}
+
+int
+TAO_AV_Transport_Factory::match_protocol (const char * /* protocol_string */)
+{
+ return 0;
+}
+
+TAO_AV_Acceptor *
+TAO_AV_Transport_Factory::make_acceptor (void)
+{
+ return 0;
+}
+
+TAO_AV_Connector *
+TAO_AV_Transport_Factory::make_connector (void)
+{
+ return 0;
+}
+
+// TAO_AV_Flow_Protocol_Factory
+TAO_AV_Flow_Protocol_Factory::TAO_AV_Flow_Protocol_Factory (void)
+{
+}
+
+TAO_AV_Flow_Protocol_Factory::~TAO_AV_Flow_Protocol_Factory (void)
+{
+}
+
+TAO_AV_Flow_Protocol_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return -1;
+}
+
+int
+TAO_AV_Flow_Protocol_Factory::match_protocol (const char * /* protocol_string */)
+{
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_Flow_Protocol_Factory::make_protocol_object (TAO_FlowSpec_Entry * /* entry */,
+ TAO_Base_StreamEndPoint * /* endpoint */ ,
+ TAO_AV_Flow_Handler * /* handler */,
+ TAO_AV_Transport * /* transport */)
+{
+ return 0;
+}
+
+const char *
+TAO_AV_Flow_Protocol_Factory::control_flow_factory (void)
+{
+ return 0;
+}
+
+//----------------------------------------------------------------------
+// TAO_AV_Protocol_Object
+//----------------------------------------------------------------------
+TAO_AV_Protocol_Object::TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :transport_ (transport),
+ callback_ (callback)
+{
+}
+
+int
+TAO_AV_Protocol_Object::open (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+{
+ this->callback_ = callback;
+ this->transport_ = transport;
+ return 0;
+}
+
+TAO_AV_Protocol_Object::~TAO_AV_Protocol_Object (void)
+{
+ //no-op
+}
+
+int
+TAO_AV_Protocol_Object::start (void)
+{
+ return this->callback_->handle_start ();
+}
+
+int
+TAO_AV_Protocol_Object::stop (void)
+{
+ return this->callback_->handle_stop ();
+}
+
+int
+TAO_AV_Protocol_Object::set_policies (const PolicyList &policy_list)
+{
+ this->policy_list_ = policy_list;
+ return 0;
+}
+
+PolicyList
+TAO_AV_Protocol_Object::get_policies (void)
+{
+ return this->policy_list_;
+}
+
+TAO_AV_Transport*
+TAO_AV_Protocol_Object::transport (void)
+{
+ return this->transport_;
+}
+
+// void
+// TAO_AV_Protocol_Object::transport (TAO_AV_Transport *transport)
+// {
+// this->transport_ = transport;
+// }
+
+void
+TAO_AV_Protocol_Object::control_object (TAO_AV_Protocol_Object * /* object */)
+{
+ return;
+}
+
+int
+TAO_AV_Protocol_Object::handle_control_input (ACE_Message_Block *,
+ const ACE_Addr &)
+{
+ ACE_DEBUG ((LM_DEBUG,"TAO_AV_Protocol_Object::handle_control_input\n"));
+ return 0;
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Dynamic_Service<TAO_AV_Transport_Factory>;
+template class ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Dynamic_Service<TAO_AV_Transport_Factory>
+#pragma instantiate ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h
new file mode 100644
index 00000000000..c837004d757
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Protocol_Factory.h
@@ -0,0 +1,117 @@
+/* -*- C++ -*- */
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// ORBSVCS AVStreams
+//
+// = FILENAME
+// Protocol_Factory
+//
+// = AUTHOR
+// Nagarajan Surendran <naga@cs.wustl.edu>
+//
+//
+// ============================================================================
+
+#ifndef TAO_AV_PROTOCOL_FACTORY_T_H
+#define TAO_AV_PROTOCOL_FACTORY_T_H
+
+#include "ace/Service_Object.h"
+#include "Policy.h"
+#include "FlowSpec_Entry.h"
+
+class TAO_ORBSVCS_Export TAO_AV_Transport_Factory : public ACE_Service_Object
+{
+public:
+ TAO_AV_Transport_Factory (void);
+ virtual ~TAO_AV_Transport_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_Protocol_Object (void);
+
+ TAO_AV_Protocol_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+ // constructor.
+
+ virtual ~TAO_AV_Protocol_Object (void);
+ // Destructor
+
+ virtual int open (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport);
+
+ void role (TAO_FlowSpec_Entry::Role role);
+ // 0 = Producer, 1 = consumer.
+
+ virtual int handle_input (void) = 0;
+
+ virtual int handle_control_input (ACE_Message_Block *control_frame,
+ const ACE_Addr &peer_address);
+ // Called on a control object.
+
+ virtual int set_policies (const PolicyList &policy_list);
+ virtual PolicyList get_policies (void);
+ // set/get policies.
+
+ virtual int start (void);
+ virtual int stop (void);
+ // start/stop the flow.
+
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0) = 0;
+ // send a data frame.
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0) = 0;
+ // send a frame in iovecs.
+
+ virtual void control_object (TAO_AV_Protocol_Object *object);
+ virtual int destroy (void) = 0;
+ // end the stream.
+ TAO_AV_Transport *transport (void);
+protected:
+ TAO_AV_Transport *transport_;
+ PolicyList policy_list_;
+ TAO_AV_Callback *callback_;
+};
+
+class TAO_ORBSVCS_Export TAO_AV_Flow_Protocol_Factory : public ACE_Service_Object
+{
+public:
+ TAO_AV_Flow_Protocol_Factory (void);
+ virtual ~TAO_AV_Flow_Protocol_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+ virtual const char *control_flow_factory (void);
+};
+
+class TAO_ORBSVCS_Export TAO_AV_SFP_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_SFP_Factory (void);
+ virtual ~TAO_AV_SFP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+#endif /* TAO_AV_PROTOCOL_FACTORY_T_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp b/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp
index 199f2ed752b..a90c6c39224 100644
--- a/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP.cpp
@@ -33,15 +33,10 @@
*/
// $Id$
-#include "RTP.h"
#include "RTCP.h"
#include "media-timer.h"
#include "ntp-time.h"
-// static hash map of rtcp handlers for all the flows.
-TAO_AV_RTCP::RTCP_MCast_Map TAO_AV_RTCP::rtcp_mcast_map_;
-TAO_AV_RTCP::RTCP_UDP_Map TAO_AV_RTCP::rtcp_udp_map_;
-
// TAO_AV_RTP_State
TAO_AV_RTP_State::TAO_AV_RTP_State (void)
:bad_version_(0),
@@ -322,10 +317,10 @@ TAO_AV_RTCP::parse_bye (rtcphdr* rh,
*/
void
TAO_AV_RTCP::send_report (int bye,
- TAO_AV_Transport *transport,
+ TAO_AV_Protocol_Object *protocol_object,
TAO_AV_SourceManager *source_manager,
TAO_AV_RTP_State *state,
- TAO_AV_RTCP_Flow_Handler *handler)
+ TAO_AV_RTCP_Callback *callback)
{
if (source_manager->localsrc () == 0)
return;
@@ -417,7 +412,9 @@ TAO_AV_RTCP::send_report (int bye,
else
len += build_sdes ( (rtcphdr*)rr, s,state);
- transport->send ((char *)state->pktbuf_, len);
+ ACE_Message_Block mb ((char *)state->pktbuf_, len);
+ mb.wr_ptr (len);
+ protocol_object->send_frame (&mb);
state->rtcp_avg_size_ += RTCP_SIZE_GAIN * (double (len + 28) - state->rtcp_avg_size_);
@@ -444,37 +441,29 @@ TAO_AV_RTCP::send_report (int bye,
if (rint < RTCP_MIN_RPT_TIME * 1000.)
rint = RTCP_MIN_RPT_TIME * 1000.;
state->rint_ = rint;
- handler->schedule (int (fmod (double (ACE_OS::rand ()), rint) + rint * .5 + .5));
+ callback->schedule (int (fmod (double (ACE_OS::rand ()), rint) + rint * .5 + .5));
source_manager->CheckActiveSources (rint);
}
int
-TAO_AV_RTCP::handle_input (TAO_AV_Transport *transport,
+TAO_AV_RTCP::handle_input (ACE_Message_Block *data,
+ const ACE_Addr &peer_address,
rtcphdr &header,
TAO_AV_SourceManager *source_manager,
TAO_AV_RTP_State *state)
{
- ACE_Message_Block *data;
- size_t bufsiz = 2*transport->mtu ();
- ACE_NEW_RETURN (data,
- ACE_Message_Block (bufsiz),
- -1);
- int cc = transport->recv (data->rd_ptr (),bufsiz);
- if (cc == 0)
- ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:connection closed\n"),-1);
- if (cc < 0)
- ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:recv error\n"),-1);
+ int cc = data->length ();
int size_phdr = ACE_static_cast (int, sizeof (rtcphdr));
if (cc < size_phdr)
{
state->nrunt_++;
ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:invalid header\n"),-1);
}
- ACE_Addr *peer_addr = 0;
- peer_addr = transport->get_peer_addr ();
- if (peer_addr == 0)
+ if (peer_address == ACE_Addr::sap_any)
ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:get_peer_addr failed\n"),-1);
+ // @@ We need to be careful of this.
+ u_long addr = peer_address.hash ();
header = * (rtcphdr*) (data->rd_ptr ());
rtcphdr *rh = (rtcphdr *)data->rd_ptr ();
/*
@@ -505,19 +494,6 @@ TAO_AV_RTCP::handle_input (TAO_AV_Transport *transport,
double tmp = ACE_static_cast (double, result);
tmp *= RTCP_SIZE_GAIN;
state->rtcp_avg_size_ += ACE_static_cast (int, tmp);
- ACE_UINT32 addr = 0;
- switch (peer_addr->get_type ())
- {
- case AF_INET:
- {
- ACE_INET_Addr *inet_addr =
- ACE_static_cast (ACE_INET_Addr *,peer_addr);
- addr = inet_addr->get_ip_address ();
- }
- break;
- default:
- break;
- }
/*
* First record in compound packet must be the ssrc of the
* sender of the packet. Pull it out here so we can use
@@ -586,161 +562,361 @@ TAO_AV_RTCP::alloc_srcid (ACE_UINT32 addr)
return (srcid);
}
-// TAO_AV_RTCP_Flow_Handler
-TAO_AV_RTCP_Flow_Handler::TAO_AV_RTCP_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname)
- :reactor_ (reactor),
- endpoint_ (endpoint),
- flowname_ (flowname)
+
+// TAO_AV_RTCP_Flow_Factory
+TAO_AV_RTCP_Flow_Factory::TAO_AV_RTCP_Flow_Factory (void)
{
- ACE_NEW (this->source_manager_,
- TAO_AV_SourceManager (flowname,
- endpoint,
- this));
}
-TAO_AV_RTCP_Flow_Handler::~TAO_AV_RTCP_Flow_Handler (void)
+TAO_AV_RTCP_Flow_Factory::~TAO_AV_RTCP_Flow_Factory (void)
{
- delete this->source_manager_;
}
-void
-TAO_AV_RTCP_Flow_Handler::init (void)
+int
+TAO_AV_RTCP_Flow_Factory::match_protocol (const char *flow_string)
{
- // Schedule a timer.
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_RTCP_Flow_Handler::schedule\n"));
- /*
- * schedule a timer for our first report using half the
- * min rtcp interval. This gives us some time before
- * our first report to learn about other sources so our
- * next report interval will account for them. The avg
- * rtcp size was initialized to 128 bytes which is
- * conservative (it assumes everyone else is generating
- * SRs instead of RRs).
- */
- double rint = this->state_.rtcp_avg_size_ * this->state_.rtcp_inv_bw_;
- if (rint < RTCP_MIN_RPT_TIME / 2. * 1000.)
- rint = RTCP_MIN_RPT_TIME / 2. * 1000.;
- this->state_.rint_ = rint;
- int msec = int(fmod(double(ACE_OS::rand ()), rint) + rint * .5 + .5);
- this->schedule (msec);
+ if (ACE_OS::strncasecmp (flow_string,"RTCP",4) == 0)
+ return 1;
+ return 0;
}
-void
-TAO_AV_RTCP_Flow_Handler::schedule (int sched)
+int
+TAO_AV_RTCP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_RTCP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_control_callback (entry->flowname (),
+ callback);
+ if (callback == 0)
+ ACE_NEW_RETURN (callback,
+ TAO_AV_RTCP_Callback,
+ 0);
+ TAO_AV_Protocol_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_RTCP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ return object;
+}
+
+// TAO_AV_RTCP_Object
+int
+TAO_AV_RTCP_Object::handle_input (void)
+{
+ ACE_Message_Block *data;
+ size_t bufsiz = 2*this->transport_->mtu ();
+ ACE_NEW_RETURN (data,
+ ACE_Message_Block (bufsiz),
+ -1);
+ int n = this->transport_->recv (data->rd_ptr (),bufsiz);
+ if (n == 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:connection closed\n"),-1);
+ if (n < 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:recv error\n"),-1);
+ data->wr_ptr (n);
+ this->callback_->receive_control_frame (data);
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info)
+{
+ return this->transport_->send (frame);
+}
+
+int
+TAO_AV_RTCP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info)
+{
+ return this->transport_->send (iov,
+ iovcnt);
+}
+
+TAO_AV_RTCP_Object::TAO_AV_RTCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+}
+
+TAO_AV_RTCP_Object::~TAO_AV_RTCP_Object (void)
+{
+}
+
+int
+TAO_AV_RTCP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ return 0;
+}
+
+int
+TAO_AV_RTCP_Object::set_policies (const PolicyList &policy_list)
+{
+ return -1;
+}
+
+int
+TAO_AV_RTCP_Object::start (void)
+{
+ return this->callback_->handle_start ();
+}
+
+int
+TAO_AV_RTCP_Object::stop (void)
+{
+ return this->callback_->handle_stop ();
+}
+
+int
+TAO_AV_RTCP_Object::handle_control_input (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address)
+{
+ frame->rd_ptr ((size_t)0);
+ // Since the rd_ptr would have been moved ahead.
+ return this->callback_->receive_frame (frame,
+ 0,
+ peer_address);
+}
+
+// TAO_AV_RTCP_Callback
+TAO_AV_RTCP_Callback::TAO_AV_RTCP_Callback (void)
+{
+ ACE_NEW (source_manager_,
+ TAO_AV_SourceManager (this));
+
+ ACE_NEW (this->state_,
+ TAO_AV_RTP_State);
+}
+
+TAO_AV_RTCP_Callback::~TAO_AV_RTCP_Callback (void)
{
- ACE_Time_Value delta (0,sched*ACE_ONE_SECOND_IN_MSECS);
- int result = this->reactor_->schedule_timer (this->event_handler (),
- 0,
- delta);
- if (result < 0)
- ACE_ERROR ((LM_ERROR,"TAO_AV_RTCP_Flow_Handler::schedule_timer failed\n"));
}
TAO_AV_SourceManager*
-TAO_AV_RTCP_Flow_Handler::source_manager (void)
+TAO_AV_RTCP_Callback::source_manager (void)
{
return this->source_manager_;
}
TAO_AV_RTP_State*
-TAO_AV_RTCP_Flow_Handler::state (void)
+TAO_AV_RTCP_Callback::state (void)
{
- return &this->state_;
+ return this->state_;
}
-//------------------------------------------------------------
-//TAO_AV_RTCP_UDP_Flow_Handler
-//------------------------------------------------------------
-
-TAO_AV_RTCP_UDP_Flow_Handler::TAO_AV_RTCP_UDP_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname)
- :TAO_AV_Flow_Handler (0),
- TAO_AV_UDP_Flow_Handler (0),
- TAO_AV_RTCP_Flow_Handler (reactor,endpoint,flowname)
+int
+TAO_AV_RTCP_Callback::get_rtp_source (TAO_AV_Source *&source,
+ ACE_UINT32 srcid,
+ ACE_UINT32 ssrc,
+ ACE_UINT32 addr)
{
+ ACE_NEW_RETURN (source,
+ TAO_AV_Source (srcid,
+ ssrc,
+ addr),
+ -1);
+ return 0;
}
-TAO_AV_RTCP_UDP_Flow_Handler::~TAO_AV_RTCP_UDP_Flow_Handler (void)
+void
+TAO_AV_RTCP_Callback::schedule (int ms)
{
+ this->timeout_ = ms;
}
-ACE_Event_Handler*
-TAO_AV_RTCP_UDP_Flow_Handler::event_handler (void)
+
+int
+TAO_AV_RTCP_Callback::handle_start (void)
{
- return this;
+ //
+ /*
+ * schedule a timer for our first report using half the
+ * min rtcp interval. This gives us some time before
+ * our first report to learn about other sources so our
+ * next report interval will account for them. The avg
+ * rtcp size was initialized to 128 bytes which is
+ * conservative (it assumes everyone else is generating
+ * SRs instead of RRs).
+ */
+ double rint = this->state_->rtcp_avg_size_ * this->state_->rtcp_inv_bw_;
+ if (rint < RTCP_MIN_RPT_TIME / 2. * 1000.)
+ rint = RTCP_MIN_RPT_TIME / 2. * 1000.;
+ this->state_->rint_ = rint;
+ this->timeout_ = int(fmod(double(ACE_OS::rand ()), rint) + rint * .5 + .5);
+ return 0;
}
int
-TAO_AV_RTCP_UDP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+TAO_AV_RTCP_Callback::handle_stop (void)
{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_RTCP_UDP_Flow_Handler::handle_input"));
- TAO_AV_RTCP::rtcphdr rtcp_header;
- int result = TAO_AV_RTCP::handle_input (this->transport_,
- rtcp_header,
- this->source_manager_,
- &this->state_);
- if (result < 0)
- return result;
return 0;
}
int
-TAO_AV_RTCP_UDP_Flow_Handler::handle_timeout (const ACE_Time_Value &/*tv*/,
- const void */*arg*/)
+TAO_AV_RTCP_Callback::handle_timeout (void *arg)
{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_RTCP_UDP_Flow_Handler::handle_timeout"));
+ // Here we do the send_report.
TAO_AV_RTCP::send_report (0,
- this->transport_,
+ this->protocol_object_,
this->source_manager_,
- &this->state_,
+ this->state_,
this);
return 0;
}
-// TAO_AV_RTCP_UDP_MCast_Flow_Handler
-TAO_AV_RTCP_UDP_MCast_Flow_Handler::TAO_AV_RTCP_UDP_MCast_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname)
- :TAO_AV_Flow_Handler (0),
- TAO_AV_UDP_MCast_Flow_Handler (0),
- TAO_AV_RTCP_Flow_Handler (reactor,endpoint,flowname)
+void
+TAO_AV_RTCP_Callback::get_timeout (ACE_Time_Value *&tv,
+ void *&arg)
{
+ // Here we do the RTCP timeout calculation.
+ ACE_NEW (tv,
+ ACE_Time_Value (0,this->timeout_*ACE_ONE_SECOND_IN_MSECS));
}
-TAO_AV_RTCP_UDP_MCast_Flow_Handler::~TAO_AV_RTCP_UDP_MCast_Flow_Handler (void)
+int
+TAO_AV_RTCP_Callback::handle_destroy (void)
{
+ // Here we do the send_bye.
+ TAO_AV_RTCP::send_report (1,
+ this->protocol_object_,
+ this->source_manager_,
+ this->state_,
+ this);
+ return 0;
}
-ACE_Event_Handler*
-TAO_AV_RTCP_UDP_MCast_Flow_Handler::event_handler (void)
+int
+TAO_AV_RTCP_Callback::receive_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *,
+ const ACE_Addr &peer_address)
{
- return this;
+ TAO_AV_RTP::rtphdr *rh = (TAO_AV_RTP::rtphdr *)frame->rd_ptr ();
+ frame->rd_ptr (sizeof (TAO_AV_RTP::rtphdr));
+ this->demux (rh,
+ frame,
+ peer_address);
+ return 0;
}
+
int
-TAO_AV_RTCP_UDP_MCast_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+TAO_AV_RTCP_Callback::receive_control_frame (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address)
{
- TAO_AV_RTCP::rtcphdr rtcp_header;
- int result = TAO_AV_RTCP::handle_input (this->transport_,
- rtcp_header,
+ // Here we do the processing of the RTCP frames.
+ TAO_AV_RTCP::rtcphdr header;
+ int result = TAO_AV_RTCP::handle_input (frame,
+ peer_address,
+ header,
this->source_manager_,
- &this->state_);
+ this->state_);
if (result < 0)
- return result;
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_RTCP::handle_input failed\n"),-1);
return 0;
}
int
-TAO_AV_RTCP_UDP_MCast_Flow_Handler::handle_timeout (const ACE_Time_Value &/*tv*/,
- const void */*arg*/)
+TAO_AV_RTCP_Callback::demux (TAO_AV_RTP::rtphdr* rh,
+ ACE_Message_Block *data,
+ const ACE_Addr &address)
{
- TAO_AV_RTCP::send_report (0,
- this->transport_,
- this->source_manager_,
- &this->state_,
- this);
+ char *bp = data->rd_ptr ();
+ int cc = data->length ();
+ if (cc < 0)
+ {
+ ++this->state_->nrunt_;
+ return -1;
+ }
+ ACE_UINT32 srcid = rh->rh_ssrc;
+ int flags = ntohs (rh->rh_flags);
+ if ( (flags & RTP_X) != 0)
+ {
+ /*
+ * the minimal-control audio/video profile
+ * explicitly forbids extensions
+ */
+ ++this->state_->badext_;
+ return -1;
+ }
+
+ // @@Naga:Maybe the framework itself could check for formats making use of
+ // the property service to query the formats supported for this flow.
+ /*
+ * Check for illegal payload types. Most likely this is
+ * a session packet arriving on the data port.
+ */
+// int fmt = flags & 0x7f;
+// if (!check_format (fmt))
+// {
+// ++state->badfmt_;
+// return;
+// }
+
+ u_long addr = address.hash ();
+ ACE_UINT16 seqno = ntohs (rh->rh_seqno);
+ TAO_AV_Source* s = this->source_manager_->demux (srcid, addr, seqno);
+ if (s == 0)
+ /*
+ * Takes a pair of validated packets before we will
+ * believe the source. This prevents a runaway
+ * allocation of Source data structures for a
+ * stream of garbage packets.
+ */
+ return -1;
+
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ s->lts_data (now);
+ s->sts_data (rh->rh_ts);
+
+ int cnt = (flags >> 8) & 0xf;
+ if (cnt > 0)
+ {
+ u_char* nh = (u_char*)rh + (cnt << 2);
+ while (--cnt >= 0)
+ {
+ ACE_UINT32 csrc = * (ACE_UINT32*)bp;
+ bp += 4;
+ TAO_AV_Source* cs = this->source_manager_->lookup (csrc, srcid, addr);
+ cs->lts_data (now);
+ cs->action ();
+ }
+ /*XXX move header up so it's contiguous with data*/
+ TAO_AV_RTP::rtphdr hdr = *rh;
+ rh = (TAO_AV_RTP::rtphdr*)nh;
+ *rh = hdr;
+ }
+ else
+ s->action ();
+
return 0;
+ /*
+ * This is a data packet. If the source needs activation,
+ * or the packet format has changed, deal with this.
+ * Then, hand the packet off to the packet handler.
+ * XXX might want to be careful about flip-flopping
+ * here when format changes due to misordered packets
+ * (easy solution -- keep rtp seqno of last fmt change).
+ */
}
+
+ACE_FACTORY_DEFINE (AV, TAO_AV_RTCP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_RTCP_Flow_Factory,
+ ASYS_TEXT ("RTCP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_RTCP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP.h b/TAO/orbsvcs/orbsvcs/AV/RTCP.h
index 30bfe48749b..a5f57663280 100644
--- a/TAO/orbsvcs/orbsvcs/AV/RTCP.h
+++ b/TAO/orbsvcs/orbsvcs/AV/RTCP.h
@@ -53,8 +53,10 @@
#include "source.h"
#include "AVStreams_i.h"
+#include "UDP.h"
#include <math.h>
#include <stdlib.h>
+#include "RTP.h"
// TAO_AV_RTP_State
class TAO_AV_RTP_State
@@ -75,57 +77,8 @@ public:
u_char* pktbuf_;
};
-class TAO_AV_RTCP_Flow_Handler
-{
-public:
- TAO_AV_RTCP_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname);
- virtual ~TAO_AV_RTCP_Flow_Handler (void);
- void init (void);
- // initialize the timer.
- virtual ACE_Event_Handler *event_handler (void) = 0;
- void schedule (int value);
- TAO_AV_SourceManager *source_manager (void);
- TAO_AV_RTP_State *state (void);
- TAO_Base_StreamEndPoint *endpoint (void);
-protected:
- TAO_AV_SourceManager *source_manager_;
- TAO_AV_RTP_State state_;
- ACE_Reactor *reactor_;
- TAO_Base_StreamEndPoint *endpoint_;
- CORBA::String_var flowname_;
-};
-
-class TAO_AV_RTCP_UDP_Flow_Handler
- :public TAO_AV_RTCP_Flow_Handler,
- public TAO_AV_UDP_Flow_Handler
-{
-public:
- TAO_AV_RTCP_UDP_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname);
- virtual ~TAO_AV_RTCP_UDP_Flow_Handler (void);
- virtual ACE_Event_Handler *event_handler (void);
- virtual int handle_input (ACE_HANDLE fd);
- virtual int handle_timeout (const ACE_Time_Value &tv,
- const void *arg = 0);
-};
-
-class TAO_AV_RTCP_UDP_MCast_Flow_Handler
- :public TAO_AV_RTCP_Flow_Handler,
- public TAO_AV_UDP_MCast_Flow_Handler
-{
-public:
- TAO_AV_RTCP_UDP_MCast_Flow_Handler (ACE_Reactor *reactor,
- TAO_Base_StreamEndPoint *endpoint,
- const char *flowname);
- virtual ~TAO_AV_RTCP_UDP_MCast_Flow_Handler (void);
- virtual ACE_Event_Handler *event_handler (void);
- virtual int handle_input (ACE_HANDLE fd);
- virtual int handle_timeout (const ACE_Time_Value &tv,
- const void *arg = 0);
-};
+class TAO_AV_RTCP_Callback;
+class TAO_AV_SourceManager;
class TAO_AV_RTCP
{
@@ -166,7 +119,8 @@ public:
ACE_UINT32 rr_dlsr; /* time from recpt of last rr to xmit time */
};
- static int handle_input (TAO_AV_Transport *transport,
+ static int handle_input (ACE_Message_Block *data,
+ const ACE_Addr &peer_address,
rtcphdr &header,
TAO_AV_SourceManager *source_manager,
TAO_AV_RTP_State *state);
@@ -224,17 +178,118 @@ public:
TAO_AV_SourceManager *source_manager);
static void send_report (int bye,
- TAO_AV_Transport *transport,
+ TAO_AV_Protocol_Object *object,
TAO_AV_SourceManager *source_manager,
TAO_AV_RTP_State *state,
- TAO_AV_RTCP_Flow_Handler *handler);
+ TAO_AV_RTCP_Callback *callback);
static ACE_UINT32 alloc_srcid (ACE_UINT32 addr);
+};
+
+class TAO_AV_Callback;
+
+class TAO_ORBSVCS_Export TAO_AV_RTCP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_RTCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+ // constructor.
+
+ virtual ~TAO_AV_RTCP_Object (void);
+ // Destructor
+
+ virtual int handle_input (void);
+ virtual int handle_control_input (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address);
+
+ virtual int set_policies (const PolicyList &policy_list);
+ // set/get policies.
+
+ virtual int start (void);
+ virtual int stop (void);
+ // start/stop the flow.
+
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+ // send a data frame.
- typedef ACE_Hash_Map_Manager <TAO_String_Hash_Key,TAO_AV_RTCP_UDP_MCast_Flow_Handler*,ACE_Null_Mutex> RTCP_MCast_Map;
- typedef ACE_Hash_Map_Manager <TAO_String_Hash_Key,TAO_AV_RTCP_UDP_Flow_Handler*,ACE_Null_Mutex> RTCP_UDP_Map;
- static RTCP_MCast_Map rtcp_mcast_map_;
- static RTCP_UDP_Map rtcp_udp_map_;
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+ // send a frame in iovecs.
+
+ virtual int destroy (void);
+ // end the stream.
};
+
+class TAO_ORBSVCS_Export TAO_AV_RTCP_Flow_Factory
+ :public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_RTCP_Flow_Factory (void);
+ virtual ~TAO_AV_RTCP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+class TAO_ORBSVCS_Export TAO_AV_RTCP_Callback : public TAO_AV_Callback
+{
+public:
+ TAO_AV_RTCP_Callback (void);
+ // RTCP callback.
+
+ virtual ~TAO_AV_RTCP_Callback (void);
+ // virtual destructor.
+
+ virtual int handle_start (void);
+ // Called during Streamctrl->start.
+
+ virtual int handle_stop (void);
+ // Called during Streamctrl->stop.
+
+ virtual int handle_timeout (void *arg);
+ // Called during timeout for Flow Producers.
+
+ virtual int receive_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0,
+ const ACE_Addr &peer_address = ACE_Addr::sap_any);
+ // Called when a frame arrives for a FlowConsumer.
+
+ virtual int receive_control_frame (ACE_Message_Block *frame,
+ const ACE_Addr &peer_address = ACE_Addr::sap_any);
+
+ virtual int handle_destroy (void);
+ // Called during Streamctrl->destroy i.e tear_down of the stream
+ // @@coryan:Call it handle_destroy or handle_close.
+
+ virtual void get_timeout (ACE_Time_Value *&tv,
+ void *&arg);
+ // Called to get the timeout. If tv is 0 then the framework stop
+ // calling this.
+
+ int demux (TAO_AV_RTP::rtphdr* rh,
+ ACE_Message_Block *data,
+ const ACE_Addr &peer_address);
+
+ virtual int get_rtp_source (TAO_AV_Source *&source,
+ ACE_UINT32 srcid,
+ ACE_UINT32 ssrc,
+ ACE_UINT32 addr);
+ void schedule (int ms);
+ TAO_AV_SourceManager *source_manager (void);
+ TAO_AV_RTP_State *state (void);
+protected:
+ TAO_AV_SourceManager *source_manager_;
+ TAO_AV_RTP_State *state_;
+ int timeout_;
+};
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_RTCP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_RTCP_Flow_Factory)
+
#endif /* TAO_AV_RTCP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTP.cpp b/TAO/orbsvcs/orbsvcs/AV/RTP.cpp
index 3b5e216c42c..f65322d9d1e 100644
--- a/TAO/orbsvcs/orbsvcs/AV/RTP.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/RTP.cpp
@@ -35,73 +35,27 @@
// $Id$
#include "RTP.h"
+#include "RTCP.h"
#include "Nil.h"
int
-TAO_AV_RTP::handle_input (TAO_AV_Transport *transport,
- ACE_Message_Block *&data,
- TAO_AV_frame_info *&frame_info,
- ACE_Addr &addr,
- TAO_AV_SourceManager *source_manager,
- TAO_AV_RTP_State *state)
+TAO_AV_RTP::handle_input (ACE_Message_Block *&data,
+ TAO_AV_frame_info *&frame_info)
{
- size_t bufsiz = 2*transport->mtu ();
- if (data == 0)
- {
- ACE_NEW_RETURN (data,
- ACE_Message_Block (bufsiz),
- -1);
- }
- else
- if (data->size () < bufsiz)
- ACE_ERROR_RETURN ( (LM_ERROR,"data block size not enough\n"),-1);
- int n = transport->recv (data->rd_ptr (),bufsiz);
- if (n == 0)
- ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:connection closed\n"),-1);
- if (n < 0)
- ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:recv error\n"),-1);
+ int n = data->length ();
int size_phdr = ACE_static_cast (int, sizeof (rtphdr));
if (n < size_phdr)
ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:invalid header\n"),-1);
- data->wr_ptr (n);
- ACE_Addr *addr_ptr = 0;
- addr_ptr = transport->get_peer_addr ();
- if (addr_ptr == 0)
- if (TAO_debug_level > 0) ACE_DEBUG ( (LM_ERROR,"TAO_AV_RTP::handle_input:get_peer_addr failed\n"));
- addr = *addr_ptr;
rtphdr* rh = (rtphdr*)data->rd_ptr ();
int version = * (u_char*)rh >> 6;
if (version != 2)
{
- state->bad_version_++;
+ // state->bad_version_++;
ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP:bad version\n"),-1);
}
TAO_AV_RTP::rtphdr header;
header = *rh;
- ACE_UINT32 ip_addr;
- switch (addr_ptr->get_type ())
- {
- case AF_INET:
- {
- ACE_INET_Addr *inet_addr = ACE_static_cast (ACE_INET_Addr *,addr_ptr);
- ip_addr = inet_addr->get_ip_address ();
- }
- break;
- default:
- if (TAO_debug_level > 0) ACE_DEBUG ( (LM_DEBUG,"TAO_AV_RTP::Unknown address type\n"));
- break;
- }
data->rd_ptr (sizeof (rtphdr));
- int result = TAO_AV_RTP::demux (rh,
- data,
- ip_addr,
- source_manager,
- state);
- if (result < 0)
- {
- data->release ();
- return -1;
- }
ACE_NEW_RETURN (frame_info,
TAO_AV_frame_info,
-1);
@@ -110,128 +64,9 @@ TAO_AV_RTP::handle_input (TAO_AV_Transport *transport,
frame_info->ssrc = header.rh_ssrc;
frame_info->sequence_num = header.rh_seqno;
frame_info->format = header.rh_flags & 0x7f;
-// ACE_Message_Block *frame_info_mb;
-// ACE_NEW_RETURN (frame_info_mb,
-// ACE_Message_Block ((char *)frame_info,
-// sizeof (TAO_AV_frame_info)),
-// -1);
-// frame_info_mb->wr_ptr (sizeof(TAO_AV_frame_info));
-// frame_info_mb->cont (data);
-// data = frame_info_mb;
return 0;
}
-int
-TAO_AV_RTP::demux (rtphdr* rh,
- ACE_Message_Block *data,
- ACE_UINT32 addr,
- TAO_AV_SourceManager *source_manager,
- TAO_AV_RTP_State *state)
-{
- char *bp = data->rd_ptr ();
- int cc = data->length ();
- if (cc < 0)
- {
- ++state->nrunt_;
- return -1;
- }
- ACE_UINT32 srcid = rh->rh_ssrc;
- int flags = ntohs (rh->rh_flags);
- if ( (flags & RTP_X) != 0)
- {
- /*
- * the minimal-control audio/video profile
- * explicitly forbids extensions
- */
- ++state->badext_;
- return -1;
- }
-
- // @@Naga:Maybe the framework itself could check for formats making use of
- // the property service to query the formats supported for this flow.
- /*
- * Check for illegal payload types. Most likely this is
- * a session packet arriving on the data port.
- */
-// int fmt = flags & 0x7f;
-// if (!check_format (fmt))
-// {
-// ++state->badfmt_;
-// return;
-// }
-
- ACE_UINT16 seqno = ntohs (rh->rh_seqno);
- TAO_AV_Source* s = source_manager->demux (srcid, addr, seqno);
- if (s == 0)
- /*
- * Takes a pair of validated packets before we will
- * believe the source. This prevents a runaway
- * allocation of Source data structures for a
- * stream of garbage packets.
- */
- return -1;
-
- ACE_Time_Value now = ACE_OS::gettimeofday ();
- s->lts_data (now);
- s->sts_data (rh->rh_ts);
-
- int cnt = (flags >> 8) & 0xf;
- if (cnt > 0)
- {
- u_char* nh = (u_char*)rh + (cnt << 2);
- while (--cnt >= 0)
- {
- ACE_UINT32 csrc = * (ACE_UINT32*)bp;
- bp += 4;
- TAO_AV_Source* cs = source_manager->lookup (csrc, srcid, addr);
- cs->lts_data (now);
- cs->action ();
- }
- /*XXX move header up so it's contiguous with data*/
- rtphdr hdr = *rh;
- rh = (rtphdr*)nh;
- *rh = hdr;
- }
- else
- s->action ();
-
- return 0;
- /*
- * This is a data packet. If the source needs activation,
- * or the packet format has changed, deal with this.
- * Then, hand the packet off to the packet handler.
- * XXX might want to be careful about flip-flopping
- * here when format changes due to misordered packets
- * (easy solution -- keep rtp seqno of last fmt change).
- */
-// PacketHandler* h = s->handler ();
-// if (h == 0)
-// h = s->activate (fmt);
-// else if (s->format () != fmt)
-// h = s->change_format (fmt);
-
-// /*
-// * XXX bit rate doesn't include rtpv1 options;
-// * but v1 is going away anyway.
-// */
-// int dup = s->cs (seqno);
-// s->np (1);
-// s->nb (cc + sizeof (*rh));
-// if (dup)
-// return;
-// if (flags & RTP_M)
-// s->nf (1);
-
-// int hlen = h->hdrlen ();
-// cc -= hlen;
-// if (cc < 0)
-// {
-// s->runt (1);
-// return;
-// }
-// if (!s->mute ())
-// h->recv (rh, bp + hlen, cc);
-}
ACE_INLINE
int
@@ -253,349 +88,37 @@ TAO_AV_RTP::write_header (rtphdr &header,
return 0;
}
-ACE_INLINE
-int
-TAO_AV_RTP::send_frame (TAO_AV_Transport *transport,
- rtphdr &header,
- ACE_Message_Block *frame)
-{
- ACE_Message_Block mb ((char *)&header,
- sizeof (header));
- mb.wr_ptr (sizeof (header));
- mb.cont (frame);
- int result = transport->send (&mb);
- if (result < 0)
- ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
- return 0;
-}
-
-//ACE_INLINE
-int
-TAO_AV_RTP::send_frame (TAO_AV_Transport *transport,
- rtphdr &header,
- const iovec *iov,
- int iovcnt)
-{
- iovec send_iov[IOV_MAX];
- send_iov [0].iov_base = (char *)&header;
- send_iov [0].iov_len = sizeof(header);
- for (int i=1;i<=iovcnt; i++)
- send_iov [i] = iov [i-1];
- int result = transport->send (send_iov,
- iovcnt+1);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_Protocol_Factory
-//------------------------------------------------------------
-
-int
-TAO_AV_RTP_UDP_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_RTP_UDP);
-}
-
-TAO_AV_Acceptor*
-TAO_AV_RTP_UDP_Protocol_Factory::make_acceptor (void)
-{
- TAO_AV_RTP_UDP_Acceptor *acceptor;
-
- ACE_NEW_RETURN (acceptor,
- TAO_AV_RTP_UDP_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector*
-TAO_AV_RTP_UDP_Protocol_Factory::make_connector (void)
-{
- TAO_AV_RTP_UDP_Connector *connector;
-
- ACE_NEW_RETURN (connector,
- TAO_AV_RTP_UDP_Connector,
- 0);
- return connector;
-}
-
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_Acceptor
-//------------------------------------------------------------
-
-TAO_AV_RTP_UDP_Acceptor::TAO_AV_RTP_UDP_Acceptor (void)
- :make_rtp_handler_ (1)
-{
-}
-
-TAO_AV_RTP_UDP_Acceptor::~TAO_AV_RTP_UDP_Acceptor (void)
-{
-}
-
-int
-TAO_AV_RTP_UDP_Acceptor::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- if (this->make_rtp_handler_)
- {
- this->make_rtp_handler_ = 0;
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_AV_RTP_UDP_Flow_Handler (callback),
- -1);
- callback->transport (handler->transport ());
- TAO_AV_Protocol_Object *object = 0;
- ACE_NEW_RETURN (object,
- TAO_AV_RTP_Object (callback,
- handler->transport ()),
- -1);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- }
- else
- {
- // Now make rtcp handler.
- ACE_NEW_RETURN (handler,
- TAO_AV_RTCP_UDP_Flow_Handler (this->reactor_,
- this->endpoint_,
- this->entry_->flowname ()),
- -1);
- }
- return 0;
-}
-
-int
-TAO_AV_RTP_UDP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- this->reactor_ = av_core->reactor ();
- int result = TAO_AV_UDP_Acceptor::open (endpoint,
- av_core,
- entry);
- if (result < 0)
- return result;
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_UDP_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_Flow_Handler *rtp_handler = ACE_dynamic_cast (TAO_AV_RTP_UDP_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_udp_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
- // Now do the creation of RTCP handler.
- // The address of RTCP will always be one port higher than RTP.
- ACE_INET_Addr *entry_addr = ACE_static_cast (ACE_INET_Addr *,
- entry->address ());
- if (entry_addr == 0)
- return -1;
- ACE_INET_Addr local_addr (entry_addr->get_port_number ()+1,
- entry_addr->get_ip_address ());
- TAO_AV_UDP_Flow_Handler *handler = 0;
- result = this->acceptor_.open (this,
- av_core->reactor (),
- local_addr,
- handler);
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_udp_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- endpoint->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
- return 0;
-}
-
-int
-TAO_AV_RTP_UDP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- this->reactor_ = av_core->reactor ();
- int result = TAO_AV_UDP_Acceptor::open (endpoint,
- av_core,
- entry);
- if (result < 0)
- return result;
- // Now do the creation of RTCP handler.
- // Since its a default open we do a default open for rtcp also.
- ACE_INET_Addr local_addr;
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_UDP_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_Flow_Handler *rtp_handler = ACE_dynamic_cast (TAO_AV_RTP_UDP_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_udp_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
- TAO_AV_UDP_Flow_Handler *handler = 0;
- result = this->acceptor_.open (this,
- av_core->reactor (),
- local_addr,
- handler);
- TAO_AV_RTCP_UDP_Flow_Handler *rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_udp_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- endpoint->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_Connector
-//------------------------------------------------------------
-
-TAO_AV_RTP_UDP_Connector::TAO_AV_RTP_UDP_Connector (void)
- :make_rtp_handler_ (1)
-{
-}
-
-TAO_AV_RTP_UDP_Connector::~TAO_AV_RTP_UDP_Connector (void)
-{
-}
-
-int
-TAO_AV_RTP_UDP_Connector::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- if (this->make_rtp_handler_)
- {
- make_rtp_handler_ = 0;
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_AV_RTP_UDP_Flow_Handler (callback),
- -1);
- callback->transport (handler->transport ());
- TAO_AV_Protocol_Object *object = 0;
- ACE_NEW_RETURN (object,
- TAO_AV_RTP_Object (callback,
- handler->transport ()),
- -1);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- }
- else
- {
- // Now make rtcp handler.
- ACE_NEW_RETURN (handler,
- TAO_AV_RTCP_UDP_Flow_Handler (this->av_core_->reactor (),
- this->endpoint_,
- this->entry_->flowname ()),
- -1);
- }
- return 0;
-}
-
-int
-TAO_AV_RTP_UDP_Connector::connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport)
-{
- int result = TAO_AV_UDP_Connector::connect (entry,
- transport);
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_UDP_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_Flow_Handler *rtp_handler = ACE_dynamic_cast (TAO_AV_RTP_UDP_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_udp_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
-
- // Now do the creation of RTCP handler.
- // The address of RTCP will always be one port higher than RTP.
- ACE_INET_Addr *entry_addr = ACE_static_cast (ACE_INET_Addr *,
- entry->address ());
- if (entry_addr == 0)
- return -1;
- ACE_INET_Addr remote_addr (entry_addr->get_port_number ()+1,
- entry_addr->get_ip_address ());
-
- ACE_INET_Addr local_addr;
- TAO_AV_UDP_Flow_Handler *handler;
- result = this->connector_.connect (handler,
- remote_addr,
- local_addr);
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_udp_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
-
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- this->endpoint_->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
- return 0;
-}
-
-// TAO_AV_RTP_UDP_Flow_Handler
-TAO_AV_RTP_UDP_Flow_Handler::TAO_AV_RTP_UDP_Flow_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_Flow_Handler (callback)
-{
-}
-
-void
-TAO_AV_RTP_UDP_Flow_Handler::rtcp_handler (TAO_AV_RTCP_UDP_Flow_Handler *handler)
-{
- this->rtcp_handler_ = handler;
- this->source_manager_ = handler->source_manager ();
- this->state_ = handler->state ();
-}
-
+// TAO_AV_RTP_Object
int
-TAO_AV_RTP_UDP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+TAO_AV_RTP_Object::handle_input (void)
{
ACE_Message_Block *data = 0;
- ACE_INET_Addr addr;
TAO_AV_frame_info *frame_info = 0;
+
// Handles the incoming RTP packet input.
- int result = TAO_AV_RTP::handle_input (this->transport_,
- data,
- frame_info,
- addr,
- this->source_manager_,
- this->state_);
+
+ size_t bufsiz = 2*this->transport_->mtu ();
+ ACE_NEW_RETURN (data,
+ ACE_Message_Block (bufsiz),
+ -1);
+ int n = this->transport_->recv (data->rd_ptr (),bufsiz);
+ if (n == 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:connection closed\n"),-1);
+ if (n < 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::handle_input:recv error\n"),-1);
+ data->wr_ptr (n);
+ ACE_Addr *addr = this->transport_->get_peer_addr ();
+
+ int result = TAO_AV_RTP::handle_input (data,
+ frame_info);
if (result < 0)
return 0;
result = this->callback_->receive_frame (data,
- frame_info);
+ frame_info,
+ *addr);
+
+ this->control_object_->handle_control_input (data->duplicate (),
+ *addr);
return 0;
}
@@ -627,12 +150,14 @@ TAO_AV_RTP_Object::send_frame (ACE_Message_Block *frame,
}
if (result < 0)
return result;
- result = TAO_AV_RTP::send_frame (this->transport_,
- header,
- frame);
- if (result < 0)
- return result;
+ ACE_Message_Block mb ((char *)&header,
+ sizeof (header));
+ mb.wr_ptr (sizeof (header));
+ mb.cont (frame);
+ result = this->transport_->send (&mb);
+ if (result < 0)
+ ACE_ERROR_RETURN ( (LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
return 0;
}
@@ -665,13 +190,16 @@ TAO_AV_RTP_Object::send_frame (const iovec *iov,
}
if (result < 0)
return result;
- result = TAO_AV_RTP::send_frame (this->transport_,
- header,
- iov,
- iovcnt);
- if (result < 0)
- return result;
+ iovec send_iov[IOV_MAX];
+ send_iov [0].iov_base = (char *)&header;
+ send_iov [0].iov_len = sizeof(header);
+ for (int i=1;i<=iovcnt; i++)
+ send_iov [i] = iov [i-1];
+ result = this->transport_->send (send_iov,
+ iovcnt+1);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_RTP::send_frame failed\n"),result);
return 0;
}
@@ -680,15 +208,18 @@ TAO_AV_RTP_Object::TAO_AV_RTP_Object (TAO_AV_Callback *callback,
:TAO_AV_Protocol_Object (callback,transport),
sequence_num_ (0)
{
- // @@Naga:We have to initialize the sequence number to a non-zero
- // random number.
this->sequence_num_ = ACE_OS::rand ();
}
+TAO_AV_RTP_Object::~TAO_AV_RTP_Object (void)
+{
+}
+
int
-TAO_AV_RTP_Object::end_stream (void)
+TAO_AV_RTP_Object::destroy (void)
{
- this->callback_->handle_end_stream ();
+ this->control_object_->destroy ();
+ this->callback_->handle_destroy ();
return 0;
}
@@ -727,321 +258,83 @@ TAO_AV_RTP_Object::set_policies (const PolicyList &policy_list)
}
}
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_MCast_Protocol_Factory
-//------------------------------------------------------------
-
-int
-TAO_AV_RTP_UDP_MCast_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_RTP_UDP_MCAST);
-}
-
-TAO_AV_Acceptor*
-TAO_AV_RTP_UDP_MCast_Protocol_Factory::make_acceptor (void)
-{
- TAO_AV_RTP_UDP_MCast_Acceptor *acceptor;
-
- ACE_NEW_RETURN (acceptor,
- TAO_AV_RTP_UDP_MCast_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector*
-TAO_AV_RTP_UDP_MCast_Protocol_Factory::make_connector (void)
-{
- TAO_AV_RTP_UDP_MCast_Connector *connector;
-
- ACE_NEW_RETURN (connector,
- TAO_AV_RTP_UDP_MCast_Connector,
- 0);
- return connector;
-}
-
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_MCast_Acceptor
-//------------------------------------------------------------
-
-TAO_AV_RTP_UDP_MCast_Acceptor::TAO_AV_RTP_UDP_MCast_Acceptor (void)
- :make_rtp_handler_ (1)
-{
-}
-
-TAO_AV_RTP_UDP_MCast_Acceptor::~TAO_AV_RTP_UDP_MCast_Acceptor (void)
+void
+TAO_AV_RTP_Object::control_object (TAO_AV_Protocol_Object *object)
{
+ this->control_object_ = object;
}
int
-TAO_AV_RTP_UDP_MCast_Acceptor::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
+TAO_AV_RTP_Object::start (void)
{
- if (this->make_rtp_handler_)
- {
- make_rtp_handler_ = 0;
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_AV_RTP_UDP_MCast_Flow_Handler (callback),
- -1);
- callback->transport (handler->transport ());
- TAO_AV_Protocol_Object *object = 0;
- ACE_NEW_RETURN (object,
- TAO_AV_RTP_Object (callback,
- handler->transport ()),
- -1);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- }
- else
- {
- // Now make rtcp handler.
- ACE_NEW_RETURN (handler,
- TAO_AV_RTCP_UDP_MCast_Flow_Handler (this->reactor_,
- this->endpoint_,
- this->entry_->flowname ()),
- -1);
- }
-
- return 0;
+ this->control_object_->start ();
+ return this->callback_->handle_start ();
}
int
-TAO_AV_RTP_UDP_MCast_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
+TAO_AV_RTP_Object::stop (void)
{
- this->reactor_ = av_core->reactor ();
- int result = TAO_AV_UDP_MCast_Acceptor::open (endpoint,
- av_core,
- entry);
- if (result < 0)
- return result;
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_MCast_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_MCast_Flow_Handler *rtp_handler = ACE_static_cast (TAO_AV_RTP_UDP_MCast_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_MCast_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_mcast_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
- // Now do the creation of RTCP handler.
- // The address of RTCP will always be one port higher than RTP.
- ACE_INET_Addr *entry_addr = ACE_static_cast (ACE_INET_Addr *,
- entry->address ());
- if (entry_addr == 0)
- return -1;
- ACE_INET_Addr *local_addr = 0;
- ACE_NEW_RETURN (local_addr,
- ACE_INET_Addr (entry_addr->get_port_number ()+1,
- entry_addr->get_ip_address ()),
- -1);
- TAO_AV_UDP_MCast_Flow_Handler *handler = 0;
- result = this->open_i (av_core->reactor (),
- local_addr,
- handler);
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_mcast_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- endpoint->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
+ this->control_object_->stop ();
+ return this->callback_->handle_stop ();
}
-int
-TAO_AV_RTP_UDP_MCast_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
+// TAO_AV_RTP_Flow_Factory
+TAO_AV_RTP_Flow_Factory::TAO_AV_RTP_Flow_Factory (void)
{
- this->reactor_ = av_core->reactor ();
- int result = TAO_AV_UDP_MCast_Acceptor::open (endpoint,
- av_core,
- entry);
- if (result < 0)
- return result;
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_MCast_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_MCast_Flow_Handler *rtp_handler = ACE_static_cast (TAO_AV_RTP_UDP_MCast_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_MCast_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_mcast_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
- // Now do the creation of RTCP handler.
- // Since its a default open we do a default open for rtcp also.
- ACE_INET_Addr *local_addr = 0;
- TAO_AV_UDP_MCast_Flow_Handler *handler = 0;
- result = this->open_i (av_core->reactor (),
- local_addr,
- handler);
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_mcast_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- endpoint->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
}
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_MCast_Connector
-//------------------------------------------------------------
-
-TAO_AV_RTP_UDP_MCast_Connector::TAO_AV_RTP_UDP_MCast_Connector (void)
- :make_rtp_handler_ (1)
-{
-}
-
-TAO_AV_RTP_UDP_MCast_Connector::~TAO_AV_RTP_UDP_MCast_Connector (void)
+TAO_AV_RTP_Flow_Factory::~TAO_AV_RTP_Flow_Factory (void)
{
}
int
-TAO_AV_RTP_UDP_MCast_Connector::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
+TAO_AV_RTP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
{
- if (this->make_rtp_handler_)
- {
- make_rtp_handler_ = 0;
-
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_AV_RTP_UDP_MCast_Flow_Handler (callback),
- -1);
- callback->transport (handler->transport ());
- TAO_AV_Protocol_Object *object = 0;
- ACE_NEW_RETURN (object,
- TAO_AV_RTP_Object (callback,
- handler->transport ()),
- -1);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- }
- else
- {
- // Now make rtcp handler.
- ACE_NEW_RETURN (handler,
- TAO_AV_RTCP_UDP_MCast_Flow_Handler (this->av_core_->reactor (),
- this->endpoint_,
- this->entry_->flowname ()),
- -1);
- }
return 0;
}
-int
-TAO_AV_RTP_UDP_MCast_Connector::connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport)
+TAO_AV_Protocol_Object*
+TAO_AV_RTP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
{
- int result = TAO_AV_UDP_MCast_Connector::connect (entry,
- transport);
- TAO_String_Hash_Key handler_key (entry->flowname ());
- TAO_AV_RTCP::RTCP_MCast_Map::ENTRY *handler_entry = 0;
- TAO_AV_RTP_UDP_MCast_Flow_Handler *rtp_handler = ACE_dynamic_cast (TAO_AV_RTP_UDP_MCast_Flow_Handler *,
- this->handler_);
- TAO_AV_RTCP_UDP_MCast_Flow_Handler *rtcp_handler = 0;
- if (TAO_AV_RTCP::rtcp_mcast_map_.find (handler_key,
- handler_entry) == 0)
- {
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_ERROR,"RTCP Object already created for this flow\n"));
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler_entry->int_id_);
- }
- else
- {
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_callback (entry->flowname (),
+ callback);
- // Now do the creation of RTCP handler.
- // The address of RTCP will always be one port higher than RTP.
- ACE_INET_Addr *entry_addr = ACE_static_cast (ACE_INET_Addr *,
- entry->address ());
- if (entry_addr == 0)
- return -1;
- ACE_INET_Addr remote_addr (entry_addr->get_port_number ()+1,
- entry_addr->get_ip_address ());
-
- ACE_INET_Addr *address = &remote_addr;
- TAO_AV_UDP_MCast_Flow_Handler *handler = 0;
- result = this->connect_i (this->av_core_->reactor (),
- address,
- handler);
- if (result < 0)
- return result;
- rtcp_handler = ACE_dynamic_cast (TAO_AV_RTCP_UDP_MCast_Flow_Handler*,
- handler);
- result = TAO_AV_RTCP::rtcp_mcast_map_.bind (handler_key,rtcp_handler);
- if (result < 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"rtcp_map::bind failed\n"));
- }
- rtp_handler->rtcp_handler (rtcp_handler);
- this->endpoint_->set_rtcp_info (entry->flowname (),
- rtcp_handler->source_manager (),
- rtcp_handler->state ());
- return 0;
+ TAO_AV_Protocol_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_RTP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+ return object;
}
-// TAO_AV_RTP_UDP_MCast_Flow_Handler
-TAO_AV_RTP_UDP_MCast_Flow_Handler::TAO_AV_RTP_UDP_MCast_Flow_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_MCast_Flow_Handler (callback),
- source_manager_ (0),
- rtcp_handler_ (0),
- state_ (0)
+int
+TAO_AV_RTP_Flow_Factory::match_protocol (const char *flow_string)
{
+ if (ACE_OS::strncasecmp (flow_string,"RTP",3) == 0)
+ return 1;
+ return 0;
}
-void
-TAO_AV_RTP_UDP_MCast_Flow_Handler::rtcp_handler (TAO_AV_RTCP_UDP_MCast_Flow_Handler *handler)
+const char *
+TAO_AV_RTP_Flow_Factory::control_flow_factory (void)
{
- this->rtcp_handler_ = handler;
- this->source_manager_ = handler->source_manager ();
- this->state_ = handler->state ();
+ return "RTCP";
}
-int
-TAO_AV_RTP_UDP_MCast_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- ACE_Message_Block *data = 0;
- ACE_INET_Addr addr;
- TAO_AV_frame_info *frame_info = 0;
- // Handles the incoming RTP packet input.
- int result = TAO_AV_RTP::handle_input (this->transport_,
- data,
- frame_info,
- addr,
- this->source_manager_,
- this->state_);
- if (result < 0)
- return 0;
- // @@ What should we do with the header.
- // Answer:Use it for RTCP statistics. But then the
- // application needs the format of the data to decode it.
- result = this->callback_->receive_frame (data,
- frame_info);
- return 0;
-}
+ACE_FACTORY_DEFINE (AV, TAO_AV_RTP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_RTP_Flow_Factory,
+ ASYS_TEXT ("RTP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_RTP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTP.h b/TAO/orbsvcs/orbsvcs/AV/RTP.h
index 6d5795475a5..8c0a03e302d 100644
--- a/TAO/orbsvcs/orbsvcs/AV/RTP.h
+++ b/TAO/orbsvcs/orbsvcs/AV/RTP.h
@@ -53,6 +53,7 @@
#ifndef TAO_AV_RTP_H
#define TAO_AV_RTP_H
+#include "Protocol_Factory.h"
#define RTP_PT_BVC 22 /* Berkeley video codec */
@@ -126,128 +127,14 @@
#include "Policy.h"
#include "FlowSpec_Entry.h"
#include "MCast.h"
-#include "RTCP.h"
//------------------------------------------------------------
// TAO_AV_RTP_UDP
//------------------------------------------------------------
-class TAO_AV_RTP_UDP_Acceptor
- :public TAO_AV_UDP_Acceptor
-{
-public:
- TAO_AV_RTP_UDP_Acceptor (void);
- virtual ~TAO_AV_RTP_UDP_Acceptor (void);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
-protected:
- ACE_Hash_Map_Manager <TAO_String_Hash_Key,TAO_AV_RTCP_UDP_Flow_Handler*,ACE_Null_Mutex> rtcp_map_;
- int make_rtp_handler_;
- ACE_Reactor *reactor_;
-};
-
-class TAO_AV_RTP_UDP_Connector
- :public TAO_AV_UDP_Connector
-{
-public:
- TAO_AV_RTP_UDP_Connector (void);
- virtual ~TAO_AV_RTP_UDP_Connector (void);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
- virtual int connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport);
-protected:
- int make_rtp_handler_;
- ACE_Reactor *reactor_;
-};
-
-class TAO_AV_RTP_UDP_Protocol_Factory
- :public TAO_AV_UDP_Protocol_Factory
-{
-public:
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- virtual TAO_AV_Acceptor *make_acceptor (void);
- virtual TAO_AV_Connector *make_connector (void);
-};
class TAO_AV_SourceManager;
class TAO_AV_RTCP_UDP_Flow_Handler;
class TAO_AV_RTP_State;
-class TAO_AV_RTP_UDP_Flow_Handler
- :public TAO_AV_UDP_Flow_Handler
-{
-public:
- TAO_AV_RTP_UDP_Flow_Handler (TAO_AV_Callback *callback);
- virtual int handle_input (ACE_HANDLE fd);
- virtual void rtcp_handler (TAO_AV_RTCP_UDP_Flow_Handler *handler);
-protected:
- TAO_AV_SourceManager *source_manager_;
- TAO_AV_RTCP_UDP_Flow_Handler *rtcp_handler_;
- TAO_AV_RTP_State *state_;
-};
-
-class TAO_AV_UDP_MCast_Flow_Handler;
-//------------------------------------------------------------
-// TAO_AV_RTP_UDP_MCast
-//------------------------------------------------------------
-
-class TAO_AV_RTP_UDP_MCast_Acceptor
- :public TAO_AV_UDP_MCast_Acceptor
-{
-public:
- TAO_AV_RTP_UDP_MCast_Acceptor (void);
- virtual ~TAO_AV_RTP_UDP_MCast_Acceptor (void);
- virtual int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
-protected:
- int make_rtp_handler_;
- ACE_Reactor *reactor_;
-};
-
-
-class TAO_AV_RTP_UDP_MCast_Connector
- :public TAO_AV_UDP_MCast_Connector
-{
-public:
- TAO_AV_RTP_UDP_MCast_Connector (void);
- virtual ~TAO_AV_RTP_UDP_MCast_Connector (void);
- virtual int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler);
- virtual int connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport);
-protected:
- int make_rtp_handler_;
- ACE_Reactor *reactor_;
-};
-
-class TAO_AV_RTP_UDP_MCast_Protocol_Factory
- :public TAO_AV_UDP_MCast_Protocol_Factory
-{
-public:
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- virtual TAO_AV_Acceptor *make_acceptor (void);
- virtual TAO_AV_Connector *make_connector (void);
-};
-
-class TAO_AV_RTP_UDP_MCast_Flow_Handler
- :public TAO_AV_UDP_MCast_Flow_Handler
-{
-public:
- TAO_AV_RTP_UDP_MCast_Flow_Handler (TAO_AV_Callback *callback);
- virtual int handle_input (ACE_HANDLE fd);
- virtual void rtcp_handler (TAO_AV_RTCP_UDP_MCast_Flow_Handler *handler);
-protected:
- TAO_AV_SourceManager *source_manager_;
- TAO_AV_RTCP_UDP_MCast_Flow_Handler *rtcp_handler_;
- TAO_AV_RTP_State *state_;
-};
//------------------------------------------------------------
// TAO_AV_RTP
@@ -346,13 +233,8 @@ public:
ACE_UINT16 blkno;
};
-
- static int handle_input (TAO_AV_Transport *transport,
- ACE_Message_Block *&data,
- TAO_AV_frame_info *&frame_info,
- ACE_Addr &addr,
- TAO_AV_SourceManager *source_manager,
- TAO_AV_RTP_State *state);
+ static int handle_input (ACE_Message_Block *&data,
+ TAO_AV_frame_info *&frame_info);
static int write_header (rtphdr &header,
int format,
@@ -361,31 +243,20 @@ public:
ACE_UINT32 ssrc,
CORBA::Boolean boundary_marker);
- static int send_frame (TAO_AV_Transport *transport,
- rtphdr &header,
- ACE_Message_Block *frame);
-
- static int send_frame (TAO_AV_Transport *transport,
- rtphdr &header,
- const iovec *iov,
- int iovcnt);
-
- static int demux (rtphdr* rh,
- ACE_Message_Block *data,
- ACE_UINT32 addr,
- TAO_AV_SourceManager *sm,
- TAO_AV_RTP_State *state);
};
-
-class TAO_AV_RTP_Object
- :public TAO_AV_Protocol_Object
+class TAO_AV_RTP_Object : public TAO_AV_Protocol_Object
{
public:
TAO_AV_RTP_Object (TAO_AV_Callback *callback,
- TAO_AV_Transport *transport = 0);
+ TAO_AV_Transport *transport);
+ virtual ~TAO_AV_RTP_Object (void);
+
+ virtual int start (void);
+ virtual int stop (void);
+ virtual int handle_input (void);
virtual int send_frame (ACE_Message_Block *frame,
TAO_AV_frame_info *frame_info = 0);
@@ -393,12 +264,32 @@ public:
int iovcnt,
TAO_AV_frame_info *frame_info = 0);
- int end_stream (void);
+ virtual int destroy (void);
virtual int set_policies (const PolicyList &policy_list);
+ virtual void control_object (TAO_AV_Protocol_Object *object);
protected:
ACE_UINT16 sequence_num_;
int format_;
CORBA::ULong ssrc_;
+ TAO_AV_Protocol_Object *control_object_;
+};
+
+class TAO_ORBSVCS_Export TAO_AV_RTP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_RTP_Flow_Factory (void);
+ virtual ~TAO_AV_RTP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+ virtual const char*control_flow_factory (void);
};
+ACE_STATIC_SVC_DECLARE (TAO_AV_RTP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_RTP_Flow_Factory)
+
#endif /* TAO_AV_RTP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/TCP.cpp b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp
new file mode 100644
index 00000000000..54232f6b7cc
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp
@@ -0,0 +1,664 @@
+// $Id$
+
+#include "TCP.h"
+#include "AVStreams_i.h"
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Transport
+//------------------------------------------------------------
+
+TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler)
+ :handler_ (handler)
+{
+}
+
+TAO_AV_TCP_Transport::~TAO_AV_TCP_Transport (void)
+{
+}
+
+int
+TAO_AV_TCP_Transport::open (ACE_Addr */*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Transport::mtu (void)
+{
+ return -1;
+}
+
+ACE_Addr*
+TAO_AV_TCP_Transport::get_peer_addr (void)
+{
+ return 0;
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = i->length ();
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set IOV_MAX to that limit.
+ if (iovcnt == IOV_MAX)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().send_n (buf, len);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().sendv_n ((const iovec *) iov,
+ iovcnt);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf, len);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *)
+{
+ return this->handler_->peer ().recv (buf,
+ len,
+ flags);
+}
+
+ssize_t
+TAO_AV_TCP_Transport::recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return handler_->peer ().recvv_n (iov, iovcnt);
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Protocol_Factory
+//------------------------------------------------------------
+
+TAO_AV_TCP_Factory::TAO_AV_TCP_Factory (void)
+{
+}
+
+TAO_AV_TCP_Factory::~TAO_AV_TCP_Factory (void)
+{
+}
+
+int
+TAO_AV_TCP_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Factory::match_protocol (const char *protocol_string)
+{
+ if (ACE_OS::strcasecmp (protocol_string,"TCP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_TCP_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Factory::make_acceptor "));
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_TCP_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_TCP_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Factory::make_connector "));
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_TCP_Connector,
+ 0);
+ return connector;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Object
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Object::handle_input (void)
+{
+ size_t size = BUFSIZ;
+ ACE_Message_Block *frame = 0;
+ ACE_NEW_RETURN (frame,
+ ACE_Message_Block (size),
+ -1);
+ int n = this->transport_->recv (frame->rd_ptr (),
+ size);
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input recv failed\n"),-1);
+ if (n == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input connection closed\n"),-1);
+ frame->wr_ptr (n);
+
+ return this->callback_->receive_frame (frame);
+}
+
+int
+TAO_AV_TCP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info)
+{
+ int result = this->transport_->send (frame);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_TCP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info)
+{
+ return this->transport_->send (iov,iovcnt);
+}
+
+TAO_AV_TCP_Object::TAO_AV_TCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+}
+
+TAO_AV_TCP_Object::~TAO_AV_TCP_Object (void)
+{
+ // No-op
+}
+int
+TAO_AV_TCP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_TCP_Flow_Factory::TAO_AV_TCP_Flow_Factory (void)
+{
+}
+
+TAO_AV_TCP_Flow_Factory::~TAO_AV_TCP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_TCP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_TCP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"TCP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_TCP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_callback (entry->flowname (),
+ callback);
+
+ TAO_AV_TCP_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_TCP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+ return object;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Base_Connector
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Base_Connector::connector_open (TAO_AV_TCP_Connector *connector,
+ ACE_Reactor *reactor)
+{
+ this->connector_ = connector;
+ this->reactor_ = reactor;
+
+ int result = ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::open (reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ int result =
+ this->connector_->make_svc_handler (tcp_handler);
+ if (result < 0)
+ return result;
+ tcp_handler->reactor (this->reactor_);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Connector::connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
+ const ACE_INET_Addr &remote_addr)
+{
+ int result = ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::connect (handler,
+ remote_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::connect failed\n"),-1);
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Connector
+//------------------------------------------------------------
+TAO_AV_TCP_Connector::TAO_AV_TCP_Connector (void)
+{
+}
+
+TAO_AV_TCP_Connector::~TAO_AV_TCP_Connector (void)
+{
+}
+
+int
+TAO_AV_TCP_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::make_svc_handler\n"));
+ TAO_AV_Callback *callback = 0;
+ if (this->endpoint_ != 0)
+ {
+// this->endpoint_->get_callback (this->flowname_.c_str (),
+// callback);
+ ACE_NEW_RETURN (tcp_handler,
+ // TAO_AV_TCP_Flow_Handler (callback),
+ TAO_AV_TCP_Flow_Handler,
+ -1);
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ tcp_handler,
+ tcp_handler->transport ());
+ tcp_handler->protocol_object (object);
+ // callback->protocol_object (object);
+// this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+// object);
+ this->endpoint_->set_handler (this->flowname_.c_str (),tcp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (tcp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_TCP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ this->endpoint_ = endpoint;
+ this->flow_protocol_factory_ = factory;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::open "));
+ int result = this->connector_.connector_open(this,
+ av_core->reactor ());
+ return result;
+}
+
+int
+TAO_AV_TCP_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport)
+{
+ this->entry_ = entry;
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *remote_addr = entry->address ();
+ ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr *,remote_addr);
+ TAO_AV_TCP_Flow_Handler *handler;
+ int result = this->connector_.connector_connect (handler,
+ *inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_connector::open failed\n"),-1);
+ entry->handler (handler);
+ transport = handler->transport ();
+ return 0;
+}
+
+int
+TAO_AV_TCP_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Base_Connector
+//------------------------------------------------------------
+
+int
+TAO_AV_TCP_Base_Acceptor::open (TAO_AV_TCP_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry)
+{
+ this->acceptor_ = acceptor;
+ this->reactor_ = reactor;
+ this->entry_ = entry;
+
+ int result = ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>::open (local_addr,reactor);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Base_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler)
+{
+ int result = this->acceptor_->make_svc_handler (handler);
+ if (result < 0)
+ return result;
+ handler->reactor (this->reactor_);
+ this->entry_->handler (handler);
+ return 0;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_TCP_Acceptor::TAO_AV_TCP_Acceptor (void)
+{
+}
+
+TAO_AV_TCP_Acceptor::~TAO_AV_TCP_Acceptor (void)
+{
+}
+
+int
+TAO_AV_TCP_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::make_svc_handler\n"));
+ // TAO_AV_Callback *callback = 0;
+ if (this->endpoint_ != 0)
+ {
+// this->endpoint_->get_callback (this->flowname_.c_str (),
+// callback);
+ ACE_NEW_RETURN (tcp_handler,
+ // TAO_AV_TCP_Flow_Handler (callback),
+ TAO_AV_TCP_Flow_Handler,
+ -1);
+ TAO_AV_Protocol_Object *object =
+// this->flow_protocol_factory_->make_protocol_object (callback,
+// tcp_handler->transport ());
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ tcp_handler,
+ tcp_handler->transport ());
+ tcp_handler->protocol_object (object);
+ // callback->protocol_object (object);
+// this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+// object);
+ this->endpoint_->set_handler (this->flowname_.c_str (),tcp_handler);
+ this->entry_->protocol_object (object);
+ this->entry_->handler (tcp_handler);
+ }
+ return 0;
+}
+
+int
+TAO_AV_TCP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory)
+{
+ this->flow_protocol_factory_ = factory;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open "));
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *address = entry->address ();
+ ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
+ inet_addr->set (inet_addr->get_port_number (),
+ inet_addr->get_host_name ());
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open: %s",
+ buf));
+ int result = this->acceptor_.open (this,
+ av_core->reactor (),
+ *inet_addr,
+ entry);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Acceptor::open failed"),-1);
+ entry->set_local_addr (address);
+ return 0;
+}
+
+int
+TAO_AV_TCP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory)
+{
+ this->flow_protocol_factory_ = factory;
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flowname_ = entry->flowname ();
+ ACE_INET_Addr *address;
+ ACE_NEW_RETURN (address,
+ ACE_INET_Addr ("0"),
+ -1);
+ int result = this->acceptor_.open (this,
+ av_core->reactor (),
+ *address,
+ entry);
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Acceptor::open failed"),-1);
+ this->acceptor_.acceptor ().get_local_addr (*address);
+ address->set (address->get_port_number (),
+ address->get_host_name ());
+ char buf[BUFSIZ];
+ address->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open_default: %s\n",buf));
+ entry->set_local_addr (address);
+ return 0;
+}
+
+
+int
+TAO_AV_TCP_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_TCP_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_TCP_Flow_Handler::TAO_AV_TCP_Flow_Handler (TAO_AV_Callback *callback)
+ // :TAO_AV_Flow_Handler (callback)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_TCP_Transport (this));
+}
+
+TAO_AV_Transport *
+TAO_AV_TCP_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_TCP_Flow_Handler::open (void *arg)
+{
+
+ int nodelay = 1;
+
+#if defined (TCP_NODELAY)
+ if (this->peer ().set_option (IPPROTO_TCP,
+ TCP_NODELAY,
+ (void *) &nodelay,
+ sizeof (nodelay)) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "NODELAY failed\n"),
+ -1);
+#endif /* TCP_NODELAY */
+
+ // Called by the <Strategy_Acceptor> when the handler is completely
+ // connected.
+ ACE_INET_Addr addr;
+
+ if (this->peer ().get_remote_addr (addr) == -1)
+ return -1;
+
+ char server[MAXHOSTNAMELEN + 16];
+
+ (void) addr.addr_to_string (server, sizeof (server));
+
+ if (TAO_debug_level > 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) connection to server <%s> on %d\n",
+ server, this->peer ().get_handle ()));
+
+ this->peer ().enable (ACE_NONBLOCK);
+ // Register the handler with the reactor.
+ if (this->reactor ()
+ && this->reactor ()->register_handler
+ (this,
+ ACE_Event_Handler::READ_MASK) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ASYS_TEXT ("%p\n"),
+ ASYS_TEXT ("unable to register client handler")),
+ -1);
+}
+
+int
+TAO_AV_TCP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ return this->protocol_object_->handle_input ();
+}
+
+int
+TAO_AV_TCP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Acceptor<TAO_AV_TCP_Flow_Handler, ACE_SOCK_ACCEPTOR>;
+template class ACE_Connector<TAO_AV_TCP_Flow_Handler, ACE_SOCK_CONNECTOR>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Acceptor<TAO_AV_TCP_Flow_Handler, ACE_SOCK_Acceptor, ACE_INET_Addr>
+#pragma instantiate ACE_Connector<TAO_AV_TCP_Flow_Handler, ACE_SOCK_Connector, ACE_INET_Addr>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_TCP_Flow_Factory,
+ ASYS_TEXT ("TCP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_TCP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (AV, TAO_AV_TCP_Flow_Factory)
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_TCP_Factory,
+ ASYS_TEXT ("TCP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_TCP_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (AV, TAO_AV_TCP_Factory)
diff --git a/TAO/orbsvcs/orbsvcs/AV/TCP.h b/TAO/orbsvcs/orbsvcs/AV/TCP.h
new file mode 100644
index 00000000000..3ddc3e24f20
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/TCP.h
@@ -0,0 +1,233 @@
+/* -*- C++ -*- */
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// ORBSVCS AVStreams
+//
+// = FILENAME
+// TCP.h
+//
+// = AUTHOR
+// Nagarajan Surendran <naga@cs.wustl.edu>
+//
+//
+// ============================================================================
+
+#if !defined TAO_AV_TCP_H
+#define TAO_AV_TCP_H
+
+#include "ace/OS.h"
+#include "Protocol_Factory.h"
+#include "FlowSpec_Entry.h"
+
+class TAO_ORBSVCS_Export TAO_AV_TCP_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ TAO_AV_TCP_Factory (void);
+ virtual ~TAO_AV_TCP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_TCP_Flow_Handler;
+
+class TAO_AV_TCP_Transport
+ :public TAO_AV_Transport
+{
+ // = TITLE
+ // A transport abstraction for socket streams.
+ //
+ // = DESCRIPTION
+ // Uses the ACE_SOCK_Stream to send the data.
+public:
+ TAO_AV_TCP_Transport (void);
+
+ TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler);
+
+ virtual ~TAO_AV_TCP_Transport (void);
+
+ virtual int open (ACE_Addr *address);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+ // Write the complete Message_Block chain to the connection.
+
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+ // Write the contents of the buffer of length len to the connection.
+
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+ // Write the contents of iovcnt iovec's to the connection.
+
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+ // Read len bytes from into buf.
+
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+ // Read len bytes from into buf using flags.
+
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+ // Read received data into the iovec buffers.
+protected:
+ TAO_AV_TCP_Flow_Handler *handler_;
+};
+
+class TAO_AV_TCP_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
+{
+public:
+ TAO_AV_TCP_Flow_Handler (TAO_AV_Callback *callback = 0);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int open (void * = 0);
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+protected:
+ TAO_AV_Core *av_core_;
+};
+
+class TAO_AV_TCP_Acceptor;
+
+class TAO_AV_TCP_Base_Acceptor :public ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>
+{
+public:
+ virtual int open (TAO_AV_TCP_Acceptor *acceptor,
+ ACE_Reactor *reactor,
+ const ACE_INET_Addr &local_addr,
+ TAO_FlowSpec_Entry *entry);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
+protected:
+ TAO_AV_TCP_Acceptor *acceptor_;
+ ACE_Reactor *reactor_;
+ TAO_FlowSpec_Entry *entry_;
+};
+
+class TAO_AV_TCP_Acceptor :public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_TCP_Acceptor (void);
+ virtual ~TAO_AV_TCP_Acceptor (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
+protected:
+ TAO_AV_TCP_Base_Acceptor acceptor_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_AV_TCP_Connector;
+
+class TAO_AV_TCP_Base_Connector : public ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>
+{
+public:
+ // To avoid warnings of open and connect hiding the base class functions these have to renamed.
+ int connector_open (TAO_AV_TCP_Connector *connector,
+ ACE_Reactor *reactor);
+ int connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
+ const ACE_INET_Addr &remote_addr);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
+protected:
+ TAO_AV_TCP_Connector *connector_;
+ ACE_Reactor *reactor_;
+};
+
+class TAO_AV_TCP_Connector : public TAO_AV_Connector
+{
+public:
+ TAO_AV_TCP_Connector (void);
+ virtual ~TAO_AV_TCP_Connector (void);
+
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport);
+ virtual int close (void);
+ virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
+protected:
+ TAO_AV_Core *av_core_;
+ TAO_AV_TCP_Base_Connector connector_;
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_ORBSVCS_Export TAO_AV_TCP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_TCP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+
+ virtual ~TAO_AV_TCP_Object (void);
+ // Dtor
+
+ virtual int handle_input (void);
+
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+ // send a data frame.
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int destroy (void);
+ // end the stream.
+
+};
+
+class TAO_AV_TCP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_TCP_Flow_Factory (void);
+ virtual ~TAO_AV_TCP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_TCP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_TCP_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_TCP_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_TCP_Factory)
+
+#endif /* TAO_AV_TCP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.cpp b/TAO/orbsvcs/orbsvcs/AV/Transport.cpp
index d8594c58fd3..5cd7e761daa 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Transport.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.cpp
@@ -5,82 +5,16 @@
#include "MCast.h"
#include "Nil.h"
#include "RTP.h"
+#include "RTCP.h"
+#include "UDP.h"
+#include "TCP.h"
+#include "FlowSpec_Entry.h"
#if !defined (__ACE_INLINE__)
#include "Transport.i"
#endif /* __ACE_INLINE__ */
//------------------------------------------------------------
-// TAO_AV_UDP_Flow_Handler
-//------------------------------------------------------------
-
-TAO_AV_UDP_Flow_Handler::TAO_AV_UDP_Flow_Handler (TAO_AV_Callback *callback)
-
- :TAO_AV_Flow_Handler(callback)
-{
- ACE_NEW (this->transport_,
- TAO_AV_UDP_Transport (this));
-// ACE_NEW (this->sock_dgram_,
-// ACE_SOCK_Dgram);
-}
-
-TAO_AV_UDP_Flow_Handler::~TAO_AV_UDP_Flow_Handler (void)
-{
- delete this->transport_;
- // delete this->sock_dgram_;
-}
-
-TAO_AV_Transport *
-TAO_AV_UDP_Flow_Handler::transport (void)
-{
- return this->transport_;
-}
-
-int
-TAO_AV_UDP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- size_t size = 2*this->transport_->mtu ();
- ACE_Message_Block *frame = 0;
- ACE_NEW_RETURN (frame,
- ACE_Message_Block (size),
- -1);
- int n = this->transport_->recv (frame->rd_ptr (),
- frame->size ());
- if (n == -1)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Flow_Handler::handle_input recv failed\n"),-1);
- if (n == -1)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Flow_Handler::handle_input connection closed\n"),-1);
- frame->wr_ptr (n);
- this->callback_->receive_frame (frame);
- return 0;
-}
-
-int
-TAO_AV_UDP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
- const void *arg)
-{
- return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
-}
-
-int
-TAO_AV_UDP_Flow_Handler::set_remote_address (ACE_Addr *address)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Flow_Handler::set_remote_address\n"));
- ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr*,address);
- this->peer_addr_ = *inet_addr;
- TAO_AV_UDP_Transport *transport = ACE_dynamic_cast (TAO_AV_UDP_Transport*,this->transport_);
- return transport->set_remote_address (*inet_addr);
-}
-
-
-ACE_HANDLE
-TAO_AV_UDP_Flow_Handler::get_handle (void) const
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Flow_Handler::get_handle:%d\n",this->sock_dgram_.get_handle ()));
- return this->sock_dgram_.get_handle () ;
-}
-
-//------------------------------------------------------------
// TAO_AV_Core
//------------------------------------------------------------
@@ -98,7 +32,7 @@ TAO_AV_Core::~TAO_AV_Core (void)
int
TAO_AV_Core::init (int &argc,
- char **argv,
+ char *argv [],
CORBA::Environment &env)
{
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Core::init "));
@@ -114,7 +48,8 @@ TAO_AV_Core::init (int &argc,
-1);
this->orb_ = this->orb_manager_.orb ();
this->reactor (this->orb_->orb_core ()->reactor ());
- this->init_protocol_factories ();
+ this->init_transport_factories ();
+ this->init_flow_protocol_factories ();
return 0;
}
@@ -150,6 +85,8 @@ TAO_AV_Core::init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
result = this->acceptor_registry_->open (endpoint,
this,
address_flow_set);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Core::init_forward_flows::acceptor_registry::open failed\n"),-1);
TAO_AV_FlowSpecSetItor end = address_flow_set.end ();
for (TAO_AV_FlowSpecSetItor start = address_flow_set.begin ();
start != end; ++start)
@@ -172,6 +109,16 @@ TAO_AV_Core::init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
default:
break;
}
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+// size_t len = flow_spec.length ();
+// flow_spec.length (len+1);
+// flow_spec [len] = entry->entry_to_string ();
+ }
}
}
break;
@@ -207,8 +154,14 @@ TAO_AV_Core::init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
default:
break;
}
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+ }
}
-
}
if (flow_set.size () > 0)
{
@@ -239,6 +192,13 @@ TAO_AV_Core::init_forward_flows (TAO_Base_StreamEndPoint *endpoint,
default:
break;
}
+ // Now if the address_set has been changed due to the addition of a control entry we should
+ // add that to the flow_spec_set also.
+ if (flow_spec_set.find (entry) < 0)
+ {
+ // entry doesn't exist so add it.
+ flow_spec_set.insert (entry);
+ }
}
}
@@ -306,8 +266,8 @@ TAO_AV_Core::init_reverse_flows (TAO_Base_StreamEndPoint *endpoint,
TAO_AV_FlowSpecSet acceptor_flow_set;
TAO_AV_FlowSpecSet connector_flow_set;
TAO_AV_FlowSpecSetItor end = reverse_flow_spec_set.end ();
- for (TAO_AV_FlowSpecSetItor start = reverse_flow_spec_set.begin ();
- start != end; ++start)
+ TAO_AV_FlowSpecSetItor start = reverse_flow_spec_set.begin ();
+ for (;start != end; ++start)
{
TAO_FlowSpec_Entry *entry = (*start);
ACE_Addr *address = entry->address ();
@@ -321,6 +281,14 @@ TAO_AV_Core::init_reverse_flows (TAO_Base_StreamEndPoint *endpoint,
entry->flowname ());
if (forward_entry != 0)
forward_entry->set_peer_addr (address);
+ // Now we have to match the control and data flow objects.
+ // Check if there's a control object.
+ char control_flowname [BUFSIZ];
+ ACE_OS::sprintf (control_flowname,"%s_control",entry->flowname ());
+ TAO_FlowSpec_Entry *control_entry = this->get_flow_spec_entry (forward_flow_spec_set,
+ control_flowname);
+ if (control_entry != 0)
+ forward_entry->protocol_object ()->control_object (control_entry->protocol_object ());
}
else
connector_flow_set.insert (entry);
@@ -340,6 +308,12 @@ TAO_AV_Core::init_reverse_flows (TAO_Base_StreamEndPoint *endpoint,
if (result == -1)
ACE_ERROR_RETURN ((LM_ERROR,"acceptor_registry::open"),-1);
+ start = reverse_flow_spec_set.begin ();
+ for (;start != end; ++start)
+ {
+ TAO_FlowSpec_Entry *entry = (*start);
+
+ }
return 0;
}
@@ -392,104 +366,180 @@ TAO_AV_Core::get_connector (const char *flowname)
}
int
-TAO_AV_Core::init_protocol_factories (void)
+TAO_AV_Core::init_transport_factories (void)
{
- TAO_AV_ProtocolFactorySetItor end = protocol_factories_.end ();
- TAO_AV_ProtocolFactorySetItor factory = protocol_factories_.begin ();
+ TAO_AV_TransportFactorySetItor end = this->transport_factories_.end ();
+ TAO_AV_TransportFactorySetItor factory = this->transport_factories_.begin ();
if (factory == end)
{
- TAO_AV_Protocol_Factory *udp_protocol_factory = 0;
- TAO_AV_Protocol_Item *udp_item = 0;
+ TAO_AV_Transport_Factory *udp_factory = 0;
+ TAO_AV_Transport_Item *udp_item = 0;
+
+ udp_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance ("UDP_Factory");
+ if (udp_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP Factory"));
+
+ ACE_NEW_RETURN (udp_factory,
+ TAO_AV_UDP_Factory,
+ -1);
+ }
- ACE_NEW_RETURN (udp_protocol_factory,
- TAO_AV_UDP_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (udp_item, TAO_AV_Protocol_Item ("UDP_Factory"), -1);
- udp_item->factory (udp_protocol_factory);
+ ACE_NEW_RETURN (udp_item, TAO_AV_Transport_Item ("UDP_Factory"), -1);
+ udp_item->factory (udp_factory);
- this->protocol_factories_.insert (udp_item);
+ this->transport_factories_.insert (udp_item);
- TAO_AV_Protocol_Factory *tcp_protocol_factory = 0;
- TAO_AV_Protocol_Item *tcp_item = 0;
+ TAO_AV_Transport_Factory *tcp_factory = 0;
+ TAO_AV_Transport_Item *tcp_item = 0;
- ACE_NEW_RETURN (tcp_protocol_factory,
- TAO_AV_TCP_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (tcp_item, TAO_AV_Protocol_Item ("TCP_Factory"), -1);
- tcp_item->factory (tcp_protocol_factory);
+ tcp_factory =
+ ACE_Dynamic_Service<TAO_AV_Transport_Factory>::instance ("TCP_Factory");
+ if (tcp_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "TCP Factory"));
+
+ ACE_NEW_RETURN (tcp_factory,
+ TAO_AV_TCP_Factory,
+ -1);
+ }
- this->protocol_factories_.insert (tcp_item);
+ ACE_NEW_RETURN (tcp_item, TAO_AV_Transport_Item ("TCP_Factory"), -1);
+ tcp_item->factory (tcp_factory);
- TAO_AV_Protocol_Factory *sfp_protocol_factory = 0;
- TAO_AV_Protocol_Item *sfp_item = 0;
+ this->transport_factories_.insert (tcp_item);
- ACE_NEW_RETURN (sfp_protocol_factory,
- TAO_SFP_UDP_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (sfp_item, TAO_AV_Protocol_Item ("SFP_UDP_Factory"), -1);
- sfp_item->factory (sfp_protocol_factory);
- this->protocol_factories_.insert (sfp_item);
+ }
+ return 0;
+}
+
+int
+TAO_AV_Core::init_flow_protocol_factories (void)
+{
+ TAO_AV_Flow_ProtocolFactorySetItor end = this->flow_protocol_factories_.end ();
+ TAO_AV_Flow_ProtocolFactorySetItor factory = this->flow_protocol_factories_.begin ();
+
+ if (factory == end)
+ {
+ TAO_AV_Flow_Protocol_Factory *udp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *udp_item = 0;
- TAO_AV_Protocol_Factory *udp_mcast_protocol_factory = 0;
- TAO_AV_Protocol_Item *udp_mcast_item = 0;
+ udp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance ("UDP_Flow_Factory");
+ if (udp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "UDP Flow Factory"));
+
+ ACE_NEW_RETURN (udp_flow_factory,
+ TAO_AV_UDP_Flow_Factory,
+ -1);
+ }
- ACE_NEW_RETURN (udp_mcast_protocol_factory,
- TAO_AV_UDP_MCast_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (udp_mcast_item, TAO_AV_Protocol_Item ("UDP_MCast_Factory"), -1);
- udp_mcast_item->factory (udp_mcast_protocol_factory);
+ ACE_NEW_RETURN (udp_item, TAO_AV_Flow_Protocol_Item ("UDP_Flow_Factory"), -1);
+ udp_item->factory (udp_flow_factory);
- this->protocol_factories_.insert (udp_mcast_item);
+ this->flow_protocol_factories_.insert (udp_item);
- TAO_AV_Protocol_Factory *rtp_udp_protocol_factory = 0;
- TAO_AV_Protocol_Item *rtp_udp_item = 0;
+ TAO_AV_Flow_Protocol_Factory *tcp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *tcp_item = 0;
- ACE_NEW_RETURN (rtp_udp_protocol_factory,
- TAO_AV_RTP_UDP_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (rtp_udp_item, TAO_AV_Protocol_Item ("RTP_UDP_Factory"), -1);
- rtp_udp_item->factory (rtp_udp_protocol_factory);
+ tcp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance ("TCP_Flow_Factory");
+ if (tcp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "TCP Flow Factory"));
+
+ ACE_NEW_RETURN (tcp_flow_factory,
+ TAO_AV_TCP_Flow_Factory,
+ -1);
+ }
- this->protocol_factories_.insert (rtp_udp_item);
+ ACE_NEW_RETURN (tcp_item, TAO_AV_Flow_Protocol_Item ("TCP_Flow_Factory"), -1);
+ tcp_item->factory (tcp_flow_factory);
- TAO_AV_Protocol_Factory *rtp_udp_mcast_protocol_factory = 0;
- TAO_AV_Protocol_Item *rtp_udp_mcast_item = 0;
+ this->flow_protocol_factories_.insert (tcp_item);
- ACE_NEW_RETURN (rtp_udp_mcast_protocol_factory,
- TAO_AV_RTP_UDP_MCast_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (rtp_udp_mcast_item, TAO_AV_Protocol_Item ("RTP_UDP_MCast_Factory"), -1);
- rtp_udp_mcast_item->factory (rtp_udp_mcast_protocol_factory);
+ TAO_AV_Flow_Protocol_Factory *rtp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *rtp_item = 0;
- this->protocol_factories_.insert (rtp_udp_mcast_item);
+ rtp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance ("RTP_Flow_Factory");
+ if (rtp_flow_factory == 0)
+ {
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "RTP Flow Factory"));
+
+ ACE_NEW_RETURN (rtp_flow_factory,
+ TAO_AV_RTP_Flow_Factory,
+ -1);
+ }
- TAO_AV_Protocol_Factory *sfp_udp_mcast_protocol_factory = 0;
- TAO_AV_Protocol_Item *sfp_udp_mcast_item = 0;
+ ACE_NEW_RETURN (rtp_item, TAO_AV_Flow_Protocol_Item ("RTP_Flow_Factory"), -1);
+ rtp_item->factory (rtp_flow_factory);
- ACE_NEW_RETURN (sfp_udp_mcast_protocol_factory,
- TAO_SFP_UDP_MCast_Protocol_Factory,
- -1);
- ACE_NEW_RETURN (sfp_udp_mcast_item, TAO_AV_Protocol_Item ("SFP_UDP_MCast_Factory"), -1);
- sfp_udp_mcast_item->factory (sfp_udp_mcast_protocol_factory);
+ this->flow_protocol_factories_.insert (rtp_item);
- this->protocol_factories_.insert (sfp_udp_mcast_item);
+ TAO_AV_Flow_Protocol_Factory *rtcp_flow_factory = 0;
+ TAO_AV_Flow_Protocol_Item *rtcp_item = 0;
- if (TAO_debug_level > 0)
+ rtcp_flow_factory =
+ ACE_Dynamic_Service<TAO_AV_Flow_Protocol_Factory>::instance ("RTCP_Flow_Factory");
+ if (rtcp_flow_factory == 0)
{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) Loaded default protocol UDP_Factory\n"));
+ if (TAO_debug_level)
+ ACE_ERROR ((LM_WARNING,
+ "(%P|%t) WARNING - No %s found in Service Repository."
+ " Using default instance.\n",
+ "RTCP Flow Factory"));
+
+ ACE_NEW_RETURN (rtcp_flow_factory,
+ TAO_AV_RTCP_Flow_Factory,
+ -1);
}
+
+ ACE_NEW_RETURN (rtcp_item, TAO_AV_Flow_Protocol_Item ("RTCP_Flow_Factory"), -1);
+ rtcp_item->factory (rtcp_flow_factory);
+
+ this->flow_protocol_factories_.insert (rtcp_item);
}
return 0;
}
+//------------------------------------------------------------
+// TAO_AV_Transport_Item
+//------------------------------------------------------------
+TAO_AV_Transport_Item::TAO_AV_Transport_Item (const ACE_CString &name)
+ : name_ (name),
+ factory_ (0)
+{
+}
//------------------------------------------------------------
-// TAO_AV_Protocol_Item
+// TAO_AV_Transport_Item
//------------------------------------------------------------
-TAO_AV_Protocol_Item::TAO_AV_Protocol_Item (const ACE_CString &name)
+TAO_AV_Flow_Protocol_Item::TAO_AV_Flow_Protocol_Item (const ACE_CString &name)
: name_ (name),
factory_ (0)
{
@@ -516,7 +566,10 @@ TAO_AV_Connector_Registry::open (TAO_Base_StreamEndPoint *endpoint,
{
TAO_FlowSpec_Entry *entry = (*flow_spec);
ACE_Addr *address = entry->address ();
- TAO_AV_Core::Protocol protocol = entry->carrier_protocol ();
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
if (address == 0)
{
// Protocol was specified without an endpoint. According to
@@ -529,40 +582,138 @@ TAO_AV_Connector_Registry::open (TAO_Base_StreamEndPoint *endpoint,
}
else
{
- // Now get the list of avaliable protocol factories.
- TAO_AV_ProtocolFactorySetItor end =
- av_core->protocol_factories ()->end ();
+ TAO_AV_Flow_ProtocolFactorySetItor flow_factory_end =
+ av_core->flow_protocol_factories ()->end ();
- for (TAO_AV_ProtocolFactorySetItor factory =
- av_core->protocol_factories ()->begin ();
- factory != end;
- ++factory)
+ for (TAO_AV_Flow_ProtocolFactorySetItor flow_factory =
+ av_core->flow_protocol_factories ()->begin ();
+ flow_factory != flow_factory_end;
+ ++flow_factory)
{
- if ((*factory)->factory ()->match_protocol (protocol))
+ if ((*flow_factory)->factory ()->match_protocol (flow_protocol))
{
- TAO_AV_Connector *connector =
- (*factory)->factory ()->make_connector ();
- if (connector != 0)
+ // @@Naga:Instead of making a new connector every time we should try and see if a connector exists
+ // for this transport already and hence we can reuse it.
+ TAO_AV_TransportFactorySetItor transport_factory_end =
+ av_core->transport_factories ()->end ();
+ for (TAO_AV_TransportFactorySetItor transport_factory =
+ av_core->transport_factories ()->begin ();
+ transport_factory != transport_factory_end;
+ ++transport_factory)
+ {
+ if ((*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ TAO_AV_Connector *connector =
+ (*transport_factory)->factory ()->make_connector ();
+ if (connector != 0)
+ {
+ // add connector to list.
+ this->connectors_.insert (connector);
+
+ if (connector->open (endpoint,
+ av_core,
+ (*flow_factory)->factory ()) == -1)
+ return -1;
+ TAO_AV_Transport *transport = 0;
+ if (connector->connect (entry,
+ transport) == -1)
+ return -1;
+ entry->transport (transport);
+ break;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "connector for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ else
+ continue;
+ }
+ // Now check if the flow factory has a control flow factory.
+ const char *control_factory_name
+ = (*flow_factory)->factory ()->control_flow_factory ();
+
+ if (control_factory_name != 0)
{
- // add connector to list.
- this->connectors_.insert (connector);
-
- if (connector->open (endpoint,
- av_core) == -1)
- return -1;
- TAO_AV_Transport *transport = 0;
- if (connector->connect (entry,
- transport) == -1)
- return -1;
- entry->transport (transport);
- break;
+ TAO_AV_Flow_ProtocolFactorySetItor control_factory_end =
+ av_core->flow_protocol_factories ()->end ();
+
+ for (TAO_AV_Flow_ProtocolFactorySetItor control_flow_factory =
+ av_core->flow_protocol_factories ()->begin ();
+ control_flow_factory != control_factory_end;
+ ++control_flow_factory)
+ {
+ if ((*control_flow_factory)->factory ()->match_protocol (control_factory_name))
+ {
+ char control_flowname [BUFSIZ];
+ ACE_OS::sprintf (control_flowname,"%s_control",entry->flowname ());
+ // Address will be one port number above the data port.
+ // @@ This requires a more generic solution. This is a hack.
+ TAO_Tokenizer address_str (CORBA::string_dup (entry->address_str ()),':');
+ int port = ACE_OS::atoi (address_str [1]);
+ // Increment the port.
+ port++;
+ char control_addr [BUFSIZ];
+ ACE_OS::sprintf (control_addr,"%s=%s:%d",
+ entry->carrier_protocol_str (),
+ address_str[0],port);
+ TAO_Forward_FlowSpec_Entry *control_entry = 0;
+ // We want to have the control entry as producer
+ // so timeout events will happen.
+ ACE_NEW_RETURN (control_entry,
+ TAO_Forward_FlowSpec_Entry (control_flowname,
+ "IN",
+ entry->format (),
+ entry->flow_protocol_str (),
+ control_addr),
+ -1);
+ // Add the control entry to the flow_spec_set that's passed so that the control entry
+ // will also be called during flow starts and stops. except that if the user specifies
+ // a flowspec in start then the control entry may not be in that but it has to be started
+ // if the flowspec has the associated data flow entry. @@ We'll leave this matter for now.
+ flow_spec_set.insert (control_entry);
+ for (TAO_AV_TransportFactorySetItor transport_factory =
+ av_core->transport_factories ()->begin ();
+ transport_factory != transport_factory_end;
+ ++transport_factory)
+ {
+ if ((*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ TAO_AV_Connector *connector =
+ (*transport_factory)->factory ()->make_connector ();
+ if (connector != 0)
+ {
+ // add connector to list.
+ this->connectors_.insert (connector);
+
+ if (connector->open (endpoint,
+ av_core,
+ (*control_flow_factory)->factory ()) == -1)
+ return -1;
+ TAO_AV_Transport *transport = 0;
+ if (connector->connect (control_entry,
+ transport) == -1)
+ return -1;
+ control_entry->transport (transport);
+ break;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "connector for <%s>\n",
+ control_entry->flowname ()),
+ -1);
+ }
+ else
+ continue;
+ }
+ // Now set the control object on the data flow object.
+ entry->protocol_object ()->control_object (control_entry->protocol_object ());
+ }
+ }
}
- else
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) Unable to create an "
- "connector for <%s>\n",
- entry->flowname ()),
- -1);
}
else
continue;
@@ -594,38 +745,6 @@ TAO_AV_Connector_Registry::close_all (void)
return 0;
}
-/*
-int
-TAO_AV_Connector_Registry::connect (TAO_FlowSpec_Entry *flowspec,
- TAO_AV_Transport *&transport)
-{
- // Find the appropriate connector object
- TAO_AV_Connector *connector =
- this->get_connector (flowspec->carrier_protocol ());
-
- return connector->connect (flowspec, transport);
-}
-
-
-TAO_AV_Connector *
-TAO_AV_Connector_Registry::get_connector (TAO_AV_Core::Protocol protocol)
-{
- TAO_AV_ConnectorSetItor end =
- this->connectors_.end ();
- TAO_AV_ConnectorSetItor connector =
- this->connectors_.begin ();
-
- for (;
- connector != end ;
- connector++)
- {
- if ((*connector)->carrier_protocol () == protocol)
- return *connector;
- }
- return 0;
-}
-*/
-
TAO_AV_Connector_Registry::~TAO_AV_Connector_Registry (void)
{
this->close_all ();
@@ -657,9 +776,12 @@ TAO_AV_Acceptor_Registry::open (TAO_Base_StreamEndPoint *endpoint,
{
TAO_FlowSpec_Entry *entry = (*flow_spec);
ACE_Addr *address = entry->address ();
- TAO_AV_Core::Protocol protocol = entry->carrier_protocol ();
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Acceptor_Registry::protocol for flow %s is %d",
- entry->flowname (),protocol));
+ entry->flowname (),transport_protocol));
if (address == 0)
{
this->open_default (endpoint,av_core, entry);
@@ -668,35 +790,130 @@ TAO_AV_Acceptor_Registry::open (TAO_Base_StreamEndPoint *endpoint,
else
{
// Now get the list of avaliable protocol factories.
- TAO_AV_ProtocolFactorySetItor end =
- av_core->protocol_factories ()->end ();
+ TAO_AV_Flow_ProtocolFactorySetItor flow_factory_end =
+ av_core->flow_protocol_factories ()->end ();
- for (TAO_AV_ProtocolFactorySetItor factory =
- av_core->protocol_factories ()->begin ();
- factory != end;
- ++factory)
+ for (TAO_AV_Flow_ProtocolFactorySetItor flow_factory =
+ av_core->flow_protocol_factories ()->begin ();
+ flow_factory != flow_factory_end;
+ ++flow_factory)
{
- if ((*factory)->factory ()->match_protocol (protocol))
+ if ((*flow_factory)->factory ()->match_protocol (flow_protocol))
{
- TAO_AV_Acceptor *acceptor =
- (*factory)->factory ()->make_acceptor ();
- if (acceptor != 0)
+ TAO_AV_TransportFactorySetItor transport_factory_end =
+ av_core->transport_factories ()->end ();
+ for (TAO_AV_TransportFactorySetItor transport_factory =
+ av_core->transport_factories ()->begin ();
+ transport_factory != transport_factory_end;
+ ++transport_factory)
{
- // add acceptor to list.
- this->acceptors_.insert (acceptor);
-
- if (acceptor->open (endpoint,
- av_core,
- entry) == -1)
- return -1;
- break;
+ if ((*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ TAO_AV_Acceptor *acceptor =
+ (*transport_factory)->factory ()->make_acceptor ();
+ if (acceptor != 0)
+ {
+ // add acceptor to list.
+ this->acceptors_.insert (acceptor);
+
+ if (acceptor->open (endpoint,
+ av_core,
+ entry,
+ (*flow_factory)->factory ()) == -1)
+ return -1;
+ break;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "acceptor for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ else
+ continue;
+ }
+ // Now check if the flow factory has a control flow factory.
+ const char *control_factory_name
+ = (*flow_factory)->factory ()->control_flow_factory ();
+
+ if (control_factory_name != 0)
+ {
+ TAO_AV_Flow_ProtocolFactorySetItor control_factory_end =
+ av_core->flow_protocol_factories ()->end ();
+
+ for (TAO_AV_Flow_ProtocolFactorySetItor control_flow_factory =
+ av_core->flow_protocol_factories ()->begin ();
+ control_flow_factory != control_factory_end;
+ ++control_flow_factory)
+ {
+ if ((*control_flow_factory)->factory ()->match_protocol (control_factory_name))
+ {
+ char control_flowname [BUFSIZ];
+ ACE_OS::sprintf (control_flowname,"%s_control",entry->flowname ());
+ // Address will be one port number above the data port.
+ // @@ This requires a more generic solution. This is a hack.
+ TAO_Tokenizer address_str (CORBA::string_dup (entry->address_str ()),':');
+ int port = ACE_OS::atoi (address_str [1]);
+ // Increment the port.
+ port++;
+ char control_addr [BUFSIZ];
+ ACE_OS::sprintf (control_addr,"%s=%s:%d",
+ entry->carrier_protocol_str (),
+ address_str[0],port);
+ TAO_Forward_FlowSpec_Entry *control_entry = 0;
+ // We want to have the control entry as producer
+ // so timeout events will happen.
+ ACE_NEW_RETURN (control_entry,
+ TAO_Forward_FlowSpec_Entry (control_flowname,
+ "IN",
+ entry->format (),
+ entry->flow_protocol_str (),
+ control_addr),
+ -1);
+ // Add the control entry to the flow_spec_set that's passed so that the control entry
+ // will also be called during flow starts and stops. except that if the user specifies
+ // a flowspec in start then the control entry may not be in that but it has to be started
+ // if the flowspec has the associated data flow entry. @@ We'll leave this matter for now.
+ flow_spec_set.insert (control_entry);
+ TAO_AV_TransportFactorySetItor transport_factory_end =
+ av_core->transport_factories ()->end ();
+ for (TAO_AV_TransportFactorySetItor transport_factory =
+ av_core->transport_factories ()->begin ();
+ transport_factory != transport_factory_end;
+ ++transport_factory)
+ {
+ if ((*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ TAO_AV_Acceptor *acceptor =
+ (*transport_factory)->factory ()->make_acceptor ();
+ if (acceptor != 0)
+ {
+ // add acceptor to list.
+ this->acceptors_.insert (acceptor);
+
+ if (acceptor->open (endpoint,
+ av_core,
+ control_entry,
+ (*control_flow_factory)->factory ()) == -1)
+ return -1;
+ break;
+ }
+ else
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Unable to create an "
+ "acceptor for <%s>\n",
+ entry->flowname ()),
+ -1);
+ }
+ else
+ continue;
+ }
+ // Now set the control object on the data flow object.
+ entry->protocol_object ()->control_object (control_entry->protocol_object ());
+ }
+ }
}
- else
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) Unable to create an "
- "acceptor for <%s>\n",
- entry->flowname ()),
- -1);
}
else
continue;
@@ -715,19 +932,23 @@ TAO_AV_Acceptor_Registry::open_default (TAO_Base_StreamEndPoint *endpoint,
// No endpoints were specified, we let each protocol pick its own
// default...
- TAO_AV_ProtocolFactorySetItor end =
- av_core->protocol_factories ()->end ();
+ TAO_AV_Flow_ProtocolFactorySetItor flow_factory_end =
+ av_core->flow_protocol_factories ()->end ();
+
+ const char *flow_protocol = entry->flow_protocol_str ();
+ const char *transport_protocol = entry->carrier_protocol_str ();
+
+ if (ACE_OS::strcmp (flow_protocol,"") == 0)
+ flow_protocol = transport_protocol;
// loop through loaded protocols looking for protocol_prefix
- for (TAO_AV_ProtocolFactorySetItor i =
- av_core->protocol_factories ()->begin ();
- i != end;
- ++i)
+ TAO_AV_Flow_ProtocolFactorySetItor flow_factory = av_core->flow_protocol_factories ()->begin ();
+ TAO_AV_TransportFactorySetItor transport_factory = av_core->transport_factories ()->begin ();
+ for (;
+ flow_factory != flow_factory_end;
+ ++flow_factory)
{
- TAO_AV_Core::Protocol protocol = entry->carrier_protocol ();
- if (protocol != TAO_AV_Core::TAO_AV_NOPROTOCOL)
- {
- if (!(*i)->factory ()->match_protocol (protocol))
+ if (!(*flow_factory)->factory ()->match_protocol (flow_protocol))
{
// If we have no matching protocol then keep searching
// for one until the entire list of protocols has been
@@ -737,40 +958,63 @@ TAO_AV_Acceptor_Registry::open_default (TAO_Base_StreamEndPoint *endpoint,
ACE_ERROR ((LM_ERROR,
"TAO (%P|%t) Unable to match protocol prefix "
"for <%s>\n",
- protocol));
+ flow_protocol));
continue;
}
- }
+ else
+ {
+ TAO_AV_TransportFactorySetItor transport_factory_end =
+ av_core->transport_factories ()->end ();
+ for (;transport_factory != transport_factory_end;
+ ++transport_factory)
+ {
+ if (!(*transport_factory)->factory ()->match_protocol (transport_protocol))
+ {
+ // If we have no matching protocol then keep searching
+ // for one until the entire list of protocols has been
+ // searched.
+
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) Unable to match protocol prefix "
+ "for <%s>\n",
+ flow_protocol));
+ continue;
+ }
+
- // got it, make an acceptor
- TAO_AV_Acceptor *acceptor =
- (*i)->factory ()->make_acceptor ();
- if (acceptor == 0)
- {
- if (TAO_debug_level > 0)
- ACE_ERROR ((LM_ERROR,
- "TAO (%P|%t) unable to create "
- "an acceptor for <%d>\n",
- protocol));
- continue;
- }
+ // got it, make an acceptor
+ TAO_AV_Acceptor *acceptor =
+ (*transport_factory)->factory ()->make_acceptor ();
- if (acceptor->open_default (endpoint,
- av_core,
- entry) == -1)
- {
- if (TAO_debug_level > 0)
- ACE_ERROR ((LM_ERROR,
- "TAO (%P|%t) unable to open "
- "default acceptor for <%s>%p\n",
- (*i)->protocol_name ().c_str (), ""));
- continue;
- }
+ if (acceptor == 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) unable to create "
+ "an acceptor for <%d>\n",
+ transport_protocol));
+ continue;
+ }
- this->acceptors_.insert (acceptor);
- }
+ if (acceptor->open_default (endpoint,
+ av_core,
+ entry,
+ (*flow_factory)->factory ()) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ "TAO (%P|%t) unable to open "
+ "default acceptor for <%s>%p\n",
+ (*transport_factory)->name ().c_str (), ""));
+ continue;
+ }
+ this->acceptors_.insert (acceptor);
+ }
+ }
+ }
if (this->acceptors_.size () == 0)
{
if (TAO_debug_level > 0)
@@ -827,9 +1071,10 @@ TAO_AV_Transport::get_local_addr (void)
// TAO_AV_Flow_Handler
//----------------------------------------------------------------------
-TAO_AV_Flow_Handler::TAO_AV_Flow_Handler (TAO_AV_Callback *callback)
+//TAO_AV_Flow_Handler::TAO_AV_Flow_Handler (TAO_AV_Callback *callback)
+TAO_AV_Flow_Handler::TAO_AV_Flow_Handler (void)
:transport_ (0),
- callback_ (callback),
+ callback_ (0),
protocol_object_ (0)
{
}
@@ -849,15 +1094,7 @@ TAO_AV_Flow_Handler::start (TAO_FlowSpec_Entry::Role role)
// only for producer we register for the timeout.
case TAO_FlowSpec_Entry::TAO_AV_PRODUCER:
{
- ACE_Event_Handler *event_handler = this->event_handler ();
- ACE_Time_Value *tv = 0;
- this->callback_->get_timeout (tv,
- this->timeout_arg_);
- if (tv == 0)
- return 0;
- this->timer_id_ = event_handler->reactor ()->schedule_timer (event_handler,
- 0,
- *tv);
+ this->schedule_timer ();
}
break;
}
@@ -865,6 +1102,22 @@ TAO_AV_Flow_Handler::start (TAO_FlowSpec_Entry::Role role)
}
int
+TAO_AV_Flow_Handler::schedule_timer (void)
+{
+ ACE_Event_Handler *event_handler = this->event_handler ();
+ ACE_Time_Value *tv = 0;
+ this->callback_->get_timeout (tv,
+ this->timeout_arg_);
+ if (tv == 0)
+ return 0;
+ this->timer_id_ = event_handler->reactor ()->schedule_timer (event_handler,
+ 0,
+ *tv);
+ if (this->timer_id_ < 0)
+ return -1;
+}
+
+int
TAO_AV_Flow_Handler::stop (TAO_FlowSpec_Entry::Role role)
{
this->callback_->handle_stop ();
@@ -916,6 +1169,12 @@ TAO_AV_Flow_Handler::protocol_object (void)
return this->protocol_object_;
}
+void
+TAO_AV_Flow_Handler::callback (TAO_AV_Callback *callback)
+{
+ this->callback_ = callback;
+}
+
// TAO_AV_Connector
TAO_AV_Connector::TAO_AV_Connector (void)
{
@@ -934,1058 +1193,6 @@ TAO_AV_Acceptor::~TAO_AV_Acceptor (void)
{
}
-// TAO_AV_Protocol_Factory
-TAO_AV_Protocol_Factory::TAO_AV_Protocol_Factory (void)
-{
-}
-
-TAO_AV_Protocol_Factory::~TAO_AV_Protocol_Factory (void)
-{
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_Transport
-//------------------------------------------------------------
-
-TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (void)
- :handler_ (0)
-{
-}
-
-TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler)
- :handler_ (handler),
- addr_ (0)
-{
-}
-
-TAO_AV_UDP_Transport::~TAO_AV_UDP_Transport (void)
-{
-}
-
-int
-TAO_AV_UDP_Transport::set_remote_address (const ACE_INET_Addr &address)
-{
- this->peer_addr_ = address;
- return 0;
-}
-
-int
-TAO_AV_UDP_Transport::open (ACE_Addr */*address*/)
-{
- return 0;
-}
-
-int
-TAO_AV_UDP_Transport::close (void)
-{
- return 0;
-}
-
-int
-TAO_AV_UDP_Transport::mtu (void)
-{
- return ACE_MAX_DGRAM_SIZE;
-}
-
-ACE_Addr*
-TAO_AV_UDP_Transport::get_peer_addr (void)
-{
- return &this->peer_addr_;
-}
-
-ssize_t
-TAO_AV_UDP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
-{
- // For the most part this was copied from GIOP::send_request and
- // friends.
-
- iovec iov[IOV_MAX];
- int iovcnt = 0;
- ssize_t n = 0;
- ssize_t nbytes = 0;
-
- for (const ACE_Message_Block *i = mblk;
- i != 0;
- i = i->cont ())
- {
- // Make sure there is something to send!
- if (i->length () > 0)
- {
- iov[iovcnt].iov_base = i->rd_ptr ();
- iov[iovcnt].iov_len = i->length ();
- iovcnt++;
-
- // The buffer is full make a OS call. @@ TODO this should
- // be optimized on a per-platform basis, for instance, some
- // platforms do not implement writev() there we should copy
- // the data into a buffer and call send_n(). In other cases
- // there may be some limits on the size of the iovec, there
- // we should set IOV_MAX to that limit.
- if (iovcnt == IOV_MAX)
- {
- n = this->handler_->get_socket ()->send ((const iovec *) iov,
- iovcnt,
- this->peer_addr_);
-
- if (n < 1)
- return n;
-
- nbytes += n;
- iovcnt = 0;
- }
- }
- }
-
- // Check for remaining buffers to be sent!
- if (iovcnt != 0)
- {
- n = this->handler_->get_socket ()->send ((const iovec *) iov,
- iovcnt,
- this->peer_addr_);
-
- if (n < 1)
- return n;
-
- nbytes += n;
- }
-
- return nbytes;
-}
-
-ssize_t
-TAO_AV_UDP_Transport::send (const char *buf,
- size_t len,
- ACE_Time_Value *)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Transport::send "));
- char addr [BUFSIZ];
- this->peer_addr_.addr_to_string (addr,BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"to %s\n",addr));
-
- return this->handler_->get_socket ()->send (buf, len,this->peer_addr_);
-}
-
-ssize_t
-TAO_AV_UDP_Transport::send (const iovec *iov,
- int iovcnt,
- ACE_Time_Value *)
-{
- return this->handler_->get_socket ()->send ((const iovec *) iov,
- iovcnt,
- this->peer_addr_);
-
-}
-
-ssize_t
-TAO_AV_UDP_Transport::recv (char *buf,
- size_t len,
- ACE_Time_Value *)
-{
- return this->handler_->get_socket ()->recv (buf, len,this->peer_addr_);
-}
-
-ssize_t
-TAO_AV_UDP_Transport::recv (char *buf,
- size_t len,
- int flags,
- ACE_Time_Value *timeout)
-{
- return this->handler_->get_socket ()->recv (buf,
- len,
- this->peer_addr_,
- flags,
- timeout);
-}
-
-ssize_t
-TAO_AV_UDP_Transport::recv (iovec *iov,
- int /*iovcnt*/,
- ACE_Time_Value *timeout)
-{
- return handler_->get_socket ()->recv (iov,this->peer_addr_,0,timeout);
-}
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Transport
-//------------------------------------------------------------
-
-TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (void)
- :handler_ (0)
-{
-}
-
-TAO_AV_TCP_Transport::TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler)
- :handler_ (handler)
-{
-}
-
-TAO_AV_TCP_Transport::~TAO_AV_TCP_Transport (void)
-{
-}
-
-int
-TAO_AV_TCP_Transport::open (ACE_Addr */*address*/)
-{
- return 0;
-}
-
-int
-TAO_AV_TCP_Transport::close (void)
-{
- return 0;
-}
-
-int
-TAO_AV_TCP_Transport::mtu (void)
-{
- return -1;
-}
-
-ACE_Addr*
-TAO_AV_TCP_Transport::get_peer_addr (void)
-{
- return 0;
-}
-
-ssize_t
-TAO_AV_TCP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
-{
- // For the most part this was copied from GIOP::send_request and
- // friends.
-
- iovec iov[IOV_MAX];
- int iovcnt = 0;
- ssize_t n = 0;
- ssize_t nbytes = 0;
-
- for (const ACE_Message_Block *i = mblk;
- i != 0;
- i = i->cont ())
- {
- // Make sure there is something to send!
- if (i->length () > 0)
- {
- iov[iovcnt].iov_base = i->rd_ptr ();
- iov[iovcnt].iov_len = i->length ();
- iovcnt++;
-
- // The buffer is full make a OS call. @@ TODO this should
- // be optimized on a per-platform basis, for instance, some
- // platforms do not implement writev() there we should copy
- // the data into a buffer and call send_n(). In other cases
- // there may be some limits on the size of the iovec, there
- // we should set IOV_MAX to that limit.
- if (iovcnt == IOV_MAX)
- {
- n = this->handler_->peer ().sendv_n ((const iovec *) iov,
- iovcnt);
- if (n < 1)
- return n;
-
- nbytes += n;
- iovcnt = 0;
- }
- }
- }
-
- // Check for remaining buffers to be sent!
- if (iovcnt != 0)
- {
- n = this->handler_->peer ().sendv_n ((const iovec *) iov,
- iovcnt);
- if (n < 1)
- return n;
-
- nbytes += n;
- }
-
- return nbytes;
-}
-
-ssize_t
-TAO_AV_TCP_Transport::send (const char *buf,
- size_t len,
- ACE_Time_Value *)
-{
- return this->handler_->peer ().send_n (buf, len);
-}
-
-ssize_t
-TAO_AV_TCP_Transport::send (const iovec *iov,
- int iovcnt,
- ACE_Time_Value *)
-{
- return this->handler_->peer ().sendv_n ((const iovec *) iov,
- iovcnt);
-}
-
-ssize_t
-TAO_AV_TCP_Transport::recv (char *buf,
- size_t len,
- ACE_Time_Value *)
-{
- return this->handler_->peer ().recv (buf, len);
-}
-
-ssize_t
-TAO_AV_TCP_Transport::recv (char *buf,
- size_t len,
- int flags,
- ACE_Time_Value *)
-{
- return this->handler_->peer ().recv (buf,
- len,
- flags);
-}
-
-ssize_t
-TAO_AV_TCP_Transport::recv (iovec *iov,
- int iovcnt,
- ACE_Time_Value *)
-{
- return handler_->peer ().recvv_n (iov, iovcnt);
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_Acceptor
-//------------------------------------------------------------
-
-TAO_AV_UDP_Acceptor::TAO_AV_UDP_Acceptor (void)
-{
-}
-
-TAO_AV_UDP_Acceptor::~TAO_AV_UDP_Acceptor (void)
-{
-}
-
-int
-TAO_AV_UDP_Acceptor::make_svc_handler (TAO_AV_UDP_Flow_Handler *&udp_handler)
-{
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (udp_handler,
- TAO_AV_UDP_Flow_Handler (callback),
- -1);
- callback->transport (udp_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_UDP_Object (callback,
- udp_handler->transport ()),
- -1);
- // @@: Call open on callback with protocol object and transport.
- udp_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),udp_handler);
- this->entry_->protocol_object (object);
- }
- return 0;
-}
-
-int
-TAO_AV_UDP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open "));
- this->av_core_ = av_core;
- this->endpoint_ = endpoint;
- this->entry_ = entry;
- this->flowname_ = entry->flowname ();
- ACE_Addr *address = entry->address ();
- ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
- inet_addr->set (inet_addr->get_port_number (),
- inet_addr->get_host_name ());
- char buf[BUFSIZ];
- inet_addr->addr_to_string (buf,
- BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open: %s",
- buf));
- int result = this->acceptor_.open (this,
- av_core->reactor (),
- *address,
- this->handler_);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Acceptor::open failed"),-1);
- entry->handler (this->handler_);
- entry->set_local_addr (address);
- return 0;
-}
-
-int
-TAO_AV_UDP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- this->av_core_ = av_core;
- this->endpoint_ = endpoint;
- this->entry_ = entry;
- this->flowname_ = entry->flowname ();
- ACE_INET_Addr *address;
- ACE_NEW_RETURN (address,
- ACE_INET_Addr ("0"),
- -1);
- int result = this->acceptor_.open (this,
- av_core->reactor (),
- *address,
- this->handler_);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Acceptor::open failed"),-1);
- address->set (address->get_port_number (),
- address->get_host_name ());
- char buf[BUFSIZ];
- address->addr_to_string (buf,BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open_default: %s\n",buf));
- entry->handler (this->handler_);
- entry->set_local_addr (address);
- return 0;
-}
-
-int
-TAO_AV_UDP_Acceptor::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_Dgram_Acceptor
-//------------------------------------------------------------
-
-int
-TAO_AV_Dgram_Acceptor::open (TAO_AV_UDP_Acceptor *acceptor,
- ACE_Reactor *reactor,
- ACE_Addr &address,
- TAO_AV_UDP_Flow_Handler *&handler)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Dgram_Acceptor::open "));
- this->acceptor_ = acceptor;
- this->reactor_ = reactor;
- int result = 0;
- result = this->make_svc_handler (handler);
- result = handler->open (address);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"SOCK_Dgram::open failed\n"),-1);
- int sndbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
- int rcvbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
-
- if (handler->get_socket ()->set_option (SOL_SOCKET,
- SO_SNDBUF,
- (void *) &sndbufsize,
- sizeof (sndbufsize)) == -1
- && errno != ENOTSUP)
- return 0;
-
- else if (handler->get_socket ()->set_option (SOL_SOCKET,
- SO_RCVBUF,
- (void *) &rcvbufsize,
- sizeof (rcvbufsize)) == -1
- && errno != ENOTSUP)
- return 0;
- result = this->activate_svc_handler (handler);
- if (result < 0)
- return result;
- result = handler->get_socket ()->get_local_addr (address);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"SOCK_Dgram::get_local_addr failed\n"),-1);
- return 0;
-}
-
-
-int
-TAO_AV_Dgram_Acceptor::activate_svc_handler (TAO_AV_UDP_Flow_Handler *handler)
-{
- ACE_Event_Handler *event_handler = handler;
- // ACE_HANDLE fd = event_handler->get_handle ();
- int result = this->reactor_->register_handler (event_handler,
- ACE_Event_Handler::READ_MASK);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Acceptor::activate_svc_handler failed\n"),result);
- event_handler->reactor (this->reactor_);
- return 0;
-}
-
-
-int
-TAO_AV_Dgram_Acceptor::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- return this->acceptor_->make_svc_handler (handler);
-}
-
-//------------------------------------------------------------
-// TAO_AV_Dgram_Connector
-//------------------------------------------------------------
-
-int
-TAO_AV_Dgram_Connector::open (TAO_AV_UDP_Connector *connector,
- ACE_Reactor *reactor)
-{
- this->connector_ = connector;
- this->reactor_ = reactor;
- return 0;
-}
-
-int
-TAO_AV_Dgram_Connector::connect (TAO_AV_UDP_Flow_Handler *&handler,
- ACE_Addr &remote_addr,
- ACE_Addr &local_addr)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_Dgram_Connector::connect "));
- int result = 0;
- this->make_svc_handler (handler);
- result = handler->open (local_addr);
- // set the socket buffer sizes to 64k.
- int sndbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
- int rcvbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
-
- if (handler->get_socket ()->set_option (SOL_SOCKET,
- SO_SNDBUF,
- (void *) &sndbufsize,
- sizeof (sndbufsize)) == -1
- && errno != ENOTSUP)
- return 0;
-
- else if (handler->get_socket ()->set_option (SOL_SOCKET,
- SO_RCVBUF,
- (void *) &rcvbufsize,
- sizeof (rcvbufsize)) == -1
- && errno != ENOTSUP)
- return 0;
-
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"SOCK_Dgram::open failed\n"),-1);
- result = this->activate_svc_handler (handler);
- if (result < 0)
- return result;
- handler->set_remote_address (&remote_addr);
- result = handler->get_socket ()->get_local_addr (local_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
- return 0;
-}
-
-int
-TAO_AV_Dgram_Connector::activate_svc_handler (TAO_AV_UDP_Flow_Handler *handler)
-{
- int result = this->reactor_->register_handler (handler,
- ACE_Event_Handler::READ_MASK);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::activate_svc_handler failed\n"),result);
- handler->reactor (this->reactor_);
- return 0;
-}
-
-int
-TAO_AV_Dgram_Connector::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- return this->connector_->make_svc_handler (handler);
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_Connector
-//------------------------------------------------------------
-TAO_AV_UDP_Connector::TAO_AV_UDP_Connector (void)
-{
-}
-
-TAO_AV_UDP_Connector::~TAO_AV_UDP_Connector (void)
-{
-}
-
-int
-TAO_AV_UDP_Connector::make_svc_handler (TAO_AV_UDP_Flow_Handler *&udp_handler)
-{
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (udp_handler,
- TAO_AV_UDP_Flow_Handler (callback),
- -1);
- callback->transport (udp_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_UDP_Object (callback,
- udp_handler->transport ()),
- -1);
- udp_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),udp_handler);
- this->entry_->protocol_object (object);
- }
- return 0;
-}
-
-int
-TAO_AV_UDP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core)
-
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Connector::open "));
- this->endpoint_ = endpoint;
- this->av_core_ = av_core;
- int result = this->connector_.open (this,av_core->reactor ());
- return result;
-}
-
-int
-TAO_AV_UDP_Connector::connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport)
-{
- this->entry_ = entry;
- ACE_Addr *remote_addr = entry->address ();
- ACE_INET_Addr *local_addr;
- ACE_NEW_RETURN (local_addr,
- ACE_INET_Addr ("0"),
- -1);
- int result = this->connector_.connect (this->handler_,
- *remote_addr,
- *local_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_connector::open failed\n"),-1);
- // XXX:hack to set the ip address correctly.
- local_addr->set (local_addr->get_port_number (),
- local_addr->get_host_name ());
- char buf[BUFSIZ];
- local_addr->addr_to_string (buf,BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_CONNECTOR::connect:%s \n",buf));
- entry->set_local_addr (local_addr);
- entry->handler (this->handler_);
- transport = this->handler_->transport ();
- return 0;
-}
-
-int
-TAO_AV_UDP_Connector::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_UDP_Protocol_Factory
-//------------------------------------------------------------
-
-TAO_AV_UDP_Protocol_Factory::TAO_AV_UDP_Protocol_Factory (void)
-{
-}
-
-TAO_AV_UDP_Protocol_Factory::~TAO_AV_UDP_Protocol_Factory (void)
-{
-}
-
-int
-TAO_AV_UDP_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_UDP);
-}
-
-TAO_AV_Acceptor*
-TAO_AV_UDP_Protocol_Factory::make_acceptor (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Protocol_Factory::make_acceptor "));
- TAO_AV_Acceptor *acceptor = 0;
- ACE_NEW_RETURN (acceptor,
- TAO_AV_UDP_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector*
-TAO_AV_UDP_Protocol_Factory::make_connector (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Protocol_Factory::make_connector "));
- TAO_AV_Connector *connector = 0;
- ACE_NEW_RETURN (connector,
- TAO_AV_UDP_Connector,
- 0);
- return connector;
-}
-//------------------------------------------------------------
-// TAO_AV_TCP_Protocol_Factory
-//------------------------------------------------------------
-
-TAO_AV_TCP_Protocol_Factory::TAO_AV_TCP_Protocol_Factory (void)
-{
-}
-
-TAO_AV_TCP_Protocol_Factory::~TAO_AV_TCP_Protocol_Factory (void)
-{
-}
-
-int
-TAO_AV_TCP_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_TCP);
-}
-
-TAO_AV_Acceptor*
-TAO_AV_TCP_Protocol_Factory::make_acceptor (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Protocol_Factory::make_acceptor "));
- TAO_AV_Acceptor *acceptor = 0;
- ACE_NEW_RETURN (acceptor,
- TAO_AV_TCP_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector*
-TAO_AV_TCP_Protocol_Factory::make_connector (void)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Protocol_Factory::make_connector "));
- TAO_AV_Connector *connector = 0;
- ACE_NEW_RETURN (connector,
- TAO_AV_TCP_Connector,
- 0);
- return connector;
-}
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Base_Connector
-//------------------------------------------------------------
-
-int
-TAO_AV_TCP_Base_Connector::connector_open (TAO_AV_TCP_Connector *connector,
- ACE_Reactor *reactor)
-{
- this->connector_ = connector;
- this->reactor_ = reactor;
-
- int result = ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::open (reactor);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
- return 0;
-}
-
-int
-TAO_AV_TCP_Base_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
-{
- int result =
- this->connector_->make_svc_handler (tcp_handler);
- if (result < 0)
- return result;
- tcp_handler->reactor (this->reactor_);
- return 0;
-}
-
-int
-TAO_AV_TCP_Base_Connector::connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
- const ACE_INET_Addr &remote_addr)
-{
- int result = ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>::connect (handler,
- remote_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::connect failed\n"),-1);
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Connector
-//------------------------------------------------------------
-TAO_AV_TCP_Connector::TAO_AV_TCP_Connector (void)
-{
-}
-
-TAO_AV_TCP_Connector::~TAO_AV_TCP_Connector (void)
-{
-}
-
-int
-TAO_AV_TCP_Connector::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::make_svc_handler\n"));
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (tcp_handler,
- TAO_AV_TCP_Flow_Handler (callback),
- -1);
- callback->transport (tcp_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_TCP_Object (callback,
- tcp_handler->transport ()),
- -1);
- tcp_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),tcp_handler);
- this->entry_->protocol_object (object);
- this->entry_->handler (tcp_handler);
- }
- return 0;
-}
-
-int
-TAO_AV_TCP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core)
-
-{
- this->endpoint_ = endpoint;
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Connector::open "));
- int result = this->connector_.connector_open(this,
- av_core->reactor ());
- return result;
-}
-
-int
-TAO_AV_TCP_Connector::connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport)
-{
- this->entry_ = entry;
- ACE_Addr *remote_addr = entry->address ();
- ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr *,remote_addr);
- TAO_AV_TCP_Flow_Handler *handler;
- int result = this->connector_.connector_connect (handler,
- *inet_addr);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_connector::open failed\n"),-1);
- entry->handler (handler);
- transport = handler->transport ();
- return 0;
-}
-
-int
-TAO_AV_TCP_Connector::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Base_Connector
-//------------------------------------------------------------
-
-int
-TAO_AV_TCP_Base_Acceptor::open (TAO_AV_TCP_Acceptor *acceptor,
- ACE_Reactor *reactor,
- const ACE_INET_Addr &local_addr,
- TAO_FlowSpec_Entry *entry)
-{
- this->acceptor_ = acceptor;
- this->reactor_ = reactor;
- this->entry_ = entry;
-
- int result = ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>::open (local_addr,reactor);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Base_Connector::open failed\n"),-1);
- return 0;
-}
-
-int
-TAO_AV_TCP_Base_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler)
-{
- int result = this->acceptor_->make_svc_handler (handler);
- if (result < 0)
- return result;
- handler->reactor (this->reactor_);
- this->entry_->handler (handler);
- return 0;
-}
-
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Acceptor
-//------------------------------------------------------------
-
-TAO_AV_TCP_Acceptor::TAO_AV_TCP_Acceptor (void)
-{
-}
-
-TAO_AV_TCP_Acceptor::~TAO_AV_TCP_Acceptor (void)
-{
-}
-
-int
-TAO_AV_TCP_Acceptor::make_svc_handler (TAO_AV_TCP_Flow_Handler *&tcp_handler)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::make_svc_handler\n"));
- TAO_AV_Callback *callback = 0;
- if (this->endpoint_ != 0)
- {
- this->endpoint_->get_callback (this->flowname_.c_str (),
- callback);
- ACE_NEW_RETURN (tcp_handler,
- TAO_AV_TCP_Flow_Handler (callback),
- -1);
- callback->transport (tcp_handler->transport ());
- TAO_AV_Protocol_Object *object =0;
- ACE_NEW_RETURN (object,
- TAO_AV_TCP_Object (callback,
- tcp_handler->transport ()),
- -1);
- tcp_handler->protocol_object (object);
- callback->protocol_object (object);
- this->endpoint_->set_protocol_object (this->flowname_.c_str (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),tcp_handler);
- this->entry_->protocol_object (object);
- this->entry_->handler (tcp_handler);
- }
- return 0;
-}
-
-int
-TAO_AV_TCP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open "));
- this->av_core_ = av_core;
- this->endpoint_ = endpoint;
- this->entry_ = entry;
- this->flowname_ = entry->flowname ();
- ACE_Addr *address = entry->address ();
- ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) address;
- inet_addr->set (inet_addr->get_port_number (),
- inet_addr->get_host_name ());
- char buf[BUFSIZ];
- inet_addr->addr_to_string (buf,
- BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open: %s",
- buf));
- int result = this->acceptor_.open (this,
- av_core->reactor (),
- *inet_addr,
- entry);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Acceptor::open failed"),-1);
- entry->set_local_addr (address);
- return 0;
-}
-
-int
-TAO_AV_TCP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry)
-{
- this->av_core_ = av_core;
- this->endpoint_ = endpoint;
- this->entry_ = entry;
- this->flowname_ = entry->flowname ();
- ACE_INET_Addr *address;
- ACE_NEW_RETURN (address,
- ACE_INET_Addr ("0"),
- -1);
- int result = this->acceptor_.open (this,
- av_core->reactor (),
- *address,
- entry);
-
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Acceptor::open failed"),-1);
- this->acceptor_.acceptor ().get_local_addr (*address);
- address->set (address->get_port_number (),
- address->get_host_name ());
- char buf[BUFSIZ];
- address->addr_to_string (buf,BUFSIZ);
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_TCP_Acceptor::open_default: %s\n",buf));
- entry->set_local_addr (address);
- return 0;
-}
-
-
-int
-TAO_AV_TCP_Acceptor::close (void)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_AV_TCP_Flow_Handler
-//------------------------------------------------------------
-
-TAO_AV_TCP_Flow_Handler::TAO_AV_TCP_Flow_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback)
-{
- ACE_NEW (this->transport_,
- TAO_AV_TCP_Transport (this));
-}
-
-TAO_AV_Transport *
-TAO_AV_TCP_Flow_Handler::transport (void)
-{
- return this->transport_;
-}
-
-int
-TAO_AV_TCP_Flow_Handler::open (void *arg)
-{
-
- int nodelay = 1;
-
-#if defined (TCP_NODELAY)
- if (this->peer ().set_option (IPPROTO_TCP,
- TCP_NODELAY,
- (void *) &nodelay,
- sizeof (nodelay)) == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- "NODELAY failed\n"),
- -1);
-#endif /* TCP_NODELAY */
-
- // Called by the <Strategy_Acceptor> when the handler is completely
- // connected.
- ACE_INET_Addr addr;
-
- if (this->peer ().get_remote_addr (addr) == -1)
- return -1;
-
- char server[MAXHOSTNAMELEN + 16];
-
- (void) addr.addr_to_string (server, sizeof (server));
-
- if (TAO_debug_level > 0)
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
- "(%P|%t) connection to server <%s> on %d\n",
- server, this->peer ().get_handle ()));
-
- this->peer ().enable (ACE_NONBLOCK);
- // Register the handler with the reactor.
- if (this->reactor ()
- && this->reactor ()->register_handler
- (this,
- ACE_Event_Handler::READ_MASK) == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- ASYS_TEXT ("%p\n"),
- ASYS_TEXT ("unable to register client handler")),
- -1);
-}
-
-int
-TAO_AV_TCP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- size_t size = BUFSIZ;
- ACE_Message_Block *frame = 0;
- ACE_NEW_RETURN (frame,
- ACE_Message_Block (size),
- -1);
- int n = this->transport_->recv (frame->rd_ptr (),
- size);
- if (n == -1)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input recv failed\n"),-1);
- if (n == 0)
- ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_TCP_Flow_Handler::handle_input connection closed\n"),-1);
- frame->wr_ptr (n);
- this->callback_->receive_frame (frame);
- return 0;
-}
-
-int
-TAO_AV_TCP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
- const void *arg)
-{
- return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
-}
-
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Node <TAO_AV_Connector*>;
template class ACE_Node <TAO_AV_Acceptor*>;
@@ -1994,8 +1201,6 @@ template class ACE_Unbounded_Set<TAO_AV_Connector*>;
template class ACE_Unbounded_Set_Iterator<TAO_AV_Acceptor*>;
template class ACE_Unbounded_Set_Iterator<TAO_AV_Connector*>;
template class ACE_Singleton<TAO_AV_Core,ACE_Null_Mutex>;
-template class ACE_Acceptor<TAO_AV_TCP_Flow_Handler, ACE_SOCK_ACCEPTOR>;
-template class ACE_Connector<TAO_AV_TCP_Flow_Handler, ACE_SOCK_CONNECTOR>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Node <TAO_AV_Connector*>
#pragma instantiate ACE_Node <TAO_AV_Acceptor*>
@@ -2004,6 +1209,4 @@ template class ACE_Connector<TAO_AV_TCP_Flow_Handler, ACE_SOCK_CONNECTOR>;
#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_AV_Connector*>
#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_AV_Acceptor*>
#pragma instantiate ACE_Singleton<TAO_AV_Core,ACE_Null_Mutex>
-#pragma instantiate ACE_Acceptor<TAO_AV_TCP_Flow_Handler, ACE_SOCK_Acceptor, ACE_INET_Addr>
-#pragma instantiate ACE_Connector<TAO_AV_TCP_Flow_Handler, ACE_SOCK_Connector, ACE_INET_Addr>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.h b/TAO/orbsvcs/orbsvcs/AV/Transport.h
index 82a5c6f674e..c46fa19e51b 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Transport.h
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.h
@@ -28,8 +28,53 @@
#include "AV_Core.h"
#include "FlowSpec_Entry.h"
-// Transports
+// Forward declarations.
+class TAO_AV_Protocol_Object;
+class TAO_AV_Callback;
+class TAO_AV_Transport;
+
+class TAO_AV_Flow_Handler
+{
+public:
+ TAO_AV_Flow_Handler (void);
+ // Constructor.
+
+ virtual int start (TAO_FlowSpec_Entry::Role role);
+ virtual int stop (TAO_FlowSpec_Entry::Role role);
+ // Start/stop the flow handler.
+
+ virtual int schedule_timer (void);
+ // Schedule timer. Uses the get_timeout method on the callback.
+
+ TAO_AV_Transport *transport (void);
+ // get the transport.
+
+ TAO_AV_Protocol_Object* protocol_object (void);
+ void protocol_object (TAO_AV_Protocol_Object *protocol_object);
+ // set/get protocol_object.
+
+ void callback (TAO_AV_Callback *callback);
+ // set the callback.
+
+ int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ // Handle timeout. called from reactor.
+
+ virtual int set_remote_address (ACE_Addr *address);
+ // set the remote address.
+
+ virtual ACE_Event_Handler* event_handler (void) = 0;
+ // get the underlying event handler. To be overridden by the derived clases.
+
+protected:
+ TAO_AV_Transport *transport_;
+ TAO_AV_Callback *callback_;
+ TAO_AV_Protocol_Object *protocol_object_;
+ long timer_id_;
+ ACE_Reactor *reactor_;
+ void *timeout_arg_;
+};
+// Transports
class TAO_ORBSVCS_Export TAO_AV_Transport
{
// TITLE
@@ -82,130 +127,10 @@ public:
};
-class TAO_AV_TCP_Flow_Handler;
-
-class TAO_AV_TCP_Transport
- :public TAO_AV_Transport
-{
- // = TITLE
- // A transport abstraction for socket streams.
- //
- // = DESCRIPTION
- // Uses the ACE_SOCK_Stream to send the data.
-public:
- TAO_AV_TCP_Transport (void);
-
- TAO_AV_TCP_Transport (TAO_AV_TCP_Flow_Handler *handler);
-
- virtual ~TAO_AV_TCP_Transport (void);
-
- virtual int open (ACE_Addr *address);
-
- virtual int close (void);
-
- virtual int mtu (void);
-
- virtual ACE_Addr *get_peer_addr (void);
-
- virtual ssize_t send (const ACE_Message_Block *mblk,
- ACE_Time_Value *s = 0);
- // Write the complete Message_Block chain to the connection.
-
- virtual ssize_t send (const char *buf,
- size_t len,
- ACE_Time_Value *s = 0);
- // Write the contents of the buffer of length len to the connection.
-
- virtual ssize_t send (const iovec *iov,
- int iovcnt,
- ACE_Time_Value *s = 0);
- // Write the contents of iovcnt iovec's to the connection.
-
- virtual ssize_t recv (char *buf,
- size_t len,
- ACE_Time_Value *s = 0);
- // Read len bytes from into buf.
-
- virtual ssize_t recv (char *buf,
- size_t len,
- int flags,
- ACE_Time_Value *s = 0);
- // Read len bytes from into buf using flags.
-
- virtual ssize_t recv (iovec *iov,
- int iovcnt,
- ACE_Time_Value *s = 0);
- // Read received data into the iovec buffers.
-protected:
- TAO_AV_TCP_Flow_Handler *handler_;
-};
-
-class TAO_AV_UDP_Flow_Handler;
-
-class TAO_AV_UDP_Transport
- :public TAO_AV_Transport
-{
- // = TITLE
- // A transport abstraction for udp sockets.
- //
- // = DESCRIPTION
- // Uses the ACE_SOCK_Dgram to send the data.
-public:
- TAO_AV_UDP_Transport (void);
-
- TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler);
-
- virtual ~TAO_AV_UDP_Transport (void);
- virtual int open (ACE_Addr *addr);
-
- virtual int close (void);
-
- virtual int mtu (void);
-
- virtual ACE_Addr *get_peer_addr (void);
-
- virtual int set_remote_address (const ACE_INET_Addr &address);
-
- virtual ssize_t send (const ACE_Message_Block *mblk,
- ACE_Time_Value *s = 0);
- // Write the complete Message_Block chain to the connection.
-
- virtual ssize_t send (const char *buf,
- size_t len,
- ACE_Time_Value *s = 0);
- // Write the contents of the buffer of length len to the connection.
-
- virtual ssize_t send (const iovec *iov,
- int iovcnt,
- ACE_Time_Value *s = 0);
- // Write the contents of iovcnt iovec's to the connection.
-
- virtual ssize_t recv (char *buf,
- size_t len,
- ACE_Time_Value *s = 0);
- // Read len bytes from into buf.
-
- virtual ssize_t recv (char *buf,
- size_t len,
- int flags,
- ACE_Time_Value *s = 0);
- // Read len bytes from into buf using flags.
-
- virtual ssize_t recv (iovec *iov,
- int iovcnt,
- ACE_Time_Value *s = 0);
- // Read received data into the iovec buffers.
-protected:
- TAO_AV_UDP_Flow_Handler *handler_;
- ACE_Addr *addr_;
- ACE_INET_Addr peer_addr_;
-};
-
class TAO_Base_StreamEndPoint;
class TAO_AV_Core;
class TAO_FlowSpec_Entry;
-// Acceptors
class TAO_AV_Acceptor
{
public:
@@ -213,10 +138,14 @@ public:
virtual ~TAO_AV_Acceptor (void);
virtual int open (TAO_Base_StreamEndPoint *endpoint,
TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry) = 0;
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory) = 0;
+
virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry) = 0;
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory) = 0;
+
const char *flowname ();
virtual int close (void) = 0;
protected:
@@ -225,101 +154,6 @@ protected:
ACE_Addr *address_;
};
-class TAO_AV_TCP_Acceptor;
-
-class TAO_AV_TCP_Base_Acceptor
- :public ACE_Acceptor <TAO_AV_TCP_Flow_Handler,ACE_SOCK_ACCEPTOR>
-{
-public:
- virtual int open (TAO_AV_TCP_Acceptor *acceptor,
- ACE_Reactor *reactor,
- const ACE_INET_Addr &local_addr,
- TAO_FlowSpec_Entry *entry);
- virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
-protected:
- TAO_AV_TCP_Acceptor *acceptor_;
- ACE_Reactor *reactor_;
- TAO_FlowSpec_Entry *entry_;
-};
-
-class TAO_AV_TCP_Acceptor
- :public TAO_AV_Acceptor
-{
-public:
- TAO_AV_TCP_Acceptor (void);
- virtual ~TAO_AV_TCP_Acceptor (void);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
-protected:
- TAO_AV_TCP_Base_Acceptor acceptor_;
- TAO_FlowSpec_Entry *entry_;
- TAO_Base_StreamEndPoint *endpoint_;
-};
-
-class TAO_AV_Flow_Handler;
-
-class TAO_AV_UDP_Acceptor;
-
-class TAO_ORBSVCS_Export TAO_AV_Dgram_Acceptor
-{
-public:
- virtual int open (TAO_AV_UDP_Acceptor *acceptor,
- ACE_Reactor *reactor,
- ACE_Addr &address,
- TAO_AV_UDP_Flow_Handler *&handler);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
- virtual int activate_svc_handler (TAO_AV_UDP_Flow_Handler *handler);
-protected:
- ACE_Reactor *reactor_;
- TAO_AV_UDP_Acceptor *acceptor_;
-};
-
-class TAO_AV_UDP_Connector;
-
-class TAO_ORBSVCS_Export TAO_AV_Dgram_Connector
-{
-public:
- virtual int open (TAO_AV_UDP_Connector *connector,
- ACE_Reactor *reactor);
-
- virtual int connect (TAO_AV_UDP_Flow_Handler *&handler,
- ACE_Addr &remote_addr,
- ACE_Addr &local_addr);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
- virtual int activate_svc_handler (TAO_AV_UDP_Flow_Handler *handler);
-protected:
- ACE_Reactor *reactor_;
- TAO_AV_UDP_Connector *connector_;
-};
-
-class TAO_AV_UDP_Acceptor
- :public TAO_AV_Acceptor
-{
-public:
- TAO_AV_UDP_Acceptor (void);
- virtual ~TAO_AV_UDP_Acceptor (void);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core,
- TAO_FlowSpec_Entry *entry);
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
-protected:
- TAO_AV_Dgram_Acceptor acceptor_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_FlowSpec_Entry *entry_;
- TAO_AV_UDP_Flow_Handler *handler_;
-};
-
-// Connectors
class TAO_AV_Connector
{
public:
@@ -328,7 +162,8 @@ public:
const char *flowname (void);
virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core) = 0;
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory) = 0;
virtual int connect (TAO_FlowSpec_Entry *entry,
TAO_AV_Transport *&transport) = 0;
@@ -338,163 +173,6 @@ protected:
ACE_CString flowname_;
};
-class TAO_AV_TCP_Connector;
-
-class TAO_AV_TCP_Base_Connector
- :public ACE_Connector <TAO_AV_TCP_Flow_Handler,ACE_SOCK_CONNECTOR>
-{
-public:
- // To avoid warnings of open and connect hiding the base class functions these have to renamed.
- int connector_open (TAO_AV_TCP_Connector *connector,
- ACE_Reactor *reactor);
- int connector_connect (TAO_AV_TCP_Flow_Handler *&handler,
- const ACE_INET_Addr &remote_addr);
- virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *& handler);
-protected:
- TAO_AV_TCP_Connector *connector_;
- ACE_Reactor *reactor_;
-};
-
-class TAO_AV_TCP_Connector
- :public TAO_AV_Connector
-{
-public:
- TAO_AV_TCP_Connector (void);
- virtual ~TAO_AV_TCP_Connector (void);
-
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core);
-
- virtual int connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport);
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_TCP_Flow_Handler *&handler);
-protected:
- TAO_AV_Core *av_core_;
- TAO_AV_TCP_Base_Connector connector_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_FlowSpec_Entry *entry_;
-};
-
-class TAO_AV_UDP_Connector
- :public TAO_AV_Connector
-{
-public:
- TAO_AV_UDP_Connector (void);
- ~TAO_AV_UDP_Connector (void);
- virtual int open (TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_Core *av_core);
-
- virtual int connect (TAO_FlowSpec_Entry *entry,
- TAO_AV_Transport *&transport);
- virtual int close (void);
- virtual int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
-protected:
- TAO_AV_Dgram_Connector connector_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_AV_Core *av_core_;
- TAO_FlowSpec_Entry *entry_;
- TAO_AV_UDP_Flow_Handler *handler_;
-};
-
-// Protocol Factories
-class TAO_ORBSVCS_Export TAO_AV_Protocol_Factory
-// @@ Derive from Svc config.
-{
-public:
- TAO_AV_Protocol_Factory (void);
- virtual ~TAO_AV_Protocol_Factory (void);
-
- virtual int match_protocol (TAO_AV_Core::Protocol protocol) = 0;
- virtual TAO_AV_Acceptor *make_acceptor (void) = 0;
- virtual TAO_AV_Connector *make_connector (void) = 0;
-};
-
-class TAO_AV_TCP_Protocol_Factory
- :public TAO_AV_Protocol_Factory
-{
-public:
- TAO_AV_TCP_Protocol_Factory (void);
- virtual ~TAO_AV_TCP_Protocol_Factory (void);
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- virtual TAO_AV_Acceptor *make_acceptor (void);
- virtual TAO_AV_Connector *make_connector (void);
-
-};
-
-class TAO_AV_UDP_Protocol_Factory
- :public TAO_AV_Protocol_Factory
-{
-public:
- TAO_AV_UDP_Protocol_Factory (void);
- virtual ~TAO_AV_UDP_Protocol_Factory (void);
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- virtual TAO_AV_Acceptor *make_acceptor (void);
- virtual TAO_AV_Connector *make_connector (void);
-};
-
-// Forward declarations.
-class TAO_AV_Protocol_Object;
-class TAO_AV_Callback;
-
-class TAO_AV_Flow_Handler
-{
-public:
- TAO_AV_Flow_Handler (TAO_AV_Callback *callback);
- virtual int start (TAO_FlowSpec_Entry::Role role);
- virtual int stop (TAO_FlowSpec_Entry::Role role);
- TAO_AV_Transport *transport (void);
- TAO_AV_Protocol_Object* protocol_object (void);
- void protocol_object (TAO_AV_Protocol_Object *protocol_object);
- int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
- virtual int set_remote_address (ACE_Addr *address);
- virtual ACE_Event_Handler* event_handler (void) = 0;
-protected:
- TAO_AV_Transport *transport_;
- TAO_AV_Callback *callback_;
- TAO_AV_Protocol_Object *protocol_object_;
- long timer_id_;
- ACE_Reactor *reactor_;
- void *timeout_arg_;
-};
-
-class TAO_AV_TCP_Flow_Handler
- :public virtual TAO_AV_Flow_Handler,
- public ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
-{
-public:
- TAO_AV_TCP_Flow_Handler (TAO_AV_Callback *callback = 0);
- virtual TAO_AV_Transport *transport (void);
- virtual int open (void * = 0);
- virtual int handle_input (ACE_HANDLE fd);
- virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
- virtual ACE_Event_Handler* event_handler (void){ return this; }
-protected:
- TAO_AV_Core *av_core_;
-};
-
-class TAO_AV_UDP_Flow_Handler
- :public virtual TAO_AV_Flow_Handler,
- public virtual ACE_Event_Handler
-{
-public:
- TAO_AV_UDP_Flow_Handler (TAO_AV_Callback *callback);
- //Ctor
- ~TAO_AV_UDP_Flow_Handler (void);
- // Dtor
- int open (ACE_Addr &address);
- virtual TAO_AV_Transport *transport (void);
- virtual int set_remote_address (ACE_Addr *address);
- virtual ACE_HANDLE get_handle (void) const;
- virtual int handle_input (ACE_HANDLE fd);
- virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
- const ACE_SOCK_Dgram *get_socket (void) const;
- virtual ACE_Event_Handler* event_handler (void){ return this; }
-protected:
- TAO_AV_Core *av_core_;
- ACE_INET_Addr peer_addr_;
- ACE_SOCK_Dgram sock_dgram_;
-};
typedef ACE_Unbounded_Set<TAO_AV_Connector*> TAO_AV_ConnectorSet;
typedef ACE_Unbounded_Set_Iterator<TAO_AV_Connector*> TAO_AV_ConnectorSetItor;
diff --git a/TAO/orbsvcs/orbsvcs/AV/Transport.i b/TAO/orbsvcs/orbsvcs/AV/Transport.i
index a98d961c54e..68db1bcf5f0 100644
--- a/TAO/orbsvcs/orbsvcs/AV/Transport.i
+++ b/TAO/orbsvcs/orbsvcs/AV/Transport.i
@@ -62,38 +62,69 @@ TAO_AV_Core::acceptor_registry (void)
}
ACE_INLINE
-TAO_AV_ProtocolFactorySet *
-TAO_AV_Core::protocol_factories (void)
+TAO_AV_TransportFactorySet *
+TAO_AV_Core::transport_factories (void)
{
- return &this->protocol_factories_;
+ return &this->transport_factories_;
+}
+
+ACE_INLINE
+TAO_AV_Flow_ProtocolFactorySet*
+TAO_AV_Core::flow_protocol_factories (void)
+{
+ return &this->flow_protocol_factories_;
}
//------------------------------------------------------------
-// TAO_AV_Protocol_Item
+// TAO_AV_Transport_Item
//------------------------------------------------------------
ACE_INLINE
const ACE_CString &
-TAO_AV_Protocol_Item::protocol_name (void)
+TAO_AV_Transport_Item::name (void)
{
return this->name_;
}
ACE_INLINE
-TAO_AV_Protocol_Factory *
-TAO_AV_Protocol_Item::factory (void)
+TAO_AV_Transport_Factory *
+TAO_AV_Transport_Item::factory (void)
{
return this->factory_;
}
ACE_INLINE
void
-TAO_AV_Protocol_Item::factory (TAO_AV_Protocol_Factory *factory)
+TAO_AV_Transport_Item::factory (TAO_AV_Transport_Factory *factory)
{
this->factory_ = factory;
}
//------------------------------------------------------------
+// TAO_AV_Flow_Protocol_Item
+//------------------------------------------------------------
+ACE_INLINE
+const ACE_CString &
+TAO_AV_Flow_Protocol_Item::name (void)
+{
+ return this->name_;
+}
+
+ACE_INLINE
+TAO_AV_Flow_Protocol_Factory *
+TAO_AV_Flow_Protocol_Item::factory (void)
+{
+ return this->factory_;
+}
+
+ACE_INLINE
+void
+TAO_AV_Flow_Protocol_Item::factory (TAO_AV_Flow_Protocol_Factory *factory)
+{
+ this->factory_ = factory;
+}
+
+//------------------------------------------------------------
// TAO_AV_Connector_Registry
//------------------------------------------------------------
@@ -128,23 +159,6 @@ TAO_AV_Acceptor_Registry::end (void)
return this->acceptors_.end ();
}
-//----------------------------------------------------------------------
-// TAO_AV_UDP_Flow_Handler
-//----------------------------------------------------------------------
-ACE_INLINE
-const ACE_SOCK_Dgram *
-TAO_AV_UDP_Flow_Handler::get_socket (void) const
-{
- return &this->sock_dgram_;
-}
-
-ACE_INLINE
-int
-TAO_AV_UDP_Flow_Handler::open (ACE_Addr &address)
-{
- return this->sock_dgram_.open (address);
-}
-
//------------------------------------------------------------
// TAO_AV_Acceptor
//------------------------------------------------------------
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.cpp b/TAO/orbsvcs/orbsvcs/AV/UDP.cpp
new file mode 100644
index 00000000000..c60fc0bb97e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.cpp
@@ -0,0 +1,733 @@
+// $Id$
+
+#include "UDP.h"
+#include "AVStreams_i.h"
+#include "MCast.h"
+
+#if !defined (__ACE_INLINE__)
+#include "UDP.i"
+#endif /* __ACE_INLINE__ */
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//------------------------------------------------------------
+
+TAO_AV_UDP_Flow_Handler::TAO_AV_UDP_Flow_Handler (void)
+{
+ ACE_NEW (this->transport_,
+ TAO_AV_UDP_Transport (this));
+}
+
+TAO_AV_UDP_Flow_Handler::~TAO_AV_UDP_Flow_Handler (void)
+{
+ delete this->transport_;
+}
+
+TAO_AV_Transport *
+TAO_AV_UDP_Flow_Handler::transport (void)
+{
+ return this->transport_;
+}
+
+int
+TAO_AV_UDP_Flow_Handler::handle_input (ACE_HANDLE /*fd*/)
+{
+ this->protocol_object_->handle_input ();
+ return 0;
+}
+
+int
+TAO_AV_UDP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv,
+ const void *arg)
+{
+ return TAO_AV_Flow_Handler::handle_timeout (tv,arg);
+}
+
+int
+TAO_AV_UDP_Flow_Handler::set_remote_address (ACE_Addr *address)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Flow_Handler::set_remote_address\n"));
+ ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr*,address);
+ this->peer_addr_ = *inet_addr;
+ TAO_AV_UDP_Transport *transport = ACE_dynamic_cast (TAO_AV_UDP_Transport*,this->transport_);
+ return transport->set_remote_address (*inet_addr);
+}
+
+
+ACE_HANDLE
+TAO_AV_UDP_Flow_Handler::get_handle (void) const
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Flow_Handler::get_handle:%d\n",this->sock_dgram_.get_handle ()));
+ return this->sock_dgram_.get_handle () ;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Transport
+//------------------------------------------------------------
+
+TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (void)
+ :handler_ (0)
+{
+}
+
+TAO_AV_UDP_Transport::TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler)
+ :handler_ (handler),
+ addr_ (0)
+{
+}
+
+TAO_AV_UDP_Transport::~TAO_AV_UDP_Transport (void)
+{
+}
+
+int
+TAO_AV_UDP_Transport::set_remote_address (const ACE_INET_Addr &address)
+{
+ this->peer_addr_ = address;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::open (ACE_Addr */*address*/)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::close (void)
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Transport::mtu (void)
+{
+ return ACE_MAX_DGRAM_SIZE;
+}
+
+ACE_Addr*
+TAO_AV_UDP_Transport::get_peer_addr (void)
+{
+ return &this->peer_addr_;
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const ACE_Message_Block *mblk, ACE_Time_Value *)
+{
+ // For the most part this was copied from GIOP::send_request and
+ // friends.
+
+ iovec iov[IOV_MAX];
+ int iovcnt = 0;
+ ssize_t n = 0;
+ ssize_t nbytes = 0;
+
+ for (const ACE_Message_Block *i = mblk;
+ i != 0;
+ i = i->cont ())
+ {
+ // Make sure there is something to send!
+ if (i->length () > 0)
+ {
+ iov[iovcnt].iov_base = i->rd_ptr ();
+ iov[iovcnt].iov_len = i->length ();
+ iovcnt++;
+
+ // The buffer is full make a OS call. @@ TODO this should
+ // be optimized on a per-platform basis, for instance, some
+ // platforms do not implement writev() there we should copy
+ // the data into a buffer and call send_n(). In other cases
+ // there may be some limits on the size of the iovec, there
+ // we should set IOV_MAX to that limit.
+ if (iovcnt == IOV_MAX)
+ {
+ n = this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ iovcnt = 0;
+ }
+ }
+ }
+
+ // Check for remaining buffers to be sent!
+ if (iovcnt != 0)
+ {
+ n = this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+ if (n < 1)
+ return n;
+
+ nbytes += n;
+ }
+
+ return nbytes;
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Transport::send "));
+ char addr [BUFSIZ];
+ this->peer_addr_.addr_to_string (addr,BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"to %s\n",addr));
+
+ return this->handler_->get_socket ()->send (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_socket ()->send ((const iovec *) iov,
+ iovcnt,
+ this->peer_addr_);
+
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (char *buf,
+ size_t len,
+ ACE_Time_Value *)
+{
+ return this->handler_->get_socket ()->recv (buf, len,this->peer_addr_);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *timeout)
+{
+ return this->handler_->get_socket ()->recv (buf,
+ len,
+ this->peer_addr_,
+ flags,
+ timeout);
+}
+
+ssize_t
+TAO_AV_UDP_Transport::recv (iovec *iov,
+ int /*iovcnt*/,
+ ACE_Time_Value *timeout)
+{
+ return handler_->get_socket ()->recv (iov,this->peer_addr_,0,timeout);
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Acceptor
+//------------------------------------------------------------
+
+TAO_AV_UDP_Acceptor::TAO_AV_UDP_Acceptor (void)
+{
+}
+
+TAO_AV_UDP_Acceptor::~TAO_AV_UDP_Acceptor (void)
+{
+}
+
+int
+TAO_AV_UDP_Acceptor::activate_svc_handler (TAO_AV_Flow_Handler *handler)
+{
+ ACE_Event_Handler *event_handler = handler->event_handler ();
+ int result = this->av_core_->reactor ()->register_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+ return result;
+}
+
+int
+TAO_AV_UDP_Acceptor::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open "));
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flow_protocol_factory_ = factory;
+ this->flowname_ = entry->flowname ();
+ ACE_INET_Addr *inet_addr = (ACE_INET_Addr *) entry->address ();
+// inet_addr->set (inet_addr->get_port_number (),
+// inet_addr->get_host_name ());
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,
+ BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Acceptor::open: %s",
+ buf));
+ int result = this->open_i (inet_addr);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Acceptor::open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory)
+{
+ this->av_core_ = av_core;
+ this->endpoint_ = endpoint;
+ this->entry_ = entry;
+ this->flow_protocol_factory_ = factory;
+ this->flowname_ = entry->flowname ();
+ ACE_INET_Addr *address;
+ ACE_NEW_RETURN (address,
+ ACE_INET_Addr ("0"),
+ -1);
+ int result = this->open_i (address);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Acceptor::open_i (ACE_INET_Addr *inet_addr)
+{
+ int result = -1;
+ // TAO_AV_Callback *callback = 0;
+// this->endpoint_->get_callback (this->flowname_.c_str (),
+// callback);
+ ACE_INET_Addr *local_addr;
+ TAO_AV_Flow_Handler *flow_handler = 0;
+ if (this->entry_->is_multicast ())
+ {
+ TAO_AV_UDP_MCast_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_MCast_Flow_Handler,
+ -1);
+ flow_handler = handler;
+ result = handler->get_mcast_socket ()->subscribe (*inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_connector::subscribe failed\n"),-1);
+ // Now disable Multicast loopback.
+ // @@Should we make this a policy?
+ if (handler->get_mcast_socket ()->set_option (IP_MULTICAST_LOOP,
+ 0) < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::multicast loop disable failed\n"));
+ // @@ This should also be policies.
+ int bufsize = 80 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ {
+ bufsize = 32 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ perror("SO_RCVBUF");
+ }
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr (*inet_addr),
+ -1);
+ }
+ else
+ {
+ TAO_AV_UDP_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ TAO_AV_UDP_Flow_Handler,
+ -1);
+ flow_handler = handler;
+ int result = handler->open (*inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Acceptor::handler_open failed\n"),-1);
+ // set the socket buffer sizes to 64k.
+ int sndbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+ int rcvbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+
+ if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_SNDBUF,
+ (void *) &sndbufsize,
+ sizeof (sndbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+
+ else if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (void *) &rcvbufsize,
+ sizeof (rcvbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"SOCK_Dgram::open failed\n"),-1);
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr,
+ -1);
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+ }
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+ flow_handler->protocol_object (object);
+ // callback->protocol_object (object);
+// this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+// object);
+ this->endpoint_->set_handler (this->flowname_.c_str (),flow_handler);
+ this->entry_->protocol_object (object);
+
+ char buf[BUFSIZ];
+ local_addr->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_CONNECTOR::connect:%s \n",buf));
+ this->entry_->set_local_addr (local_addr);
+ this->entry_->handler (flow_handler);
+ // call activate svc handler.
+ return this->activate_svc_handler (flow_handler);
+}
+
+int
+TAO_AV_UDP_Acceptor::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Connector
+//------------------------------------------------------------
+TAO_AV_UDP_Connector::TAO_AV_UDP_Connector (void)
+{
+}
+
+TAO_AV_UDP_Connector::~TAO_AV_UDP_Connector (void)
+{
+}
+
+int
+TAO_AV_UDP_Connector::open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory)
+
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Connector::open "));
+ this->endpoint_ = endpoint;
+ this->av_core_ = av_core;
+ this->flow_protocol_factory_ = factory;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Connector::connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport)
+{
+ int result = -1;
+ this->entry_ = entry;
+ this->flowname_ = entry->flowname ();
+ ACE_Addr *remote_addr = entry->address ();
+ ACE_INET_Addr *local_addr;
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr ("0"),
+ -1);
+
+ // TAO_AV_Callback *callback = 0;
+// this->endpoint_->get_callback (this->flowname_.c_str (),
+// callback);
+ ACE_INET_Addr *inet_addr = ACE_dynamic_cast (ACE_INET_Addr*,entry->address ());
+ TAO_AV_Flow_Handler *flow_handler = 0;
+ if (entry->is_multicast ())
+ {
+ TAO_AV_UDP_MCast_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ // TAO_AV_UDP_MCast_Flow_Handler (callback),
+ TAO_AV_UDP_MCast_Flow_Handler,
+ -1);
+ flow_handler = handler;
+ result = handler->get_mcast_socket ()->subscribe (*inet_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_MCast_connector::open failed\n"),-1);
+ // Now disable Multicast loopback.
+ // @@Should we make this a policy?
+ if (handler->get_mcast_socket ()->set_option (IP_MULTICAST_LOOP,
+ 0) < 0)
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_MCast_Acceptor::multicast loop disable failed\n"));
+ // @@ This should also be policies.
+ int bufsize = 80 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ {
+ bufsize = 32 * 1024;
+ if (handler->get_mcast_socket ()->ACE_SOCK::set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (char *)&bufsize,
+ sizeof(bufsize)) < 0)
+ perror("SO_RCVBUF");
+ }
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr (*inet_addr),
+ -1);
+ }
+ else
+ {
+ TAO_AV_UDP_Flow_Handler *handler;
+ ACE_NEW_RETURN (handler,
+ // TAO_AV_UDP_Flow_Handler (callback),
+ TAO_AV_UDP_Flow_Handler,
+ -1);
+ flow_handler = handler;
+ result = handler->open (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"handler::open failed\n"),-1);
+ // set the socket buffer sizes to 64k.
+ int sndbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+ int rcvbufsize = ACE_DEFAULT_MAX_SOCKET_BUFSIZ;
+
+ if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_SNDBUF,
+ (void *) &sndbufsize,
+ sizeof (sndbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+
+ else if (handler->get_socket ()->set_option (SOL_SOCKET,
+ SO_RCVBUF,
+ (void *) &rcvbufsize,
+ sizeof (rcvbufsize)) == -1
+ && errno != ENOTSUP)
+ return 0;
+
+ handler->set_remote_address (inet_addr);
+ ACE_NEW_RETURN (local_addr,
+ ACE_INET_Addr,
+ -1);
+ result = handler->get_socket ()->get_local_addr (*local_addr);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_Dgram_Connector::open: get_local_addr failed\n"),result);
+ local_addr->set (local_addr->get_port_number (),
+ local_addr->get_host_name ());
+ }
+ TAO_AV_Protocol_Object *object =
+ this->flow_protocol_factory_->make_protocol_object (this->entry_,
+ this->endpoint_,
+ flow_handler,
+ flow_handler->transport ());
+ flow_handler->protocol_object (object);
+ // callback->protocol_object (object);
+// this->endpoint_->set_protocol_object (this->flowname_.c_str (),
+// object);
+ this->endpoint_->set_handler (this->flowname_.c_str (),flow_handler);
+ this->entry_->protocol_object (object);
+
+ char buf[BUFSIZ];
+ local_addr->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_CONNECTOR::connect:%s \n",buf));
+ entry->set_local_addr (local_addr);
+ entry->handler (flow_handler);
+ transport = flow_handler->transport ();
+ // call activate svc handler.
+ return this->activate_svc_handler (flow_handler);
+}
+
+int
+TAO_AV_UDP_Connector::activate_svc_handler (TAO_AV_Flow_Handler *handler)
+{
+ ACE_Event_Handler *event_handler = handler->event_handler ();
+ int result = this->av_core_->reactor ()->register_handler (event_handler,
+ ACE_Event_Handler::READ_MASK);
+ return result;
+}
+
+int
+TAO_AV_UDP_Connector::close (void)
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Protocol_Factory
+//------------------------------------------------------------
+
+TAO_AV_UDP_Factory::TAO_AV_UDP_Factory (void)
+{
+}
+
+TAO_AV_UDP_Factory::~TAO_AV_UDP_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_Factory::match_protocol (const char *protocol_string)
+{
+ if (ACE_OS::strstr (protocol_string,"UDP") != 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Acceptor*
+TAO_AV_UDP_Factory::make_acceptor (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Factory::make_acceptor "));
+ TAO_AV_Acceptor *acceptor = 0;
+ ACE_NEW_RETURN (acceptor,
+ TAO_AV_UDP_Acceptor,
+ 0);
+ return acceptor;
+}
+
+TAO_AV_Connector*
+TAO_AV_UDP_Factory::make_connector (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Factory::make_connector "));
+ TAO_AV_Connector *connector = 0;
+ ACE_NEW_RETURN (connector,
+ TAO_AV_UDP_Connector,
+ 0);
+ return connector;
+}
+
+int
+TAO_AV_UDP_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Object
+//------------------------------------------------------------
+
+int
+TAO_AV_UDP_Object::handle_input (void)
+{
+ size_t size = 2*this->transport_->mtu ();
+ ACE_Message_Block *frame = 0;
+ ACE_NEW_RETURN (frame,
+ ACE_Message_Block (size),
+ -1);
+ int n = this->transport_->recv (frame->rd_ptr (),
+ frame->size ());
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Flow_Handler::handle_input recv failed\n"),-1);
+ if (n == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,"TAO_AV_UDP_Flow_Handler::handle_input connection closed\n"),-1);
+ frame->wr_ptr (n);
+
+ return this->callback_->receive_frame (frame);
+}
+
+int
+TAO_AV_UDP_Object::send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_AV_UDP_Object::send_frame\n"));
+ int result = this->transport_->send (frame);
+ if (result < 0)
+ return result;
+ return 0;
+}
+
+int
+TAO_AV_UDP_Object::send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info)
+{
+ return this->transport_->send (iov,iovcnt);
+}
+
+TAO_AV_UDP_Object::TAO_AV_UDP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport)
+ :TAO_AV_Protocol_Object (callback,transport)
+{
+}
+
+TAO_AV_UDP_Object::~TAO_AV_UDP_Object (void)
+{
+ //no-op
+}
+
+int
+TAO_AV_UDP_Object::destroy (void)
+{
+ this->callback_->handle_destroy ();
+ return 0;
+}
+
+
+//------------------------------------------------------------
+// TAO_AV_UDP_Flow_Factory
+//------------------------------------------------------------
+TAO_AV_UDP_Flow_Factory::TAO_AV_UDP_Flow_Factory (void)
+{
+}
+
+TAO_AV_UDP_Flow_Factory::~TAO_AV_UDP_Flow_Factory (void)
+{
+}
+
+int
+TAO_AV_UDP_Flow_Factory::init (int /* argc */,
+ char * /* argv */ [])
+{
+ return 0;
+}
+
+int
+TAO_AV_UDP_Flow_Factory::match_protocol (const char *flow_string)
+{
+ if (ACE_OS::strcasecmp (flow_string,"UDP") == 0)
+ return 1;
+ return 0;
+}
+
+TAO_AV_Protocol_Object*
+TAO_AV_UDP_Flow_Factory::make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport)
+{
+ TAO_AV_Callback *callback = 0;
+ endpoint->get_callback (entry->flowname (),
+ callback);
+
+
+ TAO_AV_UDP_Object *object = 0;
+ ACE_NEW_RETURN (object,
+ TAO_AV_UDP_Object (callback,
+ transport),
+ 0);
+ callback->open (object,
+ handler);
+ endpoint->set_protocol_object (entry->flowname (),
+ object);
+ return object;
+}
+
+ACE_FACTORY_DEFINE (AV, TAO_AV_UDP_Flow_Factory)
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_Flow_Factory,
+ ASYS_TEXT ("UDP_Flow_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_Flow_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (AV, TAO_AV_UDP_Factory)
+
+ACE_STATIC_SVC_DEFINE (TAO_AV_UDP_Factory,
+ ASYS_TEXT ("UDP_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_AV_UDP_Factory),
+ ACE_Service_Type::DELETE_THIS |
+ ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.h b/TAO/orbsvcs/orbsvcs/AV/UDP.h
new file mode 100644
index 00000000000..c009779e651
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.h
@@ -0,0 +1,215 @@
+/* -*- C++ -*- */
+
+// $Id$
+// ============================================================================
+//
+// = LIBRARY
+// ORBSVCS AVStreams
+//
+// = FILENAME
+// UDP.h
+//
+// = AUTHOR
+// Nagarajan Surendran <naga@cs.wustl.edu>
+//
+//
+// ============================================================================
+
+#ifndef TAO_AV_UDP_H
+#define TAO_AV_UDP_H
+
+#include "ace/OS.h"
+#include "Protocol_Factory.h"
+
+class TAO_ORBSVCS_Export TAO_AV_UDP_Factory : public TAO_AV_Transport_Factory
+{
+public:
+ TAO_AV_UDP_Factory (void);
+ virtual ~TAO_AV_UDP_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *protocol_string);
+ virtual TAO_AV_Acceptor *make_acceptor (void);
+ virtual TAO_AV_Connector *make_connector (void);
+};
+
+class TAO_AV_UDP_Flow_Handler;
+
+class TAO_AV_UDP_Transport
+ :public TAO_AV_Transport
+{
+ // = TITLE
+ // A transport abstraction for udp sockets.
+ //
+ // = DESCRIPTION
+ // Uses the ACE_SOCK_Dgram to send the data.
+public:
+ TAO_AV_UDP_Transport (void);
+
+ TAO_AV_UDP_Transport (TAO_AV_UDP_Flow_Handler *handler);
+
+ virtual ~TAO_AV_UDP_Transport (void);
+ virtual int open (ACE_Addr *addr);
+
+ virtual int close (void);
+
+ virtual int mtu (void);
+
+ virtual ACE_Addr *get_peer_addr (void);
+
+ virtual int set_remote_address (const ACE_INET_Addr &address);
+
+ virtual ssize_t send (const ACE_Message_Block *mblk,
+ ACE_Time_Value *s = 0);
+ // Write the complete Message_Block chain to the connection.
+
+ virtual ssize_t send (const char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+ // Write the contents of the buffer of length len to the connection.
+
+ virtual ssize_t send (const iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+ // Write the contents of iovcnt iovec's to the connection.
+
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ ACE_Time_Value *s = 0);
+ // Read len bytes from into buf.
+
+ virtual ssize_t recv (char *buf,
+ size_t len,
+ int flags,
+ ACE_Time_Value *s = 0);
+ // Read len bytes from into buf using flags.
+
+ virtual ssize_t recv (iovec *iov,
+ int iovcnt,
+ ACE_Time_Value *s = 0);
+ // Read received data into the iovec buffers.
+protected:
+ TAO_AV_UDP_Flow_Handler *handler_;
+ ACE_Addr *addr_;
+ ACE_INET_Addr peer_addr_;
+};
+
+class TAO_AV_UDP_Flow_Handler
+ :public virtual TAO_AV_Flow_Handler,
+ public virtual ACE_Event_Handler
+{
+public:
+ TAO_AV_UDP_Flow_Handler (void);
+ //Ctor
+ ~TAO_AV_UDP_Flow_Handler (void);
+ // Dtor
+ int open (ACE_Addr &address);
+ virtual TAO_AV_Transport *transport (void);
+ virtual int set_remote_address (ACE_Addr *address);
+ virtual ACE_HANDLE get_handle (void) const;
+ virtual int handle_input (ACE_HANDLE fd);
+ virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0);
+ const ACE_SOCK_Dgram *get_socket (void) const;
+ virtual ACE_Event_Handler* event_handler (void){ return this; }
+protected:
+ TAO_AV_Core *av_core_;
+ ACE_INET_Addr peer_addr_;
+ ACE_SOCK_Dgram sock_dgram_;
+};
+
+class TAO_AV_UDP_Acceptor
+ :public TAO_AV_Acceptor
+{
+public:
+ TAO_AV_UDP_Acceptor (void);
+ virtual ~TAO_AV_UDP_Acceptor (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int open_default (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_FlowSpec_Entry *entry,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int open_i (ACE_INET_Addr *address);
+
+ virtual int close (void);
+ virtual int activate_svc_handler (TAO_AV_Flow_Handler *handler);
+protected:
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_AV_UDP_Connector
+ :public TAO_AV_Connector
+{
+public:
+ TAO_AV_UDP_Connector (void);
+ ~TAO_AV_UDP_Connector (void);
+ virtual int open (TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Core *av_core,
+ TAO_AV_Flow_Protocol_Factory *factory);
+
+ virtual int connect (TAO_FlowSpec_Entry *entry,
+ TAO_AV_Transport *&transport);
+ virtual int activate_svc_handler (TAO_AV_Flow_Handler *handler);
+ virtual int close (void);
+protected:
+ TAO_Base_StreamEndPoint *endpoint_;
+ TAO_AV_Core *av_core_;
+ TAO_FlowSpec_Entry *entry_;
+ TAO_AV_Flow_Protocol_Factory *flow_protocol_factory_;
+};
+
+class TAO_ORBSVCS_Export TAO_AV_UDP_Object : public TAO_AV_Protocol_Object
+{
+public:
+ TAO_AV_UDP_Object (TAO_AV_Callback *callback,
+ TAO_AV_Transport *transport = 0);
+
+ virtual ~TAO_AV_UDP_Object (void);
+ // Dtor
+
+ virtual int handle_input (void);
+
+ virtual int send_frame (ACE_Message_Block *frame,
+ TAO_AV_frame_info *frame_info = 0);
+ // send a data frame.
+
+ virtual int send_frame (const iovec *iov,
+ int iovcnt,
+ TAO_AV_frame_info *frame_info = 0);
+
+ virtual int destroy (void);
+ // end the stream.
+};
+
+class TAO_AV_UDP_Flow_Factory : public TAO_AV_Flow_Protocol_Factory
+{
+public:
+ TAO_AV_UDP_Flow_Factory (void);
+ virtual ~TAO_AV_UDP_Flow_Factory (void);
+ virtual int init (int argc, char *argv[]);
+ // Initialization hook.
+ virtual int match_protocol (const char *flow_string);
+ TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry,
+ TAO_Base_StreamEndPoint *endpoint,
+ TAO_AV_Flow_Handler *handler,
+ TAO_AV_Transport *transport);
+};
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_Flow_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_UDP_Flow_Factory)
+
+ACE_STATIC_SVC_DECLARE (TAO_AV_UDP_Factory)
+ACE_FACTORY_DECLARE (TAO_ORBSVCS, TAO_AV_UDP_Factory)
+
+
+#if defined(__ACE_INLINE__)
+#include "UDP.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* TAO_AV_UDP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/UDP.i b/TAO/orbsvcs/orbsvcs/AV/UDP.i
new file mode 100644
index 00000000000..2406225e417
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/UDP.i
@@ -0,0 +1,20 @@
+/* -*- C++ -*- */
+
+// $Id$
+
+//----------------------------------------------------------------------
+// TAO_AV_UDP_Flow_Handler
+//----------------------------------------------------------------------
+ACE_INLINE
+const ACE_SOCK_Dgram *
+TAO_AV_UDP_Flow_Handler::get_socket (void) const
+{
+ return &this->sock_dgram_;
+}
+
+ACE_INLINE
+int
+TAO_AV_UDP_Flow_Handler::open (ACE_Addr &address)
+{
+ return this->sock_dgram_.open (address);
+}
diff --git a/TAO/orbsvcs/orbsvcs/AV/sfp.cpp b/TAO/orbsvcs/orbsvcs/AV/sfp.cpp
index 7e4e02f8067..571970953fd 100644
--- a/TAO/orbsvcs/orbsvcs/AV/sfp.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/sfp.cpp
@@ -988,391 +988,391 @@ TAO_SFP_Base::dump_buf (char *buffer,int size)
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"\n========================================\n"));
}
-//------------------------------------------------------------
-//TAO_SFP_UDP_Protocol_Factory
-//------------------------------------------------------------
-
-TAO_SFP_UDP_Protocol_Factory::TAO_SFP_UDP_Protocol_Factory (void)
-{
-}
-
-TAO_SFP_UDP_Protocol_Factory::~TAO_SFP_UDP_Protocol_Factory (void)
-{
-}
-
-TAO_AV_Acceptor *
-TAO_SFP_UDP_Protocol_Factory::make_acceptor (void)
-{
- TAO_SFP_UDP_Acceptor *acceptor = 0;
- ACE_NEW_RETURN (acceptor,
- TAO_SFP_UDP_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector *
-TAO_SFP_UDP_Protocol_Factory::make_connector (void)
-{
- TAO_SFP_UDP_Connector *connector = 0;
- ACE_NEW_RETURN (connector,
- TAO_SFP_UDP_Connector,
- 0);
- return connector;
-}
-
-int
-TAO_SFP_UDP_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_SFP_UDP);
-}
-
-//
-// TAO_SFP_UDP_Acceptor
-TAO_SFP_UDP_Acceptor::TAO_SFP_UDP_Acceptor (void)
-{
-}
-
-TAO_SFP_UDP_Acceptor::~TAO_SFP_UDP_Acceptor (void)
-{
-}
-
-int
-TAO_SFP_UDP_Acceptor::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- // @@ We should actually look at the entry and find out if we're a
- // sink or a source and create the appropriate handler
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Acceptor::make_svc_handler\n"));
- TAO_SFP_BASE::instance ();
- TAO_SFP_Object *object;
- TAO_AV_Callback *callback;
- this->endpoint_->get_callback (this->entry_->flowname (),callback);
- ACE_NEW_RETURN (object,
- TAO_SFP_Object (callback),
- -1);
- ACE_NEW_RETURN (handler,
- TAO_SFP_UDP_Sender_Handler (callback,
- object),
- -1);
- callback->transport (handler->transport ());
- callback->protocol_object (object);
- object->transport (handler->transport ());
- this->endpoint_->set_protocol_object (this->entry_->flowname (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- return 0;
-}
-//------------------------------------------------------------
-// TAO_SFP_UDP_Connector
-//------------------------------------------------------------
-TAO_SFP_UDP_Connector::TAO_SFP_UDP_Connector (void)
-{
-}
-
-TAO_SFP_UDP_Connector::~TAO_SFP_UDP_Connector (void)
-{
-}
-
-int
-TAO_SFP_UDP_Connector::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Connector::make_svc_handler\n"));
- TAO_SFP_BASE::instance ();
- // @@ We should actually look at the entry and find out if we're a
- // sink or a source and create the appropriate handler
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->entry_->flowname (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_SFP_UDP_Receiver_Handler (callback),
- -1);
- TAO_SFP_Object *object;
- ACE_NEW_RETURN (object,
- TAO_SFP_Object (callback),
- -1);
- callback->transport (handler->transport ());
- callback->protocol_object (object);
- object->transport (handler->transport ());
- this->endpoint_->set_protocol_object (this->entry_->flowname (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_SFP_UDP_Sender_Handler
-//------------------------------------------------------------
-TAO_SFP_UDP_Sender_Handler::TAO_SFP_UDP_Sender_Handler (TAO_AV_Callback *callback,
- TAO_SFP_Object *object)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_Flow_Handler (callback),
- sfp_object_ (object)
-{
-}
-
-int
-TAO_SFP_UDP_Sender_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- return -1;
-}
-
-int
-TAO_SFP_UDP_Sender_Handler::handle_close (ACE_HANDLE /*fd*/,
- ACE_Reactor_Mask)
-{
- return 0;
-}
-
-int
-TAO_SFP_UDP_Sender_Handler::start (TAO_FlowSpec_Entry::Role role)
-{
- // @@once somehow we figure out that the stream is established we
- // can start sending the frames.
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Sender_Handler::start\n"));
- TAO_AV_Flow_Handler::start (role);
- this->sfp_object_->start ();
- return 0;
-}
-
-int
-TAO_SFP_UDP_Sender_Handler::stop (TAO_FlowSpec_Entry::Role role)
-{
- TAO_AV_Flow_Handler::stop (role);
- this->sfp_object_->stop ();
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_SFP_UDP_Receiver_Handler
-//------------------------------------------------------------
-TAO_SFP_UDP_Receiver_Handler::TAO_SFP_UDP_Receiver_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_Flow_Handler (callback)
-{
-}
-
-int
-TAO_SFP_UDP_Receiver_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Receiver_Handler::handle_input\n"));
- // This is the entry point for receiving data.
- TAO_AV_frame_info *frame_info = 0;
- int result = TAO_SFP_Base::handle_input (this->transport_,
- this->state_,
- frame_info);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_UDP_Receiver_Handler::handle_input"),result);
- if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
- this->callback_->handle_end_stream ();
- if (this->state_.is_complete ())
- {
- this->callback_->receive_frame (this->state_.frame_block_,
- frame_info);
- this->state_.reset ();
- }
- return 0;
-}
-
-int
-TAO_SFP_UDP_Receiver_Handler::handle_close (ACE_HANDLE /*fd*/,
- ACE_Reactor_Mask /*mask*/)
-{
- return 0;
-}
-
-//------------------------------------------------------------
-//TAO_SFP_UDP_MCast_Protocol_Factory
-//------------------------------------------------------------
-
-TAO_SFP_UDP_MCast_Protocol_Factory::TAO_SFP_UDP_MCast_Protocol_Factory (void)
-{
-}
-
-TAO_SFP_UDP_MCast_Protocol_Factory::~TAO_SFP_UDP_MCast_Protocol_Factory (void)
-{
-}
-
-TAO_AV_Acceptor *
-TAO_SFP_UDP_MCast_Protocol_Factory::make_acceptor (void)
-{
- TAO_SFP_UDP_MCast_Acceptor *acceptor = 0;
- ACE_NEW_RETURN (acceptor,
- TAO_SFP_UDP_MCast_Acceptor,
- 0);
- return acceptor;
-}
-
-TAO_AV_Connector *
-TAO_SFP_UDP_MCast_Protocol_Factory::make_connector (void)
-{
- TAO_SFP_UDP_MCast_Connector *connector = 0;
- ACE_NEW_RETURN (connector,
- TAO_SFP_UDP_MCast_Connector,
- 0);
- return connector;
-}
-
-int
-TAO_SFP_UDP_MCast_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
-{
- return (protocol == TAO_AV_Core::TAO_AV_SFP_UDP_MCAST);
-}
-
-//
-// TAO_SFP_UDP_MCast_Acceptor
-TAO_SFP_UDP_MCast_Acceptor::TAO_SFP_UDP_MCast_Acceptor (void)
-{
-}
-
-TAO_SFP_UDP_MCast_Acceptor::~TAO_SFP_UDP_MCast_Acceptor (void)
-{
-}
-
-int
-TAO_SFP_UDP_MCast_Acceptor::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
-{
- // @@ We should actually look at the entry and find out if we're a
- // sink or a source and create the appropriate handler
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Acceptor::make_svc_handler\n"));
- TAO_SFP_BASE::instance ();
- TAO_SFP_Object *object;
- TAO_AV_Callback *callback;
- this->endpoint_->get_callback (this->entry_->flowname (),callback);
- ACE_NEW_RETURN (object,
- TAO_SFP_Object (callback),
- -1);
- ACE_NEW_RETURN (handler,
- TAO_SFP_UDP_MCast_Sender_Handler (callback,
- object),
- -1);
- callback->transport (handler->transport ());
- callback->protocol_object (object);
- object->transport (handler->transport ());
- this->endpoint_->set_protocol_object (this->entry_->flowname (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- return 0;
-}
-//------------------------------------------------------------
-// TAO_SFP_UDP_MCast_Connector
-//------------------------------------------------------------
-TAO_SFP_UDP_MCast_Connector::TAO_SFP_UDP_MCast_Connector (void)
-{
-}
-
-TAO_SFP_UDP_MCast_Connector::~TAO_SFP_UDP_MCast_Connector (void)
-{
-}
-
-int
-TAO_SFP_UDP_MCast_Connector::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Connector::make_svc_handler\n"));
- TAO_SFP_BASE::instance ();
- // @@ We should actually look at the entry and find out if we're a
- // sink or a source and create the appropriate handler
- TAO_AV_Callback *callback = 0;
- this->endpoint_->get_callback (this->entry_->flowname (),
- callback);
- ACE_NEW_RETURN (handler,
- TAO_SFP_UDP_MCast_Receiver_Handler (callback),
- -1);
- TAO_SFP_Object *object;
- ACE_NEW_RETURN (object,
- TAO_SFP_Object (callback),
- -1);
- callback->transport (handler->transport ());
- callback->protocol_object (object);
- object->transport (handler->transport ());
- this->endpoint_->set_protocol_object (this->entry_->flowname (),
- object);
- this->endpoint_->set_handler (this->flowname_.c_str (),handler);
- this->entry_->protocol_object (object);
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_SFP_UDP_MCast_Sender_Handler
-//------------------------------------------------------------
-TAO_SFP_UDP_MCast_Sender_Handler::TAO_SFP_UDP_MCast_Sender_Handler (TAO_AV_Callback *callback,
- TAO_SFP_Object *object)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_MCast_Flow_Handler (callback),
- sfp_object_ (object)
-{
-}
-
-int
-TAO_SFP_UDP_MCast_Sender_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- return -1;
-}
-
-int
-TAO_SFP_UDP_MCast_Sender_Handler::handle_close (ACE_HANDLE /*fd*/,
- ACE_Reactor_Mask)
-{
- return 0;
-}
-
-int
-TAO_SFP_UDP_MCast_Sender_Handler::start (TAO_FlowSpec_Entry::Role role)
-{
- // @@once somehow we figure out that the stream is established we
- // can start sending the frames.
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Sender_Handler::start\n"));
- TAO_AV_Flow_Handler::start (role);
- this->sfp_object_->start ();
- return 0;
-}
-
-int
-TAO_SFP_UDP_MCast_Sender_Handler::stop (TAO_FlowSpec_Entry::Role role)
-{
- TAO_AV_Flow_Handler::stop (role);
- this->sfp_object_->stop ();
- return 0;
-}
-
-//------------------------------------------------------------
-// TAO_SFP_UDP_MCast_Receiver_Handler
-//------------------------------------------------------------
-TAO_SFP_UDP_MCast_Receiver_Handler::TAO_SFP_UDP_MCast_Receiver_Handler (TAO_AV_Callback *callback)
- :TAO_AV_Flow_Handler (callback),
- TAO_AV_UDP_MCast_Flow_Handler (callback)
-{
-}
-
-int
-TAO_SFP_UDP_MCast_Receiver_Handler::handle_input (ACE_HANDLE /*fd*/)
-{
- if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Receiver_Handler::handle_input\n"));
- TAO_AV_frame_info *frame_info = 0;
- // This is the entry point for receiving data.
- int result = TAO_SFP_Base::handle_input (this->transport_,
- this->state_,
- frame_info);
- if (result < 0)
- ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_UDP_MCast_Receiver_Handler::handle_input"),result);
- if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
- this->callback_->handle_end_stream ();
- if (this->state_.is_complete ())
- {
- this->callback_->receive_frame (this->state_.frame_block_,
- frame_info);
- this->state_.reset ();
- }
- return 0;
-}
-
-int
-TAO_SFP_UDP_MCast_Receiver_Handler::handle_close (ACE_HANDLE /*fd*/,
- ACE_Reactor_Mask /*mask*/)
-{
- return 0;
-}
+// //------------------------------------------------------------
+// //TAO_SFP_UDP_Protocol_Factory
+// //------------------------------------------------------------
+
+// TAO_SFP_UDP_Protocol_Factory::TAO_SFP_UDP_Protocol_Factory (void)
+// {
+// }
+
+// TAO_SFP_UDP_Protocol_Factory::~TAO_SFP_UDP_Protocol_Factory (void)
+// {
+// }
+
+// TAO_AV_Acceptor *
+// TAO_SFP_UDP_Protocol_Factory::make_acceptor (void)
+// {
+// TAO_SFP_UDP_Acceptor *acceptor = 0;
+// ACE_NEW_RETURN (acceptor,
+// TAO_SFP_UDP_Acceptor,
+// 0);
+// return acceptor;
+// }
+
+// TAO_AV_Connector *
+// TAO_SFP_UDP_Protocol_Factory::make_connector (void)
+// {
+// TAO_SFP_UDP_Connector *connector = 0;
+// ACE_NEW_RETURN (connector,
+// TAO_SFP_UDP_Connector,
+// 0);
+// return connector;
+// }
+
+// int
+// TAO_SFP_UDP_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
+// {
+// return (protocol == TAO_AV_Core::TAO_AV_SFP_UDP);
+// }
+
+// //
+// // TAO_SFP_UDP_Acceptor
+// TAO_SFP_UDP_Acceptor::TAO_SFP_UDP_Acceptor (void)
+// {
+// }
+
+// TAO_SFP_UDP_Acceptor::~TAO_SFP_UDP_Acceptor (void)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_Acceptor::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
+// {
+// // @@ We should actually look at the entry and find out if we're a
+// // sink or a source and create the appropriate handler
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Acceptor::make_svc_handler\n"));
+// TAO_SFP_BASE::instance ();
+// TAO_SFP_Object *object;
+// TAO_AV_Callback *callback;
+// this->endpoint_->get_callback (this->entry_->flowname (),callback);
+// ACE_NEW_RETURN (object,
+// TAO_SFP_Object (callback),
+// -1);
+// ACE_NEW_RETURN (handler,
+// TAO_SFP_UDP_Sender_Handler (callback,
+// object),
+// -1);
+// callback->transport (handler->transport ());
+// callback->protocol_object (object);
+// object->transport (handler->transport ());
+// this->endpoint_->set_protocol_object (this->entry_->flowname (),
+// object);
+// this->endpoint_->set_handler (this->flowname_.c_str (),handler);
+// this->entry_->protocol_object (object);
+// return 0;
+// }
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_Connector
+// //------------------------------------------------------------
+// TAO_SFP_UDP_Connector::TAO_SFP_UDP_Connector (void)
+// {
+// }
+
+// TAO_SFP_UDP_Connector::~TAO_SFP_UDP_Connector (void)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_Connector::make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler)
+// {
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Connector::make_svc_handler\n"));
+// TAO_SFP_BASE::instance ();
+// // @@ We should actually look at the entry and find out if we're a
+// // sink or a source and create the appropriate handler
+// TAO_AV_Callback *callback = 0;
+// this->endpoint_->get_callback (this->entry_->flowname (),
+// callback);
+// ACE_NEW_RETURN (handler,
+// TAO_SFP_UDP_Receiver_Handler (callback),
+// -1);
+// TAO_SFP_Object *object;
+// ACE_NEW_RETURN (object,
+// TAO_SFP_Object (callback),
+// -1);
+// callback->transport (handler->transport ());
+// callback->protocol_object (object);
+// object->transport (handler->transport ());
+// this->endpoint_->set_protocol_object (this->entry_->flowname (),
+// object);
+// this->endpoint_->set_handler (this->flowname_.c_str (),handler);
+// this->entry_->protocol_object (object);
+// return 0;
+// }
+
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_Sender_Handler
+// //------------------------------------------------------------
+// TAO_SFP_UDP_Sender_Handler::TAO_SFP_UDP_Sender_Handler (TAO_AV_Callback *callback,
+// TAO_SFP_Object *object)
+// :TAO_AV_Flow_Handler (callback),
+// TAO_AV_UDP_Flow_Handler (callback),
+// sfp_object_ (object)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_Sender_Handler::handle_input (ACE_HANDLE /*fd*/)
+// {
+// return -1;
+// }
+
+// int
+// TAO_SFP_UDP_Sender_Handler::handle_close (ACE_HANDLE /*fd*/,
+// ACE_Reactor_Mask)
+// {
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_Sender_Handler::start (TAO_FlowSpec_Entry::Role role)
+// {
+// // @@once somehow we figure out that the stream is established we
+// // can start sending the frames.
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Sender_Handler::start\n"));
+// TAO_AV_Flow_Handler::start (role);
+// this->sfp_object_->start ();
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_Sender_Handler::stop (TAO_FlowSpec_Entry::Role role)
+// {
+// TAO_AV_Flow_Handler::stop (role);
+// this->sfp_object_->stop ();
+// return 0;
+// }
+
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_Receiver_Handler
+// //------------------------------------------------------------
+// TAO_SFP_UDP_Receiver_Handler::TAO_SFP_UDP_Receiver_Handler (TAO_AV_Callback *callback)
+// :TAO_AV_Flow_Handler (callback),
+// TAO_AV_UDP_Flow_Handler (callback)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_Receiver_Handler::handle_input (ACE_HANDLE /*fd*/)
+// {
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_Receiver_Handler::handle_input\n"));
+// // This is the entry point for receiving data.
+// TAO_AV_frame_info *frame_info = 0;
+// int result = TAO_SFP_Base::handle_input (this->transport_,
+// this->state_,
+// frame_info);
+// if (result < 0)
+// ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_UDP_Receiver_Handler::handle_input"),result);
+// if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
+// this->callback_->handle_end_stream ();
+// if (this->state_.is_complete ())
+// {
+// this->callback_->receive_frame (this->state_.frame_block_,
+// frame_info);
+// this->state_.reset ();
+// }
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_Receiver_Handler::handle_close (ACE_HANDLE /*fd*/,
+// ACE_Reactor_Mask /*mask*/)
+// {
+// return 0;
+// }
+
+// //------------------------------------------------------------
+// //TAO_SFP_UDP_MCast_Protocol_Factory
+// //------------------------------------------------------------
+
+// TAO_SFP_UDP_MCast_Protocol_Factory::TAO_SFP_UDP_MCast_Protocol_Factory (void)
+// {
+// }
+
+// TAO_SFP_UDP_MCast_Protocol_Factory::~TAO_SFP_UDP_MCast_Protocol_Factory (void)
+// {
+// }
+
+// TAO_AV_Acceptor *
+// TAO_SFP_UDP_MCast_Protocol_Factory::make_acceptor (void)
+// {
+// TAO_SFP_UDP_MCast_Acceptor *acceptor = 0;
+// ACE_NEW_RETURN (acceptor,
+// TAO_SFP_UDP_MCast_Acceptor,
+// 0);
+// return acceptor;
+// }
+
+// TAO_AV_Connector *
+// TAO_SFP_UDP_MCast_Protocol_Factory::make_connector (void)
+// {
+// TAO_SFP_UDP_MCast_Connector *connector = 0;
+// ACE_NEW_RETURN (connector,
+// TAO_SFP_UDP_MCast_Connector,
+// 0);
+// return connector;
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Protocol_Factory::match_protocol (TAO_AV_Core::Protocol protocol)
+// {
+// return (protocol == TAO_AV_Core::TAO_AV_SFP_UDP_MCAST);
+// }
+
+// //
+// // TAO_SFP_UDP_MCast_Acceptor
+// TAO_SFP_UDP_MCast_Acceptor::TAO_SFP_UDP_MCast_Acceptor (void)
+// {
+// }
+
+// TAO_SFP_UDP_MCast_Acceptor::~TAO_SFP_UDP_MCast_Acceptor (void)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Acceptor::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
+// {
+// // @@ We should actually look at the entry and find out if we're a
+// // sink or a source and create the appropriate handler
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Acceptor::make_svc_handler\n"));
+// TAO_SFP_BASE::instance ();
+// TAO_SFP_Object *object;
+// TAO_AV_Callback *callback;
+// this->endpoint_->get_callback (this->entry_->flowname (),callback);
+// ACE_NEW_RETURN (object,
+// TAO_SFP_Object (callback),
+// -1);
+// ACE_NEW_RETURN (handler,
+// TAO_SFP_UDP_MCast_Sender_Handler (callback,
+// object),
+// -1);
+// callback->transport (handler->transport ());
+// callback->protocol_object (object);
+// object->transport (handler->transport ());
+// this->endpoint_->set_protocol_object (this->entry_->flowname (),
+// object);
+// this->endpoint_->set_handler (this->flowname_.c_str (),handler);
+// this->entry_->protocol_object (object);
+// return 0;
+// }
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_MCast_Connector
+// //------------------------------------------------------------
+// TAO_SFP_UDP_MCast_Connector::TAO_SFP_UDP_MCast_Connector (void)
+// {
+// }
+
+// TAO_SFP_UDP_MCast_Connector::~TAO_SFP_UDP_MCast_Connector (void)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Connector::make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler)
+// {
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Connector::make_svc_handler\n"));
+// TAO_SFP_BASE::instance ();
+// // @@ We should actually look at the entry and find out if we're a
+// // sink or a source and create the appropriate handler
+// TAO_AV_Callback *callback = 0;
+// this->endpoint_->get_callback (this->entry_->flowname (),
+// callback);
+// ACE_NEW_RETURN (handler,
+// TAO_SFP_UDP_MCast_Receiver_Handler (callback),
+// -1);
+// TAO_SFP_Object *object;
+// ACE_NEW_RETURN (object,
+// TAO_SFP_Object (callback),
+// -1);
+// callback->transport (handler->transport ());
+// callback->protocol_object (object);
+// object->transport (handler->transport ());
+// this->endpoint_->set_protocol_object (this->entry_->flowname (),
+// object);
+// this->endpoint_->set_handler (this->flowname_.c_str (),handler);
+// this->entry_->protocol_object (object);
+// return 0;
+// }
+
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_MCast_Sender_Handler
+// //------------------------------------------------------------
+// TAO_SFP_UDP_MCast_Sender_Handler::TAO_SFP_UDP_MCast_Sender_Handler (TAO_AV_Callback *callback,
+// TAO_SFP_Object *object)
+// :TAO_AV_Flow_Handler (callback),
+// TAO_AV_UDP_MCast_Flow_Handler (callback),
+// sfp_object_ (object)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Sender_Handler::handle_input (ACE_HANDLE /*fd*/)
+// {
+// return -1;
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Sender_Handler::handle_close (ACE_HANDLE /*fd*/,
+// ACE_Reactor_Mask)
+// {
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Sender_Handler::start (TAO_FlowSpec_Entry::Role role)
+// {
+// // @@once somehow we figure out that the stream is established we
+// // can start sending the frames.
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Sender_Handler::start\n"));
+// TAO_AV_Flow_Handler::start (role);
+// this->sfp_object_->start ();
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Sender_Handler::stop (TAO_FlowSpec_Entry::Role role)
+// {
+// TAO_AV_Flow_Handler::stop (role);
+// this->sfp_object_->stop ();
+// return 0;
+// }
+
+// //------------------------------------------------------------
+// // TAO_SFP_UDP_MCast_Receiver_Handler
+// //------------------------------------------------------------
+// TAO_SFP_UDP_MCast_Receiver_Handler::TAO_SFP_UDP_MCast_Receiver_Handler (TAO_AV_Callback *callback)
+// :TAO_AV_Flow_Handler (callback),
+// TAO_AV_UDP_MCast_Flow_Handler (callback)
+// {
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Receiver_Handler::handle_input (ACE_HANDLE /*fd*/)
+// {
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_UDP_MCast_Receiver_Handler::handle_input\n"));
+// TAO_AV_frame_info *frame_info = 0;
+// // This is the entry point for receiving data.
+// int result = TAO_SFP_Base::handle_input (this->transport_,
+// this->state_,
+// frame_info);
+// if (result < 0)
+// ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_UDP_MCast_Receiver_Handler::handle_input"),result);
+// if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
+// this->callback_->handle_end_stream ();
+// if (this->state_.is_complete ())
+// {
+// this->callback_->receive_frame (this->state_.frame_block_,
+// frame_info);
+// this->state_.reset ();
+// }
+// return 0;
+// }
+
+// int
+// TAO_SFP_UDP_MCast_Receiver_Handler::handle_close (ACE_HANDLE /*fd*/,
+// ACE_Reactor_Mask /*mask*/)
+// {
+// return 0;
+// }
//------------------------------------------------------------
@@ -1420,7 +1420,7 @@ TAO_SFP_Object::send_frame (ACE_Message_Block *frame,
CORBA::Octet flags = TAO_ENCAP_BYTE_ORDER;
if (this->transport_ == 0)
ACE_ERROR_RETURN ((LM_ERROR,"TAO_SFP_Object::send_frame: transport is null\n"),-1);
- if (this->credit_ > 0)
+ if (this->current_credit_ > 0)
{
// if we have enough credit then we send.
int total_length = 0;
@@ -1553,13 +1553,16 @@ TAO_SFP_Object::send_frame (ACE_Message_Block *frame,
}
// Increment the sequence_num after sending the message.
this->sequence_num_++;
+ // Also reduce the number of credits.
+ this->credit--;
}
}
else
{
- // flow controlled so wait.
+ // flow controlled so wait.
+ // A greater than 0 value indicates that flow control is being exercised.
+ return 1;
}
-
return 0;
}
@@ -1614,6 +1617,80 @@ TAO_SFP_Object::get_fragment (ACE_Message_Block *&mb,
return fragment_mb;
}
+// TAO_SFP_Consumer_Object
+int
+TAO_SFP_Consumer_Object::handle_input (void)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"TAO_SFP_Consumer_Object::handle_input\n"));
+ // This is the entry point for receiving data.
+ TAO_AV_frame_info *frame_info = 0;
+ int result = TAO_SFP_Base::handle_input (this->transport_,
+ this->state_,
+ frame_info);
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,"ERROR in TAO_SFP_Consumer_Object::handle_input"),result);
+ if (this->state_.frame_header_.message_type == flowProtocol::EndofStream_Msg)
+ this->callback_->handle_end_stream ();
+ if (this->state_.is_complete ())
+ {
+ this->callback_->receive_frame (this->state_.frame_block_,
+ frame_info);
+ this->state_.reset ();
+ }
+ return 0;
+}
+
+TAO_SFP_Producer_Object::TAO_SFP_Producer_Object (void)
+ :credit_sequence_num_ (0)
+{
+}
+
+int
+TAO_SFP_Producer_Object::handle_input (void)
+{
+ // A producer can only receive credit messages.
+ int result;
+ flowProtocol::MsgType msg_type;
+ result = TAO_SFP_Base::peek_message_type (transport,
+ msg_type);
+ if (result < 0)
+ return result;
+ switch (msg_type)
+ {
+ case flowProtocol::Credit_Msg:
+ {
+ flowProtocol::credit credit;
+ result = TAO_SFP_Base::read_credit_message (transport,
+ credit,
+ this->state_.cdr);
+ if (result < 0)
+ return result;
+ if (!this->credit_sequence_num_)
+ this->credit_sequence_num_ = credit.cred_num;
+ else
+ {
+ // check that the sequence number is above the last sequence number
+ // else its a duplicate credit message so we can ignore it.
+ if (credit.cred_num <= this->credit_sequence_num_)
+ return 0;
+ else // Update our credit now.
+ this->current_credit_ = this->max_credit_;
+ }
+ }
+ break;
+ default:
+ {
+ ACE_Message_Block mb (2*this->transport_->mtu ());
+
+ // Ignore the rest of the message by just reading.
+ this->transport_->recv (mb.rd_ptr (),
+ mb.size ());
+ break;
+ }
+ }
+ return 0;
+}
+
//------------------------------------------------------------
// TAO_SFP_Frame_State
//------------------------------------------------------------
diff --git a/TAO/orbsvcs/orbsvcs/AV/sfp.h b/TAO/orbsvcs/orbsvcs/AV/sfp.h
index a1fa3cd7557..5044d72afa0 100644
--- a/TAO/orbsvcs/orbsvcs/AV/sfp.h
+++ b/TAO/orbsvcs/orbsvcs/AV/sfp.h
@@ -4,13 +4,13 @@
// ============================================================================
//
// = LIBRARY
-// AVStreams.
+// ORBSVCS AVStreams.
//
// = FILENAME
// sfp.h
//
// = AUTHOR
-// Nagarajan Surendran <naga@cs.wustl.edu>
+// Nagarajan Surendran <naga@cs.wustl.edu>
//
// ============================================================================
@@ -25,6 +25,7 @@
#include "Policy.h"
#include "MCast.h"
#include "AVStreams_i.h"
+#include "UDP.h"
#define TAO_SFP_MAGIC_NUMBER_LEN 4
#define TAO_SFP_MESSAGE_TYPE_OFFSET 5
@@ -190,8 +191,8 @@ protected:
};
typedef ACE_Singleton <TAO_SFP_Base,ACE_SYNCH_MUTEX> TAO_SFP_BASE;
-class TAO_ORBSVCS_Export TAO_SFP_Object
- :public TAO_AV_Protocol_Object
+
+class TAO_ORBSVCS_Export TAO_SFP_Object : public TAO_AV_Protocol_Object
{
public:
TAO_SFP_Object (TAO_AV_Callback *callback,
@@ -200,6 +201,7 @@ public:
virtual ~TAO_SFP_Object (void);
// Dtor
+ virtual int handle_input (void) = 0;
virtual int send_frame (ACE_Message_Block *frame,
TAO_AV_frame_info *frame_info = 0);
@@ -215,136 +217,24 @@ protected:
size_t &last_mb_current_len);
CORBA::ULong sequence_num_;
CORBA::ULong source_id_;
- CORBA::ULong credit_;
-};
-
-class TAO_SFP_UDP_Receiver_Handler
- :public TAO_AV_UDP_Flow_Handler
-{
-public:
- TAO_SFP_UDP_Receiver_Handler (TAO_AV_Callback *callback);
- virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
- virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
- ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK);
-protected:
- TAO_SFP_Frame_State state_;
-};
-
-class TAO_SFP_UDP_Sender_Handler
- :public TAO_AV_UDP_Flow_Handler
-{
-public:
- TAO_SFP_UDP_Sender_Handler (TAO_AV_Callback *callback,
- TAO_SFP_Object *sfp_object);
- virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
- virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
- ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK);
- virtual int start (TAO_FlowSpec_Entry::Role role);
- virtual int stop (TAO_FlowSpec_Entry::Role role);
-protected:
- TAO_SFP_Object *sfp_object_;
-};
-
-
-class TAO_ORBSVCS_Export TAO_SFP_UDP_Protocol_Factory
- :public TAO_AV_Protocol_Factory
-{
-public:
- TAO_SFP_UDP_Protocol_Factory (void);
- ~TAO_SFP_UDP_Protocol_Factory (void);
-
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- // verify protocol is a match.
-
- virtual TAO_AV_Acceptor *make_acceptor (void);
- // create an acceptor.
-
- virtual TAO_AV_Connector *make_connector (void);
- // create a connector.
-};
-
-class TAO_SFP_UDP_Acceptor
- :public TAO_AV_UDP_Acceptor
-{
-public:
- TAO_SFP_UDP_Acceptor (void);
- ~TAO_SFP_UDP_Acceptor (void);
- int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
-};
-
-class TAO_SFP_UDP_Connector
- :public TAO_AV_UDP_Connector
-{
-public:
- TAO_SFP_UDP_Connector (void);
- ~TAO_SFP_UDP_Connector (void);
- int make_svc_handler (TAO_AV_UDP_Flow_Handler *&handler);
+ CORBA::ULong max_credit_;
+ CORBA::ULong current_credit_;
};
-//----------------------------------------------------------------------
-// SFP_UDP_MCast classes
-//----------------------------------------------------------------------
-class TAO_SFP_UDP_MCast_Receiver_Handler
- :public TAO_AV_UDP_MCast_Flow_Handler
+class TAO_ORBSVCS_Export TAO_SFP_Producer_Object : public TAO_SFP_Object
{
public:
- TAO_SFP_UDP_MCast_Receiver_Handler (TAO_AV_Callback *callback);
- virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
- virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
- ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK);
+ TAO_SFP_Producer_Object (void);
+ virtual int handle_input (void);
protected:
- TAO_SFP_Frame_State state_;
-};
-
-class TAO_SFP_UDP_MCast_Sender_Handler
- :public TAO_AV_UDP_MCast_Flow_Handler
-{
-public:
- TAO_SFP_UDP_MCast_Sender_Handler (TAO_AV_Callback *callback,
- TAO_SFP_Object *sfp_object);
- virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
- virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE,
- ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK);
- virtual int start (TAO_FlowSpec_Entry::Role role);
- virtual int stop (TAO_FlowSpec_Entry::Role role);
-protected:
- TAO_SFP_Object *sfp_object_;
-};
-
-
-class TAO_ORBSVCS_Export TAO_SFP_UDP_MCast_Protocol_Factory
- :public TAO_AV_Protocol_Factory
-{
-public:
- TAO_SFP_UDP_MCast_Protocol_Factory (void);
- ~TAO_SFP_UDP_MCast_Protocol_Factory (void);
-
- virtual int match_protocol (TAO_AV_Core::Protocol protocol);
- // verify protocol is a match.
-
- virtual TAO_AV_Acceptor *make_acceptor (void);
- // create an acceptor.
-
- virtual TAO_AV_Connector *make_connector (void);
- // create a connector.
-};
-
-class TAO_SFP_UDP_MCast_Acceptor
- :public TAO_AV_UDP_MCast_Acceptor
-{
-public:
- TAO_SFP_UDP_MCast_Acceptor (void);
- ~TAO_SFP_UDP_MCast_Acceptor (void);
- int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler);
+ CORBA::ULong credit_sequence_num_;
};
-class TAO_SFP_UDP_MCast_Connector
- :public TAO_AV_UDP_MCast_Connector
+class TAO_ORBSVCS_Export TAO_SFP_Consumer_Object : public TAO_SFP_Object
{
public:
- TAO_SFP_UDP_MCast_Connector (void);
- ~TAO_SFP_UDP_MCast_Connector (void);
- int make_svc_handler (TAO_AV_UDP_MCast_Flow_Handler *&handler);
+ TAO_SFP_Consumer_Object (void);
+ virtual int handle_input (void);
};
-#endif /* !defined (TAO_SFP_H) */
+#endif /* TAO_SFP_H */
diff --git a/TAO/orbsvcs/orbsvcs/AV/source.cpp b/TAO/orbsvcs/orbsvcs/AV/source.cpp
index 936bf4054eb..730385495a3 100644
--- a/TAO/orbsvcs/orbsvcs/AV/source.cpp
+++ b/TAO/orbsvcs/orbsvcs/AV/source.cpp
@@ -33,7 +33,7 @@
*/
// $Id$
#include "ace/OS.h"
-#include "RTP.h"
+#include "RTCP.h"
#include "source.h"
/* gray out src if no ctrl msgs for this many consecutive update intervals */
@@ -187,18 +187,14 @@ TAO_AV_Source::clear_counters ()
lts_done_.tv_usec = 0;
}
-TAO_AV_SourceManager::TAO_AV_SourceManager (const char *flowname,
- TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_RTCP_Flow_Handler *handler)
+TAO_AV_SourceManager::TAO_AV_SourceManager (TAO_AV_RTCP_Callback *callback)
:nsources_ (0),
sources_ (0),
clock_ (0),
keep_sites_ (0),
site_drop_time_ (0),
localsrc_ (0),
- flowname_ (flowname),
- endpoint_ (endpoint),
- handler_ (handler)
+ callback_ (callback)
{
memset ( (char*)hashtab_, 0, sizeof (hashtab_));
}
@@ -224,13 +220,10 @@ TAO_AV_SourceManager::init (ACE_UINT32 localid, ACE_UINT32 localaddr)
* (we special case detection of our own loopbed back packets)
*/
// Make an upcall to get the source.
- this->endpoint_->get_rtp_source (localsrc_,
- this->flowname_.in (),
+ this->callback_->get_rtp_source (localsrc_,
localid,
localid,
localaddr);
- // ACE_NEW (localsrc_,
- // TAO_AV_Source (localid, localid, localaddr));
enter (localsrc_);
remove_from_hashtable (localsrc_);
/*
@@ -239,7 +232,6 @@ TAO_AV_SourceManager::init (ACE_UINT32 localid, ACE_UINT32 localaddr)
* because they are only created when a packet arrives.
*/
localsrc_->lts_ctrl (ACE_OS::gettimeofday ());
- this->handler_->init ();
}
TAO_AV_Source*
@@ -286,8 +278,7 @@ TAO_AV_SourceManager::lookup (ACE_UINT32 srcid, ACE_UINT32 ssrc, ACE_UINT32 addr
s = lookup_duplicate (srcid, addr);
if (s == 0) {
- this->endpoint_->get_rtp_source (s,
- this->flowname_.in (),
+ this->callback_->get_rtp_source (s,
srcid,
ssrc,
addr);
@@ -315,8 +306,7 @@ TAO_AV_SourceManager::demux (ACE_UINT32 srcid, ACE_UINT32 addr, ACE_UINT16 seq)
if (s == 0) {
/* CSRC=SSRC for data stream */
- this->endpoint_->get_rtp_source (s,
- this->flowname_.in (),
+ this->callback_->get_rtp_source (s,
srcid,
srcid,
addr);
diff --git a/TAO/orbsvcs/orbsvcs/AV/source.h b/TAO/orbsvcs/orbsvcs/AV/source.h
index 65f103c9d9d..5adafbfe2b1 100644
--- a/TAO/orbsvcs/orbsvcs/AV/source.h
+++ b/TAO/orbsvcs/orbsvcs/AV/source.h
@@ -130,7 +130,6 @@ public:
protected:
char* stats (char* cp) const;
-
// @@Naga:My additions
int active_;
char *name_;
@@ -177,14 +176,12 @@ protected:
int sdes_atoi (const char* s);
char* onestat (char* cp, const char* name, u_long v);
class TAO_Base_StreamEndPoint;
-class TAO_AV_RTCP_Flow_Handler;
+class TAO_AV_RTCP_Callback;
class TAO_AV_SourceManager
{
public:
- TAO_AV_SourceManager (const char *flowname,
- TAO_Base_StreamEndPoint *endpoint,
- TAO_AV_RTCP_Flow_Handler *handler);
+ TAO_AV_SourceManager (TAO_AV_RTCP_Callback *callback);
void init (ACE_UINT32 localid, ACE_UINT32 localaddr);
TAO_AV_Source* lookup (ACE_UINT32 srcid, ACE_UINT32 ssrc, ACE_UINT32 addr);
TAO_AV_Source* demux (ACE_UINT32 srcid, ACE_UINT32 addr, ACE_UINT16 seq);
@@ -218,10 +215,7 @@ protected:
TAO_AV_Source* localsrc_;
TAO_AV_Source* hashtab_[TAO_AV_SOURCE_HASH];
- // flow members.
- CORBA::String_var flowname_;
- TAO_Base_StreamEndPoint *endpoint_;
- TAO_AV_RTCP_Flow_Handler *handler_;
+ TAO_AV_RTCP_Callback *callback_;
};
#if defined (__ACE_INLINE__)