summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp837
1 files changed, 837 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp
new file mode 100644
index 00000000000..b52287ef621
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy_T.cpp
@@ -0,0 +1,837 @@
+// $Id$
+
+#ifndef TAO_AV_ENDPOINT_STRATEGY_T_CPP
+#define TAO_AV_ENDPOINT_STRATEGY_T_CPP
+
+#include "orbsvcs/AV/Endpoint_Strategy_T.h"
+
+#include "tao/debug.h"
+
+#include "ace/Process_Semaphore.h"
+#include "ace/OS_NS_unistd.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy
+// ----------------------------------------------------------------------
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy (void)
+ : stream_endpoint_a_servant_(0), stream_endpoint_b_servant_(0), vdev_servant_(0),
+ media_ctrl_servant_(0)
+{
+}
+
+template <class T_StreamEndpoint, class T_VDev, class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy (void)
+{
+ // Do not allow exceptions to escape from the destructor
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if(this->stream_endpoint_a_servant_ )
+ {
+ stream_endpoint_a_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->stream_endpoint_b_servant_)
+ {
+ stream_endpoint_b_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->vdev_servant_)
+ {
+ vdev_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ if(this->media_ctrl_servant_)
+ {
+ media_ctrl_servant_->_remove_ref (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ }
+# if defined (ACE_HAS_EXCEPTIONS) \
+ && defined (ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS)
+ ACE_CATCHALL
+ {
+ }
+# endif /* ACE_HAS_EXCEPTIONS && ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS */
+ ACE_ENDTRY;
+
+}
+
+// Create, activate the objects with the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->activate_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated stream_endpoint\n"));
+
+ this->activate_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated vdev\n"));
+
+ this->activate_mediactrl (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activated mediactrl\n"));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Reactive_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+char *
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_with_poa (PortableServer::Servant servant ACE_ENV_ARG_DECL)
+{
+
+ PortableServer::ObjectId_var id =
+ this->poa_->activate_object (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj =
+ this->poa_->id_to_reference (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::String_var str =
+ this->orb_->object_to_string (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return str._retn ();
+}
+
+
+// Activate VDev into the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // Bridge pattern. Allow subclasses to override this behavior
+ T_VDev *vdev = 0;
+ if (this->make_vdev (vdev) == -1)
+ return -1;
+
+ // Activate the object under the root poa.
+// CORBA::String_var vdev_ior = this->activate_with_poa (vdev,
+// ACE_ENV_ARG_PARAMETER);
+// ACE_TRY_CHECK;
+// if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Reactive_Strategy::activate_vdev, vdev ior is:%s\n",
+// vdev_ior. in ()));
+
+ // Save the object reference, so that create_A can return it
+ this->vdev_ = vdev->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy::activate_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+
+// Activate the media_controller
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_mediactrl (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // Bridge pattern. Subclasses can override this
+ if (this->make_mediactrl ( media_ctrl_servant_ ) == -1)
+ return -1;
+
+ // Associate the media controller object reference with the vdev, as per the OMG spec
+ CORBA::Any anyval;
+ media_ctrl_obj_
+ = media_ctrl_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ anyval <<= media_ctrl_obj_.in();
+
+ ACE_TRY_CHECK;
+
+ this->vdev_->define_property ("Related_MediaCtrl",
+ anyval
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy::activate_mediactrl");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_stream_endpoint (T_StreamEndpoint *&stream_endpoint)
+{
+ ACE_NEW_RETURN (stream_endpoint,
+ T_StreamEndpoint,
+ -1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_vdev (T_VDev *&vdev)
+{
+ ACE_NEW_RETURN (vdev,
+ T_VDev,
+ -1);
+ return 0;
+}
+
+// Bridge method
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_mediactrl (T_MediaCtrl *&media_ctrl)
+{
+ ACE_NEW_RETURN (media_ctrl,
+ T_MediaCtrl,
+ -1);
+ return 0;
+}
+
+
+// ----------------------------------------------------------------------
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy_A
+// ----------------------------------------------------------------------
+
+//Constructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy_A (void)
+{
+}
+
+
+// Destructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy_A (void)
+{
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
+{
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ return 0;
+}
+
+// Creates an "A" type streamendpoint, and a vdev and returns the
+// object references
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A<T_StreamEndpoint, T_VDev, T_MediaCtrl>::create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED/* ACE_ENV_SINGLE_ARG_PARAMETER */)
+{
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Reactive_Strategy_A: Error in activate ()\n"),
+ -1);
+
+ stream_endpoint = AVStreams::StreamEndPoint_A::_duplicate( this->stream_endpoint_a_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ return 0;
+
+}
+
+// Put the stream_endpoint into the POA
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+
+ // Use the bridge method
+ if (this->make_stream_endpoint (this->stream_endpoint_a_servant_) == -1)
+ return -1;
+
+ // Save the object references, so that create_a can return them
+ this->stream_endpoint_a_ = this->stream_endpoint_a_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy_A::activate_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Reactive_Strategy_B
+// ----------------------------------------------------------------------
+
+
+// Constructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Endpoint_Reactive_Strategy_B (void)
+{
+}
+
+// Destructor
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Endpoint_Reactive_Strategy_B (void)
+{
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::init (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
+{
+ this->orb_ = CORBA::ORB::_duplicate (orb);
+ this->poa_ = PortableServer::POA::_duplicate (poa);
+ return 0;
+}
+
+// Activate stream_endpoint
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->make_stream_endpoint ( this->stream_endpoint_b_servant_ ) == -1)
+ return -1;
+
+ this->stream_endpoint_b_ = this->stream_endpoint_b_servant_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Reactive_Strategy_B::activate_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Returns a "B" type stream_endpoint and a vdev
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Endpoint_Reactive_Strategy_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED/* ACE_ENV_SINGLE_ARG_PARAMETER */)
+{
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Reactive_Strategy_B: Error in activate ()\n"),
+ -1);
+
+ stream_endpoint = AVStreams::StreamEndPoint_B::_duplicate( this->stream_endpoint_b_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process
+// ----------------------------------------------------------------------
+
+// Constructor
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process ()
+ : stream_endpoint_name_ (0),
+ pid_ (-1)
+{
+ this->pid_ = ACE_OS::getpid ();
+ if (this->pid_ == 0)
+ ACE_ERROR ((LM_ERROR,"getpid () failed\n"));
+ ACE_OS::hostname (this->host_,
+ sizeof this->host_);
+}
+
+// Initializes the ORB, activates the objects, and release the semaphore
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::init (int argc,
+ char **argv,
+ CORBA::ORB_ptr orb,
+ PortableServer::POA_ptr poa)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->orb_ = orb;
+
+ this->poa_ = poa;
+
+ // create the objects and activate them in the poa
+ this->activate_objects (argc,
+ argv
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get ourselves a naming_service object reference
+ this->bind_to_naming_service (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Register the vdev with the naming service
+ this->register_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // register the stream_endpoing with the naming_service
+ this->register_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Child_Process");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ // release the semaphore the parent is waiting on
+ if (this->release_semaphore () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error releasing semaphores\n"),
+ -1);
+
+ return 0;
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+char *
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_with_poa (PortableServer::Servant servant
+ ACE_ENV_ARG_DECL)
+{
+
+ PortableServer::ObjectId_var id =
+ this->poa_->activate_object (servant
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var obj =
+ this->poa_->id_to_reference (id.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::String_var str =
+ this->orb_->object_to_string (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return str._retn ();
+}
+
+// initializes the orb, and activates the objects
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::activate_objects (int /*argc*/,
+ char ** /*argv*/
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ // bridge method to make a new stream endpoint
+ if (this->make_stream_endpoint (this->stream_endpoint_) == -1)
+ return -1;
+
+ // bridge method to make a new vdev
+ if (this->make_vdev (this->vdev_) == -1)
+ return -1;
+
+ // bridge method to make a new media controller
+ if (this->make_mediactrl (this->media_ctrl_) == -1)
+ return -1;
+
+ // activate the stream_endpoint
+ CORBA::String_var stream_endpoint_ior = this->activate_with_poa (this->stream_endpoint_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t)TAO_AV_Child_Process::activate_objects,stream_endpoint_ior :%s\n",
+ stream_endpoint_ior.in ()));
+
+ // activate the vdev
+ CORBA::String_var vdev_ior = this->activate_with_poa (this->vdev_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t)TAO_AV_Child_Process::activate_objects, vdev ior is :%s\n",
+ vdev_ior.in ()));
+
+ // activate the media controller
+ CORBA::String_var media_ctrl_ior = this->activate_with_poa (this->media_ctrl_
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Child_Process::activate_objects,media_ctrl_ior is: %s\n",media_ctrl_ior.in ()));
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::init ");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bind to the namingservice
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ CORBA::Object_var naming_obj =
+ this->orb_->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil (naming_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to resolve the Name Service.\n"),
+ -1);
+ // if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) %s:%d\n", __FILE__, __LINE__));
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::bind_to_naming_service");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// register the vdev with the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::register_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char vdev_name [BUFSIZ];
+ ACE_OS::sprintf (vdev_name,
+ "%s:%s:%ld",
+ "VDev",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",vdev_name));
+ // create the name
+ this->vdev_name_.length (1);
+ this->vdev_name_ [0].id = CORBA::string_dup (vdev_name);
+
+ // make the media controller a property of the vdev
+ CORBA::Any media_ctrl_property;
+ media_ctrl_obj_ =
+ this->media_ctrl_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->vdev_->define_property ("Related_MediaCtrl",
+ media_ctrl_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ vdev_obj_ = this->vdev_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ ACE_TRY_CHECK;
+ ACE_TRY_EX (bind)
+ {
+ // Register the vdev with the naming server.
+ this->naming_context_->bind (this->vdev_name_,
+ vdev_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX (bind);
+ }
+ ACE_CATCH (CosNaming::NamingContext::AlreadyBound,ex)
+ {
+ // If the object was already there, replace the older reference
+ // with this one
+ this->naming_context_->rebind (this->vdev_name_,
+ vdev_obj_.in()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::register_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Child_Process::register_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// run the orb event look
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::run (ACE_Time_Value *tv)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ this->orb_->run (tv ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"orb.run ()");
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+// release the semaphore the parent is waiting on
+template <class T_StreamEndpoint_B, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint_B, T_VDev, T_MediaCtrl>::release_semaphore ()
+{
+ char sem_str [BUFSIZ];
+
+ long pid = this->pid_;
+ sprintf (sem_str,
+ "%s:%s:%ld",
+ "TAO_AV_Process_Semaphore",
+ this->host_,
+ pid);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) semaphore is %s\n",
+ sem_str));
+
+ // Release the lock on which the server is waiting
+ ACE_Process_Semaphore semaphore (0, // 0 means that the semaphore is
+ // initially locked
+ sem_str);
+
+ if (semaphore.release () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error releasing semaphore %s: %p\n",
+ sem_str,
+ "semaphore.release ()"),
+ -1);
+
+ return 0;
+}
+
+// register the stream_endpoint with the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process <T_StreamEndpoint, T_VDev, T_MediaCtrl>::register_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::Object_ptr stream_endpoint_obj = CORBA::Object::_nil ();
+ ACE_TRY
+ {
+ stream_endpoint_obj = this->stream_endpoint_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Create a name for the video control object
+ // subclasses can define their own name for the streamendpoint
+ // Register the stream endpoint object with the naming server.
+ this->naming_context_->bind (this->stream_endpoint_name_,
+ stream_endpoint_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCH (CosNaming::NamingContext::AlreadyBound,ex)
+ {
+ // if the name was already there, replace the reference with the new one
+ this->naming_context_->rebind (this->stream_endpoint_name_,
+ stream_endpoint_obj
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Reactive_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Bridge method to make a new stream_endpoint
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_stream_endpoint (T_StreamEndpoint *&stream_endpoint)
+{
+ ACE_NEW_RETURN (stream_endpoint,
+ T_StreamEndpoint,
+ -1);
+ return 0;
+}
+
+// Bridge method to make a new vdev
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_vdev (T_VDev *&vdev)
+{
+ ACE_NEW_RETURN (vdev,
+ T_VDev,
+ -1);
+ return 0;
+}
+
+// Bridge method to make a new media controller
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::make_mediactrl (T_MediaCtrl *&media_ctrl)
+{
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t) TAO_AV_Child_Process::make_mediactrl ()\n"));
+ ACE_NEW_RETURN (media_ctrl,
+ T_MediaCtrl,
+ -1);
+ return 0;
+}
+
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+int
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::unbind_names (void)
+{
+ // Remove the names from the naming service
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ if (CORBA::is_nil (this->naming_context_.in ()) == 0)
+ return 0;
+ this->naming_context_->unbind (this->stream_endpoint_name_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->naming_context_->unbind (this->vdev_name_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_Endpoint_Process_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// %% its not clear whether we should be deleting the objects, since
+// if the application overrides the make_mediactrl methods etc.,
+// then, we may not own these objects.
+// For now, we dont delete the objects, since they exist for the
+// lifetime of the process anyway
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process<T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process ()
+{
+ this->unbind_names ();
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process_A
+// ----------------------------------------------------------------------
+
+// Define the name of the stream_endpoint, as used to register with
+// the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_A<T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process_A ()
+{
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_A",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+ this->stream_endpoint_name_.length (1);
+ this->stream_endpoint_name_ [0].id = CORBA::string_dup (stream_endpoint_name);
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_A <T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process_A ()
+{
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Child_Process_B
+// ----------------------------------------------------------------------
+
+// Define the name of the stream_endpoint, as used to register with
+// the naming service
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::TAO_AV_Child_Process_B ()
+{
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_B",
+ this->host_,
+ static_cast<long> (this->pid_));
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+ this->stream_endpoint_name_.length (1);
+ this->stream_endpoint_name_ [0].id = CORBA::string_dup (stream_endpoint_name);
+}
+
+template <class T_StreamEndpoint, class T_VDev , class T_MediaCtrl>
+TAO_AV_Child_Process_B<T_StreamEndpoint, T_VDev, T_MediaCtrl>::~TAO_AV_Child_Process_B ()
+{
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_AV_ENDPOINT_STRATEGY_T_CPP */