connection_manager.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 694 行 · 第 1/2 页
CPP
694 行
//Connection_Manager.cpp,v 1.11 2002/10/25 00:40:19 bala Exp
#include "Connection_Manager.h"
#include "tao/debug.h"
Connection_Manager::Connection_Manager (void)
{
}
Connection_Manager::~Connection_Manager (void)
{
}
int
Connection_Manager::init (CORBA::ORB_ptr orb)
{
// Initialize the naming service
if (this->naming_client_.init (orb) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
" (%P|%t) Unable to initialize "
"the TAO_Naming_Client. \n"),
-1);
return 0;
}
void
Connection_Manager::bind_to_receivers (const ACE_CString &sender_name,
AVStreams::MMDevice_ptr sender
ACE_ENV_ARG_DECL)
{
this->sender_name_ =
sender_name;
this->sender_ =
AVStreams::MMDevice::_duplicate (sender);
CosNaming::Name name (1);
name.length (1);
ACE_TRY
{
// Try binding the sender context in the NS
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
this->sender_context_ =
this->naming_client_->bind_new_context (name
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
//
// We reach here if there was no exception raised in
// <bind_new_context>. We then create a receiver context.
//
// Create the context for storing the receivers
name [0].id =
CORBA::string_dup ("Receivers");
// Try binding the receivers context under the sender context.
this->receiver_context_ =
this->sender_context_->bind_new_context (name
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCH (CosNaming::NamingContext::AlreadyBound, al_ex)
{
//
// The sender context already exists, probably created by the
// receiver(s).
//
// Get the sender context.
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
CORBA::Object_var object =
this->naming_client_->resolve (name
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->sender_context_ =
CosNaming::NamingContext::_narrow (object.in ());
// Find the Receiver context.
name [0].id =
CORBA::string_dup ("Receivers");
object =
this->sender_context_->resolve (name
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->receiver_context_ =
CosNaming::NamingContext::_narrow (object.in ());
this->find_receivers (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
ACE_ENDTRY;
ACE_CHECK;
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
// Register the sender object with the sender context.
this->sender_context_->rebind (name,
sender
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
Connection_Manager::find_receivers (ACE_ENV_SINGLE_ARG_DECL)
{
CosNaming::BindingIterator_var iterator;
CosNaming::BindingList_var binding_list;
const CORBA::ULong chunk = 100;
// Get the list of receivers registered for this sender.
this->receiver_context_->list (chunk,
binding_list,
iterator
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Add the receivers found in the bindinglist to the <receivers>.
this->add_to_receivers (binding_list
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (!CORBA::is_nil (iterator.in ()))
{
CORBA::Boolean more = 1;
// Check to see if there are more receivers listed.
while (more)
{
more = iterator->next_n (chunk,
binding_list
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->add_to_receivers (binding_list
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
}
void
Connection_Manager::add_to_receivers (CosNaming::BindingList &binding_list
ACE_ENV_ARG_DECL)
{
for (CORBA::ULong i = 0;
i < binding_list.length ();
i++)
{
// Get the receiver name from the binding list.
ACE_CString receiver_name =
binding_list [i].binding_name [0].id.in ();
CosNaming::Name name (1);
name.length (1);
name [0].id =
CORBA::string_dup (receiver_name.c_str ());
// Resolve the reference of the receiver from the receiver
// context.
CORBA::Object_var obj =
this->receiver_context_->resolve (name
ACE_ENV_ARG_PARAMETER);
AVStreams::MMDevice_var receiver_device =
AVStreams::MMDevice::_narrow (obj.in ());
// Add this receiver to the receiver map.
ACE_CString flowname =
this->sender_name_ +
"_" +
receiver_name;
this->receivers_.bind (flowname,
receiver_device);
}
}
void
Connection_Manager::connect_to_receivers (ACE_ENV_SINGLE_ARG_DECL)
{
// Connect to all receivers that we know about.
for (Receivers::iterator iterator = this->receivers_.begin ();
iterator != this->receivers_.end ();
++iterator)
{
// Initialize the QoS
AVStreams::streamQoS_var the_qos (new AVStreams::streamQoS);
ACE_CString flowname =
(*iterator).ext_id_;
// Create the forward flow specification to describe the flow.
TAO_Forward_FlowSpec_Entry sender_entry (flowname.c_str (),
"IN",
"USER_DEFINED",
"",
"UDP",
0);
// Set the flow specification for the stream between receiver
// and distributer
AVStreams::flowSpec flow_spec (1);
flow_spec.length (1);
flow_spec [0] =
CORBA::string_dup (sender_entry.entry_to_string ());
// Create the stream control for this stream.
TAO_StreamCtrl *streamctrl;
ACE_NEW (streamctrl,
TAO_StreamCtrl);
// Servant Reference Counting to manage lifetime
PortableServer::ServantBase_var safe_streamctrl =
streamctrl;
// Register streamctrl.
AVStreams::StreamCtrl_var streamctrl_object =
streamctrl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// Bind the flowname and the corresponding stream controller to
// the stream controller map
this->streamctrls_.bind (flowname,
streamctrl_object);
// Bind the sender and receiver MMDevices.
(void) streamctrl->bind_devs (this->sender_.in (),
(*iterator).int_id_.in (),
the_qos.inout (),
flow_spec
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
void
Connection_Manager::bind_to_sender (const ACE_CString &sender_name,
const ACE_CString &receiver_name,
AVStreams::MMDevice_ptr receiver
ACE_ENV_ARG_DECL)
{
this->sender_name_ =
sender_name;
this->receiver_name_ =
receiver_name;
this->receiver_ =
AVStreams::MMDevice::_duplicate (receiver);
this->sender_ = 0 ;
CosNaming::Name name (1);
name.length (1);
int sender_context_exists = 0;
ACE_TRY
{
// Try binding the sender context in the NS
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
CORBA::Object_var object =
this->naming_client_->resolve (name
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
//
// We reach here if there was no exception raised in <resolve>.
// Therefore, there must be a valid sender context available.
//
sender_context_exists = 1;
this->sender_context_ =
CosNaming::NamingContext::_narrow (object.in ());
name [0].id =
CORBA::string_dup ("Receivers");
// Find the receivers context under the sender's context
object =
this->sender_context_->resolve (name
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->receiver_context_ =
CosNaming::NamingContext::_narrow (object.in ());
}
ACE_CATCH (CosNaming::NamingContext::NotFound, al_ex)
{
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
// Create the sender context
this->sender_context_ =
this->naming_client_->bind_new_context (name
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
name [0].id =
CORBA::string_dup ("Receivers");
// Create the receivers context under the sender's context
this->receiver_context_ =
this->sender_context_->bind_new_context (name
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
ACE_ENDTRY;
ACE_CHECK;
//
// At this point we either have resolved the receiver context or we
// have created a new one.
//
name [0].id =
CORBA::string_dup (this->receiver_name_.c_str ());
// Register this receiver object under the receiver context.
this->receiver_context_->rebind (name,
receiver
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
//
// Check if the sender was registered. Note that if we created the
// sender context, there is no point in checking for the sender.
//
if (sender_context_exists)
{
ACE_TRY_EX(SENDER_CONTEXT_EXISTS)
{
// Try binding the sender under the sender context
name [0].id =
CORBA::string_dup (this->sender_name_.c_str ());
CORBA::Object_var object =
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?