summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp1018
1 files changed, 1018 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
new file mode 100644
index 00000000000..e7d1f5ec94c
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/FlowSpec_Entry.cpp
@@ -0,0 +1,1018 @@
+// $Id$
+
+//------------------------------------------------------------
+// TAO_FlowSpec_Entry
+//------------------------------------------------------------
+
+#include "orbsvcs/AV/FlowSpec_Entry.h"
+#include "orbsvcs/AV/Protocol_Factory.h"
+
+#include "tao/debug.h"
+
+#include "ace/OS_NS_strings.h"
+
+#if !defined (__ACE_INLINE__)
+#include "orbsvcs/AV/FlowSpec_Entry.inl"
+#endif /* __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// constructor.
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (void)
+ :address_ (0),
+ clean_up_address_ (0),
+ control_address_ (0),
+ clean_up_control_address_ (0),
+ address_str_ (),
+ format_ (),
+ direction_ (TAO_AV_INVALID),
+ direction_str_ (),
+ flowname_ (),
+ protocol_ (TAO_AV_Core::TAO_AV_NOPROTOCOL),
+ carrier_protocol_ (),
+ flow_protocol_ (),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ delete_peer_addr_ (false),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+}
+
+// constructor.
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *carrier_protocol,
+ ACE_Addr *fwd_address,
+ //ACE_Addr *peer_address,
+ ACE_Addr *control_address)
+ :address_ (fwd_address),
+ clean_up_address_ (0),
+ control_address_ (control_address),
+ clean_up_control_address_ (0),
+ address_str_ (),
+ format_ (format_name),
+ direction_str_ (direction ),
+ flowname_ ( flowname ),
+ carrier_protocol_ ( carrier_protocol ),
+ flow_protocol_ ( flow_protocol ),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ delete_peer_addr_ (false),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+ this->set_protocol ();
+ this->set_direction (this->direction_str_.c_str());
+ this->parse_flow_protocol_string (this->flow_protocol_.c_str() );
+}
+
+TAO_FlowSpec_Entry::TAO_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name,
+ const char *flow_protocol,
+ const char *address)
+ //const char *peer_address)
+ :address_ (0),
+ clean_up_address_ (0),
+ control_address_ (0),
+ clean_up_control_address_ (0),
+ address_str_ ( address ),
+ format_ ( format_name ),
+ direction_str_ ( direction ),
+ flowname_ ( flowname ),
+ carrier_protocol_ (),
+ flow_protocol_ ( flow_protocol ),
+ use_flow_protocol_ (0),
+ entry_ (),
+ is_multicast_ (0),
+ peer_addr_ (0),
+ local_sec_addr_ (0),
+ num_local_sec_addrs_ (0),
+ peer_sec_addr_ (0),
+ num_peer_sec_addrs_ (0),
+ peer_control_addr_ (0),
+ local_addr_ (0),
+ local_control_addr_ (0),
+ transport_ (0),
+ control_transport_ (0),
+ handler_ (0),
+ control_handler_ (0),
+ protocol_object_ (0),
+ control_protocol_object_ (0),
+ role_ (TAO_AV_INVALID_ROLE)
+{
+ this->parse_flow_protocol_string (this->flow_protocol_.c_str() );
+ this->parse_address (this->address_str_.c_str(), TAO_AV_Core::TAO_AV_DATA);
+ this->set_direction (this->direction_str_.c_str());
+}
+
+// Destructor.
+TAO_FlowSpec_Entry::~TAO_FlowSpec_Entry (void)
+{
+ if (this->delete_peer_addr_)
+ delete this->peer_addr_;
+
+ if (this->clean_up_address_)
+ delete address_;
+ if (this->clean_up_control_address_)
+ delete control_address_;
+ if (local_control_addr_ != 0)
+ delete local_control_addr_;
+}
+
+int
+TAO_FlowSpec_Entry::set_protocol (void)
+{
+ if (!this->use_flow_protocol_)
+ {
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"TCP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_TCP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"SCTP_SEQ") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_SCTP_SEQ;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"UDP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"QoS_UDP") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_QOS_UDP;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL5") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL5;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL3_4") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL3_4;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"AAL1") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_AAL1;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0){
+ this->protocol_ = TAO_AV_Core::TAO_AV_UDP;
+ flow_protocol_ = "RTP";
+ }
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/AAL5") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_RTP_AAL5;
+ else if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"IPX") == 0)
+ this->protocol_ = TAO_AV_Core::TAO_AV_IPX;
+ else
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_NOPROTOCOL;
+ return -1;
+ }
+ }
+ else
+ {
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"UDP") == 0)
+ {
+ if (ACE_OS::strncasecmp (this->flow_protocol_.c_str (),"sfp",3) == 0)
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_SFP_UDP;
+ }
+ else this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP;
+ }
+ else
+ {
+ this->protocol_ = TAO_AV_Core::TAO_AV_NOPROTOCOL;
+ return -1;
+ }
+ }
+
+ if (this->address_ != 0)
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::set_protocol address is not 0\n"));
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ char buf[BUFSIZ];
+ inet_addr->addr_to_string (buf,BUFSIZ);
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"TAO_FlowSpec_Entry::set_protocol:%s %x\n",buf, inet_addr->get_ip_address ()));
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ 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;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+int
+TAO_FlowSpec_Entry::parse_address (const char *address,
+ TAO_AV_Core::Flow_Component flow_comp)
+{
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address [%s]\n", address));
+
+ if (address == 0)
+ return 0;
+ if (ACE_OS::strcmp (address,"") == 0)
+ return 0;
+ TAO_Tokenizer protocol_tokenizer (address,'=');
+
+ this->carrier_protocol_ = protocol_tokenizer[0];
+
+ int result = this->set_protocol ();
+ if (result < 0)
+ return result;
+
+ if (protocol_tokenizer [1] != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Protocol tokenixer is not null\n"));
+ if ((flow_comp == TAO_AV_Core::TAO_AV_DATA) ||
+ //(flow_comp == TAO_AV_Core::TAO_AV_BOTH) ||
+ (flow_comp == TAO_AV_Core::TAO_AV_CONTROL) )
+ {
+ ACE_CString addr;
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ TAO_Tokenizer addr_token (protocol_tokenizer [1], ';');
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of local sec addresses = %d\n",
+ addr_token.num_tokens () - 1));
+
+ if (addr_token.num_tokens () != 0)
+ {
+ addr += addr_token [0];
+ ACE_NEW_RETURN (local_sec_addr_, char* [addr_token.num_tokens () - 1],-1);
+ for (int j = 1; j <= addr_token.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ addr_token [j]));
+
+ local_sec_addr_ [j-1] = CORBA::string_dup (addr_token [j]);
+ }
+ num_local_sec_addrs_ = addr_token.num_tokens () - 1;
+ }
+ }
+ else addr += protocol_tokenizer[1];
+
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ {
+ if (flow_comp == TAO_AV_Core::TAO_AV_DATA)
+ this->address_str_ = addr;
+ ACE_INET_Addr *inet_addr;
+ ACE_NEW_RETURN (inet_addr,
+ ACE_INET_Addr (addr.c_str() ),
+ -1);
+ if (flow_comp == TAO_AV_Core::TAO_AV_DATA)
+ {
+ this->clean_up_address_ = 1;
+ this->address_ = inet_addr;
+ }
+ else
+ {
+ this->clean_up_control_address_ = 1;
+ this->control_address_ = inet_addr;
+ }
+
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address is multicast\n"));
+
+ 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;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"ATM support not added yet\n"));
+ }
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "AV BOTH %s \n",
+ protocol_tokenizer[1]));
+
+ TAO_Tokenizer address_tokenizer (protocol_tokenizer[1], ':');
+ TAO_Tokenizer port_tokenizer (address_tokenizer[1], ';');
+ ACE_CString addr;
+ addr += address_tokenizer[0];
+ addr += ":";
+ addr += port_tokenizer[0];
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of local sec addresses = %d\n",
+ port_tokenizer.num_tokens () - 1));
+
+ if (port_tokenizer.num_tokens () - 1 != 0)
+ {
+ ACE_NEW_RETURN (local_sec_addr_, char* [port_tokenizer.num_tokens () - 1],-1);
+ for (int j = 1; j <= port_tokenizer.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ port_tokenizer [j]));
+
+ local_sec_addr_ [j-1] = CORBA::string_dup (port_tokenizer [j]);
+ }
+ num_local_sec_addrs_ = port_tokenizer.num_tokens () - 1;
+ }
+ }
+
+ short control_port = static_cast<short> (ACE_OS::atoi(port_tokenizer[0])) + 1;
+ char control_port_str[6];
+ sprintf (control_port_str, "%d", control_port);
+
+ ACE_CString control_addr = "";
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0)
+ {
+ control_addr += address_tokenizer[0];
+ control_addr += ":";
+ if (port_tokenizer[1] != 0)
+ control_addr += port_tokenizer[1];
+ else
+ control_addr += control_port_str;
+ }
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ {
+ this->address_str_ = addr;
+ ACE_INET_Addr *inet_addr;
+ ACE_NEW_RETURN (inet_addr,
+ ACE_INET_Addr (addr.c_str() ),
+ -1);
+ this->clean_up_address_ = 1;
+ this->address_ = inet_addr;
+
+ if (ACE_OS::strcasecmp (this->carrier_protocol_.c_str(),"RTP/UDP") == 0)
+ {
+ ACE_INET_Addr *control_inet_addr;
+ ACE_NEW_RETURN (control_inet_addr,
+ ACE_INET_Addr (control_addr.c_str() ),
+ -1);
+ this->clean_up_control_address_ = 1;
+ this->control_address_ = control_inet_addr;
+ }
+
+ if (IN_CLASSD (inet_addr->get_ip_address ()))
+ {
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "TAO_FlowSpec_Entry::parse_address is multicast\n"));
+
+ 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;
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ this->protocol_ = TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"ATM support not added yet\n"));
+ }
+ }
+ }
+ ACE_DEBUG ((LM_DEBUG,
+ "Return from parse address\n"));
+ return 0;
+}
+
+char *
+TAO_FlowSpec_Entry::get_local_addr_str (void)
+{
+ if (this->local_addr_ == 0)
+ return 0;
+
+ switch (this->local_addr_->get_type ())
+ {
+ case AF_INET:
+ {
+ char *buf;
+ ACE_NEW_RETURN (buf,
+ char [BUFSIZ],
+ 0);
+
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr *> (this->local_addr_);
+ inet_addr->addr_to_string (buf,BUFSIZ);
+ ACE_CString cstring (buf, 0, false);
+
+ return cstring.rep ();
+ }
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,"Address family not supported"),0);
+ }
+}
+
+//------------------------------------------------------------
+// TAO_Forward_FlowSpec_Entry
+//------------------------------------------------------------
+
+// default constructor.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+// constructor to construct the entry from the arguments.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *carrier_protocol ,
+ ACE_Addr *address,
+ ACE_Addr *control_address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ carrier_protocol,
+ address,
+ control_address)
+{
+ // no-op.
+}
+
+// constructor to construct the entry from the arguments.
+TAO_Forward_FlowSpec_Entry::TAO_Forward_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ address)
+{
+ // no-op.
+}
+
+TAO_Forward_FlowSpec_Entry::~TAO_Forward_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+int
+TAO_Forward_FlowSpec_Entry::parse (const char *flowSpec_entry)
+{
+ TAO_Tokenizer tokenizer (flowSpec_entry,'\\');
+
+ this->flowname_ = tokenizer [TAO_AV_FLOWNAME];
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Forward_FlowSpec_Entry::parse [%s]\n",
+ flowSpec_entry));
+
+ if (tokenizer [TAO_AV_DIRECTION] != 0)
+ this->set_direction (tokenizer [TAO_AV_DIRECTION]);
+
+ if (tokenizer [TAO_AV_FORMAT] != 0)
+ this->format_ = tokenizer [TAO_AV_FORMAT];
+
+ if (tokenizer [TAO_AV_ADDRESS] != 0)
+ if (this->parse_address (tokenizer [TAO_AV_ADDRESS], TAO_AV_Core::TAO_AV_BOTH) < 0)
+ return -1;
+
+ if (tokenizer [TAO_AV_PEER_ADDR] != 0)
+ {
+ ACE_INET_Addr *addr = 0;
+
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ TAO_Tokenizer addr_token (tokenizer [TAO_AV_PEER_ADDR], ';');
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Number of peer sec addresses = %d\n",
+ addr_token.num_tokens () - 1));
+
+ if (addr_token.num_tokens () != 0)
+ {
+ ACE_NEW_RETURN (addr,
+ ACE_INET_Addr (addr_token [0]),
+ 0);
+
+ ACE_NEW_RETURN (peer_sec_addr_, char* [addr_token.num_tokens () - 1],-1);
+ for (int j = 1; j <= addr_token.num_tokens () - 1; j++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "adding addresses to sequence %s\n",
+ addr_token [j]));
+
+ peer_sec_addr_ [j-1] = CORBA::string_dup (addr_token [j]);
+ }
+ num_peer_sec_addrs_ = addr_token.num_tokens () - 1;
+ }
+ }
+ else
+ {
+ ACE_NEW_RETURN (addr,
+ ACE_INET_Addr (tokenizer [TAO_AV_PEER_ADDR]),
+ 0);
+ }
+ this->delete_peer_addr_ = true;
+ this->peer_addr_ = addr;
+
+ char buf [BUFSIZ];
+ addr->addr_to_string (buf, BUFSIZ);
+ ACE_DEBUG ((LM_DEBUG,
+ "Peer Address %s \n",
+ buf));
+
+ }
+
+ if (tokenizer [TAO_AV_FLOW_PROTOCOL] != 0)
+ if (this->parse_flow_protocol_string (tokenizer [TAO_AV_FLOW_PROTOCOL]) < 0)
+ return -1;
+
+ return 0;
+}
+
+TAO_FlowSpec_Entry::Role
+TAO_Forward_FlowSpec_Entry::role (void)
+{
+ if (this->role_ != TAO_AV_INVALID_ROLE)
+ return this->role_;
+
+ switch (this->direction_)
+ {
+ case TAO_AV_DIR_IN:
+ // Forward IN means we're the Source.
+ return TAO_AV_PRODUCER;
+ case TAO_AV_DIR_OUT:
+ // Forward out means we're the sink.
+ return TAO_AV_CONSUMER;
+ default:
+ return TAO_AV_INVALID_ROLE;
+ }
+}
+
+const char *
+TAO_Forward_FlowSpec_Entry::entry_to_string (void)
+{
+ if (this->flowname_.length() == 0)
+ return "";
+
+ char address [BUFSIZ];
+ ACE_CString address_str;
+ ACE_CString peer_address_str;
+
+ if (this->address_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ }
+ break;
+ default:
+ break;
+ }
+ ACE_CString cstring (address);
+
+ address_str = this->carrier_protocol_;
+ address_str += "=";
+ address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_local_sec_addrs_; i++)
+ {
+ address_str += ";";
+ address_str += this->local_sec_addr_ [i];
+ }
+ }
+
+ }
+ else
+ {
+ address_str = this->carrier_protocol_;
+ }
+
+
+ if ( (this->address_ != 0) &&
+ (this->control_address_ == 0) &&
+ (ACE_OS::strncasecmp (this->flow_protocol_.c_str(), "RTP", 3) == 0))
+ {
+ u_short control_port;
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ control_port = inet_addr->get_port_number() + 1;
+ ACE_INET_Addr *inet_control_addr;
+ ACE_NEW_RETURN (inet_control_addr,
+ ACE_INET_Addr (control_port, inet_addr->get_host_addr ()),
+ "");
+ this->control_address_ = inet_control_addr;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ if (this->peer_addr_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->peer_addr_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ //inet_addr->get_host_name (address, BUFSIZ);
+
+ //cstring += ACE_OS::itoa (address, BUFSIZ, inet_addr->get_port_number ());
+
+ }
+ break;
+ default:
+ break;
+ }
+
+ ACE_CString cstring (address);
+
+ //peer_address_str = this->carrier_protocol_;
+ //peer_address_str += "=";
+ peer_address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_peer_sec_addrs_; i++)
+ {
+ peer_address_str += ";";
+ peer_address_str += this->peer_sec_addr_ [i];
+ }
+ }
+
+ }
+
+ if (this->control_address_ != 0)
+ {
+ u_short control_port = 0;
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->control_address_);
+ control_port = inet_addr->get_port_number();
+ }
+ break;
+ default:
+ break;
+ }
+
+ address_str += ";";
+ char port_str[10];
+ sprintf(port_str, "%u", control_port);
+ address_str += port_str;
+ }
+
+ this->entry_ = this->flowname_;
+ this->entry_ += "\\";
+ this->entry_ += this->direction_str_;
+ this->entry_ += "\\";
+ this->entry_ += this->format_;
+ this->entry_ += "\\";
+ this->entry_ += this->flow_protocol_;
+ this->entry_ += "\\";
+ this->entry_ += address_str;
+
+ if (this->peer_addr_ != 0)
+ {
+ this->entry_ += "\\";
+ this->entry_ += peer_address_str;
+ }
+ else ACE_DEBUG ((LM_DEBUG,
+ "No peer address specified\n"));
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,"Forward entry_to_string: entry = %s\n",this->entry_.c_str()));
+
+ return this->entry_.c_str();
+}
+
+//------------------------------------------------------------
+// TAO_Reverse_FlowSpec_Entry
+//------------------------------------------------------------
+
+//default constructor.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (void)
+{
+ // no-op
+}
+
+// constructor to construct an entry from the arguments.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *carrier_protocol,
+ ACE_Addr *address,
+ ACE_Addr *control_address )
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ carrier_protocol,
+ address,
+ control_address)
+{
+ // no-op
+}
+
+// constructor to construct an entry from the arguments.
+TAO_Reverse_FlowSpec_Entry::TAO_Reverse_FlowSpec_Entry (const char *flowname,
+ const char *direction,
+ const char *format_name ,
+ const char *flow_protocol ,
+ const char *address)
+ :TAO_FlowSpec_Entry (flowname,
+ direction,
+ format_name,
+ flow_protocol,
+ address)
+{
+ // no-op.
+}
+
+TAO_Reverse_FlowSpec_Entry::~TAO_Reverse_FlowSpec_Entry (void)
+{
+ // no-op.
+}
+
+TAO_FlowSpec_Entry::Role
+TAO_Reverse_FlowSpec_Entry::role (void)
+{
+ if (this->role_ != TAO_AV_INVALID_ROLE)
+ return this->role_;
+ switch (this->direction_)
+ {
+ case TAO_AV_DIR_IN:
+ // Forward IN means we're the Source.
+ return TAO_AV_CONSUMER;
+ case TAO_AV_DIR_OUT:
+ // Forward out means we're the sink.
+ return TAO_AV_PRODUCER;
+ default:
+ return TAO_AV_INVALID_ROLE;
+ }
+}
+
+int
+TAO_Reverse_FlowSpec_Entry::parse (const char *flowSpec_entry)
+{
+ TAO_Tokenizer tokenizer (flowSpec_entry,'\\');
+ this->flowname_ = tokenizer [TAO_AV_FLOWNAME];
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ "TAO_Reverse_FlowSpec_Entry::parse [%s]\n",
+ flowSpec_entry));
+
+ if (tokenizer [TAO_AV_ADDRESS] != 0)
+ if (this->parse_address (tokenizer [TAO_AV_ADDRESS], TAO_AV_Core::TAO_AV_BOTH) < 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]);
+
+// if (tokenizer [TAO_AV_FORMAT] != 0)
+// this->format_ = tokenizer [TAO_AV_FORMAT];
+
+ return 0;
+}
+
+
+const char *
+TAO_Reverse_FlowSpec_Entry::entry_to_string (void)
+{
+ if (this->flowname_.length() == 0)
+ return "";
+
+ char address [BUFSIZ];
+ ACE_CString address_str;
+ if (this->address_ != 0)
+ {
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->address_);
+ inet_addr->addr_to_string (address,BUFSIZ);
+ }
+ break;
+ default:
+ break;
+ }
+ ACE_CString cstring (address);
+
+ address_str = this->carrier_protocol_;
+ address_str += "=";
+ address_str += cstring;
+
+ if (this->protocol_ == TAO_AV_Core::TAO_AV_SCTP_SEQ)
+ {
+ for (int i = 0; i < this->num_local_sec_addrs_; i++)
+ {
+ address_str += ";";
+ address_str += this->local_sec_addr_ [i];
+ }
+ }
+
+ }
+ else
+ {
+ address_str = "";
+ }
+
+ if (this->control_address_ != 0)
+ {
+ u_short control_port = 0;
+
+
+ switch (this->protocol_)
+ {
+ case TAO_AV_Core::TAO_AV_SFP_UDP:
+ case TAO_AV_Core::TAO_AV_SFP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP:
+ case TAO_AV_Core::TAO_AV_USERDEFINED_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_RTP_UDP:
+ case TAO_AV_Core::TAO_AV_RTP_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_UDP:
+ case TAO_AV_Core::TAO_AV_QOS_UDP:
+ case TAO_AV_Core::TAO_AV_UDP_MCAST:
+ case TAO_AV_Core::TAO_AV_TCP:
+ case TAO_AV_Core::TAO_AV_SCTP_SEQ:
+ {
+ ACE_INET_Addr *inet_addr = dynamic_cast<ACE_INET_Addr*> (this->control_address_);
+ control_port = inet_addr->get_port_number();
+ }
+ break;
+ default:
+ break;
+ }
+
+ address_str += ";";
+ char port_str[10];
+ sprintf(port_str, "%u", control_port);
+ address_str += port_str;
+
+ }
+
+ this->entry_ = this->flowname_;
+ this->entry_ += "\\";
+ this->entry_ += address_str;
+ this->entry_ += "\\";
+ this->entry_ += this->flow_protocol_;
+// this->entry_ += "\\";
+// this->entry_ += this->direction_str_;
+// this->entry_ += "\\";
+// this->entry_ += format_;
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"Reverse entry_to_string: entry = %s\n",this->entry_.c_str() ));
+ return this->entry_.c_str();
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL