diff options
628 files changed, 32805 insertions, 0 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index 591f6c9650f..be2bc0cb971 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,10 @@ +Tue Oct 21 19:10:21 UTC 2008 Abdullah Sowayan <abdullah.sowayan@lmco.com> + + * DevGuideExamples: + + Added examples from the OCI distribution. Special thanks to OCI + for contributing the examples. + Tue Oct 21 15:59:59 UTC 2008 Vladimir Zykov <vzykov@prismtech.com> * tests/Bug_1495_Regression/Client_Task.cpp: diff --git a/TAO/DevGuideExamples/AMH/AMH.mpc b/TAO/DevGuideExamples/AMH/AMH.mpc new file mode 100644 index 00000000000..8a36a59d928 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/AMH.mpc @@ -0,0 +1,20 @@ +project(*Server): taoexe, portableserver, amh { + idlflags += -Wb,pch_include=amh_pch.h + + Source_Files { + AMH_Messenger_i.cpp + MessengerServer.cpp + } +} + +// This project doesn't really require AMH, but since they +// are in the same directory and share the generated idl code +// it has to be there. +project(*Client): taoexe, amh { + idlflags += -Wb,pch_include=amh_pch.h + + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/AMH/AMH_Messenger_i.cpp b/TAO/DevGuideExamples/AMH/AMH_Messenger_i.cpp new file mode 100644 index 00000000000..2fdbf6e927e --- /dev/null +++ b/TAO/DevGuideExamples/AMH/AMH_Messenger_i.cpp @@ -0,0 +1,39 @@ +#include "amh_pch.h" +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "AMH_Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +AMH_Messenger_i::AMH_Messenger_i (void) +{ +} + +// Implementation skeleton destructor +AMH_Messenger_i::~AMH_Messenger_i (void) +{ +} + +void +AMH_Messenger_i::send_message ( + DevGuide::AMH_MessengerResponseHandler_ptr _tao_rh, + const char * user_name, + const char * subject, + const char * message + ) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::String_var inout_message_arg = + CORBA::string_dup("Thanks for the message."); + CORBA::Boolean result = 1; + + _tao_rh->send_message(result,inout_message_arg.inout ()); +} diff --git a/TAO/DevGuideExamples/AMH/AMH_Messenger_i.h b/TAO/DevGuideExamples/AMH/AMH_Messenger_i.h new file mode 100644 index 00000000000..150ff7059a3 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/AMH_Messenger_i.h @@ -0,0 +1,38 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef AMH_MESSENGER_I_H_ +#define AMH_MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class AMH_Messenger_i +class AMH_Messenger_i : public virtual POA_DevGuide::AMH_Messenger +{ +public: + //Constructor + AMH_Messenger_i (void); + + //Destructor + virtual ~AMH_Messenger_i (void); + + virtual void send_message ( + DevGuide::AMH_MessengerResponseHandler_ptr _tao_rh, + const char * user_name, + const char * subject, + const char * message + ); +}; + + +#endif /* AMH_MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/AMH/Messenger.idl b/TAO/DevGuideExamples/AMH/Messenger.idl new file mode 100644 index 00000000000..b307589b231 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/Messenger.idl @@ -0,0 +1,11 @@ +// Messenger.idl + +module DevGuide +{ + interface Messenger + { + boolean send_message(in string user_name, + in string subject, + inout string message); + }; +}; diff --git a/TAO/DevGuideExamples/AMH/MessengerClient.cpp b/TAO/DevGuideExamples/AMH/MessengerClient.cpp new file mode 100644 index 00000000000..8ae0fe979d6 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/MessengerClient.cpp @@ -0,0 +1,40 @@ +#include "amh_pch.h" + +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + DevGuide::Messenger_var messenger = + DevGuide::Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var msg = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", msg.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << msg.in() << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/AMH/MessengerServer.cpp b/TAO/DevGuideExamples/AMH/MessengerServer.cpp new file mode 100644 index 00000000000..f17c9cabd9d --- /dev/null +++ b/TAO/DevGuideExamples/AMH/MessengerServer.cpp @@ -0,0 +1,44 @@ +#include "amh_pch.h" + +#include "AMH_Messenger_i.h" +#include <iostream> +#include <fstream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + AMH_Messenger_i servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = poa->activate_object( &servant ); + obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/AMH/Messenger_i.cpp b/TAO/DevGuideExamples/AMH/Messenger_i.cpp new file mode 100644 index 00000000000..c825da18737 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/Messenger_i.cpp @@ -0,0 +1,35 @@ +#include "amh_pch.h" +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::string_free(message); + message = CORBA::string_dup("Thanks for the message."); + return 1; +} diff --git a/TAO/DevGuideExamples/AMH/Messenger_i.h b/TAO/DevGuideExamples/AMH/Messenger_i.h new file mode 100644 index 00000000000..8783559712b --- /dev/null +++ b/TAO/DevGuideExamples/AMH/Messenger_i.h @@ -0,0 +1,37 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/AMH/README b/TAO/DevGuideExamples/AMH/README new file mode 100644 index 00000000000..1ae24245c7b --- /dev/null +++ b/TAO/DevGuideExamples/AMH/README @@ -0,0 +1,43 @@ +File: DevGuideExamples/GettingStarted/README + + +This directory contains a CORBA example illustrating a simple client and +a server with a Interface Messenger. The Messenger Interface has +an operation for sending a message (send_message). The MessengerClient +will send a message which is displayed by the MessengerServer when +received. The MessengerClient will then confirm that the message has +been sent successfully. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/AMH/amh_pch.cpp b/TAO/DevGuideExamples/AMH/amh_pch.cpp new file mode 100644 index 00000000000..ab632ec71cb --- /dev/null +++ b/TAO/DevGuideExamples/AMH/amh_pch.cpp @@ -0,0 +1 @@ +#include "amh_pch.h" diff --git a/TAO/DevGuideExamples/AMH/amh_pch.h b/TAO/DevGuideExamples/AMH/amh_pch.h new file mode 100644 index 00000000000..1b4e8d10348 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/amh_pch.h @@ -0,0 +1,10 @@ +#ifndef PCH_H +#define PCH_H + +#ifdef USING_PCH +#include <tao/corba.h> +#include <tao/ORB_Core.h> +#include <tao/Stub.h> +#endif + +#endif diff --git a/TAO/DevGuideExamples/AMH/run_test.pl b/TAO/DevGuideExamples/AMH/run_test.pl new file mode 100644 index 00000000000..7c83927dfc1 --- /dev/null +++ b/TAO/DevGuideExamples/AMH/run_test.pl @@ -0,0 +1,44 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +# start MessengerServer + +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C = new PerlACE::Process("MessengerClient"); +$C->Spawn(); + +$CRET = $C->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/AMH_AMI/AMH_AMI.mpc b/TAO/DevGuideExamples/AMH_AMI/AMH_AMI.mpc new file mode 100644 index 00000000000..cd76f03f84c --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/AMH_AMI.mpc @@ -0,0 +1,51 @@ +project(*Client): taoexe, portableserver, messaging { + after += *Middle_Server + + IDL_Files { + } + + Source_Files { + middleC.cpp + client.cpp + } + // To avoid link errors with SunCC 5.[34], put this project's + // object files (and resulting SunWS_cache directory) in a different + // location than the default. + verbatim(gnuace, macros) { + VDIR := .obj/AMH_AMI_Client/ + } +} + +project(*Middle_Server): messaging, taoexe, portableserver, amh { + idlflags += -Wb,pch_include=amh_ami_pch.h + after += *Inner_Server + + IDL_Files { + middle.idl + } + + Source_Files { + middleS.cpp + middleC.cpp + innerS.cpp + innerC.cpp + middle_i.cpp + middle_server.cpp + inner_cb.cpp + } +} + +project(*Inner_Server): messaging, taoexe, portableserver, ami { + idlflags += -Wb,pch_include=amh_ami_pch.h + + IDL_Files { + inner.idl + } + + Source_Files { + innerS.cpp + innerC.cpp + inner_i.cpp + inner_server.cpp + } +} diff --git a/TAO/DevGuideExamples/AMH_AMI/README b/TAO/DevGuideExamples/AMH_AMI/README new file mode 100644 index 00000000000..3732baaed97 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/README @@ -0,0 +1,53 @@ +File: DevGuideExamples/AMH_AMI/README + +The example in this directory demonstrates how AMH can be coupled with +AMI to create very efficient and scalable middle components for +multi-tier applications. In this case, a client connects to a middle +server which in turn is connected to an inner server. the client +submits a question to the middle server, which forwards the question +on to the inner server. The inner server then waits a few seconds, to +simulate a busy process, then replies. The reply is handled +asynchronously by the middle server, using AMI, then forwarded to the +original client using AMH. Neither the client nor the inner server are +aware of the asynchronous nature of the middle server. + +The inner server has a single startup option, -crash. When supplied, +the server will induce an exception when invoked, rather than +returning the answer. + +The middle server also has a single option, -no_AMH. When run in this +mode, the IOR it publishes will refer to an object that does not use +AMH and AMI. This allows you to compare the behavior and source code +for these two modes of operation. + +How to Run +---------- + +Start the inner server (writes inner.ior) : +------------------ +./inner_server [-crash] + + +Then start the middle server (writes middle.ior): +------------------ +./middle_server [-no_AMH] + +Finally, run the client: +------------------ +./client + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl diff --git a/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.cpp b/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.cpp new file mode 100644 index 00000000000..b7aa56c8c40 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.cpp @@ -0,0 +1 @@ +#include "amh_ami_pch.h" diff --git a/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.h b/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.h new file mode 100644 index 00000000000..1b4e8d10348 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/amh_ami_pch.h @@ -0,0 +1,10 @@ +#ifndef PCH_H +#define PCH_H + +#ifdef USING_PCH +#include <tao/corba.h> +#include <tao/ORB_Core.h> +#include <tao/Stub.h> +#endif + +#endif diff --git a/TAO/DevGuideExamples/AMH_AMI/client.cpp b/TAO/DevGuideExamples/AMH_AMI/client.cpp new file mode 100644 index 00000000000..1a90fa27081 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/client.cpp @@ -0,0 +1,45 @@ +#include "amh_ami_pch.h" + +#include "middleC.h" + +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Asynch_Except_Demo object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://middle.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get middle IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Asycnh_Except_Demo object reference. + Middle_var mid = Middle::_narrow( obj.in() ); + if( CORBA::is_nil( mid.in() ) ) { + std::cerr << "IOR was not an middle object reference." << std::endl; + return 1; + } + + CORBA::String_var question = + CORBA::string_dup ("How much wood would a woodchuck chuck, if a woodchuck could chuck wood?"); + + std::cout << "Question is: " << question.in() << std::endl; + + + // trigger the exception via AMI call + CORBA::String_var answer = + mid->get_the_answer (question.in()); + + std::cout << "Answer is: " << answer.in() << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/AMH_AMI/inner.idl b/TAO/DevGuideExamples/AMH_AMI/inner.idl new file mode 100644 index 00000000000..77a86167084 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner.idl @@ -0,0 +1,7 @@ +// file: inner.idl + + +interface Inner +{ + string answer (in string question); +}; diff --git a/TAO/DevGuideExamples/AMH_AMI/inner_cb.cpp b/TAO/DevGuideExamples/AMH_AMI/inner_cb.cpp new file mode 100644 index 00000000000..6ce5e712976 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner_cb.cpp @@ -0,0 +1,60 @@ +#include "amh_ami_pch.h" +#include "inner_cb.h" +#include <iostream> +// Implementation skeleton constructor +Inner_callback_i::Inner_callback_i (PortableServer::POA_ptr p, + AMH_MiddleResponseHandler_ptr rh) + : poa_(PortableServer::POA::_duplicate (p)), + response_handler_ (AMH_MiddleResponseHandler::_duplicate (rh)) +{ +} + +// Implementation skeleton destructor +Inner_callback_i::~Inner_callback_i (void) +{ + std::cout << "Inner_callback_i destroying" << std::endl; + +} + +void +Inner_callback_i::answer (const char * ami_return_val) +{ + std::cout << "Inner_callback_i::answer called, return_val = " + << ami_return_val << std::endl; + this->response_handler_->get_the_answer (ami_return_val); + + std::cout << "inner_callback_i deactivating self" << std::endl; + PortableServer::ObjectId_var oid = this->poa_->servant_to_id(this); + this->poa_->deactivate_object (oid.in()); +} + +void +Inner_callback_i::answer_excep (Messaging::ExceptionHolder* excep_holder) +{ + // Here, we need to extract the exception from this holder, and package + // it in another so the AMH response handler may forward it on. + try + { + excep_holder->raise_exception(); + } + catch(const CORBA::Exception& ex) + { + CORBA::Exception *local_ex = ex._tao_duplicate(); + AMH_MiddleExceptionHolder amh_excep_holder (local_ex); + this->response_handler_->get_the_answer_excep (&amh_excep_holder); + } + catch(...) + { + std::cout + << "inner_callback_i::answer_excep got an unknown exception" + << std::endl; + + CORBA::Exception *unknown_ex = new CORBA::UNKNOWN; + AMH_MiddleExceptionHolder amh_excep_holder (unknown_ex); + this->response_handler_->get_the_answer_excep (&amh_excep_holder); + } + + std::cout << "inner_callback_i deactivating self" << std::endl; + PortableServer::ObjectId_var oid = this->poa_->servant_to_id(this); + this->poa_->deactivate_object (oid.in()); +} diff --git a/TAO/DevGuideExamples/AMH_AMI/inner_cb.h b/TAO/DevGuideExamples/AMH_AMI/inner_cb.h new file mode 100644 index 00000000000..cca0c349eac --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner_cb.h @@ -0,0 +1,28 @@ +// -*- C++ -*- +#ifndef INNER_CB_H +#define INNER_CB_H + +#include "innerS.h" +#include "middleC.h" + +class Inner_callback_i : public virtual POA_AMI_InnerHandler, + public virtual PortableServer::RefCountServantBase +{ +public: + //Constructor + Inner_callback_i (PortableServer::POA_ptr p, + AMH_MiddleResponseHandler_ptr rh); + + //Destructor + virtual ~Inner_callback_i(void); + + virtual void answer (const char * ami_return_val); + + virtual void answer_excep (Messaging::ExceptionHolder * excep_holder); + +private: + PortableServer::POA_var poa_; + AMH_MiddleResponseHandler_var response_handler_; +}; + +#endif diff --git a/TAO/DevGuideExamples/AMH_AMI/inner_i.cpp b/TAO/DevGuideExamples/AMH_AMI/inner_i.cpp new file mode 100644 index 00000000000..71a7020a330 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner_i.cpp @@ -0,0 +1,31 @@ +#include "amh_ami_pch.h" +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "inner_i.h" +#include <ace/OS.h> + +Inner_i::Inner_i (int d) + : divisor_ (d) +{ +} + +char * +Inner_i::answer (const char * question) +{ + ACE_UNUSED_ARG (question); // doesn't matter + + CORBA::String_var answer = + CORBA::string_dup ("I didn't know dogs could talk!"); + + int delay = 5/this->divisor_; // throw exception if divisor = 0 + + ACE_OS::sleep(delay); // make the caller wait a bit + return answer._retn(); +} diff --git a/TAO/DevGuideExamples/AMH_AMI/inner_i.h b/TAO/DevGuideExamples/AMH_AMI/inner_i.h new file mode 100644 index 00000000000..fbdbd5ee8fa --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner_i.h @@ -0,0 +1,34 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef AMH_INNER_I_H_ +#define AMH_INNER_I_H_ + +#include "innerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class Inner_i : public virtual POA_Inner, + public virtual PortableServer::RefCountServantBase +{ +public: + // ctor takes a 1 to delay and return string, a 0 to crash + Inner_i (int d); + + // will either return a string after a brief delay, or crash + virtual char * answer (const char *question); + +private: + int divisor_; +}; + + +#endif /* AMH_INNER_H_ */ diff --git a/TAO/DevGuideExamples/AMH_AMI/inner_server.cpp b/TAO/DevGuideExamples/AMH_AMI/inner_server.cpp new file mode 100644 index 00000000000..6dd9f551f27 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/inner_server.cpp @@ -0,0 +1,67 @@ +#include "amh_ami_pch.h" + +#include "inner_i.h" +#include "ace/SString.h" +#include "ace/OS_String.h" +#include <iostream> +#include <fstream> + +int dont_crash = 1; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + int c = 0; + while (c < argc) + { + if (ACE_OS::strcasecmp (argv[c], ACE_TEXT("-crash")) == 0) + dont_crash = 0; + c++; + } + + return 1; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + parse_args (argc, argv); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Inner_i servant(dont_crash); + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = poa->activate_object( &servant ); + obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( obj.in() ); + ACE_CString iorname ("inner.ior"); + std::ofstream iorFile (iorname.c_str()); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to " << iorname << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/AMH_AMI/middle.idl b/TAO/DevGuideExamples/AMH_AMI/middle.idl new file mode 100644 index 00000000000..eb15857ba67 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/middle.idl @@ -0,0 +1,6 @@ +// file: middle.idl + +interface Middle +{ + string get_the_answer (in string question); +}; diff --git a/TAO/DevGuideExamples/AMH_AMI/middle_i.cpp b/TAO/DevGuideExamples/AMH_AMI/middle_i.cpp new file mode 100644 index 00000000000..2b9d192bfcd --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/middle_i.cpp @@ -0,0 +1,59 @@ +#include "amh_ami_pch.h" +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "middle_i.h" +#include "inner_cb.h" + +#include <iostream> +// Implementation skeleton constructor +Asynch_Middle_i::Asynch_Middle_i (PortableServer::POA_ptr poa, + Inner_ptr inner) + : poa_ (PortableServer::POA::_duplicate(poa)), + inner_ (Inner::_duplicate(inner)) +{ +} + +void +Asynch_Middle_i::get_the_answer (AMH_MiddleResponseHandler_ptr _tao_rh, + const char * question) +{ + // The callback handler servant instance holds on to a reference to the + // AMH response handler. That way, it can forward the reply back to the + // originial client after getting the reply from the inner server. + PortableServer::ServantBase_var servant = new Inner_callback_i(this->poa_.in(), + _tao_rh); + PortableServer::ObjectId_var objid = + this->poa_->activate_object(servant.in()); + CORBA::Object_var obj = this->poa_->id_to_reference (objid.in()); + + AMI_InnerHandler_var cb = AMI_InnerHandler::_narrow(obj.in()); + + // forward the request on to the inner server, with the callback handler + // reference. + this->inner_->sendc_answer (cb.in(),question); + + // nothing else to do. Our client will block until the callback handler + // forwards the reply. +} + + +//------------------------------------------------------------------------ + +// Implementation skeleton constructor +Middle_i::Middle_i (Inner_ptr inner) + : inner_ (Inner::_duplicate(inner)) +{ +} + +char * +Middle_i::get_the_answer ( const char * question ) +{ + return inner_->answer (question); +} diff --git a/TAO/DevGuideExamples/AMH_AMI/middle_i.h b/TAO/DevGuideExamples/AMH_AMI/middle_i.h new file mode 100644 index 00000000000..1574d91e4f1 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/middle_i.h @@ -0,0 +1,46 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MIDDLE_I_H_ +#define MIDDLE_I_H_ + +#include "middleS.h" +#include "innerC.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class Asynch_Middle_i : public virtual POA_AMH_Middle, + public virtual PortableServer::RefCountServantBase +{ +public: + //Constructor + Asynch_Middle_i (PortableServer::POA_ptr poa, Inner_ptr inner); + + virtual void get_the_answer (AMH_MiddleResponseHandler_ptr _tao_rh, + const char * question); + +private: + PortableServer::POA_var poa_; + Inner_var inner_; +}; + +// This version of the implementation does not use AMH, It is supplied for +// comparison. Either this or the asynch version may be used to serve +// "Middle" objects. +class Middle_i : public virtual POA_Middle, + public virtual PortableServer::RefCountServantBase +{ +public: + //Constructor + Middle_i (Inner_ptr inner); + + virtual char * get_the_answer (const char * question); + +private: + PortableServer::POA_var poa_; + Inner_var inner_; +}; + + +#endif /* MIDDLE_I_H_ */ diff --git a/TAO/DevGuideExamples/AMH_AMI/middle_server.cpp b/TAO/DevGuideExamples/AMH_AMI/middle_server.cpp new file mode 100644 index 00000000000..9e0fd150481 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/middle_server.cpp @@ -0,0 +1,81 @@ +#include "amh_ami_pch.h" + +#include "middle_i.h" +#include <ace/OS_String.h> +#include <iostream> +#include <fstream> + +int use_synch = 0; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + int c = 0; + while (c < argc) + { + if (ACE_OS::strcasecmp (argv[c], "-no_AMH") == 0) + use_synch = 1; + c++; + } + + return 1; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + parse_args(argc,argv); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + obj = orb->string_to_object("file://inner.ior"); + Inner_var peer = + Inner::_narrow(obj.in()); + if (CORBA::is_nil(peer.in())) + { + std::cerr << "Could not initialize peer object reference" << std::endl; + exit (1); + } + + // create either a synchronous or AMH_based servant depending on command + // line arguement. + PortableServer::ServantBase_var servant; + if (use_synch) + servant = new Middle_i (peer.in()); + else + servant = new Asynch_Middle_i(poa.in(), peer.in()); + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = poa->activate_object(servant.in()); + obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( obj.in() ); + + ACE_CString iorname("middle.ior"); + std::ofstream iorFile (iorname.c_str()); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to " << iorname << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/AMH_AMI/run_test.pl b/TAO/DevGuideExamples/AMH_AMI/run_test.pl new file mode 100644 index 00000000000..8e704213c77 --- /dev/null +++ b/TAO/DevGuideExamples/AMH_AMI/run_test.pl @@ -0,0 +1,58 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$inner_ior = PerlACE::LocalFile ("inner.ior"); +$middle_ior = PerlACE::LocalFile ("middle.ior"); +unlink $inner_ior; +unlink $middle_ior; + +# start inner_server + +$IS = new PerlACE::Process("inner_server"); +$IS->Spawn(); + +if (PerlACE::waitforfile_timed ($inner_ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$inner_ior>\n"; + $IS->Kill(); + unlink $inner_ior; + exit 1; +} + + +# start middle_server + +$MS = new PerlACE::Process("middle_server"); +$MS->Spawn(); + +if (PerlACE::waitforfile_timed ($middle_ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$middle_ior>\n"; + $MS->Kill(); + unlink $middle_ior; + exit 1; +} + +# start client + +$C = new PerlACE::Process("client"); +$C->Spawn(); + +$CRET = $C->WaitKill(25); +$IS->Kill(); +$MS->Kill(); + +# clean-up + +unlink $inner_ior; +unlink $middle_ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/BiDirectionalGIOP.mpc b/TAO/DevGuideExamples/BiDirectionalGIOP/BiDirectionalGIOP.mpc new file mode 100644 index 00000000000..d75d57f1c56 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/BiDirectionalGIOP.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, avoids_minimum_corba, bidir_giop, avoids_corba_e_micro { + exename = server + idlflags += -Wb,pch_include=bidir_giop_pch.h + Source_Files { + callbackC.cpp + simpleC.cpp + simpleS.cpp + simple_i.cpp + server.cpp + } +} + +project(*Client): taoexe, portableserver, avoids_minimum_corba, bidir_giop, avoids_corba_e_micro { + exename = client + idlflags += -Wb,pch_include=bidir_giop_pch.h + Source_Files { + simpleC.cpp + callbackC.cpp + callbackS.cpp + callback_i.cpp + client.cpp + } +} diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/README b/TAO/DevGuideExamples/BiDirectionalGIOP/README new file mode 100644 index 00000000000..6314e1cd301 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/README @@ -0,0 +1,27 @@ +This example is a copy of the $TAO_ROOT/test/BiDirerectional test +but it does not use ACE_TRY/ENVIRONMENT macros. + +This example exercises the birectional GIOP connection +implementation in TAO. + +Start like this: + +$ server -o <file.ior> -i <no_iterations> +$ client -k file://<file.ior> + +The server starts up writing the IOR to the file. The client then +starts up, creates its own object and passes the reference to the +server. Then it invokes a method on the server to indicate that it is +ready for callback. The server then callsback the client on the same +connection <no_iterations> times. If the server creates a new +connection the server will crash itself. + +Each time the client recieves a callback, it outputs: +Callback method called. + + + + + + + diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.cpp b/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.cpp new file mode 100644 index 00000000000..570337d5803 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.cpp @@ -0,0 +1 @@ +#include "bidir_giop_pch.h" diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.h b/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.h new file mode 100644 index 00000000000..cc3b7dd664f --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/bidir_giop_pch.h @@ -0,0 +1,15 @@ +#ifndef BIDIR_GIOP_PCH_H +#define BIDIR_GIOP_PCH_H + +// See the Devguide chapter on Getting Started With Visual C++ for +// more information on how to correctly use precompiled headers. +// Currently only Windows VC++ defines USING_PCH so this file +// is effectively empty for other platforms. + +#ifdef USING_PCH +#include "tao/corba.h" +#include "tao/ORB_Core.h" +#include "tao/Stub.h" +#endif + +#endif diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/callback.idl b/TAO/DevGuideExamples/BiDirectionalGIOP/callback.idl new file mode 100644 index 00000000000..ddb989750a2 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/callback.idl @@ -0,0 +1,10 @@ +interface Callback +{ + // A safe way to shutdown the client, using either clean shutdowns + // or "catastrophic failures". + oneway void shutdown(); + + // A simple remote call + void callback_method(); +}; + diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.cpp b/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.cpp new file mode 100644 index 00000000000..cc4d9d3977b --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.cpp @@ -0,0 +1,26 @@ +#include "bidir_giop_pch.h" + +#include "callback_i.h" +#include <iostream> + +Callback_i::Callback_i (CORBA::ORB_ptr orb) +: orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +Callback_i::~Callback_i (void) +{ +} + +void Callback_i::shutdown () +{ + std::cout << "Performing clean shutdown." << std::endl; + const int wait = 0; + orb_->shutdown(wait); +} + +void Callback_i::callback_method () +{ + std::cout << "Callback method called." << std::endl; +} + diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.h b/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.h new file mode 100644 index 00000000000..dc70a79ed39 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/callback_i.h @@ -0,0 +1,22 @@ +#ifndef CALLBACKI_H_ +#define CALLBACKI_H_ + +#include "callbackS.h" + +class Callback_i : public virtual POA_Callback +{ +public: + Callback_i (CORBA::ORB_ptr orb); + + virtual ~Callback_i (void); + + virtual void shutdown (void); + + virtual void callback_method (void); + +private: + CORBA::ORB_var orb_; +}; + + +#endif /* CALLBACKI_H_ */ diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/client.cpp b/TAO/DevGuideExamples/BiDirectionalGIOP/client.cpp new file mode 100644 index 00000000000..d935c5e1b5e --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/client.cpp @@ -0,0 +1,101 @@ +#include "bidir_giop_pch.h" + +#include "callback_i.h" +#include "simpleC.h" + +#include <ace/Get_Opt.h> +#include <ace/Argv_Type_Converter.h> +#include <tao/BiDir_GIOP/BiDirGIOP.h> + +#include <iostream> + +ACE_TString ior = ACE_TEXT ("file://test.ior"); + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("k:")); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'k': + ior = get_opts.optarg; + break; + + case '?': + default: + std::cerr << "usage: " << argv[0] << " -k <ior>" << std::endl; + return -1; + break; + } + return 0; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + + if (parse_args (argc, argv) != 0) { + return 1; + } + + try { + ACE_Argv_Type_Converter conv(argc, argv); + CORBA::ORB_var orb = CORBA::ORB_init(conv.get_argc(), + conv.get_TCHAR_argv (), ""); + + // Create a bidirectional POA + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var poa_manager = root_poa->the_POAManager(); + // Policies for the childPOA to be created. + CORBA::PolicyList policies(1); + policies.length(1); + CORBA::Any pol; + pol <<= BiDirPolicy::BOTH; + policies[0] = + orb->create_policy(BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE, pol); + // Create POA as child of RootPOA with the above policies. This POA + // will receive request in the same connection in which it sent + // the request + PortableServer::POA_var poa = root_poa->create_POA("bidirPOA", poa_manager.in(), policies); + // Creation of bidirPOA is over. Destroy the Policy objects. + for (CORBA::ULong i = 0; i < policies.length (); ++i) { + policies[i]->destroy (); + } + poa_manager->activate (); + + // get server object + obj = orb->string_to_object(ACE_TEXT_ALWAYS_CHAR(ior.c_str())); + Simple_var server = Simple::_narrow (obj.in()); + + Callback_i callback_svt(orb.in()); + + // Register and activate callback servant + PortableServer::ObjectId_var id = poa->activate_object(&callback_svt); + obj = poa->id_to_reference(id.in()); + Callback_var callback = Callback::_narrow(obj.in()); + + server->callback_object (callback.in()); + + CORBA::Long r = server->test_method(1); // Tell the server to call us back. + if (r != 0) { + std::cout << "unexpected result = " << r << std::endl; + } + + orb->run(); + + int etherealize = 1, wait = 1; + poa->destroy(etherealize, wait); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA::Exception: " << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/run_test.pl b/TAO/DevGuideExamples/BiDirectionalGIOP/run_test.pl new file mode 100644 index 00000000000..f126f2865ef --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/run_test.pl @@ -0,0 +1,39 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$iorfile = "test.ior"; +unlink $iorfile; + +$SV = new PerlACE::Process ("server", "-o $iorfile -i 100"); +$CL = new PerlACE::Process ("client", "-k file://$iorfile"); + +$SV->Spawn (); + +if (PerlACE::waitforfile_timed ($iorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $SV->Kill (); + exit 1; +} + +$status = 0; + +$client = $CL->SpawnWaitKill (15); +if ($client != 0) { + print STDERR "ERROR: client returned $client\n"; + $status = 1; +} + +$server = $SV->WaitKill (5); +if ($server != 0) { + print STDERR "ERROR: server returned $server\n"; + $status = 1; +} + +unlink $iorfile; + +exit $status; diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/server.cpp b/TAO/DevGuideExamples/BiDirectionalGIOP/server.cpp new file mode 100644 index 00000000000..a9af3367bfa --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/server.cpp @@ -0,0 +1,115 @@ +#include "bidir_giop_pch.h" + +#include "simple_i.h" +#include "callbackC.h" + +#include <ace/Get_Opt.h> +#include <ace/Argv_Type_Converter.h> +#include <tao/BiDir_GIOP/BiDirGIOP.h> +#include <iostream> +#include <fstream> + +ACE_TString ior_output_file; +int callback_count = 10; + +int +parse_args(int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts(argc, argv, ACE_TEXT("o:i:")); + int c; + + while((c = get_opts()) != -1) + switch(c) + { + case 'o': + ior_output_file = get_opts.optarg; + break; + case 'i': + callback_count = ACE_OS::atoi(get_opts.optarg); + break; + case '?': + default: + std::cerr << "usage: " << argv[0] << "-o <iorfile> -i <no_iterations>" << std::endl; + return -1; + break; + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +ACE_TMAIN(int argc, ACE_TCHAR *argv[]) +{ + if (parse_args(argc, argv) != 0) { + return 1; + } + + try + { + ACE_Argv_Type_Converter conv(argc, argv); + CORBA::ORB_var orb = CORBA::ORB_init(conv.get_argc(), + conv.get_TCHAR_argv(), ""); + + // Create a bidirectional POA + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var poa_manager = root_poa->the_POAManager(); + // Policies for the childPOA to be created. + CORBA::PolicyList policies(1); + policies.length(1); + CORBA::Any pol; + pol <<= BiDirPolicy::BOTH; + policies[0] = + orb->create_policy(BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE, pol); + // Create POA as child of RootPOA with the above policies. This POA + // will receive request in the same connection in which it sent + // the request + PortableServer::POA_var poa = root_poa->create_POA("bidirPOA", poa_manager.in(), policies); + // Creation of bidirPOA is over. Destroy the Policy objects. + for (CORBA::ULong i = 0; i < policies.length (); ++i) { + policies[i]->destroy (); + } + poa_manager->activate (); + + Simple_i svt(orb.in(), callback_count); + + // Register and activate Simple servant + PortableServer::ObjectId_var id = poa->activate_object(&svt); + obj = poa->id_to_reference(id.in()); + Simple_var server = Simple::_narrow(obj.in()); + + CORBA::String_var ior = orb->object_to_string(server.in()); + if (ior_output_file != ACE_TEXT("")) { + std::ofstream outfile(ACE_TEXT_ALWAYS_CHAR(ior_output_file.c_str())); + outfile << ior.in(); + } + std::cout << "Activated as " << ior.in() << std::endl; + + // Our own special orb->run() that knows how to callback clients + while (true) { + + // returns 1 as soon as it has successfully called back. + if (svt.call_client()) { + break; + } + + // We don't want to check for work pending, because we really want + // to simulate a normal orb->run() while adding the ability to call + // our routine which calls back to the client. + orb->perform_work(); + } + + std::cout << "Event loop finished." << std::endl; + + int etherealize = 1, wait = 1; + poa->destroy(etherealize, wait); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA::Exception: " << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/simple.idl b/TAO/DevGuideExamples/BiDirectionalGIOP/simple.idl new file mode 100644 index 00000000000..e6ef4fffa86 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/simple.idl @@ -0,0 +1,14 @@ +#include "callback.idl" + +interface Simple +{ + // Just call a method on the server, + long test_method(in boolean do_callback); + + // send the callback object to the server + void callback_object(in Callback cb); + + // A safe way to shutdown the server, it is a oneway function so we + // will never get a COMM_FAILURE error + oneway void shutdown(); +}; diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.cpp b/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.cpp new file mode 100644 index 00000000000..be05be761e9 --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.cpp @@ -0,0 +1,77 @@ +#include "bidir_giop_pch.h" + +#include "simple_i.h" + +#include <tao/ORB_Core.h> +#include <tao/Transport_Cache_Manager.h> +#include <tao/Thread_Lane_Resources.h> + +#include <iostream> + +Simple_i::Simple_i (CORBA::ORB_ptr orb, int callback_count) +: orb_(CORBA::ORB::_duplicate(orb)) +, ready_for_callback_(0) +, callback_count_(callback_count) +, callback_(0) +{ +} + +Simple_i::~Simple_i (void) +{ +} + +CORBA::Long Simple_i::test_method (CORBA::Boolean do_callback) +ACE_THROW_SPEC (( + CORBA::SystemException +)) +{ + if (do_callback) { + ready_for_callback_ = 1; + } + return 0; +} + +void Simple_i::callback_object (Callback_ptr cb) +ACE_THROW_SPEC (( + CORBA::SystemException +)) +{ + callback_ = Callback::_duplicate(cb); +} + +void Simple_i::shutdown () +ACE_THROW_SPEC (( + CORBA::SystemException +)) +{ + const int wait = 0; + orb_->shutdown(wait); +} + +int +Simple_i::call_client() +{ + if (ready_for_callback_) { + + ready_for_callback_ = 0; + + for (int times = 0; times < callback_count_; ++times) { + + callback_->callback_method(); + + if (orb_->orb_core()->lane_resources().transport_cache().current_size() > 1) + { + std::cerr << "The connection cache has grown. " + << "BiDirection did not work. aborting..." << std::endl; + ACE_OS::abort(); // Should probably define and throw a UserException + } + } + + callback_->shutdown(); + + return 1; + } + + return 0; +} + diff --git a/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.h b/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.h new file mode 100644 index 00000000000..feb107e351f --- /dev/null +++ b/TAO/DevGuideExamples/BiDirectionalGIOP/simple_i.h @@ -0,0 +1,46 @@ +#ifndef SIMPLEI_H_ +#define SIMPLEI_H_ + +#include "simpleS.h" + +class Simple_i : public virtual POA_Simple +{ +public: + Simple_i (CORBA::ORB_ptr orb, int iterations); + + virtual ~Simple_i (void); + +virtual CORBA::Long test_method ( + CORBA::Boolean do_callback + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual void callback_object ( + Callback_ptr cb + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual void shutdown ( + + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + /// Not part of the CORBA interface. This method is called + /// by our special orb event loop in server main(). + int call_client(); + +private: + CORBA::ORB_var orb_; + int ready_for_callback_; + int callback_count_; + Callback_var callback_; +}; + + +#endif /* SIMPLEI_H_ */ diff --git a/TAO/DevGuideExamples/CIAO/CIAO.mwc b/TAO/DevGuideExamples/CIAO/CIAO.mwc new file mode 100644 index 00000000000..d90104a2381 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/CIAO.mwc @@ -0,0 +1,2 @@ +workspace { +} diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator.cidl b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.cidl new file mode 100644 index 00000000000..0d6f1f9fd97 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.cidl @@ -0,0 +1,22 @@ +/** + * @file Administrator.cidl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef ADMINISTRATOR_CIDL +#define ADMINISTRATOR_CIDL + +#include <Administrator.idl> + +composition session Administrator_Impl +{ + home executor AdministratorHome_Exec + { + implements AdministratorHome; + manages Administrator_Exec; + }; +}; + +#endif + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator.idl b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.idl new file mode 100644 index 00000000000..ee67ebfb5ff --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.idl @@ -0,0 +1,22 @@ +/** + * @file Administrator.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef ADMINISTRATOR_IDL +#define ADMINISTRATOR_IDL + +#include <Components.idl> +#include <Runnable.idl> +#include <Publication.idl> + +component Administrator { + uses multiple Runnable runnables; + uses multiple Publication content; +}; + +home AdministratorHome manages Administrator {}; + +#endif + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator.mpc b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.mpc new file mode 100644 index 00000000000..1921aa4e0a9 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator.mpc @@ -0,0 +1,96 @@ +// +// @file Administrator.mpc +// +// @author Don Busch <busch_d@ociweb.com> +// + +project(Administrator_idl): ciao_client_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,stub_export_macro=ADMINISTRATOR_STUB_Export + idlflags += -Wb,stub_export_include=Administrator_stub_export.h + idlflags += -Wb,skel_export_macro=ADMINISTRATOR_SVNT_Export + idlflags += -Wb,skel_export_include=Administrator_svnt_export.h + + IDL_Files { + Administrator.idl + } +} + + +project(Administrator_stub): ciao_client_dnc { + requires += cidl + + after += Messenger_stub Administrator_idl + sharedname = Administrator_stub + libs += Messenger_stub + dynamicflags = ADMINISTRATOR_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + AdministratorC.cpp + } +} + +project(Administrator_cidl): ciao_servant_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,export_macro=ADMINISTRATOR_SVNT_Export + idlflags += -Wb,export_include=Administrator_svnt_export.h + + // cidlc does NOT automatically add the current directory to + // the include path. This is a worksround to add it. We have + // to insert it before the "--" that is at the end of the + // default cidlflags. + cidlflags -= -- + cidlflags += -I. -- + + // project must be a ciao_servant or ciao_server to use CIDL files + CIDL_Files { + Administrator.cidl + } + + IDL_Files { + AdministratorE.idl + } +} + +project(Administrator_svnt): ciao_servant_dnc { + requires += cidl + after += Administrator_cidl Administrator_stub + sharedname = Administrator_svnt + libs += Administrator_stub Messenger_stub + dynamicflags = ADMINISTRATOR_SVNT_BUILD_DLL + + Source_Files { + AdministratorS.cpp + AdministratorEC.cpp + Administrator_svnt.cpp + } + CIDL_Files { + } + IDL_Files { + } +} + +project(Administrator_exec): ciao_component_dnc { + requires += cidl + + after += Administrator_svnt + sharedname = Administrator_exec + libs += Administrator_stub Administrator_svnt Messenger_stub + dynamicflags = ADMINISTRATOR_EXEC_BUILD_DLL + + IDL_Files { + } + + Source_Files { + AdministratorES.cpp + Administrator_exec_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client.cpp new file mode 100644 index 00000000000..2fdd28af3ab --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client.cpp @@ -0,0 +1,121 @@ +/** + * @file Administrator_Client.cpp + * + * Do NOT put this file in a project; it is included by + * Administrator_Client_IDL2.cpp and Administrator_Client_IDL3.cpp + * This file will not build on its own. + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#include "ace/Get_Opt.h" +#include <iostream> + +const char* ior = "file://Messenger.ior"; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, "k:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'k': + ior = get_opts.optarg; + break; + + case '?': + default: + std::cerr << "usage: " << argv[0] << " -k <ior>" << std::endl; + return -1; + break; + } + return 0; +} + +int +svc( Runnable_ptr runnable, Publication_ptr publication ) +{ + enum SelectionType { START=1, STOP, CHANGE_PERIOD, CHANGE_TEXT, EXIT }; + + bool done = false; + do { + std::cout << "\nWhat do you want to do to the Messenger(s)?" << std::endl; + std::cout << START << ". Start" << std::endl; + std::cout << STOP << ". Stop" << std::endl; + std::cout << CHANGE_PERIOD << ". Change Publication Period" << std::endl; + std::cout << CHANGE_TEXT << ". Change Publication Text" << std::endl; + std::cout << EXIT << ". Exit" << std::endl; + + char selection_text[10]; + std::cout << "Please enter a selection: "; + std::cin.getline( selection_text, sizeof(selection_text) ); + int selection = ACE_OS::atoi(selection_text); + + switch (selection) { + case START: { + runnable->start(); + break; + } + case STOP: { + runnable->stop(); + break; + } + case CHANGE_PERIOD: { + char period[10]; + std::cout << "Please enter a new period in seconds: "; + std::cin.getline( period, sizeof( period ) ); + publication->period( ACE_OS::atoi(period) ); + break; + } + case CHANGE_TEXT: { + char buffer[1024]; + std::cout << "Please enter new text: "; + std::cin.getline( buffer, sizeof(buffer) ); + publication->text( buffer ); + break; + } + case EXIT: { + done = true; + break; + } + default: + std::cout << "Please enter a valid option" << std::endl; + } + } while ( !done ); + + return 0; +} + +int +main (int argc, char *argv[]) +{ + + if (parse_args (argc, argv) != 0) { + return 1; + } + + try { + + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, ""); + + // get Messenger object + CORBA::Object_var obj = orb->string_to_object(ior); + Messenger_var messenger = Messenger::_narrow (obj.in()); + + Runnable_var runnable = messenger->provide_control(); + Publication_var publication = messenger->provide_content (); + + svc( runnable.in(), publication.in() ); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA::Exception: " << std::endl << ex << std::endl; + } + + return 1; +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.cpp new file mode 100644 index 00000000000..f3c508a50ef --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.cpp @@ -0,0 +1,8 @@ +/** + * @file Administrator_Client_IDL2.cpp + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#include "idl2/Messenger_IDL2C.h" +#include "Administrator_Client.cpp" diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.mpc b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.mpc new file mode 100644 index 00000000000..4ee650af0de --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL2.mpc @@ -0,0 +1,45 @@ +project(Administrator_Client_IDL2_Compile): taoidl3toidl2defaults { + requires += cidl + // ensures that only idl3-to-idl2 processing is performed + custom_only = 1 + + idl3toidl2flags += -I. -o idl2 + + IDL3TOIDL2_Files { + gendir = idl2 + Runnable.idl + Publication.idl + Message.idl + History.idl + Administrator.idl + Messenger.idl + } +} + +project(Administrator_Client_IDL2): ciao_client_dnc, valuetype { + requires += cidl + after += Administrator_Client_IDL2_Compile + + exename = Administrator_Client_IDL2 + idlflags += -Sm -Iidl2 -o idl2 -SS + + IDL_Files { + gendir = idl2 + idl2/Runnable_IDL2.idl + idl2/Publication_IDL2.idl + idl2/Message_IDL2.idl + idl2/History_IDL2.idl + idl2/Administrator_IDL2.idl + idl2/Messenger_IDL2.idl + } + + Source_Files { + Administrator_Client_IDL2.cpp + idl2/Administrator_IDL2C.cpp + idl2/Messenger_IDL2C.cpp + idl2/Publication_IDL2C.cpp + idl2/Runnable_IDL2C.cpp + idl2/History_IDL2C.cpp + idl2/Message_IDL2C.cpp + } +} diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.cpp new file mode 100644 index 00000000000..5dd6316f986 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.cpp @@ -0,0 +1,8 @@ +/** + * @file Administrator_Client_IDL3.cpp + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#include "MessengerC.h" +#include "Administrator_Client.cpp" diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.mpc b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.mpc new file mode 100644 index 00000000000..045b2dd2d88 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_Client_IDL3.mpc @@ -0,0 +1,29 @@ +// +// @file Administrator_Client_IDL3.mpc +// +// @author Don Busch <busch_d@ociweb.com> +// + +project(Administrator_Client_IDL3): ciao_client_dnc, valuetype, { + requires += cidl + after += Messenger_stub + libs += Messenger_stub + + exename = Administrator_Client_IDL3 + + IDL_Files { + // IDL stubs are linked from the Messenger_stub library; + // this empty section prevents all of the IDL stub code from + // being linked into this executable as well + } + + Header_Files { + // this empty section prevents all of the header files + // being includes in this project + } + + Source_Files { + Administrator_Client_IDL3.cpp + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_export.h new file mode 100644 index 00000000000..e90abc0929b --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl ADMINISTRATOR_EXEC +// ------------------------------ +#ifndef ADMINISTRATOR_EXEC_EXPORT_H +#define ADMINISTRATOR_EXEC_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (ADMINISTRATOR_EXEC_HAS_DLL) +# define ADMINISTRATOR_EXEC_HAS_DLL 1 +#endif /* ! ADMINISTRATOR_EXEC_HAS_DLL */ + +#if defined (ADMINISTRATOR_EXEC_HAS_DLL) && (ADMINISTRATOR_EXEC_HAS_DLL == 1) +# if defined (ADMINISTRATOR_EXEC_BUILD_DLL) +# define ADMINISTRATOR_EXEC_Export ACE_Proper_Export_Flag +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* ADMINISTRATOR_EXEC_BUILD_DLL */ +# define ADMINISTRATOR_EXEC_Export ACE_Proper_Import_Flag +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* ADMINISTRATOR_EXEC_BUILD_DLL */ +#else /* ADMINISTRATOR_EXEC_HAS_DLL == 1 */ +# define ADMINISTRATOR_EXEC_Export +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARATION(T) +# define ADMINISTRATOR_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* ADMINISTRATOR_EXEC_HAS_DLL == 1 */ + +// Set ADMINISTRATOR_EXEC_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (ADMINISTRATOR_EXEC_NTRACE) +# if (ACE_NTRACE == 1) +# define ADMINISTRATOR_EXEC_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define ADMINISTRATOR_EXEC_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !ADMINISTRATOR_EXEC_NTRACE */ + +#if (ADMINISTRATOR_EXEC_NTRACE == 1) +# define ADMINISTRATOR_EXEC_TRACE(X) +#else /* (ADMINISTRATOR_EXEC_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define ADMINISTRATOR_EXEC_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (ADMINISTRATOR_EXEC_NTRACE == 1) */ + +#endif /* ADMINISTRATOR_EXEC_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.cpp new file mode 100644 index 00000000000..e99433bda39 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.cpp @@ -0,0 +1,278 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "Administrator_exec_i.h" +#include "ciao/CIAO_common.h" + +// MY CODE +#include <iostream> +#include <string> + +namespace CIDL_Administrator_Impl +{ + //================================================================== + // Component Executor Implementation Class: Administrator_exec_i + //================================================================== + + Administrator_exec_i::Administrator_exec_i (void) + { + } + + Administrator_exec_i::~Administrator_exec_i (void) + { + } + + // Supported or inherited operations. + + // Attribute operations. + + // Port operations. + + // Operations from Components::SessionComponent + + void + Administrator_exec_i::set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + this->context_ = + Administrator_Context::_narrow ( + ctx); + + if (this->context_ == 0) + { + throw CORBA::INTERNAL (); + } + } + + void + Administrator_exec_i::ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + + // MY CODE + ACE_DEBUG((LM_INFO, ACE_TEXT("ccm_activate\n" ))); + + // Activate the Task + this->activate(); + } + + void + Administrator_exec_i::ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + + // MY CODE + ACE_DEBUG((LM_INFO, ACE_TEXT("ccm_passivate\n" ))); + } + + void + Administrator_exec_i::ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("ccm_remove\n"))); + } + + void + Administrator_exec_i::ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("ciao_preactivate\n"))); + } + + void + Administrator_exec_i::ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("ciao_postactivate\n"))); + } + + // Overridden from ACE_Task_Base + int + Administrator_exec_i::svc() + { + enum SelectionType { START=1, STOP, CHANGE_PERIOD, CHANGE_TEXT,EXIT }; + + bool done = false; + do { + std::cout << "\nWhat do you want to do to the Messenger(s)?" << std::endl; + std::cout << START << ". Start" << std::endl; + std::cout << STOP << ". Stop" << std::endl; + std::cout << CHANGE_PERIOD << ". Change Publication Period" << std::endl; + std::cout << CHANGE_TEXT << ". Change Publication Text" << std::endl; + std::cout << EXIT << ". Exit" << std::endl; + + char selection_text[10]; + std::cout << "Please enter a selection: "; + std::cin.getline( selection_text, sizeof(selection_text) ); + int selection = ACE_OS::atoi(selection_text); + + switch (selection) { + case START: + startPublishing(); + break; + case STOP: + stopPublishing(); + break; + case CHANGE_PERIOD: + changePublicationPeriod(); + break; + case CHANGE_TEXT: + changePublicationText(); + break; + case EXIT: { + done = true; + break; + } + default: + std::cout << "Please enter a valid option" << std::endl; + } + } while ( !done ); + + return 0; + } + + void Administrator_exec_i::startPublishing() + { + // Get the attached Runnable facet(s) + ::Administrator::runnablesConnections_var connections = + this->context_->get_connections_runnables(); + + std::cout << "Starting Publication" << std::endl; + for ( unsigned int i = 0; i < connections->length(); ++i ) { + Runnable_var runnable = (*connections)[i].objref; + runnable->start(); + } + } + + void Administrator_exec_i::stopPublishing() + { + // Get the attached Runnable facet(s) + ::Administrator::runnablesConnections_var connections = + this->context_->get_connections_runnables(); + + std::cout << "Stopping Publication" << std::endl; + for ( unsigned int i = 0; i < connections->length(); ++i ) { + Runnable_var runnable = (*connections)[i].objref; + runnable->stop(); + } + } + + void Administrator_exec_i::changePublicationPeriod() + { + // Get the attached Publication facet(s) + ::Administrator::contentConnections_var contents = + this->context_->get_connections_content(); + + char period[10]; + std::cout << "Please enter a new period in seconds: "; + std::cin.getline( period, sizeof( period ) ); + for ( unsigned int i = 0; i < contents->length(); ++i ) { + Publication_var publication = (*contents)[i].objref; + publication->period( ACE_OS::atoi(period) ); + } + } + + void Administrator_exec_i::changePublicationText() + { + // Get the attached Publication facet(s) + ::Administrator::contentConnections_var contents = + this->context_->get_connections_content(); + + char buffer[1024]; + std::cout << "Please enter new text: "; + std::cin.getline( buffer, sizeof(buffer) ); + for ( unsigned int i = 0; i < contents->length(); ++i ) { + Publication_var publication = (*contents)[i].objref; + publication->text( buffer ); + } + } + + //================================================================== + // Home Executor Implementation Class: AdministratorHome_exec_i + //================================================================== + + AdministratorHome_exec_i::AdministratorHome_exec_i (void) + { + } + + AdministratorHome_exec_i::~AdministratorHome_exec_i (void) + { + } + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + ::Components::EnterpriseComponent_ptr + AdministratorHome_exec_i::create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + ::Components::EnterpriseComponent_ptr retval = + ::Components::EnterpriseComponent::_nil (); + + ACE_NEW_THROW_EX ( + retval, + Administrator_exec_i, + CORBA::NO_MEMORY ()); + + return retval; + } + + extern "C" ADMINISTRATOR_EXEC_Export ::Components::HomeExecutorBase_ptr + create_AdministratorHome_Impl (void) + { + ::Components::HomeExecutorBase_ptr retval = + ::Components::HomeExecutorBase::_nil (); + + ACE_NEW_RETURN ( + retval, + AdministratorHome_exec_i, + ::Components::HomeExecutorBase::_nil ()); + + return retval; + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.h new file mode 100644 index 00000000000..69271a63266 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_exec_i.h @@ -0,0 +1,138 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_ADMINISTRATOR_EXEC_H +#define CIAO_ADMINISTRATOR_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Administrator_svnt.h" +#include "Administrator_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" +#include <ace/Task.h> + +namespace CIDL_Administrator_Impl +{ + class ADMINISTRATOR_EXEC_Export Administrator_exec_i + : public virtual Administrator_Exec, + public virtual ACE_Task_Base, + public virtual TAO_Local_RefCounted_Object + { + public: + Administrator_exec_i (void); + virtual ~Administrator_exec_i (void); + + // Supported or inherited operations. + + // Attribute operations. + + // Port operations. + + // Operations from Components::SessionComponent + + virtual void + set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + protected: + Administrator_Context *context_; + + public: + // Overridden from ACE_Task_Base + int svc(); + + private: + void startPublishing(); + void stopPublishing(); + void changePublicationPeriod(); + void changePublicationText(); + }; + + class ADMINISTRATOR_EXEC_Export AdministratorHome_exec_i + : public virtual AdministratorHome_Exec, + public virtual TAO_Local_RefCounted_Object + { + public: + AdministratorHome_exec_i (void); + virtual ~AdministratorHome_exec_i (void); + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + virtual ::Components::EnterpriseComponent_ptr + create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + }; + + extern "C" ADMINISTRATOR_EXEC_Export ::Components::HomeExecutorBase_ptr + create_AdministratorHome_Impl (void); +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_ADMINISTRATOR_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_stub_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_stub_export.h new file mode 100644 index 00000000000..d5f9dcc7d86 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_stub_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl ADMINISTRATOR_STUB +// ------------------------------ +#ifndef ADMINISTRATOR_STUB_EXPORT_H +#define ADMINISTRATOR_STUB_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (ADMINISTRATOR_STUB_HAS_DLL) +# define ADMINISTRATOR_STUB_HAS_DLL 1 +#endif /* ! ADMINISTRATOR_STUB_HAS_DLL */ + +#if defined (ADMINISTRATOR_STUB_HAS_DLL) && (ADMINISTRATOR_STUB_HAS_DLL == 1) +# if defined (ADMINISTRATOR_STUB_BUILD_DLL) +# define ADMINISTRATOR_STUB_Export ACE_Proper_Export_Flag +# define ADMINISTRATOR_STUB_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* ADMINISTRATOR_STUB_BUILD_DLL */ +# define ADMINISTRATOR_STUB_Export ACE_Proper_Import_Flag +# define ADMINISTRATOR_STUB_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* ADMINISTRATOR_STUB_BUILD_DLL */ +#else /* ADMINISTRATOR_STUB_HAS_DLL == 1 */ +# define ADMINISTRATOR_STUB_Export +# define ADMINISTRATOR_STUB_SINGLETON_DECLARATION(T) +# define ADMINISTRATOR_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* ADMINISTRATOR_STUB_HAS_DLL == 1 */ + +// Set ADMINISTRATOR_STUB_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (ADMINISTRATOR_STUB_NTRACE) +# if (ACE_NTRACE == 1) +# define ADMINISTRATOR_STUB_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define ADMINISTRATOR_STUB_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !ADMINISTRATOR_STUB_NTRACE */ + +#if (ADMINISTRATOR_STUB_NTRACE == 1) +# define ADMINISTRATOR_STUB_TRACE(X) +#else /* (ADMINISTRATOR_STUB_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define ADMINISTRATOR_STUB_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (ADMINISTRATOR_STUB_NTRACE == 1) */ + +#endif /* ADMINISTRATOR_STUB_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Administrator_svnt_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_svnt_export.h new file mode 100644 index 00000000000..e6cdc5c687e --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Administrator_svnt_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl ADMINISTRATOR_SVNT +// ------------------------------ +#ifndef ADMINISTRATOR_SVNT_EXPORT_H +#define ADMINISTRATOR_SVNT_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (ADMINISTRATOR_SVNT_HAS_DLL) +# define ADMINISTRATOR_SVNT_HAS_DLL 1 +#endif /* ! ADMINISTRATOR_SVNT_HAS_DLL */ + +#if defined (ADMINISTRATOR_SVNT_HAS_DLL) && (ADMINISTRATOR_SVNT_HAS_DLL == 1) +# if defined (ADMINISTRATOR_SVNT_BUILD_DLL) +# define ADMINISTRATOR_SVNT_Export ACE_Proper_Export_Flag +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* ADMINISTRATOR_SVNT_BUILD_DLL */ +# define ADMINISTRATOR_SVNT_Export ACE_Proper_Import_Flag +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* ADMINISTRATOR_SVNT_BUILD_DLL */ +#else /* ADMINISTRATOR_SVNT_HAS_DLL == 1 */ +# define ADMINISTRATOR_SVNT_Export +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARATION(T) +# define ADMINISTRATOR_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* ADMINISTRATOR_SVNT_HAS_DLL == 1 */ + +// Set ADMINISTRATOR_SVNT_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (ADMINISTRATOR_SVNT_NTRACE) +# if (ACE_NTRACE == 1) +# define ADMINISTRATOR_SVNT_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define ADMINISTRATOR_SVNT_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !ADMINISTRATOR_SVNT_NTRACE */ + +#if (ADMINISTRATOR_SVNT_NTRACE == 1) +# define ADMINISTRATOR_SVNT_TRACE(X) +#else /* (ADMINISTRATOR_SVNT_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define ADMINISTRATOR_SVNT_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (ADMINISTRATOR_SVNT_NTRACE == 1) */ + +#endif /* ADMINISTRATOR_SVNT_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/History.idl b/TAO/DevGuideExamples/CIAO/Messenger/History.idl new file mode 100644 index 00000000000..c690bce9ed5 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/History.idl @@ -0,0 +1,17 @@ +/** + * @file History.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef HISTORY_IDL +#define HISTORY_IDL + +#include <Message.idl> + +interface History { + Messages get_all(); + Message get_latest(); +}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.cpp new file mode 100644 index 00000000000..e964e12f455 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.cpp @@ -0,0 +1,100 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "History_exec_i.h" +#include "ciao/CIAO_common.h" + +namespace CIDL_Messenger_Impl +{ + //================================================================== + // Facet Executor Implementation Class: History_exec_i + //================================================================== + + History_exec_i::History_exec_i (void) + { + } + + History_exec_i::~History_exec_i (void) + { + } + + // Operations from ::History + + ::Messages * + History_exec_i::get_all () + ACE_THROW_SPEC (( + ::CORBA::SystemException)) + { + // Your code here. + + // MY CODE + ACE_Guard<ACE_Mutex> guard(this->lock_); + + ACE_DEBUG((LM_INFO, ACE_TEXT("History_i::get_all\n") )); + + // create a Messages sequence, set its length + ::Messages* retval = new ::Messages(); + retval->length( this->messages_.size() ); + + // iterate through the MessageList, copying messages into the return sequence + int i = 0; + for ( MessageList::iterator messageItr = this->messages_.begin(); + messageItr != this->messages_.end(); + ++messageItr ) { + + // because the MessageList contains Message_vars, reference counting + // upon assignment into the sequence is handled properly for us. + (*retval)[i++] = *messageItr; + } + return retval; + } + + ::Message * + History_exec_i::get_latest () + ACE_THROW_SPEC (( + ::CORBA::SystemException)) + { + // Your code here. + + // MY CODE + ACE_Guard<ACE_Mutex> guard(this->lock_); + + ACE_DEBUG((LM_INFO, ACE_TEXT("History_i::get_latest\n") )); + + // just get the last message from the history. because the MessageList + // contains Message_vars, _var to _var assigmnent handles the reference + // counting properly for us. + ::Message_var retval = this->messages_.back(); + return retval._retn(); + } + + // MY CODE + void + History_exec_i::add( ::Message* message ) + { + ACE_Guard<ACE_Mutex> guard(lock_); + + // bump up the reference count; we don't own it. + // the _var in the STL list takes ownership of the "copy" + message->_add_ref(); + this->messages_.push_back( message ); + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.h new file mode 100644 index 00000000000..6e100e29a90 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/History_exec_i.h @@ -0,0 +1,76 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_HISTORY_EXEC_H +#define CIAO_HISTORY_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Messenger_svnt.h" +#include "Messenger_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" + +// MY CODE +#include <list> +#include <ace/Synch.h> + +namespace CIDL_Messenger_Impl +{ + class MESSENGER_EXEC_Export History_exec_i + : public virtual ::CCM_History, + public virtual TAO_Local_RefCounted_Object + { + public: + History_exec_i (void); + virtual ~History_exec_i (void); + + // Operations from ::History + + virtual ::Messages * + get_all () + ACE_THROW_SPEC (( + ::CORBA::SystemException)); + + virtual ::Message * + get_latest () + ACE_THROW_SPEC (( + ::CORBA::SystemException)); + + // MY CODE + + void add( ::Message* message ); + + private: + ACE_Mutex lock_; + + typedef std::list< ::Message_var> MessageList; + MessageList messages_; + }; +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_HISTORY_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Message.idl b/TAO/DevGuideExamples/CIAO/Messenger/Message.idl new file mode 100644 index 00000000000..02fe99f5f3d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Message.idl @@ -0,0 +1,19 @@ +/** + * @file Message.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef MESSAGE_IDL +#define MESSAGE_IDL + +#include <Components.idl> + +eventtype Message { + public string subject; + public string user; + public string text; +}; +typedef sequence<Message> Messages; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger.cidl b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.cidl new file mode 100644 index 00000000000..7642335f1a0 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.cidl @@ -0,0 +1,22 @@ +/** + * @file Messenger.cidl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef MESSENGER_CIDL +#define MESSENGER_CIDL + +#include <Messenger.idl> + +composition session Messenger_Impl +{ + home executor MessengerHome_Exec + { + implements MessengerHome; + manages Messenger_Exec; + }; +}; + +#endif + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger.idl b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.idl new file mode 100644 index 00000000000..3c9633da8a7 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.idl @@ -0,0 +1,28 @@ +/** + * @file Messenger.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef MESSENGER_IDL +#define MESSENGER_IDL + +#include <Components.idl> +#include <Runnable.idl> +#include <Publication.idl> +#include <Message.idl> +#include <History.idl> + +component Messenger { + attribute string subject; + + provides Runnable control; + provides Publication content; + + publishes Message message_publisher; + provides History message_history; +}; + +home MessengerHome manages Messenger {}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger.mpc b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.mpc new file mode 100644 index 00000000000..7514f41b29f --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger.mpc @@ -0,0 +1,109 @@ +// +// @file Messenger.mpc +// +// @author Don Busch <busch_d@ociweb.com> +// + +project(Messenger_idl): ciao_client_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,stub_export_macro=MESSENGER_STUB_Export + idlflags += -Wb,stub_export_include=Messenger_stub_export.h + idlflags += -Wb,skel_export_macro=MESSENGER_SVNT_Export + idlflags += -Wb,skel_export_include=Messenger_svnt_export.h + + IDL_Files { + Runnable.idl + Publication.idl + Message.idl + History.idl + Messenger.idl + } +} + +project(Messenger_stub): ciao_client_dnc { + requires += cidl + after += Messenger_idl + sharedname = Messenger_stub + dynamicflags = MESSENGER_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + RunnableC.cpp + PublicationC.cpp + MessageC.cpp + HistoryC.cpp + MessengerC.cpp + } +} + +project(Messenger_cidl): ciao_servant_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,export_macro=MESSENGER_SVNT_Export + idlflags += -Wb,export_include=Messenger_svnt_export.h + + // cidlc does NOT automatically add the current directory to + // the include path. This is a worksround to add it. We have + // to insert it before the "--" that is at the end of the + // default cidlflags. + cidlflags -= -- + cidlflags += -I. -- + + // project must be a ciao_servant or ciao_server to use CIDL files + CIDL_Files { + Messenger.cidl + } + + IDL_Files { + MessengerE.idl + } +} + +project(Messenger_svnt): ciao_servant_dnc { + requires += cidl + after += Messenger_cidl Messenger_stub + sharedname = Messenger_svnt + libs += Messenger_stub + dynamicflags = MESSENGER_SVNT_BUILD_DLL + + Source_Files { + RunnableS.cpp + PublicationS.cpp + MessageS.cpp + HistoryS.cpp + MessengerS.cpp + MessengerEC.cpp + Messenger_svnt.cpp + } + + CIDL_Files { + } + IDL_Files { + } +} + +project(Messenger_exec): ciao_component_dnc { + requires += cidl + + after += Messenger_svnt + sharedname = Messenger_exec + libs += Messenger_stub Messenger_svnt + dynamicflags = MESSENGER_EXEC_BUILD_DLL + + IDL_Files { + } + + Source_Files { + MessengerES.cpp + Messenger_exec_i.cpp + Publication_exec_i.cpp + History_exec_i.cpp + Runnable_exec_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_export.h new file mode 100644 index 00000000000..4b3a125c287 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl MESSENGER_EXEC +// ------------------------------ +#ifndef MESSENGER_EXEC_EXPORT_H +#define MESSENGER_EXEC_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (MESSENGER_EXEC_HAS_DLL) +# define MESSENGER_EXEC_HAS_DLL 1 +#endif /* ! MESSENGER_EXEC_HAS_DLL */ + +#if defined (MESSENGER_EXEC_HAS_DLL) && (MESSENGER_EXEC_HAS_DLL == 1) +# if defined (MESSENGER_EXEC_BUILD_DLL) +# define MESSENGER_EXEC_Export ACE_Proper_Export_Flag +# define MESSENGER_EXEC_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* MESSENGER_EXEC_BUILD_DLL */ +# define MESSENGER_EXEC_Export ACE_Proper_Import_Flag +# define MESSENGER_EXEC_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* MESSENGER_EXEC_BUILD_DLL */ +#else /* MESSENGER_EXEC_HAS_DLL == 1 */ +# define MESSENGER_EXEC_Export +# define MESSENGER_EXEC_SINGLETON_DECLARATION(T) +# define MESSENGER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* MESSENGER_EXEC_HAS_DLL == 1 */ + +// Set MESSENGER_EXEC_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (MESSENGER_EXEC_NTRACE) +# if (ACE_NTRACE == 1) +# define MESSENGER_EXEC_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define MESSENGER_EXEC_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !MESSENGER_EXEC_NTRACE */ + +#if (MESSENGER_EXEC_NTRACE == 1) +# define MESSENGER_EXEC_TRACE(X) +#else /* (MESSENGER_EXEC_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define MESSENGER_EXEC_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (MESSENGER_EXEC_NTRACE == 1) */ + +#endif /* MESSENGER_EXEC_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.cpp new file mode 100644 index 00000000000..0520e7bc2f3 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.cpp @@ -0,0 +1,273 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "Messenger_exec_i.h" +#include "ciao/CIAO_common.h" + +// MY CODE +#include <ace/OS.h> +#include "History_exec_i.h" +#include "Runnable_exec_i.h" +#include "Publication_exec_i.h" + +namespace CIDL_Messenger_Impl +{ + //================================================================== + // Component Executor Implementation Class: Messenger_exec_i + //================================================================== + + Messenger_exec_i::Messenger_exec_i () + : subject_( "Test Subject" ), + user_( "ciao_user" ) + { + this->control_ = new Runnable_exec_i(); + this->history_ = new History_exec_i(); + this->content_ = new Publication_exec_i( + "The quick brown fox jumped over the lazy dog", + 2 ); + } + + Messenger_exec_i::~Messenger_exec_i (void) + { + this->control_->_remove_ref(); + this->history_->_remove_ref(); + this->content_->_remove_ref(); + } + + // MY CODE + int Messenger_exec_i::svc() { + + ACE_DEBUG((LM_INFO, ACE_TEXT("svc()\n"))); + + while (1) + { + ACE_OS::sleep( this->content_->period() ); + + // get the run_lock from the Runnable executor; we have an + // agreement with the Runnable executor that we must posess the + // run_lock to publish + ACE_Guard<ACE_Mutex> guard( this->control_->get_run_lock() ); + + // create a message to publish + ::Message_var msg = new ::OBV_Message(); + msg->subject( this->subject() ); + msg->text( this->content_->text() ); + msg->user( CORBA::string_dup( this->user_.c_str() ) ); + + // add the message to the message history + this->history_->add( msg.in() ); + + ACE_DEBUG((LM_INFO, ACE_TEXT("Messenger_exec_i::svc: publishing message\n") )); + + // publish to all interested consumers + this->context_->push_message_publisher( msg.in() ); + + ACE_DEBUG((LM_INFO, + ACE_TEXT("Published Message on subject %s\n User %s\n Text %s\n"), + msg->subject(), + msg->user(), + msg->text() )); + } + + ACE_DEBUG((LM_INFO, ACE_TEXT("svc(): Gracefully stopping publication\n"))); + return 0; + } + + // Supported or inherited operations. + + // Attribute operations. + + char* + Messenger_exec_i::subject () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + return CORBA::string_dup( this->subject_.c_str() ); + } + + void + Messenger_exec_i::subject ( const char* subject) + ACE_THROW_SPEC ((CORBA::SystemException)) + { + this->subject_ = CORBA::string_dup( subject ); + } + + // Port operations. + + ::CCM_Publication_ptr + Messenger_exec_i::get_content () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + // Your code here. + + // MY CODE + + // bump up ref count because we give up ownership when we return this + this->content_->_add_ref(); + return this->content_; + } + + ::CCM_Runnable_ptr + Messenger_exec_i::get_control () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + // Your code here. + + // MY CODE + + // bump up ref count because we give up ownership when we return this + this->control_->_add_ref(); + return this->control_; + } + + ::CCM_History_ptr + Messenger_exec_i::get_message_history () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + // Your code here. + + // MY CODE + + // bump up ref count because we give up ownership when we return this + this->history_->_add_ref(); + return this->history_; + } + + // Operations from Components::SessionComponent + + void + Messenger_exec_i::set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + this->context_ = + Messenger_Context::_narrow ( + ctx); + + if (this->context_ == 0) + { + throw CORBA::INTERNAL (); + } + } + + void + Messenger_exec_i::ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + } + + void + Messenger_exec_i::ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + } + + void + Messenger_exec_i::ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Messenger_exec_i::ccm_activate\n"))); + this->activate(); + } + + void + Messenger_exec_i::ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Messenger_exec_i::ccm_passivate\n"))); + } + + void + Messenger_exec_i::ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Messenger_exec_i::ccm_remove\n"))); + } + + //================================================================== + // Home Executor Implementation Class: MessengerHome_exec_i + //================================================================== + + MessengerHome_exec_i::MessengerHome_exec_i (void) + { + } + + MessengerHome_exec_i::~MessengerHome_exec_i (void) + { + } + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + ::Components::EnterpriseComponent_ptr + MessengerHome_exec_i::create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + ::Components::EnterpriseComponent_ptr retval = + ::Components::EnterpriseComponent::_nil (); + + ACE_NEW_THROW_EX ( + retval, + Messenger_exec_i, + CORBA::NO_MEMORY ()); + + return retval; + } + + extern "C" MESSENGER_EXEC_Export ::Components::HomeExecutorBase_ptr + create_MessengerHome_Impl (void) + { + ::Components::HomeExecutorBase_ptr retval = + ::Components::HomeExecutorBase::_nil (); + + ACE_NEW_RETURN ( + retval, + MessengerHome_exec_i, + ::Components::HomeExecutorBase::_nil ()); + + return retval; + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.h new file mode 100644 index 00000000000..218d006301b --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_exec_i.h @@ -0,0 +1,167 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_MESSENGER_EXEC_H +#define CIAO_MESSENGER_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Messenger_svnt.h" +#include "Messenger_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" + +// MY CODE +#include <string> +#include <ace/Task.h> + +namespace CIDL_Messenger_Impl +{ + class Runnable_exec_i; + class Publication_exec_i; + class History_exec_i; + + class MESSENGER_EXEC_Export Messenger_exec_i + : public virtual Messenger_Exec, + public virtual TAO_Local_RefCounted_Object, + public virtual ACE_Task_Base + { + public: + Messenger_exec_i (void); + virtual ~Messenger_exec_i (void); + + // Supported or inherited operations. + + // Operations from ::Runnable + + // Attribute operations. + + virtual char * subject () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void subject (const char* subject) + ACE_THROW_SPEC ((CORBA::SystemException)); + + // Port operations. + + virtual ::CCM_Publication_ptr + get_content () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual ::CCM_Runnable_ptr + get_control () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual ::CCM_History_ptr + get_message_history () + ACE_THROW_SPEC ((CORBA::SystemException)); + + // Operations from Components::SessionComponent + + virtual void + set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + // MY CODE + virtual int svc(); + + protected: + Messenger_Context *context_; + + // MY CODE + private: + Runnable_exec_i* control_; + Publication_exec_i* content_; + History_exec_i* history_; + + std::string subject_; + const std::string user_; + }; + + class MESSENGER_EXEC_Export MessengerHome_exec_i + : public virtual MessengerHome_Exec, + public virtual TAO_Local_RefCounted_Object + { + public: + MessengerHome_exec_i (void); + virtual ~MessengerHome_exec_i (void); + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + virtual ::Components::EnterpriseComponent_ptr + create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + }; + + extern "C" MESSENGER_EXEC_Export ::Components::HomeExecutorBase_ptr + create_MessengerHome_Impl (void); +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_MESSENGER_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger_stub_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_stub_export.h new file mode 100644 index 00000000000..9f866bac3fd --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_stub_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl MESSENGER_STUB +// ------------------------------ +#ifndef MESSENGER_STUB_EXPORT_H +#define MESSENGER_STUB_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (MESSENGER_STUB_HAS_DLL) +# define MESSENGER_STUB_HAS_DLL 1 +#endif /* ! MESSENGER_STUB_HAS_DLL */ + +#if defined (MESSENGER_STUB_HAS_DLL) && (MESSENGER_STUB_HAS_DLL == 1) +# if defined (MESSENGER_STUB_BUILD_DLL) +# define MESSENGER_STUB_Export ACE_Proper_Export_Flag +# define MESSENGER_STUB_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* MESSENGER_STUB_BUILD_DLL */ +# define MESSENGER_STUB_Export ACE_Proper_Import_Flag +# define MESSENGER_STUB_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* MESSENGER_STUB_BUILD_DLL */ +#else /* MESSENGER_STUB_HAS_DLL == 1 */ +# define MESSENGER_STUB_Export +# define MESSENGER_STUB_SINGLETON_DECLARATION(T) +# define MESSENGER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* MESSENGER_STUB_HAS_DLL == 1 */ + +// Set MESSENGER_STUB_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (MESSENGER_STUB_NTRACE) +# if (ACE_NTRACE == 1) +# define MESSENGER_STUB_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define MESSENGER_STUB_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !MESSENGER_STUB_NTRACE */ + +#if (MESSENGER_STUB_NTRACE == 1) +# define MESSENGER_STUB_TRACE(X) +#else /* (MESSENGER_STUB_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define MESSENGER_STUB_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (MESSENGER_STUB_NTRACE == 1) */ + +#endif /* MESSENGER_STUB_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Messenger_svnt_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_svnt_export.h new file mode 100644 index 00000000000..4415ac291d2 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Messenger_svnt_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl MESSENGER_SVNT +// ------------------------------ +#ifndef MESSENGER_SVNT_EXPORT_H +#define MESSENGER_SVNT_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (MESSENGER_SVNT_HAS_DLL) +# define MESSENGER_SVNT_HAS_DLL 1 +#endif /* ! MESSENGER_SVNT_HAS_DLL */ + +#if defined (MESSENGER_SVNT_HAS_DLL) && (MESSENGER_SVNT_HAS_DLL == 1) +# if defined (MESSENGER_SVNT_BUILD_DLL) +# define MESSENGER_SVNT_Export ACE_Proper_Export_Flag +# define MESSENGER_SVNT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* MESSENGER_SVNT_BUILD_DLL */ +# define MESSENGER_SVNT_Export ACE_Proper_Import_Flag +# define MESSENGER_SVNT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define MESSENGER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* MESSENGER_SVNT_BUILD_DLL */ +#else /* MESSENGER_SVNT_HAS_DLL == 1 */ +# define MESSENGER_SVNT_Export +# define MESSENGER_SVNT_SINGLETON_DECLARATION(T) +# define MESSENGER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* MESSENGER_SVNT_HAS_DLL == 1 */ + +// Set MESSENGER_SVNT_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (MESSENGER_SVNT_NTRACE) +# if (ACE_NTRACE == 1) +# define MESSENGER_SVNT_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define MESSENGER_SVNT_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !MESSENGER_SVNT_NTRACE */ + +#if (MESSENGER_SVNT_NTRACE == 1) +# define MESSENGER_SVNT_TRACE(X) +#else /* (MESSENGER_SVNT_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define MESSENGER_SVNT_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (MESSENGER_SVNT_NTRACE == 1) */ + +#endif /* MESSENGER_SVNT_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Publication.idl b/TAO/DevGuideExamples/CIAO/Messenger/Publication.idl new file mode 100644 index 00000000000..947e596ef50 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Publication.idl @@ -0,0 +1,15 @@ +/** + * @file Publication.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef PUBLICATION_IDL +#define PUBLICATION_IDL + +interface Publication { + attribute string text; + attribute unsigned short period; +}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.cpp new file mode 100644 index 00000000000..a12ada2d355 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.cpp @@ -0,0 +1,89 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "Publication_exec_i.h" +#include "ciao/CIAO_common.h" + +namespace CIDL_Messenger_Impl +{ + //================================================================== + // Facet Executor Implementation Class: Publication_exec_i + //================================================================== + + Publication_exec_i::Publication_exec_i ( + const char* text, + CORBA::UShort period ) + : text_( text ), + period_( period) + { + } + + Publication_exec_i::~Publication_exec_i (void) + { + } + + // Operations from ::Publication + + char* + Publication_exec_i::text () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + ACE_Guard<ACE_Mutex> guard(this->lock_); + + return CORBA::string_dup( this->text_.c_str() ); + } + + void + Publication_exec_i::text ( + const char* text) + ACE_THROW_SPEC ((CORBA::SystemException)) + { + ACE_Guard<ACE_Mutex> guard(this->lock_); + + this->text_ = text; + ACE_DEBUG((LM_INFO, ACE_TEXT("publication text changed to %s\n"), text )); + } + + CORBA::UShort + Publication_exec_i::period () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + ACE_Guard<ACE_Mutex> guard(this->lock_); + + return this->period_; + } + + void + Publication_exec_i::period ( + CORBA::UShort period) + ACE_THROW_SPEC ((CORBA::SystemException)) + { + ACE_Guard<ACE_Mutex> guard( this->lock_ ); + + if ( period > 0 ) { + this->period_ = period; + ACE_DEBUG((LM_INFO, ACE_TEXT("publication period changed to %d seconds\n"), period )); + } else { + ACE_DEBUG((LM_INFO, ACE_TEXT("ignoring a non-positive period of %d\n"), period )); + } + } + +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.h new file mode 100644 index 00000000000..7cb75471279 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Publication_exec_i.h @@ -0,0 +1,79 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_PUBLICATION_EXEC_H +#define CIAO_PUBLICATION_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Messenger_svnt.h" +#include "Messenger_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" + +// MY CODE +#include <string> +#include <ace/Synch.h> + +namespace CIDL_Messenger_Impl +{ + class MESSENGER_EXEC_Export Publication_exec_i + : public virtual ::CCM_Publication, + public virtual TAO_Local_RefCounted_Object + { + public: + Publication_exec_i ( const char* text, + CORBA::UShort period ); + virtual ~Publication_exec_i (void); + + // Operations from ::Publication + + virtual char* + text () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void + text ( const char* text) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual CORBA::UShort + period () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void + period ( CORBA::UShort period) + ACE_THROW_SPEC ((CORBA::SystemException)); + + private: + std::string text_; + CORBA::UShort period_; + + ACE_Mutex lock_; + }; +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_PUBLICATION_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver.cidl b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.cidl new file mode 100644 index 00000000000..7fc893c080f --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.cidl @@ -0,0 +1,21 @@ +/** + * @file Receiver.cidl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef RECEIVER_CIDL +#define RECEIVER_CIDL + +#include <Receiver.idl> + +composition session Receiver_Impl +{ + home executor ReceiverHome_Exec + { + implements ReceiverHome; + manages Receiver_Exec; + }; +}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver.idl b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.idl new file mode 100644 index 00000000000..1b9717d326e --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.idl @@ -0,0 +1,21 @@ +/** + * @file Receiver.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef RECEIVER_IDL +#define RECEIVER_IDL + +#include <Components.idl> +#include <Message.idl> +#include <History.idl> + +component Receiver { + consumes Message message_consumer; + uses History message_history; +}; + +home ReceiverHome manages Receiver {}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver.mpc b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.mpc new file mode 100644 index 00000000000..280777d2c8a --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver.mpc @@ -0,0 +1,96 @@ +// +// @file Receiver.mpc +// +// @author Don Busch <busch_d@ociweb.com> +// + +project(Receiver_idl): ciao_client_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,stub_export_macro=RECEIVER_STUB_Export + idlflags += -Wb,stub_export_include=Receiver_stub_export.h + idlflags += -Wb,skel_export_macro=RECEIVER_SVNT_Export + idlflags += -Wb,skel_export_include=Receiver_svnt_export.h + + IDL_Files { + Receiver.idl + } +} + +project(Receiver_stub): ciao_client_dnc { + requires += cidl + + after += Messenger_stub Receiver_idl + sharedname = Receiver_stub + libs += Messenger_stub + dynamicflags = RECEIVER_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + ReceiverC.cpp + } +} + +project(Receiver_cidl): ciao_servant_dnc { + custom_only = 1 + requires += cidl + + idlflags += -Wb,export_macro=RECEIVER_SVNT_Export + idlflags += -Wb,export_include=Receiver_svnt_export.h + + // cidlc does NOT automatically add the current directory to + // the include path. This is a worksround to add it. We have + // to insert it before the "--" that is at the end of the + // default cidlflags. + cidlflags -= -- + cidlflags += -I. -- + + // project must be a ciao_servant or ciao_server to use CIDL files + CIDL_Files { + Receiver.cidl + } + + IDL_Files { + ReceiverE.idl + } +} + +project(Receiver_svnt): ciao_servant_dnc { + requires += cidl + + after += Receiver_cidl Messenger_svnt Receiver_stub + sharedname = Receiver_svnt + libs += Receiver_stub Messenger_stub Messenger_svnt + dynamicflags = RECEIVER_SVNT_BUILD_DLL + + Source_Files { + ReceiverS.cpp + ReceiverEC.cpp + Receiver_svnt.cpp + } + + CIDL_Files { + } + IDL_Files { + } +} + +project(Receiver_exec): ciao_component_dnc { + requires += cidl + + after += Receiver_svnt + sharedname = Receiver_exec + libs += Receiver_stub Receiver_svnt Messenger_stub + dynamicflags = RECEIVER_EXEC_BUILD_DLL + + IDL_Files { + } + + Source_Files { + ReceiverES.cpp + Receiver_exec_i.cpp + } +} diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_export.h new file mode 100644 index 00000000000..8ad3640d130 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl RECEIVER_EXEC +// ------------------------------ +#ifndef RECEIVER_EXEC_EXPORT_H +#define RECEIVER_EXEC_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (RECEIVER_EXEC_HAS_DLL) +# define RECEIVER_EXEC_HAS_DLL 1 +#endif /* ! RECEIVER_EXEC_HAS_DLL */ + +#if defined (RECEIVER_EXEC_HAS_DLL) && (RECEIVER_EXEC_HAS_DLL == 1) +# if defined (RECEIVER_EXEC_BUILD_DLL) +# define RECEIVER_EXEC_Export ACE_Proper_Export_Flag +# define RECEIVER_EXEC_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* RECEIVER_EXEC_BUILD_DLL */ +# define RECEIVER_EXEC_Export ACE_Proper_Import_Flag +# define RECEIVER_EXEC_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* RECEIVER_EXEC_BUILD_DLL */ +#else /* RECEIVER_EXEC_HAS_DLL == 1 */ +# define RECEIVER_EXEC_Export +# define RECEIVER_EXEC_SINGLETON_DECLARATION(T) +# define RECEIVER_EXEC_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* RECEIVER_EXEC_HAS_DLL == 1 */ + +// Set RECEIVER_EXEC_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (RECEIVER_EXEC_NTRACE) +# if (ACE_NTRACE == 1) +# define RECEIVER_EXEC_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define RECEIVER_EXEC_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !RECEIVER_EXEC_NTRACE */ + +#if (RECEIVER_EXEC_NTRACE == 1) +# define RECEIVER_EXEC_TRACE(X) +#else /* (RECEIVER_EXEC_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define RECEIVER_EXEC_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (RECEIVER_EXEC_NTRACE == 1) */ + +#endif /* RECEIVER_EXEC_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.cpp new file mode 100644 index 00000000000..b08db1cef52 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.cpp @@ -0,0 +1,196 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "Receiver_exec_i.h" +#include "ciao/CIAO_common.h" + +namespace CIDL_Receiver_Impl +{ + //================================================================== + // Component Executor Implementation Class: Receiver_exec_i + //================================================================== + + Receiver_exec_i::Receiver_exec_i (void) + { + } + + Receiver_exec_i::~Receiver_exec_i (void) + { + } + + // Supported or inherited operations. + + // Attribute operations. + + // Port operations. + + void + Receiver_exec_i::push_message_consumer ( + ::Message * ev) + ACE_THROW_SPEC ((CORBA::SystemException)) + { + // Your code here. + + // MY CODE + + CORBA::String_var subject = ev->subject(); + CORBA::String_var user = ev->user(); + CORBA::String_var text = ev->text(); + + ACE_DEBUG((LM_INFO, + ACE_TEXT("Received Message:\n Subject: %s\n User: %s\n Text: %s\n"), + subject.in(), + user.in(), + text.in() )); + + // Use the history to (inefficiently) get the total number of messages + // published on this item so far + ::History_var history = + this->context_->get_connection_message_history(); + ::Messages_var messages = history->get_all(); + ACE_DEBUG((LM_INFO, + ACE_TEXT(" Subject \"%s\" has published %d messages so far\n"), + subject.in(), + messages->length() )); + } + + // Operations from Components::SessionComponent + + void + Receiver_exec_i::set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + this->context_ = + Receiver_Context::_narrow ( + ctx); + + if (this->context_ == 0) + { + throw CORBA::INTERNAL (); + } + } + + void + Receiver_exec_i::ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Receiver_exec_i::ccm_activate\n"))); + } + + void + Receiver_exec_i::ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Receiver_exec_i::ccm_passivate\n"))); + } + + void + Receiver_exec_i::ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Receiver_exec_i::ccm_remove\n"))); + } + + void + Receiver_exec_i::ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Receiver_exec_i::ciao_preactivate\n"))); + } + + void + Receiver_exec_i::ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + // Your code here. + ACE_DEBUG((LM_INFO, ACE_TEXT("Receiver_exec_i::ciao_postactivate\n"))); + } + + //================================================================== + // Home Executor Implementation Class: ReceiverHome_exec_i + //================================================================== + + ReceiverHome_exec_i::ReceiverHome_exec_i (void) + { + } + + ReceiverHome_exec_i::~ReceiverHome_exec_i (void) + { + } + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + ::Components::EnterpriseComponent_ptr + ReceiverHome_exec_i::create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)) + { + ::Components::EnterpriseComponent_ptr retval = + ::Components::EnterpriseComponent::_nil (); + + ACE_NEW_THROW_EX ( + retval, + Receiver_exec_i, + CORBA::NO_MEMORY ()); + + return retval; + } + + extern "C" RECEIVER_EXEC_Export ::Components::HomeExecutorBase_ptr + create_ReceiverHome_Impl (void) + { + ::Components::HomeExecutorBase_ptr retval = + ::Components::HomeExecutorBase::_nil (); + + ACE_NEW_RETURN ( + retval, + ReceiverHome_exec_i, + ::Components::HomeExecutorBase::_nil ()); + + return retval; + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.h new file mode 100644 index 00000000000..5ccb8fb402d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_exec_i.h @@ -0,0 +1,131 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_RECEIVER_EXEC_H +#define CIAO_RECEIVER_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Receiver_svnt.h" +#include "Receiver_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" + +namespace CIDL_Receiver_Impl +{ + class RECEIVER_EXEC_Export Receiver_exec_i + : public virtual Receiver_Exec, + public virtual TAO_Local_RefCounted_Object + { + public: + Receiver_exec_i (void); + virtual ~Receiver_exec_i (void); + + // Supported or inherited operations. + + // Attribute operations. + + // Port operations. + + virtual void + push_message_consumer ( + ::Message *ev) + ACE_THROW_SPEC ((CORBA::SystemException)); + + // Operations from Components::SessionComponent + + virtual void + set_session_context ( + ::Components::SessionContext_ptr ctx) + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_preactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ciao_postactivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_activate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_passivate () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + virtual void + ccm_remove () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + + protected: + Receiver_Context *context_; + }; + + class RECEIVER_EXEC_Export ReceiverHome_exec_i + : public virtual ReceiverHome_Exec, + public virtual TAO_Local_RefCounted_Object + { + public: + ReceiverHome_exec_i (void); + virtual ~ReceiverHome_exec_i (void); + + // Supported or inherited operations. + + // Home operations. + + // Factory and finder operations. + + // Attribute operations. + + // Implicit operations. + + virtual ::Components::EnterpriseComponent_ptr + create () + ACE_THROW_SPEC (( + ::CORBA::SystemException, + ::Components::CCMException)); + }; + + extern "C" RECEIVER_EXEC_Export ::Components::HomeExecutorBase_ptr + create_ReceiverHome_Impl (void); +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_RECEIVER_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver_stub_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_stub_export.h new file mode 100644 index 00000000000..c457802854f --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_stub_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl RECEIVER_STUB +// ------------------------------ +#ifndef RECEIVER_STUB_EXPORT_H +#define RECEIVER_STUB_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (RECEIVER_STUB_HAS_DLL) +# define RECEIVER_STUB_HAS_DLL 1 +#endif /* ! RECEIVER_STUB_HAS_DLL */ + +#if defined (RECEIVER_STUB_HAS_DLL) && (RECEIVER_STUB_HAS_DLL == 1) +# if defined (RECEIVER_STUB_BUILD_DLL) +# define RECEIVER_STUB_Export ACE_Proper_Export_Flag +# define RECEIVER_STUB_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* RECEIVER_STUB_BUILD_DLL */ +# define RECEIVER_STUB_Export ACE_Proper_Import_Flag +# define RECEIVER_STUB_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* RECEIVER_STUB_BUILD_DLL */ +#else /* RECEIVER_STUB_HAS_DLL == 1 */ +# define RECEIVER_STUB_Export +# define RECEIVER_STUB_SINGLETON_DECLARATION(T) +# define RECEIVER_STUB_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* RECEIVER_STUB_HAS_DLL == 1 */ + +// Set RECEIVER_STUB_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (RECEIVER_STUB_NTRACE) +# if (ACE_NTRACE == 1) +# define RECEIVER_STUB_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define RECEIVER_STUB_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !RECEIVER_STUB_NTRACE */ + +#if (RECEIVER_STUB_NTRACE == 1) +# define RECEIVER_STUB_TRACE(X) +#else /* (RECEIVER_STUB_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define RECEIVER_STUB_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (RECEIVER_STUB_NTRACE == 1) */ + +#endif /* RECEIVER_STUB_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Receiver_svnt_export.h b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_svnt_export.h new file mode 100644 index 00000000000..1c9eca2556d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Receiver_svnt_export.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl RECEIVER_SVNT +// ------------------------------ +#ifndef RECEIVER_SVNT_EXPORT_H +#define RECEIVER_SVNT_EXPORT_H + +#include "ace/config-all.h" + +#if !defined (RECEIVER_SVNT_HAS_DLL) +# define RECEIVER_SVNT_HAS_DLL 1 +#endif /* ! RECEIVER_SVNT_HAS_DLL */ + +#if defined (RECEIVER_SVNT_HAS_DLL) && (RECEIVER_SVNT_HAS_DLL == 1) +# if defined (RECEIVER_SVNT_BUILD_DLL) +# define RECEIVER_SVNT_Export ACE_Proper_Export_Flag +# define RECEIVER_SVNT_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* RECEIVER_SVNT_BUILD_DLL */ +# define RECEIVER_SVNT_Export ACE_Proper_Import_Flag +# define RECEIVER_SVNT_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define RECEIVER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* RECEIVER_SVNT_BUILD_DLL */ +#else /* RECEIVER_SVNT_HAS_DLL == 1 */ +# define RECEIVER_SVNT_Export +# define RECEIVER_SVNT_SINGLETON_DECLARATION(T) +# define RECEIVER_SVNT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* RECEIVER_SVNT_HAS_DLL == 1 */ + +// Set RECEIVER_SVNT_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (RECEIVER_SVNT_NTRACE) +# if (ACE_NTRACE == 1) +# define RECEIVER_SVNT_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define RECEIVER_SVNT_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !RECEIVER_SVNT_NTRACE */ + +#if (RECEIVER_SVNT_NTRACE == 1) +# define RECEIVER_SVNT_TRACE(X) +#else /* (RECEIVER_SVNT_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define RECEIVER_SVNT_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (RECEIVER_SVNT_NTRACE == 1) */ + +#endif /* RECEIVER_SVNT_EXPORT_H */ + +// End of auto generated file. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Runnable.idl b/TAO/DevGuideExamples/CIAO/Messenger/Runnable.idl new file mode 100644 index 00000000000..7b006bca89b --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Runnable.idl @@ -0,0 +1,15 @@ +/** + * @file Runnable.idl + * + * @author Don Busch <busch_d@ociweb.com> + */ + +#ifndef RUNNABLE_IDL +#define RUNNABLE_IDL + +interface Runnable { + void start(); + void stop(); +}; + +#endif diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.cpp b/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.cpp new file mode 100644 index 00000000000..12ba03b4c8b --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.cpp @@ -0,0 +1,63 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#include "Runnable_exec_i.h" +#include "ciao/CIAO_common.h" + +namespace CIDL_Messenger_Impl +{ + //================================================================== + // Facet Executor Implementation Class: Runnable_exec_i + //================================================================== + + Runnable_exec_i::Runnable_exec_i () + { + // initially in "stopped" state + this->stop(); + } + + Runnable_exec_i::~Runnable_exec_i (void) + { + // don't own anything + } + + // Operations from ::Runnable + + void + Runnable_exec_i::start () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + this->run_lock_.release(); + } + + void + Runnable_exec_i::stop () + ACE_THROW_SPEC ((CORBA::SystemException)) + { + this->run_lock_.acquire(); + } + + ACE_Mutex& + Runnable_exec_i::get_run_lock () + { + return this->run_lock_; + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.h b/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.h new file mode 100644 index 00000000000..13f8f7d358d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/Runnable_exec_i.h @@ -0,0 +1,70 @@ +// $Id$ +// +// **** Code generated by the **** +// **** Component Integrated ACE ORB (CIAO) CIDL Compiler **** +// CIAO has been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// CIDL Compiler has been developed by: +// Institute for Software Integrated Systems +// Vanderbilt University +// Nashville, TN +// USA +// http://www.isis.vanderbilt.edu/ +// +// Information about CIAO is available at: +// http://www.dre.vanderbilt.edu/CIAO + +#ifndef CIAO_RUNNABLE_EXEC_H +#define CIAO_RUNNABLE_EXEC_H + +#include /**/ "ace/pre.h" + +#include "Messenger_svnt.h" +#include "Messenger_exec_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/LocalObject.h" + +// MY CODE +#include <ace/Synch.h> + +namespace CIDL_Messenger_Impl +{ + class MESSENGER_EXEC_Export Runnable_exec_i + : public virtual ::CCM_Runnable, + public virtual TAO_Local_RefCounted_Object + { + public: + Runnable_exec_i (); + virtual ~Runnable_exec_i (void); + + // Operations from ::Runnable + + virtual void + start () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void + stop () + ACE_THROW_SPEC ((CORBA::SystemException)); + + // MY CODE + + ACE_Mutex& get_run_lock(); + + private: + ACE_Mutex run_lock_; + }; +} + +#include /**/ "ace/post.h" + +#endif /* CIAO_RUNNABLE_EXEC_H */ + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/Messenger_StaticDAnCE.mpc b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/Messenger_StaticDAnCE.mpc new file mode 100644 index 00000000000..e9b29c24629 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/Messenger_StaticDAnCE.mpc @@ -0,0 +1,18 @@ +// -*- MPC -*- +// $Id$ + +project(Messenger_StaticDAnCE): ciao_static_dnc_app { + requires += cidl + exename = Messenger_StaticDAnCE + + libs += Receiver_stub Administrator_stub Messenger_stub + libs += Receiver_svnt Administrator_svnt Messenger_svnt + libs += Receiver_exec Administrator_exec Messenger_exec + + after += Receiver_exec Administrator_exec Messenger_exec + + Source_Files { + StaticDAnCEApp.cpp + } +} + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/README.txt b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/README.txt new file mode 100644 index 00000000000..fe5f0901380 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/README.txt @@ -0,0 +1,33 @@ +plan.h +------- +generated by running +$CIAO_ROOT/DAnCE/StaticConfiguration/StaticDAnCEParser -p + ../descriptors/Application-flattened.cdp + +Messenger_StaticDAnCE.mpc +------------------------- +started with a copy of StaticDAnCEApp.mpc.tmpl from + $CIAO_ROOT/DAnCE/StaticConfiguration +changed project name and exe name +replaces example libs with libs built in the .. directory +added the after += line + +StaticDAnCEApp.cpp +------------------ +copied from StaticDAnCEApp.cpp.tmpl in $CIAO_ROOT/DAnCE/StaticConfiguration + +run_test.pl +----------- +a modified copy of the ../descriptors/run_test.pl script that uses the static +application in place of the NodeManager to run the Messenger_Node (port 44000) + +To run the test on the target, start the Messenger_StaticDAnCE executable +(with -ORBEndpoint iiop://:44000) first on the target. +Then comment out the spawning of process NA4 in the run_test.pl script. +Also modify the final line of ../descriptors/ApplicationNodeMap.dat to +replace host with the hostname or IP address of the target system. + +Known issues: +- During shutodwn the Execution_Manager will print out some exceptions when +it tries to communicate with the Messenger_StaticDAnCE process that has +already terminated. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/StaticDAnCEApp.cpp b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/StaticDAnCEApp.cpp new file mode 100644 index 00000000000..985173e5720 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/StaticDAnCEApp.cpp @@ -0,0 +1,119 @@ +// $Id$ + +#include "Container_Base.h" +#include "NodeManager/NodeManager_Impl.h" +#include "ace/OS_NS_stdio.h" +#include "ace/streams.h" +#include "ace/Get_Opt.h" +#include "tao/IORTable/IORTable.h" +#include "tao/CDR.h" +#include "plan.h" + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + // Initialize the ORB so that CORBA::Any will work + // + CORBA::ORB_var orb = + CORBA::ORB_init (argc, + argv, + ""); + try + { + // Get reference to Root POA. + CORBA::Object_var obj + = orb->resolve_initial_references ("RootPOA" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::POA_var poa + = PortableServer::POA::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Activate POA manager + PortableServer::POAManager_var mgr + = poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + mgr->activate (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + int homes_table_size = + sizeof (homes_table)/sizeof(HomeAttributes); + + CIAO::HOMECREATOR_FUNCPTR_MAP home_creator_fptr_map; + CIAO::HOMESERVANTCREATOR_FUNCPTR_MAP homesvnt_creator_fptr_map; + CIAO::Static_Config_EntryPoints_Maps static_config_entrypoints_maps; + static_config_entrypoints_maps.home_creator_funcptr_map_ = &home_creator_fptr_map; + static_config_entrypoints_maps.home_servant_creator_funcptr_map_ = &homesvnt_creator_fptr_map; + + int i=0; + for (i=0; i<homes_table_size; ++i) + { + home_creator_fptr_map.bind (homes_table[i].executor_entrypt_, + homes_table[i].executor_fptr_); + + homesvnt_creator_fptr_map.bind (homes_table[i].servant_entrypt_, + homes_table[i].servant_fptr_); + } + + CIAO::Static_NodeManager_Impl *static_node_manager_impl; + // Create and install the CIAO Daemon servant + + ACE_DEBUG ((LM_DEBUG, "creating static_node_manager\n")); + + static_node_manager_impl = + new CIAO::Static_NodeManager_Impl("NodeManager", + orb.in (), + poa.in (), + "", //exe location + "", //exe options + 0, //spawn delay + &static_config_entrypoints_maps); + + static_node_manager_impl->init (); + + CORBA::Object_var table_object = + orb->resolve_initial_references ("IORTable" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + IORTable::Table_var adapter = + IORTable::Table::_narrow (table_object.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (adapter.in ())) + ACE_ERROR_RETURN ((LM_ERROR, "Nil IORTable\n"), -1); + + CIAO::NodeManagerDaemon_var manager = + static_node_manager_impl->_this (); + + CORBA::String_var str = + orb->object_to_string (manager.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + adapter->bind ("NodeManager", + str.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Run the main event loop for the ORB. + orb->run (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + poa->destroy (1, 1 ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + catch (CORBA::Exception& ex) + { + ACE_PRINT_EXCEPTION (ex, "Caught CORBA Exception: "); + return -1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/plan.h b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/plan.h new file mode 100644 index 00000000000..5e36d41628e --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/plan.h @@ -0,0 +1,42 @@ +extern "C" ::Components::HomeExecutorBase_ptr create_MessengerHome_Impl (void); +extern "C" ::PortableServer::Servant create_MessengerHome_Servant + (::Components::HomeExecutorBase_ptr p, + ::CIAO::Session_Container *c, + const char* + ); +extern "C" ::Components::HomeExecutorBase_ptr create_ReceiverHome_Impl (void); +extern "C" ::PortableServer::Servant create_ReceiverHome_Servant + (::Components::HomeExecutorBase_ptr p, + ::CIAO::Session_Container *c, + const char* + ); +extern "C" ::Components::HomeExecutorBase_ptr create_ReceiverHome_Impl (void); +extern "C" ::PortableServer::Servant create_ReceiverHome_Servant + (::Components::HomeExecutorBase_ptr p, + ::CIAO::Session_Container *c, + const char* + ); +extern "C" ::Components::HomeExecutorBase_ptr create_AdministratorHome_Impl (void); +extern "C" ::PortableServer::Servant create_AdministratorHome_Servant + (::Components::HomeExecutorBase_ptr p, + ::CIAO::Session_Container *c, + const char* + ); +struct HomeAttributes +{ + char const * component_instance_name_; + /// Specify the entrypoint to component executor DLL. + char const * executor_entrypt_; + ::CIAO::HomeFactory executor_fptr_; + /// Specify the entrypoint to component servant DLL. + char const * servant_entrypt_; + ::CIAO::ServantFactory servant_fptr_; +}; +/// Homes +HomeAttributes homes_table[]= +{ + {"Messenger_Instance", "create_MessengerHome_Impl", create_MessengerHome_Impl, "create_MessengerHome_Servant", create_MessengerHome_Servant}, + {"First_Receiver_Instance", "create_ReceiverHome_Impl", create_ReceiverHome_Impl, "create_ReceiverHome_Servant", create_ReceiverHome_Servant}, + {"Second_Receiver_Instance", "create_ReceiverHome_Impl", create_ReceiverHome_Impl, "create_ReceiverHome_Servant", create_ReceiverHome_Servant}, + {"Administrator_Instance", "create_AdministratorHome_Impl", create_AdministratorHome_Impl, "create_AdministratorHome_Servant", create_AdministratorHome_Servant}}; + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/run_test.pl b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/run_test.pl new file mode 100644 index 00000000000..c4c35677500 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/StaticDAnCE/run_test.pl @@ -0,0 +1,108 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$emior= PerlACE::LocalFile ("em.ior"); +unlink $emior; +$plior= PerlACE::LocalFile ("pl.ior"); +unlink $plior; + +if (defined $ENV{'CIAO_ROOT'}) { + $CIAO_ROOT = $ENV{'CIAO_ROOT'}; +} +else { + $CIAO_ROOT = $ACE_ROOT/TAO/CIAO; +} + +$NA = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeApplication/NodeApplication"); +$NA_cmd = $NA->Executable (); + +$NA1 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:11000 -s $NA_cmd"); + +$NA2 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:22000 -s $NA_cmd"); + +$NA3 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:33000 -s $NA_cmd"); + +$NA4 = new PerlACE::Process ("Messenger_StaticDAnCE", + "-ORBEndpoint iiop://:44000"); + +# Each Node Manager lauches a Node Application process. +open(STDIN, "<../descriptors/admin.dat"); +$Ret1 = $NA1->Spawn (); +if($Ret1 == -1) { + print STDERR "ERROR: Administrator returned <$Ret1>\n" +} + +$Ret2 = $NA2->Spawn (); +if($Ret2 == -1) { + print STDERR "ERROR: Receiver 1 returned <$Ret2>\n" +} + +$Ret3 = $NA3->Spawn (); +if($Ret3 == -1) { + print STDERR "ERROR: Receiver 2 returned <$Ret3>\n" +} + +$Ret4 = $NA4->Spawn (); +if($Ret4 == -1) { + print STDERR "ERROR: Messenger returned <$Ret4>\n" +} + +#Start an Execution Manager +$EM = new PerlACE::Process ("$CIAO_ROOT/DAnCE/ExecutionManager/Execution_Manager", "-o $emior -i ../descriptors/ApplicationNodeMap.dat"); + +$Ret5 = $EM->Spawn (); +if($Ret5 == -1) { + print STDERR "ERROR: Execution Manager returned <$Ret5>\n" +} + +if (PerlACE::waitforfile_timed ($emior, 5) == -1) { + print STDERR "ERROR: cannot find file <$emior>\n"; + $EM->Kill(); + unlink $emior; + exit 1; +} + +sleep(5); +#Start the plan laucnher +$EX = new PerlACE::Process ("$CIAO_ROOT/DAnCE/Plan_Launcher/plan_launcher", + "-p ../descriptors/Application-flattened.cdp ". + "-k file://$emior -o $plior"); + +#Stop the plan launcher +$EX2 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/Plan_Launcher/plan_launcher", + "-k file://$emior -i file://$plior"); + +$Ret6 = $EX->Spawn (); +if($Ret6 == -1) { + print STDERR "ERROR: plan launcher returned <$Ret6>\n" +} + +sleep(10); + +$Ret7 = $EX2->Spawn (); +if($Ret7 == -1) { + print STDERR "ERROR: plan launcher (shutdown) returned <$Ret7>\n" +} + +sleep(5); +$EX2->Kill(); +$EX->Kill(); +$EM->Kill(); + +$NA1->Kill(); +$NA2->Kill(); +$NA3->Kill(); +$NA4->Kill(); + +unlink $emior; +unlink $plior; + +exit 0; diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.ccd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.ccd new file mode 100644 index 00000000000..23ba49bb84c --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.ccd @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentInterfaceDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Administrator Component</label> + <specificType>IDL:Administrator:1.0</specificType> + <supportedType>IDL:Administrator:1.0</supportedType> + <idlFile>Administrator.idl</idlFile> + + <port> + <name>runnables</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>true</exclusiveUser> + <optional>true</optional> + <provider>false</provider> + <supportedType>IDL:Runnable:1.0</supportedType> + <specificType>IDL:Runnable:1.0</specificType> + <kind>MultiplexReceptacle</kind> + </port> + + <port> + <name>content</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>true</exclusiveUser> + <optional>true</optional> + <provider>false</provider> + <supportedType>IDL:Publication:1.0</supportedType> + <specificType>IDL:Publication:1.0</specificType> + <kind>MultiplexReceptacle</kind> + </port> + + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This CCD describes the Administrator's interface</string> + </value> + </value> + </infoProperty> + +</Deployment:ComponentInterfaceDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cid b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cid new file mode 100644 index 00000000000..af9e9a4c677 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cid @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentImplementationDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Administrator Implementation</label> + <implements href="Administrator.ccd"/> + <monolithicImpl> + <primaryArtifact> + <name>Administrator_Stub</name> + <referencedArtifact href="Administrator_Stub.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Administrator_Svnt</name> + <referencedArtifact href="Administrator_Svnt.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Administrator_Exec</name> + <referencedArtifact href="Administrator_Exec.iad"/> + </primaryArtifact> + </monolithicImpl> + <configProperty> + <name>ComponentIOR</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>Administrator.ior</string> + </value> + </value> + </configProperty> +</Deployment:ComponentImplementationDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cpd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cpd new file mode 100644 index 00000000000..972966462e6 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator.cpd @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentPackageDescription +xmlns:Deployment="http://www.omg.org/Deployment" +xmlns:xmi="http://www.omg.org/XMI" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + + <label>Administrator Component</label> + <realizes href="Administrator.ccd"/> + <implementation> + <name>AdministratorImpl</name> + <referencedImplementation href="Administrator.cid"/> + </implementation> + +</Deployment:ComponentPackageDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Exec.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Exec.iad new file mode 100644 index 00000000000..81b7a16da7a --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Exec.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Administrator Executor Artifact</label> + <location>Administrator_exec</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Administrator_Stub</name> + <referencedArtifact href="Administrator_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createAdministratorHome_Impl</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Administrator's executor library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Stub.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Stub.iad new file mode 100644 index 00000000000..931fc371710 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Stub.iad @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Administrator Stub Artifact</label> + <location>Administrator_stub</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Messenger_Stub</name> + <referencedArtifact href="Messenger_Stub.iad"/> + </dependsOn> + + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Administrator's stub library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Svnt.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Svnt.iad new file mode 100644 index 00000000000..6774a107ef0 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Administrator_Svnt.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Administrator Servant Artifact</label> + <location>Administrator_svnt</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Administrator_Stub</name> + <referencedArtifact href="Administrator_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createAdministratorHome_Servant</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Administrator's servant library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application-flattened.cdp b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application-flattened.cdp new file mode 100644 index 00000000000..d01ec12e2db --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application-flattened.cdp @@ -0,0 +1,255 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:deploymentPlan + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + + <label>Messenger Deployment Plan</label> + + <!-- realizes --> + + <!-- implementation* --> + + <implementation id="MessengerImpl"> <!-- from Messenger.cpd --> + <name>MessengerImpl</name> + <source></source> + <!-- from Messenger.cid --> + <artifact>Messenger_Stub</artifact> + <artifact>Messenger_Svnt</artifact> + <artifact>Messenger_Exec</artifact> + </implementation> + + <implementation id="ReceiverImpl"> <!-- from Receiver.cpd --> + <name>ReceiverImpl</name> + <source></source> + <artifact>Receiver_Stub</artifact> + <artifact>Receiver_Svnt</artifact> + <artifact>Receiver_Exec</artifact> + </implementation> + + <implementation id="AdministratorImpl"> <!-- from Administrator.cpd --> + <name>AdministratorImpl</name> + <source></source> + <artifact>Administrator_Stub</artifact> + <artifact>Administrator_Svnt</artifact> + <artifact>Administrator_Exec</artifact> + </implementation> + + <!-- instance* --> + + <instance id="Messenger_Instance_ID"> + <name>Messenger_Instance</name> + <node>Messenger_Node</node> + <source></source> + <implementation>MessengerImpl</implementation> + </instance> + <instance id="First_Receiver_Instance_ID"> + <name>First_Receiver_Instance</name> + <node>First_Receiver_Node</node> + <source></source> + <implementation>ReceiverImpl</implementation> + </instance> + <instance id="Second_Receiver_Instance_ID"> + <name>Second_Receiver_Instance</name> + <node>Second_Receiver_Node</node> + <source></source> + <implementation>ReceiverImpl</implementation> + </instance> + <instance id="Administrator_Instance_ID"> + <name>Administrator_Instance</name> + <node>Administrator_Node</node> + <source></source> + <implementation>AdministratorImpl</implementation> + </instance> + + <!-- connection* --> + + <connection> + <name>Messenger_to_First_Receiver_Publish</name> + <internalEndpoint> + <portName>message_publisher</portName> + <kind>EventPublisher</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>message_consumer</portName> + <kind>EventConsumer</kind> + <instance>First_Receiver_Instance_ID</instance> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_First_Receiver_History</name> + <internalEndpoint> + <portName>message_history</portName> + <kind>Facet</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>message_history</portName> + <kind>SimplexReceptacle</kind> + <instance>First_Receiver_Instance_ID</instance> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Second_Receiver_Publish</name> + <internalEndpoint> + <portName>message_publisher</portName> + <kind>EventPublisher</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>message_consumer</portName> + <kind>EventConsumer</kind> + <instance>Second_Receiver_Instance_ID</instance> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Second_Receiver_History</name> + <internalEndpoint> + <portName>message_history</portName> + <kind>Facet</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>message_history</portName> + <kind>SimplexReceptacle</kind> + <instance>Second_Receiver_Instance_ID</instance> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Administrator_Control</name> + <internalEndpoint> + <portName>control</portName> + <kind>Facet</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>runnables</portName> + <kind>SimplexReceptacle</kind> + <instance>Administrator_Instance_ID</instance> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Administrator_Content</name> + <internalEndpoint> + <portName>content</portName> + <kind>Facet</kind> + <instance>Messenger_Instance_ID</instance> + </internalEndpoint> + <internalEndpoint> + <portName>content</portName> + <kind>SimplexReceptacle</kind> + <instance>Administrator_Instance_ID</instance> + </internalEndpoint> + </connection> + + <!-- artifact* (exec, svnt) --> + + <artifact id="Messenger_Stub"> + <name>Messenger_Stub</name> + <source></source> + <node></node> + <location>Messenger_stub</location> + </artifact> + <artifact id="Messenger_Svnt"> + <name>Messenger_Svnt</name> + <source></source> + <node></node> + <location>Messenger_svnt</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_MessengerHome_Servant</string></value> + </value> + </execParameter> + </artifact> + <artifact id="Messenger_Exec"> + <name>Messenger_Exec</name> + <source></source> + <node></node> + <location>Messenger_exec</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_MessengerHome_Impl</string></value> + </value> + </execParameter> + </artifact> + + <artifact id="Receiver_Stub"> + <name>Receiver_Stub</name> + <source></source> + <node></node> + <location>Receiver_stub</location> + </artifact> + <artifact id="Receiver_Svnt"> + <name>Receiver_Svnt</name> + <source></source> + <node></node> + <location>Receiver_svnt</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_ReceiverHome_Servant</string></value> + </value> + </execParameter> + </artifact> + <artifact id="Receiver_Exec"> + <name>Receiver_Exec</name> + <source></source> + <node></node> + <location>Receiver_exec</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_ReceiverHome_Impl</string></value> + </value> + </execParameter> + </artifact> + + <artifact id="Administrator_Stub"> + <name>Administrator_Stub</name> + <source></source> + <node></node> + <location>Administrator_stub</location> + </artifact> + <artifact id="Administrator_Svnt"> + <name>Administrator_Svnt</name> + <source></source> + <node></node> + <location>Administrator_svnt</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_AdministratorHome_Servant</string></value> + </value> + </execParameter> + </artifact> + <artifact id="Administrator_Exec"> + <name>Administrator_Exec</name> + <source></source> + <node></node> + <location>Administrator_exec</location> + <execParameter> + <name>entryPoint</name> + <value> + <type><kind>tk_string</kind></type> + <value><string>create_AdministratorHome_Impl</string></value> + </value> + </execParameter> + </artifact> + + +</Deployment:deploymentPlan> + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.cdp b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.cdp new file mode 100644 index 00000000000..9e774373c2f --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.cdp @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:DeploymentPlan + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Deployment Plan</label> + <instance xmi:id="Messenger_Instance_ID"> + <name>Messenger_Instance</name> + <node>Messenger_Node</node> + </instance> + <instance xmi:id="First_Receiver_Instance_ID"> + <name>First_Receiver_Instance</name> + <node>First_Receiver_Node</node> + </instance> + <instance xmi:id="Second_Receiver_Instance_ID"> + <name>Second_Receiver_Instance</name> + <node>Second_Receiver_Node</node> + </instance> + <instance xmi:id="Administrator_Instance_ID"> + <name>Administrator_Instance</name> + <node>Administrator_Node</node> + </instance> +</Deployment:DeploymentPlan> + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.pcd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.pcd new file mode 100644 index 00000000000..70635a4850b --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Application.pcd @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:PackageConfiguration +xmlns:Deployment="http://www.omg.org/Deployment" +xmlns:xmi="http://www.omg.org/XMI" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Application Configuration</label> + <basePackage href="MessengerAssembly.cpd"/> + + <!-- CIAO does not yet pay attention to this --> + <configProperty> + <name>subject</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>My Subject</string> + </value> + </value> + </configProperty> +</Deployment:PackageConfiguration> + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/ApplicationNodeMap.dat b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/ApplicationNodeMap.dat new file mode 100644 index 00000000000..75f28747798 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/ApplicationNodeMap.dat @@ -0,0 +1,4 @@ +Administrator_Node corbaloc:iiop:localhost:11000/NodeManager +First_Receiver_Node corbaloc:iiop:localhost:22000/NodeManager +Second_Receiver_Node corbaloc:iiop:localhost:33000/NodeManager +Messenger_Node corbaloc:iiop:localhost:44000/NodeManager diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Deployment.xsd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Deployment.xsd new file mode 100644 index 00000000000..ae9bc21965d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Deployment.xsd @@ -0,0 +1,776 @@ +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:Deployment="http://www.omg.org/Deployment" + targetNamespace="http://www.omg.org/Deployment"> + + <xsd:import namespace="http://www.omg.org/XMI" schemaLocation="XMI.xsd" /> + + + <xsd:complexType name="Any"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="type" type="Deployment:DataType"/> + <xsd:element name="value" type="Deployment:DataValue"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Any" type="Deployment:Any"/> + <xsd:complexType name="DataType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="kind" type="Deployment:TCKind"/> + <xsd:element name="enum" type="Deployment:EnumType"/> + <xsd:element name="objref" type="Deployment:ObjrefType"/> + <xsd:element name="boundedString" type="Deployment:BoundedStringType"/> + <xsd:element name="fixed" type="Deployment:FixedType"/> + <xsd:element name="array" type="Deployment:ArrayType"/> + <xsd:element name="sequence" type="Deployment:SequenceType"/> + <xsd:element name="alias" type="Deployment:AliasType"/> + <xsd:element name="struct" type="Deployment:StructType"/> + <xsd:element name="value" type="Deployment:ValueType"/> + <xsd:element name="union" type="Deployment:UnionType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="DataType" type="Deployment:DataType"/> + <xsd:complexType name="DataValue"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="short" type="xsd:short"/> + <xsd:element name="long" type="xsd:int"/> + <xsd:element name="ushort" type="xsd:unsignedShort"/> + <xsd:element name="ulong" type="xsd:unsignedInt"/> + <xsd:element name="float" type="xsd:float"/> + <xsd:element name="double" type="xsd:double"/> + <xsd:element name="boolean" type="xsd:boolean"/> + <xsd:element name="octet" type="xsd:unsignedByte"/> + <xsd:element name="opaque" type="xsd:base64Binary"/> + <xsd:element name="objref" type="xsd:string"/> + <xsd:element name="enum" type="xsd:string"/> + <xsd:element name="string" type="xsd:string"/> + <xsd:element name="longlong" type="xsd:long"/> + <xsd:element name="ulonglong" type="xsd:unsignedLong"/> + <xsd:element name="longdouble" type="xsd:double"/> + <xsd:element name="fixed" type="xsd:string"/> + <xsd:element name="any" type="Deployment:Any"/> + <xsd:element name="typecode" type="Deployment:DataType"/> + <xsd:element name="element" type="Deployment:DataValue"/> + <xsd:element name="discriminator" type="Deployment:DataValue"/> + <xsd:element name="value" type="Deployment:DataValue"/> + <xsd:element name="boxedValue" type="Deployment:DataValue"/> + <xsd:element name="member" type="Deployment:NamedValue"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="DataValue" type="Deployment:DataValue"/> + + + <xsd:complexType name="EnumType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + <xsd:element name="member" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="EnumType" type="Deployment:EnumType"/> + <xsd:complexType name="ObjrefType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + + + <xsd:element name="ObjrefType" type="Deployment:ObjrefType"/> + <xsd:complexType name="BoundedStringType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="bound" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="BoundedStringType" type="Deployment:BoundedStringType"/> + <xsd:complexType name="FixedType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="digits" type="xsd:string"/> + <xsd:element name="scale" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="FixedType" type="Deployment:FixedType"/> + <xsd:complexType name="ArrayType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="length" type="xsd:string"/> + <xsd:element name="elementType" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ArrayType" type="Deployment:ArrayType"/> + <xsd:complexType name="SequenceType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="bound" type="xsd:string"/> + <xsd:element name="elementType" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SequenceType" type="Deployment:SequenceType"/> + <xsd:complexType name="AliasType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + <xsd:element name="elementType" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="AliasType" type="Deployment:AliasType"/> + <xsd:complexType name="StructType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + <xsd:element name="member" type="Deployment:StructMemberType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="StructType" type="Deployment:StructType"/> + <xsd:complexType name="StructMemberType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="type" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="StructMemberType" type="Deployment:StructMemberType"/> + <xsd:complexType name="ValueType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + <xsd:element name="modifier" type="xsd:string"/> + <xsd:element name="baseType" type="Deployment:DataType"/> + <xsd:element name="member" type="Deployment:ValueMemberType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ValueType" type="Deployment:ValueType"/> + <xsd:complexType name="ValueMemberType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="visibility" type="xsd:string"/> + <xsd:element name="type" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ValueMemberType" type="Deployment:ValueMemberType"/> + <xsd:complexType name="UnionType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="typeId" type="xsd:string"/> + <xsd:element name="default" type="Deployment:UnionMemberType"/> + <xsd:element name="discriminatorType" type="Deployment:DataType"/> + <xsd:element name="member" type="Deployment:UnionMemberType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="UnionType" type="Deployment:UnionType"/> + <xsd:complexType name="UnionMemberType"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="type" type="Deployment:DataType"/> + <xsd:element name="label" type="Deployment:DataValue"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="UnionMemberType" type="Deployment:UnionMemberType"/> + <xsd:complexType name="NamedValue"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="value" type="Deployment:DataValue"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="NamedValue" type="Deployment:NamedValue"/> + <xsd:complexType name="Bridge"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="connect" type="Deployment:Interconnect"/> + <xsd:element name="resource" type="Deployment:Resource"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Bridge" type="Deployment:Bridge"/> + <xsd:complexType name="Interconnect"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="connection" type="Deployment:Bridge"/> + <xsd:element name="connect" type="Deployment:Node"/> + <xsd:element name="resource" type="Deployment:Resource"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Interconnect" type="Deployment:Interconnect"/> + <xsd:complexType name="Node"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="connection" type="Deployment:Interconnect"/> + <xsd:element name="sharedResource" type="Deployment:SharedResource"/> + <xsd:element name="resource" type="Deployment:Resource"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Node" type="Deployment:Node"/> + <xsd:complexType name="Resource"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="property" type="Deployment:SatisfierProperty"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Resource" type="Deployment:Resource"/> + <xsd:complexType name="SharedResource"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="node" type="Deployment:Node"/> + <xsd:element name="property" type="Deployment:SatisfierProperty"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SharedResource" type="Deployment:SharedResource"/> + <xsd:complexType name="Domain"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="sharedResource" type="Deployment:SharedResource"/> + <xsd:element name="node" type="Deployment:Node"/> + <xsd:element name="interconnect" type="Deployment:Interconnect"/> + <xsd:element name="bridge" type="Deployment:Bridge"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Domain" type="Deployment:Domain"/> + <xsd:complexType name="PlanPropertyMapping"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="source" type="xsd:string"/> + <xsd:element name="externalName" type="xsd:string"/> + <xsd:element name="delegatesTo" type="Deployment:PlanSubcomponentPropertyReference"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PlanPropertyMapping" type="Deployment:PlanPropertyMapping"/> + <xsd:complexType name="PlanSubcomponentPropertyReference"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="propertyName" type="xsd:string"/> + <xsd:element name="instance" type="Deployment:InstanceDeploymentDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PlanSubcomponentPropertyReference" type="Deployment:PlanSubcomponentPropertyReference"/> + <xsd:complexType name="PlanSubcomponentPortEndpoint"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="portName" type="xsd:string"/> + <xsd:element name="provider" type="xsd:string"/> + <xsd:element name="kind" type="Deployment:CCMComponentPortKind"/> + <xsd:element name="instance" type="Deployment:InstanceDeploymentDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PlanSubcomponentPortEndpoint" type="Deployment:PlanSubcomponentPortEndpoint"/> + <xsd:complexType name="PlanConnectionDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="source" type="xsd:string"/> + <xsd:element name="deployRequirement" type="Deployment:Requirement"/> + <xsd:element name="externalEndpoint" type="Deployment:ComponentExternalPortEndpoint"/> + <xsd:element name="internalEndpoint" type="Deployment:PlanSubcomponentPortEndpoint"/> + <xsd:element name="externalReference" type="Deployment:ExternalReferenceEndpoint"/> + <xsd:element name="deployedResource" type="Deployment:ConnectionResourceDeploymentDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PlanConnectionDescription" type="Deployment:PlanConnectionDescription"/> + <xsd:complexType name="InstanceDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="node" type="xsd:string"/> + <xsd:element name="source" type="xsd:string"/> + <xsd:element name="implementation" type="Deployment:MonolithicDeploymentDescription"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + <xsd:element name="deployedResource" type="Deployment:InstanceResourceDeploymentDescription"/> + <xsd:element name="deployedSharedResource" type="Deployment:InstanceResourceDeploymentDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="InstanceDeploymentDescription" type="Deployment:InstanceDeploymentDescription"/> + <xsd:complexType name="MonolithicDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="source" type="xsd:string"/> + <xsd:element name="artifact" type="Deployment:ArtifactDeploymentDescription"/> + <xsd:element name="execParameter" type="Deployment:Property"/> + <xsd:element name="deployRequirement" type="Deployment:Requirement"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="MonolithicDeploymentDescription" type="Deployment:MonolithicDeploymentDescription"/> + <xsd:complexType name="ArtifactDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="location" type="xsd:string"/> + <xsd:element name="node" type="xsd:string"/> + <xsd:element name="source" type="xsd:string"/> + <xsd:element name="execParameter" type="Deployment:Property"/> + <xsd:element name="deployRequirement" type="Deployment:Requirement"/> + <xsd:element name="deployedResource" type="Deployment:ResourceDeploymentDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ArtifactDeploymentDescription" type="Deployment:ArtifactDeploymentDescription"/> + + + <xsd:complexType name="DeploymentPlan"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="realizes" type="Deployment:ComponentInterfaceDescription"/> + <xsd:element name="implementation" type="Deployment:MonolithicDeploymentDescription"/> + <xsd:element name="instance" type="Deployment:InstanceDeploymentDescription"/> + <xsd:element name="connection" type="Deployment:PlanConnectionDescription"/> + <xsd:element name="externalProperty" type="Deployment:PlanPropertyMapping"/> + <xsd:element name="dependsOn" type="Deployment:ImplementationDependency"/> + <xsd:element name="artifact" type="Deployment:ArtifactDeploymentDescription"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="DeploymentPlan" type="Deployment:DeploymentPlan"/> + + + <xsd:complexType name="ResourceDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="requirementName" type="xsd:string"/> + <xsd:element name="resourceName" type="xsd:string"/> + <xsd:element name="resourceValue" type="Deployment:Any"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ResourceDeploymentDescription" type="Deployment:ResourceDeploymentDescription"/> + <xsd:complexType name="InstanceResourceDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="resourceUsage" type="Deployment:ResourceUsageKind"/> + <xsd:element name="requirementName" type="xsd:string"/> + <xsd:element name="resourceName" type="xsd:string"/> + <xsd:element name="resourceValue" type="Deployment:Any"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="InstanceResourceDeploymentDescription" type="Deployment:InstanceResourceDeploymentDescription"/> + <xsd:complexType name="ConnectionResourceDeploymentDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="targetName" type="xsd:string"/> + <xsd:element name="requirementName" type="xsd:string"/> + <xsd:element name="resourceName" type="xsd:string"/> + <xsd:element name="resourceValue" type="Deployment:Any"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ConnectionResourceDeploymentDescription" type="Deployment:ConnectionResourceDeploymentDescription"/> + <xsd:complexType name="Capability"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="property" type="Deployment:SatisfierProperty"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Capability" type="Deployment:Capability"/> + <xsd:complexType name="ComponentPropertyDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="type" type="Deployment:DataType"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentPropertyDescription" type="Deployment:ComponentPropertyDescription"/> + <xsd:complexType name="ComponentPortDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="specificType" type="xsd:string"/> + <xsd:element name="supportedType" type="xsd:string"/> + <xsd:element name="provider" type="xsd:string"/> + <xsd:element name="exclusiveProvider" type="xsd:string"/> + <xsd:element name="exclusiveUser" type="xsd:string"/> + <xsd:element name="optional" type="xsd:string"/> + <xsd:element name="kind" type="Deployment:CCMComponentPortKind"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentPortDescription" type="Deployment:ComponentPortDescription"/> + <xsd:complexType name="ComponentInterfaceDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="specificType" type="xsd:string"/> + <xsd:element name="supportedType" type="xsd:string"/> + <xsd:element name="idlFile" type="xsd:string"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + <xsd:element name="port" type="Deployment:ComponentPortDescription"/> + <xsd:element name="property" type="Deployment:ComponentPropertyDescription"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentInterfaceDescription" type="Deployment:ComponentInterfaceDescription"/> + <xsd:complexType name="ImplementationArtifactDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="location" type="xsd:string"/> + <xsd:element name="execParameter" type="Deployment:Property"/> + <xsd:element name="deployRequirement" type="Deployment:Requirement"/> + <xsd:element name="dependsOn" type="Deployment:NamedImplementationArtifact"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ImplementationArtifactDescription" type="Deployment:ImplementationArtifactDescription"/> + <xsd:complexType name="MonolithicImplementationDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="execParameter" type="Deployment:Property"/> + <xsd:element name="primaryArtifact" type="Deployment:NamedImplementationArtifact"/> + <xsd:element name="deployRequirement" type="Deployment:ImplementationRequirement"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="MonolithicImplementationDescription" type="Deployment:MonolithicImplementationDescription"/> + <xsd:complexType name="AssemblyPropertyMapping"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="externalName" type="xsd:string"/> + <xsd:element name="delegatesTo" type="Deployment:SubcomponentPropertyReference"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="AssemblyPropertyMapping" type="Deployment:AssemblyPropertyMapping"/> + <xsd:complexType name="SubcomponentPropertyReference"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="propertyName" type="xsd:string"/> + <xsd:element name="instance" type="Deployment:SubcomponentInstantiationDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SubcomponentPropertyReference" type="Deployment:SubcomponentPropertyReference"/> + <xsd:complexType name="SubcomponentPortEndpoint"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="portName" type="xsd:string"/> + <xsd:element name="instance" type="Deployment:SubcomponentInstantiationDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SubcomponentPortEndpoint" type="Deployment:SubcomponentPortEndpoint"/> + <xsd:complexType name="AssemblyConnectionDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="deployRequirement" type="Deployment:Requirement"/> + <xsd:element name="externalEndpoint" type="Deployment:ComponentExternalPortEndpoint"/> + <xsd:element name="internalEndpoint" type="Deployment:SubcomponentPortEndpoint"/> + <xsd:element name="externalReference" type="Deployment:ExternalReferenceEndpoint"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="AssemblyConnectionDescription" type="Deployment:AssemblyConnectionDescription"/> + <xsd:complexType name="SubcomponentInstantiationDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="package" type="Deployment:ComponentPackageDescription"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + <xsd:element name="selectRequirement" type="Deployment:Requirement"/> + <xsd:element name="reference" type="Deployment:ComponentPackageReference"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SubcomponentInstantiationDescription" type="Deployment:SubcomponentInstantiationDescription"/> + <xsd:complexType name="ComponentAssemblyDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="instance" type="Deployment:SubcomponentInstantiationDescription"/> + <xsd:element name="connection" type="Deployment:AssemblyConnectionDescription"/> + <xsd:element name="externalProperty" type="Deployment:AssemblyPropertyMapping"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentAssemblyDescription" type="Deployment:ComponentAssemblyDescription"/> + <xsd:complexType name="ComponentImplementationDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="implements" type="Deployment:ComponentInterfaceDescription"/> + <xsd:element name="assemblyImpl" type="Deployment:ComponentAssemblyDescription"/> + <xsd:element name="monolithicImpl" type="Deployment:MonolithicImplementationDescription"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + <xsd:element name="capability" type="Deployment:Capability"/> + <xsd:element name="dependsOn" type="Deployment:ImplementationDependency"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentImplementationDescription" type="Deployment:ComponentImplementationDescription"/> + <xsd:complexType name="ComponentPackageReference"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="requiredUUID" type="xsd:string"/> + <xsd:element name="requiredName" type="xsd:string"/> + <xsd:element name="requiredType" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentPackageReference" type="Deployment:ComponentPackageReference"/> + <xsd:complexType name="ComponentPackageDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="realizes" type="Deployment:ComponentInterfaceDescription"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + <xsd:element name="implementation" type="Deployment:PackagedComponentImplementation"/> + <xsd:element name="infoProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentPackageDescription" type="Deployment:ComponentPackageDescription"/> + <xsd:complexType name="PackageConfiguration"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="label" type="xsd:string"/> + <xsd:element name="UUID" type="xsd:string"/> + <xsd:element name="specializedConfig" type="Deployment:PackageConfiguration"/> + <xsd:element name="basePackage" type="Deployment:ComponentPackageDescription"/> + <xsd:element name="reference" type="Deployment:ComponentPackageReference"/> + <xsd:element name="selectRequirement" type="Deployment:Requirement"/> + <xsd:element name="configProperty" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PackageConfiguration" type="Deployment:PackageConfiguration"/> + <xsd:complexType name="PackagedComponentImplementation"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="referencedImplementation" type="Deployment:ComponentImplementationDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="PackagedComponentImplementation" type="Deployment:PackagedComponentImplementation"/> + <xsd:complexType name="NamedImplementationArtifact"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="referencedArtifact" type="Deployment:ImplementationArtifactDescription"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="NamedImplementationArtifact" type="Deployment:NamedImplementationArtifact"/> + <xsd:complexType name="ImplementationRequirement"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="resourceUsage" type="Deployment:ResourceUsageKind"/> + <xsd:element name="resourcePort" type="xsd:string"/> + <xsd:element name="componentPort" type="xsd:string"/> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="property" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ImplementationRequirement" type="Deployment:ImplementationRequirement"/> + <xsd:complexType name="RequirementSatisfier"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="property" type="Deployment:SatisfierProperty"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="RequirementSatisfier" type="Deployment:RequirementSatisfier"/> + <xsd:complexType name="SatisfierProperty"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="kind" type="Deployment:SatisfierPropertyKind"/> + <xsd:element name="value" type="Deployment:Any"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="SatisfierProperty" type="Deployment:SatisfierProperty"/> + <xsd:complexType name="Requirement"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="resourceType" type="xsd:string"/> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="property" type="Deployment:Property"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Requirement" type="Deployment:Requirement"/> + <xsd:complexType name="Property"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="name" type="xsd:string"/> + <xsd:element name="value" type="Deployment:Any"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="Property" type="Deployment:Property"/> + <xsd:complexType name="ExternalReferenceEndpoint"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="location" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ExternalReferenceEndpoint" type="Deployment:ExternalReferenceEndpoint"/> + <xsd:complexType name="ComponentExternalPortEndpoint"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="portName" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ComponentExternalPortEndpoint" type="Deployment:ComponentExternalPortEndpoint"/> + <xsd:complexType name="ImplementationDependency"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="requiredType" type="xsd:string"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="ImplementationDependency" type="Deployment:ImplementationDependency"/> + <xsd:complexType name="TopLevelPackageDescription"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="package" type="Deployment:PackageConfiguration"/> + </xsd:choice> + <xsd:attribute ref="xmi:id" use="optional"/> + <xsd:attributeGroup ref="xmi:ObjectAttribs"/> + </xsd:complexType> + <xsd:element name="TopLevelPackageDescription" type="Deployment:TopLevelPackageDescription"/> + <xsd:simpleType name="TCKind"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="tk_null"/> + <xsd:enumeration value="tk_void"/> + <xsd:enumeration value="tk_short"/> + <xsd:enumeration value="tk_long"/> + <xsd:enumeration value="tk_ushort"/> + <xsd:enumeration value="tk_ulong"/> + <xsd:enumeration value="tk_float"/> + <xsd:enumeration value="tk_double"/> + <xsd:enumeration value="tk_boolean"/> + <xsd:enumeration value="tk_char"/> + <xsd:enumeration value="tk_octet"/> + <xsd:enumeration value="tk_any"/> + <xsd:enumeration value="tk_TypeCode"/> + <xsd:enumeration value="tk_Principal"/> + <xsd:enumeration value="tk_objref"/> + <xsd:enumeration value="tk_struct"/> + <xsd:enumeration value="tk_union"/> + <xsd:enumeration value="tk_enum"/> + <xsd:enumeration value="tk_string"/> + <xsd:enumeration value="tk_sequence"/> + <xsd:enumeration value="tk_array"/> + <xsd:enumeration value="tk_alias"/> + <xsd:enumeration value="tk_except"/> + <xsd:enumeration value="tk_longlong"/> + <xsd:enumeration value="tk_ulonglong"/> + <xsd:enumeration value="tk_longdouble"/> + <xsd:enumeration value="tk_wchar"/> + <xsd:enumeration value="tk_wstring"/> + <xsd:enumeration value="tk_wfixed"/> + <xsd:enumeration value="tk_value"/> + <xsd:enumeration value="tk_value_box"/> + <xsd:enumeration value="tk_native"/> + <xsd:enumeration value="tk_abstract_interface"/> + <xsd:enumeration value="tk_local_interface"/> + <xsd:enumeration value="tk_component"/> + <xsd:enumeration value="tk_home"/> + <xsd:enumeration value="tk_event"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ResourceUsageKind"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="None"/> + <xsd:enumeration value="InstanceUsesResource"/> + <xsd:enumeration value="ResourceUsesInstance"/> + <xsd:enumeration value="PortUsesResource"/> + <xsd:enumeration value="ResourceUsesPort"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="CCMComponentPortKind"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Facet"/> + <xsd:enumeration value="SimplexReceptacle"/> + <xsd:enumeration value="MultiplexReceptacle"/> + <xsd:enumeration value="EventEmitter"/> + <xsd:enumeration value="EventPublisher"/> + <xsd:enumeration value="EventConsumer"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="SatisfierPropertyKind"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Quantity"/> + <xsd:enumeration value="Capacity"/> + <xsd:enumeration value="Minimum"/> + <xsd:enumeration value="Maximum"/> + <xsd:enumeration value="Attribute"/> + <xsd:enumeration value="Selection"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Domain.cdd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Domain.cdd new file mode 100644 index 00000000000..54a8c1f5a82 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Domain.cdd @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<Deployment:Domain + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> +<label>Messenger Application Domain</label> +<node> + <name>Messenger_Node</name> + <label>Messenger's Node</label> +</node> +<node> + <name>First_Receiver_Node</name> + <label>First Receiver's Node</label> +</node> +<node> + <name>Second_Receiver_Node</name> + <label>Second Receiver's Node</label> +</node> +<node> + <name>Administrator_Node</name> + <label>Administrator's Node</label> +</node> +</Deployment:Domain> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Libraries.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Libraries.iad new file mode 100644 index 00000000000..d861613c157 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Libraries.iad @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>ACE/TAO/CIAO Libraries</label> + <location>$ACE_ROOT/lib/ACE</location> + <location>$ACE_ROOT/lib/TAO</location> + <location>$ACE_ROOT/lib/CIAO_Client</location> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.ccd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.ccd new file mode 100644 index 00000000000..cf79d7fb9f7 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.ccd @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentInterfaceDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Component</label> + <specificType>IDL:Messenger:1.0</specificType> + <idlFile>Messenger.idl</idlFile> + + <property> + <name>subject</name> + <type> + <kind>tk_string</kind> + </type> + </property> + + <port> + <name>control</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>false</exclusiveUser> + <optional>true</optional> + <provider>true</provider> + <supportedType>IDL:Runnable:1.0</supportedType> + <specificType>IDL:Runnable:1.0</specificType> + <kind>Facet</kind> + </port> + + <port> + <name>content</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>false</exclusiveUser> + <optional>true</optional> + <provider>true</provider> + <supportedType>IDL:Publication:1.0</supportedType> + <specificType>IDL:Publication:1.0</specificType> + <kind>Facet</kind> + </port> + + <port> + <name>message_publisher</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>false</exclusiveUser> + <optional>true</optional> + <provider>false</provider> + <supportedType>IDL:Message:1.0</supportedType> + <specificType>IDL:Message:1.0</specificType> + <kind>EventPublisher</kind> + </port> + + <port> + <name>message_history</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>false</exclusiveUser> + <optional>true</optional> + <provider>true</provider> + <supportedType>IDL:History:1.0</supportedType> + <specificType>IDL:History:1.0</specificType> + <kind>Facet</kind> + </port> + + <!-- Default value for subject property, can be overridden. + CIAO does not process this (yet) + --> + <configProperty> + <name>subject</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>Default Subject</string> + </value> + </value> + </configProperty> + + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This CCD describes the Messenger's interface</string> + </value> + </value> + </infoProperty> + +</Deployment:ComponentInterfaceDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cid b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cid new file mode 100644 index 00000000000..c4e934f1ee2 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cid @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentImplementationDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Implementation</label> + <implements href="Messenger.ccd"/> + <monolithicImpl> + <primaryArtifact> + <name>Messenger_Stub</name> + <referencedArtifact href="Messenger_Stub.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Messenger_Svnt</name> + <referencedArtifact href="Messenger_Svnt.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Messenger_Exec</name> + <referencedArtifact href="Messenger_Exec.iad"/> + </primaryArtifact> + </monolithicImpl> + + <configProperty> + <name>ComponentIOR</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>Messenger.ior</string> + </value> + </value> + </configProperty> + +</Deployment:ComponentImplementationDescription> + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cpd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cpd new file mode 100644 index 00000000000..ee624b9bce5 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger.cpd @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentPackageDescription +xmlns:Deployment="http://www.omg.org/Deployment" +xmlns:xmi="http://www.omg.org/XMI" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + + <label>Messenger Component</label> + <realizes href="Messenger.ccd"/> + <implementation> + <name>MessengerImpl</name> + <referencedImplementation href="Messenger.cid"/> + </implementation> + +</Deployment:ComponentPackageDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.ccd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.ccd new file mode 100644 index 00000000000..c048d99133d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.ccd @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentInterfaceDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Assembly</label> + + <property> + <name>subject</name> + <type> + <kind>tk_string</kind> + </type> + </property> + + <!-- Default value for subject property, can be overridden. + CIAO does not process this (yet) + --> + <configProperty> + <name>subject</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>Default Subject</string> + </value> + </value> + </configProperty> + +</Deployment:ComponentInterfaceDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cid b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cid new file mode 100644 index 00000000000..bd0bf4e56ce --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cid @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentImplementationDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Assembly</label> + <implements href="MessengerAssembly.ccd"/> + <assemblyImpl> + <instance xmi:id="a_Messenger"> + <name>Messenger_Instance</name> + <package href="Messenger.cpd"/> + </instance> + <instance xmi:id="first_Receiver"> + <name>First_Receiver_Instance</name> + <package href="Receiver.cpd"/> + </instance> + <instance xmi:id="second_Receiver"> + <name>Second_Receiver_Instance</name> + <package href="Receiver.cpd"/> + </instance> + <instance xmi:id="a_Administrator"> + <name>Administrator_Instance</name> + <package href="Administrator.cpd"/> + </instance> + + <connection> + <name>Messenger_to_First_Receiver_Publish</name> + <internalEndpoint> + <portName>message_publisher</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>message_consumer</portName> + <instance xmi:idref="first_Receiver"/> + </internalEndpoint> + </connection> + <connection> + <name>Messenger_to_First_Receiver_History</name> + <internalEndpoint> + <portName>message_history</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>message_history</portName> + <instance xmi:idref="first_Receiver"/> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Second_Receiver_Publisher</name> + <internalEndpoint> + <portName>message_publisher</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>message_consumer</portName> + <instance xmi:idref="second_Receiver"/> + </internalEndpoint> + </connection> + <connection> + <name>Messenger_to_Second_Receiver_History</name> + <internalEndpoint> + <portName>message_history</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>message_history</portName> + <instance xmi:idref="second_Receiver"/> + </internalEndpoint> + </connection> + + <connection> + <name>Messenger_to_Administrator_Control</name> + <internalEndpoint> + <portName>control</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>runnables</portName> + <instance xmi:idref="a_Administrator"/> + </internalEndpoint> + </connection> + <connection> + <name>Messenger_to_Administrator_Content</name> + <internalEndpoint> + <portName>content</portName> + <instance xmi:idref="a_Messenger"/> + </internalEndpoint> + <internalEndpoint> + <portName>content</portName> + <instance xmi:idref="a_Administrator"/> + </internalEndpoint> + </connection> + + <!-- + Not sure that externalName has to match. + Don't know if CIAO processes this yet. + --> + <externalProperty> + <name>Subject Mapping</name> + <externalName>subject</externalName> + <delegatesTo> + <propertyName>subject</propertyName> + <instance xmi:idref="a_Messenger"/> + </delegatesTo> + </externalProperty> + + </assemblyImpl> +</Deployment:ComponentImplementationDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cpd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cpd new file mode 100644 index 00000000000..a719ad571c9 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/MessengerAssembly.cpd @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentPackageDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Assembly Package</label> + <realizes href="MessengerAssembly.ccd"/> + <implementation> + <name>Messenger Application</name> + <referencedImplementation href="MessengerAssembly.cid"/> + </implementation> +</Deployment:ComponentPackageDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Exec.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Exec.iad new file mode 100644 index 00000000000..0b8cef2092c --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Exec.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Executor Artifact</label> + <location>Messenger_exec</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Messenger_Stub</name> + <referencedArtifact href="Messenger_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createMessengerHome_Impl</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Messenger's executor library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Stub.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Stub.iad new file mode 100644 index 00000000000..50447209f50 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Stub.iad @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Stub Artifact</label> + <location>Messenger_stub</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Messenger's stub library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Svnt.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Svnt.iad new file mode 100644 index 00000000000..29b83d63e53 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Messenger_Svnt.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Messenger Servant Artifact</label> + <location>Messenger_svnt</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Messenger_Stub</name> + <referencedArtifact href="Messenger_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createMessengerHome_Servant</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Messenger's servant library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/README_15a b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/README_15a new file mode 100644 index 00000000000..ac466837dc4 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/README_15a @@ -0,0 +1,5 @@ +Deployment has changed in CIAO 0.5a (part of TAO 1.5a), now we use the plan +launcher, which reads a single XML file called a flattened deployment plan. +In our example, that file is Application-flattened.cdp. All the other XML +files in this directory are here for reference and to correspond to the 1.4a +TAO Developer's Guide, but they are not actually used. diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.ccd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.ccd new file mode 100644 index 00000000000..3094ae368dc --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.ccd @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentInterfaceDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Receiver Component</label> + <specificType>IDL:Receiver:1.0</specificType> + <supportedType>IDL:Receiver:1.0</supportedType> + <idlFile>Receiver.idl</idlFile> + + <port> + <name>message_consumer</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>false</exclusiveUser> + <optional>false</optional> + <provider>true</provider> + <supportedType>IDL:Message:1.0</supportedType> + <specificType>IDL:Message:1.0</specificType> + <kind>EventConsumer</kind> + </port> + + <port> + <name>message_history</name> + <exclusiveProvider>false</exclusiveProvider> + <exclusiveUser>true</exclusiveUser> + <optional>true</optional> + <provider>false</provider> + <supportedType>IDL:History:1.0</supportedType> + <specificType>IDL:History:1.0</specificType> + <kind>SimplexReceptacle</kind> + </port> + + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This CCD describes the Receiver's interface</string> + </value> + </value> + </infoProperty> + +</Deployment:ComponentInterfaceDescription> + diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cid b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cid new file mode 100644 index 00000000000..c5c85d648da --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cid @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentImplementationDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Receiver Implementation</label> + <implements href="Receiver.ccd"/> + <monolithicImpl> + <primaryArtifact> + <name>Receiver_Stub</name> + <referencedArtifact href="Receiver_Stub.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Receiver_Svnt</name> + <referencedArtifact href="Receiver_Svnt.iad"/> + </primaryArtifact> + <primaryArtifact> + <name>Receiver_Exec</name> + <referencedArtifact href="Receiver_Exec.iad"/> + </primaryArtifact> + </monolithicImpl> + <configProperty> + <name>ComponentIOR</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>Receiver.ior</string> + </value> + </value> + </configProperty> +</Deployment:ComponentImplementationDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cpd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cpd new file mode 100644 index 00000000000..8b8ff890fa2 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver.cpd @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ComponentPackageDescription xmlns:Deployment="http://www.omg.org/Deployment" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + + <label>Receiver Component</label> + <realizes href="Receiver.ccd"/> + <implementation> + <name>ReceiverImpl</name> + <referencedImplementation href="Receiver.cid"/> + </implementation> + +</Deployment:ComponentPackageDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Exec.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Exec.iad new file mode 100644 index 00000000000..adcee103c94 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Exec.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Receiver Executor Artifact</label> + <location>Receiver_exec</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Receiver_Stub</name> + <referencedArtifact href="Receiver_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createReceiverHome_Impl</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Receiver's executor library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Stub.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Stub.iad new file mode 100644 index 00000000000..63d7e37cc8e --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Stub.iad @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Receiver Stub Artifact</label> + <location>Receiver_stub</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Messenger_Stub</name> + <referencedArtifact href="Messenger_Stub.iad"/> + </dependsOn> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Receiver's stub library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Svnt.iad b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Svnt.iad new file mode 100644 index 00000000000..8e3bf58d965 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/Receiver_Svnt.iad @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:ImplementationArtifactDescription + xmlns:Deployment="http://www.omg.org/Deployment" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <label>Receiver Servant Artifact</label> + <location>Receiver_svnt</location> + <dependsOn> + <name>ACE/TAO/CIAO</name> + <referencedArtifact href="Libraries.iad"/> + </dependsOn> + <dependsOn> + <name>Receiver_Stub</name> + <referencedArtifact href="Receiver_Stub.iad"/> + </dependsOn> + <execParameter> + <name>entryPoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>createReceiverHome_Servant</string> + </value> + </value> + </execParameter> + <!-- infoProperty elements are optional, and are non-functional --> + <infoProperty> + <name>comment</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>This IAD describes the Receiver's servant library</string> + </value> + </value> + </infoProperty> +</Deployment:ImplementationArtifactDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/XMI.xsd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/XMI.xsd new file mode 100644 index 00000000000..f4adac91934 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/XMI.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" ?> +<xsd:schema targetNamespace="http://www.omg.org/XMI" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation='http://www.w3.org/2001/XMLSchema XMLSchema.xsd'> + <xsd:attribute name="id" type="xsd:ID" /> + <xsd:attributeGroup name="IdentityAttribs"> + <xsd:attribute form="qualified" name="label" type="xsd:string" use="optional" /> + <xsd:attribute form="qualified" name="uuid" type="xsd:string" use="optional" /> + </xsd:attributeGroup> + <xsd:attributeGroup name="LinkAttribs"> + <xsd:attribute name="href" type="xsd:string" use="optional" /> + <xsd:attribute form="qualified" name="idref" type="xsd:IDREF" use="optional" /> + </xsd:attributeGroup> + <xsd:attributeGroup name="ObjectAttribs"> + <xsd:attributeGroup ref="xmi:IdentityAttribs" /> + <xsd:attributeGroup ref="xmi:LinkAttribs" /> + <xsd:attribute fixed="2.0" form="qualified" name="version" type="xsd:string" use="optional" /> + <xsd:attribute form="qualified" name="type" type="xsd:QName" use="optional" /> + </xsd:attributeGroup> + <xsd:complexType name="Extension"> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:any processContents="lax" /> + </xsd:choice> + <xsd:attribute ref="xmi:id" /> + <xsd:attributeGroup ref="xmi:ObjectAttribs" /> + <xsd:attribute name="extender" type="xsd:string" use="optional" /> + <xsd:attribute name="extenderID" type="xsd:string" use="optional" /> + </xsd:complexType> + <xsd:element name="Extension" type="xmi:Extension" /> + <xsd:complexType name="Any"> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:any processContents="skip" /> + </xsd:choice> + <xsd:anyAttribute processContents="skip" /> + </xsd:complexType> +</xsd:schema> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/admin.dat b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/admin.dat new file mode 100644 index 00000000000..f5815bb1f60 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/admin.dat @@ -0,0 +1,7 @@ +1 +3 +1 +4 +Changing the publication text! +2 +5 diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/package.tpd b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/package.tpd new file mode 100644 index 00000000000..f481b6bd789 --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/package.tpd @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<Deployment:TopLevelPackageDescription +xmlns:Deployment="http://www.omg.org/Deployment" +xmlns:xmi="http://www.omg.org/XMI" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + <package href="Application.pcd"/> +</Deployment:TopLevelPackageDescription> diff --git a/TAO/DevGuideExamples/CIAO/Messenger/descriptors/run_test.pl b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/run_test.pl new file mode 100644 index 00000000000..0741c971a5d --- /dev/null +++ b/TAO/DevGuideExamples/CIAO/Messenger/descriptors/run_test.pl @@ -0,0 +1,109 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$emior= PerlACE::LocalFile ("em.ior"); +unlink $emior; +$plior= PerlACE::LocalFile ("pl.ior"); +unlink $plior; + +if (defined $ENV{'CIAO_ROOT'}) { + $CIAO_ROOT = $ENV{'CIAO_ROOT'}; +} +else { + $CIAO_ROOT = $ACE_ROOT/TAO/CIAO; +} + + +$NA = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeApplication/NodeApplication"); +$NA_cmd = $NA->Executable (); + +$NA1 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:11000 -s $NA_cmd"); + +$NA2 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:22000 -s $NA_cmd"); + +$NA3 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:33000 -s $NA_cmd"); + +$NA4 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/NodeManager/NodeManager", + "-ORBEndpoint iiop://localhost:44000 -s $NA_cmd"); + +# Each Node Manager lauches a Node Application process. +open(STDIN, "<admin.dat"); +$Ret1 = $NA1->Spawn (); +if($Ret1 == -1) { + print STDERR "ERROR: Administrator returned <$Ret1>\n" +} + +$Ret2 = $NA2->Spawn (); +if($Ret2 == -1) { + print STDERR "ERROR: Receiver 1 returned <$Ret2>\n" +} + +$Ret3 = $NA3->Spawn (); +if($Ret3 == -1) { + print STDERR "ERROR: Receiver 2 returned <$Ret3>\n" +} + +$Ret4 = $NA4->Spawn (); +if($Ret4 == -1) { + print STDERR "ERROR: Messenger returned <$Ret4>\n" +} + +#Start an Execution Manager +$EM = new PerlACE::Process ("$CIAO_ROOT/DAnCE/ExecutionManager/Execution_Manager", "-o $emior -i ApplicationNodeMap.dat"); + +$Ret5 = $EM->Spawn (); +if($Ret5 == -1) { + print STDERR "ERROR: Execution Manager returned <$Ret5>\n" +} + +if (PerlACE::waitforfile_timed ($emior, 5) == -1) { + print STDERR "ERROR: cannot find file <$emior>\n"; + $EM->Kill(); + unlink $emior; + exit 1; +} + +sleep(5); +#Start the plan laucnher +$EX = new PerlACE::Process ("$CIAO_ROOT/DAnCE/Plan_Launcher/plan_launcher", + "-p Application-flattened.cdp -k file://$emior ". + "-o $plior"); + +#Stop the plan launcher +$EX2 = new PerlACE::Process ("$CIAO_ROOT/DAnCE/Plan_Launcher/plan_launcher", + "-k file://$emior -i file://$plior"); + +$Ret6 = $EX->Spawn (); +if($Ret6 == -1) { + print STDERR "ERROR: plan launcher returned <$Ret6>\n" +} + +sleep(10); + +$Ret7 = $EX2->Spawn (); +if($Ret7 == -1) { + print STDERR "ERROR: plan launcher (shutdown) returned <$Ret7>\n" +} + +sleep(5); + +$NA1->Kill(); +$NA2->Kill(); +$NA3->Kill(); +$NA4->Kill(); +$EX->Kill(); +$EX2->Kill(); +$EM->Kill(); + +unlink $emior; +unlink $plior; + +exit 0; diff --git a/TAO/DevGuideExamples/ChangeLog b/TAO/DevGuideExamples/ChangeLog new file mode 100644 index 00000000000..10a0b3b91da --- /dev/null +++ b/TAO/DevGuideExamples/ChangeLog @@ -0,0 +1,498 @@ +Wed Apr 23 13:09:22 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Disable the RTCORBA example for minimum CORBA and the like. + +Fri Apr 18 14:06:47 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + + Also excluded the Bidir client from CORBA/e micro. + +Thu Apr 17 22:43:37 UTC 2008 Adam Mitz <mitza@ociweb.com> + + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + * ImplRepo/Basic/ImplRepo_Basic.mpc: + * ImplRepo/IORTable/ImplRepo_IORTable.mpc: + * ImplRepo/ImplRepo.mpc: + * devguide_examples.lst: + + Excluded these from CORBA/e Micro builds. + +Wed Apr 9 14:44:33 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_Federated/supplier.conf: + + Fixed a problem where the last line was continued with a backslash. + +Fri Apr 4 11:55:44 UTC 2008 Chad Elliott <elliott_c@ociweb.com> + + * Messaging/AMIcallback/Messenger_i.cpp: + + Remove vc8 warning about conversion from time_t to smaller type. + +Mon Feb 25 17:28:59 UTC 2008 Ciju John <johnc at ociweb dot com> + + * DevGuideExamples/PortableInterceptors/IOR/run_test.pl: + Additional timeout for monitoring service ior. + + * DevGuideExamples/EventServices/RTEC_Federated/supplier.conf: + Add block flushing and exclusive TransportMuxing + strategies. Adding these fixes scoreboard failures. + +Wed Sep 19 17:24:25 UTC 2007 Ciju John <johnc at ociweb dot com> + + * DevGuideExamples/Security/SecurityUnawareApp/MessengerClient.cpp: + * DevGuideExamples/Security/SecurityUnawareApp/run_test.pl: + Fix app to mask expected exception. Also test script doesn't + exit on expected failure. + +Tue Dec 18 23:28:01 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * CIAO/Messenger/StaticDAnCE/run_test.pl: + * CIAO/Messenger/descriptors/run_test.pl: + + Using PerlACE::Process to determine the real path to NodeApplication + since it may need to be modified by -ExeSubDir. + +Thu Oct 25 14:48:21 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Receiver.mpc: + * CIAO/Messenger/StaticDAnCE/Messenger_StaticDAnCE.mpc: + + Added "requires += cidl" to all projects that did not already have + it. This prevents the CIAO examples from being built when there is + no CIAO library built. + +Wed Oct 24 22:05:08 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * CIAO/Messenger/StaticDAnCE: + * CIAO/Messenger/StaticDAnCE/Messenger_StaticDAnCE.mpc: + * CIAO/Messenger/StaticDAnCE/README.txt: + * CIAO/Messenger/StaticDAnCE/StaticDAnCEApp.cpp: + * CIAO/Messenger/StaticDAnCE/plan.h: + * CIAO/Messenger/StaticDAnCE/run_test.pl: + + Added a new example that builds on the CIAO/Messenger example but + runs one of the four nodes statically (no dlopen, etc.). + +Wed Oct 24 19:08:46 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + * CIAO/Messenger/Administrator_exec_i.h: + * CIAO/Messenger/Administrator_exec_i.cpp: + * CIAO/Messenger/History_exec_i.h: + * CIAO/Messenger/History_exec_i.cpp: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Messenger_exec_i.h: + * CIAO/Messenger/Messenger_exec_i.cpp: + * CIAO/Messenger/Publication_exec_i.h: + * CIAO/Messenger/Publication_exec_i.cpp: + * CIAO/Messenger/Receiver.mpc: + * CIAO/Messenger/Receiver_exec_i.h: + * CIAO/Messenger/Receiver_exec_i.cpp: + * CIAO/Messenger/Runnable_exec_i.h: + * CIAO/Messenger/Runnable_exec_i.cpp: + * CIAO/Messenger/descriptors/Application-flattened.cdp: + * CIAO/Messenger/descriptors/ApplicationNodeMap.dat: + * CIAO/Messenger/descriptors/README_15a: + * CIAO/Messenger/descriptors/run_test.pl: + + Ported the CIAO example to TAO 1.5a (CIAO 0.5a). + +Fri Oct 19 20:56:50 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + * Multithreading/GracefulShutdown/GracefulShutdown.mpc: + * NotifyService/Filtering/Filtering.mpc: + + Added exename to account for the wchar changes (ACE_TMAIN). + + * devguide_examples.lst: + + Added the CIAO example, which is only run with -Config CIAO. + +Thu Oct 11 16:45:44 2007 ciju john <john_c@ociweb.com> + + Importing entry from $TAO_ROOT/OCIChangeLog + Wed Sep 19 17:24:25 UTC 2007 Ciju John <johnc at ociweb dot com> + * DevGuideExamples/Security/SecurityUnawareApp/MessengerClient.cpp: + * DevGuideExamples/Security/SecurityUnawareApp/run_test.pl: + Fix app to mask expected exception. Also test script doesn't + exit on expected failure. + +Tue Oct 9 16:20:46 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * BiDirectionalGIOP/client.cpp: + * BiDirectionalGIOP/server.cpp: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Multithreading/GracefulShutdown/MessengerClient.cpp: + * Multithreading/GracefulShutdown/MessengerServer.h: + * Multithreading/GracefulShutdown/MessengerServer.cpp: + * NotifyService/Filtering/MessengerServer.cpp: + * NotifyService/Messenger/Messenger_i.cpp: + * NotifyService/RTNotify/Messenger_i.cpp: + * SmartProxies/Logger_i.h: + * SmartProxies/Logger_i.cpp: + * ValueTypes/Notify/consumer.cpp: + + Fixes for ACE_USES_WCHAR builds. + +Mon Jul 23 14:17:47 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * LocalObjects/ServantLocator/ServantLocator.mpc: + + Exclude this example from CORBA/e Compact and Micro builds. + +Fri Jun 15 21:54:31 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + + Changed code to match the new enumeration name in the IDL. + +Mon Jun 4 11:58:54 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.h: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + + Updated address server implementation to be consistent with the + interface. + +Thu May 10 11:44:16 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * NamingService/Naming_Server/MessengerTask.cpp: + * PortableInterceptors/Auth/ClientInterceptor.cpp: + * PortableInterceptors/Auth/ServerInterceptor.cpp: + * PortableInterceptors/IOR/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ClientInterceptor.cpp: + + Replaced the old ACE_.*_cast with the corresponding C++ style + cast. + +Fri Apr 27 13:15:11 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Disable the PortableInterceptors examples if interceptors are + disabled. + +Fri Apr 27 13:12:00 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * PortableInterceptors/Auth/Auth.mpc: + * PortableInterceptors/IOR/IOR.mpc: + * PortableInterceptors/PICurrent/PICurrent.mpc: + * PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc: + * PortableInterceptors/SimpleCodec/SimpleCode.mpc: + + Added interceptors to the inheritence list for the clients. + +Wed Mar 21 14:48:47 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * AMH_AMI/run_test.pl: + * BiDirectionalGIOP/run_test.pl: + * EventServices/RTEC_Basic/run_test.pl: + * EventServices/RTEC_Federated/run_test.pl: + * EventServices/RTEC_Filter/run_test.pl: + * EventServices/RTEC_MCast_Federated/run_test.pl: + * ImplRepo/run_test.pl: + * Messaging/AMIcallback/run_test.pl: + * NamingService/Naming_Context_Ext/run_test.pl: + * NamingService/corbaloc_Messenger/run_test.pl: + * PortableInterceptors/Auth/run_test.pl: + * PortableInterceptors/IOR/run_test.pl: + * PortableInterceptors/PICurrent/run_test.pl: + * PortableInterceptors/PICurrent_NameService/run_test.pl: + * PortableInterceptors/SimpleCodec/run_test.pl: + * SmartProxies/run_test.pl: + * ValueTypes/Bank/run_test.pl: + * ValueTypes/Messenger/run_test.pl: + + Increase timeouts to allow these to run on slower machines. + +Tue Feb 27 12:17:34 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * PortableInterceptors/PICurrent_NameService/run_test.pl: + + I introduced a bug into this script. The MessengerServer does + not create an IOR file, just wait 1 second before starting the + client. + +Tue Feb 20 12:30:37 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * PortableInterceptors/Auth/run_test.pl: + * PortableInterceptors/IOR/run_test.pl: + * PortableInterceptors/PICurrent/run_test.pl: + * PortableInterceptors/PICurrent_NameService/run_test.pl: + * PortableInterceptors/SimpleCodec/run_test.pl: + + Modified these tests to wait for the IOR file and then a half + second before starting the client. On slower machines, the client + could get a TRANSIENT exception by invoking a method on the server + before it's ready. + +Mon Feb 19 15:23:44 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * ImplRepo/run_test.pl: + * LocalObjects/ServantLocator/run_test.pl: + * Messaging/AMIcallback/run_test.pl: + * Messaging/RelativeRoundtripTimeout/run_test.pl: + * NamingService/Messenger/run_test.pl: + * NamingService/Naming_Client/run_test.pl: + * NamingService/Naming_Context_Ext/run_test.pl: + * NamingService/Naming_Server/run_test.pl: + * NamingService/corbaloc_Messenger/run_test.pl: + * NamingService/corbaname_Messenger/run_test.pl: + * NotifyService/EventSequence/run_test.pl: + * NotifyService/Filtering/run_test.pl: + * NotifyService/Messenger/run_test.pl: + * NotifyService/OfferSubscriptions/run_test.pl: + * NotifyService/QoSProperties/run_test.pl: + * NotifyService/RTNotify/run_test.pl: + * NotifyService/SupplierSideNC/run_test.pl: + * PortableInterceptors/Auth/run_test.pl: + * PortableInterceptors/IOR/run_test.pl: + * PortableInterceptors/PICurrent/run_test.pl: + * PortableInterceptors/PICurrent_NameService/run_test.pl: + * PortableInterceptors/SimpleCodec/run_test.pl: + * RTCORBA/run_test.pl: + * Security/ParticipatingApp/run_test.pl: + * Security/PolicyControllingApp/run_test.pl: + * Security/SecurityUnawareApp/run_test.pl: + * SmartProxies/run_test.pl: + + Changed the return value check on SpawnWaitKill() from == -1 to != + 0 to catch process failures instead of just process timeouts. + +Thu Feb 15 12:23:31 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * ValueTypes/Bank/bank.mpc: + + With my rename from Wed Feb 14 14:29:40 UTC 2007, I forgot to + change the clients 'after' setting. + +Wed Feb 14 16:23:31 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * PortableInterceptors/PICurrent/ClientInitializer.h: + * PortableInterceptors/PICurrent/ClientInitializer.cpp: + * PortableInterceptors/PICurrent/MessengerClient.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.h: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerClient.cpp: + + Moved the setting of the PICurrent slot data to after the ORB and + PICurrent object are initialized. + +Wed Feb 14 14:29:40 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * PortableInterceptors/Auth/MessengerClient.cpp: + * PortableInterceptors/Auth/MessengerServer.cpp: + * PortableInterceptors/IOR/MessengerClient.cpp: + * PortableInterceptors/IOR/MessengerServer.cpp: + * PortableInterceptors/PICurrent/MessengerClient.cpp: + * PortableInterceptors/PICurrent/MessengerServer.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerClient.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerServer.cpp: + * PortableInterceptors/SimpleCodec/MessengerClient.cpp: + * PortableInterceptors/SimpleCodec/MessengerServer.cpp: + + Include either tao/PI_Server/PI_Server.h or tao/PI/PI.h to ensure + that the PI_Server or PI libraries are actually linked into the + executable when statically linking. + +Wed Feb 14 14:03:26 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + The ImplRepo test can no longer be run in a static build since the + ImR_Client library must be dynamically loaded in. It is part of + the PortableServer library in TAO 1.4a. + +Tue Feb 13 13:05:57 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Administrator_exec_i.h: + * CIAO/Messenger/Administrator_exec_i.cpp: + * CIAO/Messenger/History_exec_i.h: + * CIAO/Messenger/History_exec_i.cpp: + * CIAO/Messenger/Messenger_exec_i.h: + * CIAO/Messenger/Messenger_exec_i.cpp: + * CIAO/Messenger/Publication_exec_i.h: + * CIAO/Messenger/Publication_exec_i.cpp: + * CIAO/Messenger/Receiver_exec_i.h: + * CIAO/Messenger/Receiver_exec_i.cpp: + * CIAO/Messenger/Runnable_exec_i.h: + * CIAO/Messenger/Runnable_exec_i.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp: + * PortableInterceptors/IOR/ServerIORInterceptor.h: + * PortableInterceptors/IOR/ServerIORInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ClientInterceptor.cpp: + + Removed the ACE exception macros. + + * EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc: + * ValueTypes/Bank/bank.mpc: + + Modified these project names so that they can be included in the + entire TAO workspace. + +Mon Feb 12 14:46:17 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * AMH_AMI/AMH_AMI.mpc: + + Re-arranged the generated source files so that they are at the + beginning (like MPC would do if it were automatically generating + the list of source files). This is required for template + instantiation to work properly for Visual Age 6.0. + +Thu Feb 8 14:32:40 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * LocalObjects/ServantLocator/ServantLocator.mpc: + + Added the anytypecode base project for compatibility with this + change to TAO (see $TAO_ROOT/OCIChangeLog). + Thu Feb 8 14:28:06 UTC 2007 Adam Mitz <mitza@ociweb.com> + +Mon Feb 5 22:51:25 UTC 2007 Adam Mitz <mitza@ociweb.com> + + * ValueTypes/Notify/Event.idl: + * ValueTypes/Notify/Event_i.h: + + Replaced a custom typedef for sequence<long> with CORBA::LongSeq. + Using the type provided by the C++ mapping spec is simpler and it + avoids a lingering problem with Visual C++ and DLL exports with + templates. + +Fri Feb 2 02:54:02 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + + Added requires += cidl so that these projects will not be built if + cidl is not available. + +Thu Feb 1 19:00:50 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/CIAO.mwc: + + Removed an unnecessary -includes. + + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Receiver.mpc: + + Removed requires += exceptions. + +Thu Feb 1 18:49:47 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * ChangeLogs/ChangeLog-1.4a: + * readme.txt: + * AMH/AMH.mpc: + * AMH_AMI/AMH_AMI.mpc: + * AMH_AMI/inner_cb.cpp: + * AMH_AMI/inner_cb.h: + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + * EventServices/OMG_Basic/OMG_Basic.mpc: + * EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc: + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/OMG_TypedEC/Messenger_i.cpp: + * EventServices/OMG_TypedEC/Messenger_i.h: + * EventServices/OMG_TypedEC/OMG_TypedEC.mpc: + * EventServices/OMG_TypedEC/SupplierMain.cpp: + * EventServices/RTEC_Basic/RTEC_Basic.mpc: + * EventServices/RTEC_Federated/RTEC_Federated.mpc: + * EventServices/RTEC_Filter/RTEC_Filter.mpc: + * EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.h: + * GettingStarted/GettingStarted.mpc: + * ImplRepo/ImplRepo.mpc: + * ImplRepo/Basic/ImplRepo_Basic.mpc: + * ImplRepo/IORTable/ImplRepo_IORTable.mpc: + * InterfaceRepo/IFRBrowser.cpp: + * InterfaceRepo/InterfaceRepo.mpc: + * LocalObjects/Messenger/Messenger.mpc: + * LocalObjects/ServantLocator/MessengerServer.cpp: + * LocalObjects/ServantLocator/ServantLocator.mpc: + * Messaging/AMIcallback/AMIcallback.mpc: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Messaging/AMIcallback/MessengerHandler.h: + * Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc: + * Multithreading/GracefulShutdown/GracefulShutdown.mpc: + * Multithreading/Reactive/Reactive.mpc: + * Multithreading/ThreadPerConnection/ThreadPerConnection.mpc: + * Multithreading/ThreadPool/ThreadPool.mpc: + * NamingService/Messenger/Messenger.mpc: + * NamingService/Naming_Client/Naming_Client.mpc: + * NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc: + * NamingService/Naming_Server/Naming_Server.mpc: + * NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc: + * NamingService/corbaname_Messenger/corbaname_Messenger.mpc: + * NotifyService/EventSequence/EventSequence.mpc: + * NotifyService/Filtering/Filtering.mpc: + * NotifyService/Messenger/Messenger.mpc: + * NotifyService/OfferSubscriptions/OfferSubscriptions.mpc: + * NotifyService/QoSProperties/QoSProperties.mpc: + * NotifyService/RTNotify/RTNotify.mpc: + * NotifyService/SupplierSideNC/SupplierSideNC.mpc: + * PortableInterceptors/Auth/Auth.mpc: + * PortableInterceptors/Auth/ClientInitializer.h: + * PortableInterceptors/Auth/ClientInterceptor.cpp: + * PortableInterceptors/Auth/ClientInterceptor.h: + * PortableInterceptors/Auth/ServerInitializer.h: + * PortableInterceptors/Auth/ServerInterceptor.cpp: + * PortableInterceptors/Auth/ServerInterceptor.h: + * PortableInterceptors/IOR/ClientInitializer.h: + * PortableInterceptors/IOR/ClientInterceptor.cpp: + * PortableInterceptors/IOR/ClientInterceptor.h: + * PortableInterceptors/IOR/IOR.mpc: + * PortableInterceptors/IOR/Messenger_i.cpp: + * PortableInterceptors/IOR/ServerInitializer.h: + * PortableInterceptors/IOR/ServerInterceptor.cpp: + * PortableInterceptors/IOR/ServerInterceptor.h: + * PortableInterceptors/PICurrent/ClientInitializer.h: + * PortableInterceptors/PICurrent/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/ClientInterceptor.h: + * PortableInterceptors/PICurrent/PICurrent.mpc: + * PortableInterceptors/PICurrent/ServerInitializer.h: + * PortableInterceptors/PICurrent/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent/ServerInterceptor.h: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.h: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.h: + * PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc: + * PortableInterceptors/PICurrent_NameService/ServerInitializer.h: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.h: + * PortableInterceptors/SimpleCodec/ClientInitializer.h: + * PortableInterceptors/SimpleCodec/ClientInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ClientInterceptor.h: + * PortableInterceptors/SimpleCodec/Messenger_i.cpp: + * PortableInterceptors/SimpleCodec/ServerInitializer.h: + * PortableInterceptors/SimpleCodec/ServerInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ServerInterceptor.h: + * PortableInterceptors/SimpleCodec/SimpleCode.mpc: + * RTCORBA/RTCORBA.mpc: + * Security/ParticipatingApp/ParticipatingApp.mpc: + * Security/PolicyControllingApp/PolicyControllingApp.mpc: + * Security/SecurityUnawareApp/SecurityUnawareApp.mpc: + * SmartProxies/SmartProxies.mpc: + * ValueTypes/Bank/bank.mpc: + * ValueTypes/Bank/server.cpp: + * ValueTypes/Messenger/Message_i.cpp: + * ValueTypes/Messenger/ValueTypes.mpc: + * ValueTypes/Notify/Notify.mpc: + + Brought over the TAO 1.4a DevGuideExamples and updated them for + TAO 1.5a. diff --git a/TAO/DevGuideExamples/ChangeLogs/ChangeLog-1.4a b/TAO/DevGuideExamples/ChangeLogs/ChangeLog-1.4a new file mode 100644 index 00000000000..9d8258884a5 --- /dev/null +++ b/TAO/DevGuideExamples/ChangeLogs/ChangeLog-1.4a @@ -0,0 +1,1932 @@ +Tue Jan 23 17:06:25 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Don't run examples that require threads if the ST configuration is + supplied. + +Tue Jan 23 17:00:34 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * AMH/MessengerClient.cpp: + * AMH/MessengerServer.cpp: + * AMH_AMI/client.cpp: + * AMH_AMI/inner_cb.cpp: + * AMH_AMI/inner_server.cpp: + * AMH_AMI/middle_server.cpp: + * BiDirectionalGIOP/client.cpp: + * BiDirectionalGIOP/server.cpp: + * CIAO/Messenger/Administrator_Client.cpp: + * EventServices/OMG_Basic/EchoEventConsumerMain.cpp: + * EventServices/OMG_Basic/EchoEventSupplierMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp: + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/OMG_TypedEC/SupplierMain.cpp: + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Basic/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Filter/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Filter/EchoEventSupplierMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + * GettingStarted/MessengerClient.cpp: + * GettingStarted/MessengerServer.cpp: + * ImplRepo/Basic/MessengerClient.cpp: + * ImplRepo/Basic/MessengerServer.cpp: + * ImplRepo/IORTable/MessengerClient.cpp: + * ImplRepo/IORTable/MessengerServer.cpp: + * ImplRepo/MessengerClient.cpp: + * ImplRepo/MessengerServer.cpp: + * InterfaceRepo/IFRBrowser.cpp: + * LocalObjects/Messenger/MessengerServer.cpp: + * LocalObjects/ServantLocator/MessengerClient.cpp: + * LocalObjects/ServantLocator/MessengerServer.cpp: + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Messaging/AMIcallback/MessengerServer.cpp: + * Messaging/RelativeRoundtripTimeout/MessengerClient.cpp: + * Messaging/RelativeRoundtripTimeout/MessengerServer.cpp: + * Multithreading/GracefulShutdown/MessengerClient.cpp: + * Multithreading/GracefulShutdown/MessengerServer.cpp: + * Multithreading/Reactive/MessengerClient.cpp: + * Multithreading/Reactive/MessengerServer.cpp: + * Multithreading/ThreadPerConnection/MessengerClient.cpp: + * Multithreading/ThreadPerConnection/MessengerServer.cpp: + * Multithreading/ThreadPool/MessengerClient.cpp: + * Multithreading/ThreadPool/MessengerServer.cpp: + * NamingService/Messenger/MessengerClient.cpp: + * NamingService/Messenger/MessengerServer.cpp: + * NamingService/Naming_Client/MessengerClient.cpp: + * NamingService/Naming_Client/MessengerServer.cpp: + * NamingService/Naming_Context_Ext/MessengerClient.cpp: + * NamingService/Naming_Context_Ext/MessengerServer.cpp: + * NamingService/Naming_Server/MessengerTask.cpp: + * NamingService/Naming_Server/NamingTask.cpp: + * NamingService/corbaloc_Messenger/MessengerClient.cpp: + * NamingService/corbaloc_Messenger/MessengerServer.cpp: + * NamingService/corbaname_Messenger/MessengerClient.cpp: + * NamingService/corbaname_Messenger/MessengerServer.cpp: + * NotifyService/EventSequence/MessengerClient.cpp: + * NotifyService/EventSequence/MessengerConsumer.cpp: + * NotifyService/EventSequence/MessengerServer.cpp: + * NotifyService/Filtering/MessengerClient.cpp: + * NotifyService/Filtering/MessengerConsumer.cpp: + * NotifyService/Filtering/MessengerServer.cpp: + * NotifyService/Filtering/Messenger_i.cpp: + * NotifyService/Messenger/MessengerClient.cpp: + * NotifyService/Messenger/MessengerConsumer.cpp: + * NotifyService/Messenger/MessengerServer.cpp: + * NotifyService/OfferSubscriptions/MessengerClient.cpp: + * NotifyService/OfferSubscriptions/MessengerConsumer.cpp: + * NotifyService/OfferSubscriptions/MessengerServer.cpp: + * NotifyService/QoSProperties/MessengerClient.cpp: + * NotifyService/QoSProperties/MessengerConsumer.cpp: + * NotifyService/QoSProperties/MessengerServer.cpp: + * NotifyService/RTNotify/MessengerClient.cpp: + * NotifyService/RTNotify/MessengerConsumer.cpp: + * NotifyService/RTNotify/MessengerServer.cpp: + * NotifyService/SupplierSideNC/MessengerClient.cpp: + * NotifyService/SupplierSideNC/MessengerConsumer.cpp: + * NotifyService/SupplierSideNC/MessengerServer.cpp: + * NotifyService/SupplierSideNC/MessengerSupplier.cpp: + * NotifyService/SupplierSideNC/Messenger_i.cpp: + * PortableInterceptors/Auth/ClientInitializer.cpp: + * PortableInterceptors/Auth/MessengerClient.cpp: + * PortableInterceptors/Auth/MessengerServer.cpp: + * PortableInterceptors/IOR/MessengerClient.cpp: + * PortableInterceptors/IOR/MessengerServer.cpp: + * PortableInterceptors/IOR/Messenger_i.cpp: + * PortableInterceptors/PICurrent/MessengerClient.cpp: + * PortableInterceptors/PICurrent/MessengerServer.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerClient.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerServer.cpp: + * PortableInterceptors/SimpleCodec/MessengerClient.cpp: + * PortableInterceptors/SimpleCodec/MessengerServer.cpp: + * PortableInterceptors/SimpleCodec/Messenger_i.cpp: + * RTCORBA/MessengerClient.cpp: + * RTCORBA/MessengerServer.cpp: + * Security/ParticipatingApp/MessengerClient.cpp: + * Security/ParticipatingApp/MessengerServer.cpp: + * Security/PolicyControllingApp/MessengerClient.cpp: + * Security/PolicyControllingApp/MessengerServer.cpp: + * Security/SecurityUnawareApp/MessengerClient.cpp: + * Security/SecurityUnawareApp/MessengerServer.cpp: + * SmartProxies/LoggerServer.cpp: + * SmartProxies/MessengerClient.cpp: + * SmartProxies/MessengerServer.cpp: + * ValueTypes/Bank/client.cpp: + * ValueTypes/Messenger/MessengerClient.cpp: + * ValueTypes/Notify/consumer.cpp: + * ValueTypes/Notify/supplier.cpp: + + Catch exceptions as const. + +Tue Jan 23 13:16:24 UTC 2007 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/OMG_Basic/EchoEventConsumerMain.cpp: + * EventServices/OMG_Basic/EchoEventConsumer_i.h: + * EventServices/OMG_Basic/EchoEventConsumer_i.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.h: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Basic/EchoEventConsumer_i.h: + * EventServices/RTEC_Basic/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Federated/EchoEventConsumer_i.h: + * EventServices/RTEC_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Filter/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Filter/EchoEventConsumer_i.h: + * EventServices/RTEC_Filter/EchoEventConsumer_i.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.h: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_MCast_Federated/run_test.pl: + + Moved the disconnect_push_supplier() call to happen before the ORB + is shut down. There should be no communication related calls on + servants after shutdown() is called on the ORB. + + * devguide_examples.lst: + + Re-enabled the Security/ParticipatingApp example. It was + temporarily disabled in March of 2005, but runs properly now. + + * devguide_client.mpb: + * devguide_example.mpb: + * devguide_server.mpb: + + Removed these files. They were not used by any of the examples. + +Sat Dec 23 18:42:18 UTC 2006 Steve Totten <totten_s@ociweb.com> + + * DevGuideExamples/NamingService/Naming_Server/Naming_Server.mpc: + Added "requires += threads" as this server + specifically calls activate on an ACE_Task. Thanks + to Rich Seibel <seibel_r@ociweb.com> for pointing + this out. + +Thu Aug 3 16:56:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + + Removed an unused parameter warning. + +Tue Aug 1 15:52:53 UTC 2006 Ciju John <johnc@ociweb.com> + + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + + The host name part was being set incorrectly. + +Fri Jul 14 12:11:13 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.h: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + + Added an implementation for get_ip_address() which was added in + the commit to TAO 1.4a on Wed Jul 12 21:56:32 UTC 2006. + + * EventServices/RTEC_MCast_Federated/run_test.pl: + + If the TAO_ROOT environment variable isn't set, create it from + $ACE_ROOT/TAO. + +Fri Apr 21 16:16:46 2006 Ciju John <john_c@ociweb.com> + + * devguide_examples.lst: + + Restored the RTEC_MCast_Federated to the nightly list. + +Fri Apr 21 16:00:01 2006 Ciju John <john_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated : + + Restored the DevGuideExample deleted in entry + Fri Apr 7 15:30:11 2006 Ciju John <john_c@ociweb.com> + +Fri Apr 7 15:30:11 2006 Ciju John <john_c@ociweb.com> + + * devguide_examples.lst + + Commented out RTEC_MCast_Federated example. + + * EventServices/RTEC_MCast_Federated + + Remove DevGuide example. + +Tue Mar 7 13:11:30 UTC 2006 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/OMG_Basic/OMG_Basic.mpc: + * EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc: + * EventServices/OMG_TypedEC/OMG_TypedEC.mpc: + * NamingService/Messenger/Messenger.mpc: + * NamingService/Naming_Client/Naming_Client.mpc: + * NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc: + * NamingService/Naming_Server/Naming_Server.mpc: + * NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc: + * NamingService/corbaname_Messenger/corbaname_Messenger.mpc: + + Empty parent project names are no longer accepted (and ignored) by + MPC. + +Thu Feb 2 13:41:47 2006 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Added the !NO_EXCEPTIONS to the RTCORBA example. + +Mon Jan 23 13:14:49 2006 Chad Elliott <elliott_c@ociweb.com> + + * NotifyService/RTNotify/run_test.pl: + + Increased the timeout for the messenger server for slower loading + machines. + +Mon Jan 23 06:28:43 2006 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Modified to not run the InterfaceRepo test on a minimum corba + build. + +Fri Jan 20 06:39:59 2006 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Modified the settings for + PortableInterceptors/PICurrent/run_test.pl by adding !MINIMUM as + is done for all of the other PortableInterceptors tests. + + I also added !DISABLE_INTERCEPTORS to all the Security tests as + both the TAO_Security library and TAO_SSLIOP library require + interceptors. + +Tue Jan 17 09:00:33 2006 Chad Elliott <elliott_c@ociweb.com> + + * InterfaceRepo/IFRBrowser.cpp: + * LocalObjects/Messenger/Messenger_i.h: + * PortableInterceptors/Auth/ClientInitializer.h: + * PortableInterceptors/Auth/ClientInterceptor.h: + * PortableInterceptors/IOR/ClientInitializer.h: + * PortableInterceptors/IOR/ClientInterceptor.h: + * PortableInterceptors/PICurrent/ClientInitializer.h: + * PortableInterceptors/PICurrent/ClientInterceptor.h: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.h: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.h: + * PortableInterceptors/SimpleCodec/ClientInitializer.h: + * PortableInterceptors/SimpleCodec/ClientInterceptor.h: + * ValueTypes/Messenger/MessengerClient.cpp: + + Modified these files to use correct reference counting which + cleans up a few memory leaks. + +Fri Nov 18 14:56:08 USMST 2005 Yan Dai <dai_y@ociweb.com> + + * DevGuideExamples/ValueTypes/Notify/supplier.cpp: + * DevGuideExamples/ValueTypes/Notify/run_test.pl: + * DevGuideExamples/ValueTypes/Notify/consumer.cpp: + + Made the test create event channel instead of getting from + EventChannelFactory since current Notify_Service implementation + does not create a default event channel when -NoNameSvc is + specified. + +Wed Nov 9 14:54:08 2005 Don Busch <busch_d@ociweb.com> + + * CIAO/Messenger/Administrator_Client.cpp + * CIAO/Messenger/Administrator_Client_IDL2.cpp + * CIAO/Messenger/Administrator_Client_IDL3.cpp + * CIAO/Messenger/Administrator_Client_IDL2.mpc + * CIAO/Messenger/Administrator_Client_IDL3.mpc + + Fixed both of these clients so they build properly + without conflicting with each other. The + Administrator_Client_IDL2.mpc client is a good example + of how to build an IDL3-to-IDL2 client. + +Fri Sep 23 14:54:08 2005 Wallace Zhang <zhang_w@ociweb.com> + + * AMH_AMI/middle_i.h: + * AMH_AMI/middle_i.cpp: + + Changed a couple of passing parameter names to match the dev guide. + +Fri Sep 23 14:24:34 2005 Wallace Zhang <zhang_w@ociweb.com> + + * Multithreading/ThreadPerConnection/server.conf: + + Corrected a typo. + +Fri Sep 23 14:17:29 2005 Wallace Zhang <zhang_w@ociweb.com> + + * InterfaceRepo/IFRBrowser.cpp: + + Changed two variable types from unsigned int to CORBA::ULong. + +Fri Sep 23 14:08:19 2005 Wallace Zhang <zhang_w@ociweb.com> + + * NamingService/Naming_Server/NamingTask.h: + + Changed the NamingTask to inherit from ACE_Task<ACE_MT_SYNCH> + since it is a two-threaded application. + +Fri Sep 23 13:58:13 2005 Wallace Zhang <zhang_w@ociweb.com> + + * NamingService/Messenger/MessengerClient.cpp: + * NamingService/Messenger/MessengerServer.cpp: + + Changed to use more meaningful variable name and added + more comments to match the dev guide. + +Fri Sep 23 13:35:05 2005 Wallace Zhang <zhang_w@ociweb.com> + + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + + Explicitly set the disjunction group be 1 to match + the dev guide. + + * EventServices/RTEC_Basic/EchoEventSupplierMain.cpp: + + Fixed a typo in a comment. + +Fri Sep 23 13:05:32 2005 Wallace Zhang <zhang_w@ociweb.com> + + * InterfaceRepo/IFRBrowser.cpp: + + Added a default case to a switch statment + to match the dev guide. + +Fri Sep 23 12:42:31 2005 Wallace Zhang <zhang_w@ociweb.com> + + * ImplRepo/Basic/MessengerServer.cpp: + + Changed the way of creating policy list to match the + dev guide. + +Fri Sep 23 10:33:04 2005 Chris Cleeland <cleeland_c@ociweb.com> + + * AMH_AMI/inner_server.cpp: + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + * NotifyService/SupplierSideNC/MessengerSupplier.cpp: + + Fixed a few instance where the script I used to convert from + <ace/streams.h> to <iostream> left out a newline after the + changed line. This should fix compile problems on the + scoreboard. + +Fri Sep 23 02:22:38 2005 Steve Totten <totten_s@ociweb.com> + + * ValueTypes/Messenger/MessengerClient.cpp: + * ImplRepo/IORTable/MessengerClient.cpp: + * ImplRepo/Basic/MessengerClient.cpp: + + Added "CORBA::" to "is_nil()". + +Thu Sep 22 14:54:20 2005 Chris Cleeland <cleeland_c@ociweb.com> + + I think it would have been easier to list the files that didn't + change... + + * AMH/AMH.mpc: + * AMH_AMI/AMH_AMI.mpc: + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Receiver.mpc: + * EventServices/OMG_Basic/OMG_Basic.mpc: + * EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc: + * EventServices/OMG_TypedEC/OMG_TypedEC.mpc: + * EventServices/RTEC_Basic/RTEC_Basic.mpc: + * EventServices/RTEC_Federated/RTEC_Federated.mpc: + * EventServices/RTEC_Filter/RTEC_Filter.mpc: + * EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc: + * GettingStarted/GettingStarted.mpc: + * ImplRepo/Basic/ImplRepo_Basic.mpc: + * ImplRepo/IORTable/ImplRepo_IORTable.mpc: + * ImplRepo/ImplRepo.mpc: + * InterfaceRepo/InterfaceRepo.mpc: + * LocalObjects/Messenger/Messenger.mpc: + * LocalObjects/ServantLocator/ServantLocator.mpc: + * Messaging/AMIcallback/AMIcallback.mpc: + * Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc: + * Multithreading/GracefulShutdown/GracefulShutdown.mpc: + * Multithreading/Reactive/Reactive.mpc: + * Multithreading/ThreadPerConnection/ThreadPerConnection.mpc: + * Multithreading/ThreadPool/ThreadPool.mpc: + * NamingService/Messenger/Messenger.mpc: + * NamingService/Naming_Client/Naming_Client.mpc: + * NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc: + * NamingService/Naming_Server/Naming_Server.mpc: + * NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc: + * NamingService/corbaname_Messenger/corbaname_Messenger.mpc: + * NotifyService/EventSequence/EventSequence.mpc: + * NotifyService/Filtering/Filtering.mpc: + * NotifyService/Messenger/Messenger.mpc: + * NotifyService/OfferSubscriptions/OfferSubscriptions.mpc: + * NotifyService/QoSProperties/QoSProperties.mpc: + * NotifyService/RTNotify/RTNotify.mpc: + * NotifyService/SupplierSideNC/SupplierSideNC.mpc: + * PortableInterceptors/Auth/Auth.mpc: + * PortableInterceptors/IOR/IOR.mpc: + * PortableInterceptors/PICurrent/PICurrent.mpc: + * PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc: + * PortableInterceptors/SimpleCodec/SimpleCode.mpc: + * RTCORBA/RTCORBA.mpc: + * Security/ParticipatingApp/ParticipatingApp.mpc: + * Security/PolicyControllingApp/PolicyControllingApp.mpc: + * Security/SecurityUnawareApp/SecurityUnawareApp.mpc: + * SmartProxies/SmartProxies.mpc: + * ValueTypes/Bank/bank.mpc: + * ValueTypes/Messenger/ValueTypes.mpc: + * ValueTypes/Notify/Notify.mpc: + + Removed reference to the devguide_server and devguide_client + base projects. Since one of the goals for our dev guide + examples is to provide hallmark examples of how to write code + and projects, and we document the mpc files in the book itself, + it didn't seem correct to use base projects that the user + herself would not end up using. + + Note that if we decide, at some point, to add an example of + creating your own base project to the MPC chapter, we could then + re-introduce devguide-specific base projects. + + * AMH/AMH_Messenger_i.cpp: + * AMH/MessengerClient.cpp: + * AMH/MessengerServer.cpp: + * AMH/Messenger_i.cpp: + + * AMH_AMI/client.cpp: + * AMH_AMI/inner_cb.cpp: + * AMH_AMI/inner_server.cpp: + * AMH_AMI/middle_i.cpp: + * AMH_AMI/middle_server.cpp: + + * BiDirectionalGIOP/server.cpp: + + * EventServices/OMG_Basic/EchoEventConsumerMain.cpp: + * EventServices/OMG_Basic/EchoEventSupplierMain.cpp: + + * EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp: + + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/OMG_TypedEC/Messenger_i.cpp: + * EventServices/OMG_TypedEC/SupplierMain.cpp: + + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Basic/EchoEventSupplierMain.cpp: + + * EventServices/RTEC_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + + * EventServices/RTEC_Filter/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Filter/EchoEventSupplierMain.cpp: + + * EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + * GettingStarted/MessengerClient.cpp: + * GettingStarted/MessengerServer.cpp: + * GettingStarted/Messenger_i.cpp: + + * ImplRepo/Basic/MessengerClient.cpp: + * ImplRepo/Basic/MessengerServer.cpp: + * ImplRepo/Basic/Messenger_i.cpp: + + * ImplRepo/IORTable/MessengerClient.cpp: + * ImplRepo/IORTable/MessengerServer.cpp: + * ImplRepo/IORTable/Messenger_i.cpp: + + * ImplRepo/MessengerClient.cpp: + * ImplRepo/MessengerServer.cpp: + * ImplRepo/Messenger_i.cpp: + + + * LocalObjects/Messenger/MessengerServer.cpp: + + * LocalObjects/ServantLocator/MessengerClient.cpp: + * LocalObjects/ServantLocator/MessengerServer.cpp: + * LocalObjects/ServantLocator/Messenger_i.cpp: + + * Messaging/AMIcallback/Messenger.idl: + * Messaging/AMIcallback/MessengerHandler.h: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Messaging/AMIcallback/MessengerServer.cpp: + * Messaging/AMIcallback/Messenger_i.h: + * Messaging/AMIcallback/Messenger_i.cpp: + + * Messaging/RelativeRoundtripTimeout/MessengerClient.cpp: + * Messaging/RelativeRoundtripTimeout/MessengerServer.cpp: + + * Multithreading/GracefulShutdown/MessengerClient.cpp: + * Multithreading/GracefulShutdown/MessengerServer.cpp: + * Multithreading/GracefulShutdown/Messenger_i.cpp: + + * Multithreading/Reactive/MessengerClient.cpp: + * Multithreading/Reactive/MessengerServer.cpp: + * Multithreading/Reactive/Messenger_i.cpp: + + * Multithreading/ThreadPerConnection/MessengerClient.cpp: + * Multithreading/ThreadPerConnection/MessengerServer.cpp: + * Multithreading/ThreadPerConnection/Messenger_i.cpp: + + * Multithreading/ThreadPool/MessengerClient.cpp: + * Multithreading/ThreadPool/MessengerServer.cpp: + * Multithreading/ThreadPool/Messenger_i.cpp: + + * NamingService/Messenger/MessengerClient.cpp: + * NamingService/Messenger/MessengerServer.cpp: + * NamingService/Messenger/Messenger_i.cpp: + + * NamingService/Naming_Client/MessengerClient.cpp: + * NamingService/Naming_Client/MessengerServer.cpp: + * NamingService/Naming_Client/Messenger_i.cpp: + + * NamingService/Naming_Context_Ext/MessengerClient.cpp: + * NamingService/Naming_Context_Ext/MessengerServer.cpp: + * NamingService/Naming_Context_Ext/Messenger_i.cpp: + + * NamingService/Naming_Server/Messenger_i.cpp: + + * NamingService/corbaloc_Messenger/MessengerClient.cpp: + * NamingService/corbaloc_Messenger/MessengerServer.cpp: + * NamingService/corbaloc_Messenger/Messenger_i.cpp: + + * NamingService/corbaname_Messenger/MessengerClient.cpp: + * NamingService/corbaname_Messenger/MessengerServer.cpp: + * NamingService/corbaname_Messenger/Messenger_i.cpp: + + * NotifyService/EventSequence/MessengerClient.cpp: + * NotifyService/EventSequence/MessengerServer.cpp: + + * NotifyService/Filtering/MessengerClient.cpp: + * NotifyService/Filtering/MessengerServer.cpp: + + * NotifyService/Messenger/MessengerClient.cpp: + * NotifyService/Messenger/MessengerServer.cpp: + + * NotifyService/OfferSubscriptions/MessengerClient.cpp: + * NotifyService/OfferSubscriptions/MessengerServer.cpp: + + * NotifyService/QoSProperties/MessengerClient.cpp: + * NotifyService/QoSProperties/MessengerServer.cpp: + + * NotifyService/RTNotify/MessengerClient.cpp: + * NotifyService/RTNotify/MessengerServer.cpp: + + * NotifyService/SupplierSideNC/MessengerClient.cpp: + * NotifyService/SupplierSideNC/MessengerServer.cpp: + * NotifyService/SupplierSideNC/MessengerSupplier.cpp: + + * PortableInterceptors/Auth/MessengerClient.cpp: + * PortableInterceptors/Auth/MessengerServer.cpp: + + * PortableInterceptors/IOR/MessengerClient.cpp: + * PortableInterceptors/IOR/MessengerServer.cpp: + * PortableInterceptors/IOR/Messenger_i.cpp: + * PortableInterceptors/IOR/ServerIORInterceptor.cpp: + + * PortableInterceptors/PICurrent/ClientInitializer.cpp: + * PortableInterceptors/PICurrent/MessengerClient.cpp: + * PortableInterceptors/PICurrent/MessengerServer.cpp: + * PortableInterceptors/PICurrent/run_test.pl: + + * PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerClient.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerServer.cpp: + + * PortableInterceptors/SimpleCodec/MessengerClient.cpp: + * PortableInterceptors/SimpleCodec/MessengerServer.cpp: + * PortableInterceptors/SimpleCodec/Messenger_i.cpp: + + * RTCORBA/MessengerClient.cpp: + * RTCORBA/MessengerServer.cpp: + * RTCORBA/Messenger_i.cpp: + + * Security/ParticipatingApp/MessengerServer.cpp: + * Security/ParticipatingApp/Messenger_i.cpp: + + * Security/PolicyControllingApp/MessengerClient.cpp: + * Security/PolicyControllingApp/MessengerServer.cpp: + * Security/PolicyControllingApp/Messenger_i.cpp: + + * Security/SecurityUnawareApp/MessengerClient.cpp: + * Security/SecurityUnawareApp/MessengerServer.cpp: + * Security/SecurityUnawareApp/Messenger_i.cpp: + + * SmartProxies/LoggerServer.cpp: + * SmartProxies/MessengerClient.cpp: + * SmartProxies/MessengerServer.cpp: + * SmartProxies/Messenger_i.cpp: + + * ValueTypes/Bank/client.cpp: + * ValueTypes/Bank/server.cpp: + + * ValueTypes/Messenger/Message_i.cpp: + * ValueTypes/Messenger/MessengerClient.cpp: + * ValueTypes/Messenger/MessengerServer.cpp: + * ValueTypes/Messenger/Messenger_i.h: + * ValueTypes/Messenger/Messenger_i.cpp: + + * ValueTypes/Notify/Event_i.h: + * ValueTypes/Notify/consumer.cpp: + * ValueTypes/Notify/supplier.cpp: + + General synchronization of actual source code with code + published in the book. Sometimes the book's expresion of + the idea won, while sometimes others won. In places where + the code remains different, it's because the differences + didn't lend substantially to the educational value of the + example in the book, but lent significantly to the efficacy + of the actual code. + + Now that the world seems to have caught up to standards, I + replaced ACE_ASSERT() usage with throwing exceptions defined + the C++ standard, and changed usage of ACE's streams to use + the actual standard streams. + + Removed "using namespace..." shorthand syntax, as this also + conflicts with the idea that the code should be consistent + between the book and the actual code. + +Wed Sep 14 08:46:46 2005 Justin Michel <michel_j@ociweb.com> + + * devguide_examples.lst: + + Missing ':' between test and config options. + +Tue Sep 13 10:31:23 2005 Justin Michel <michel_j@ociweb.com> + + * devguide_examples.lst: + + Prevent the tests from running for exceptions=0 builds. + +Wed Aug 31 17:12:59 2005 Chris Cleeland <cleeland_c@ociweb.com> + + * Security/ParticipatingApp/MessengerServer.cpp: + * Security/ParticipatingApp/Messenger_i.h: + * Security/ParticipatingApp/Messenger_i.cpp: + + Removed references to now-obsolete SecurityLevel1 and + SecurityLevel2 "Current" objects. + + * Security/ParticipatingApp/ParticipatingApp.mpc: + * Security/PolicyControllingApp/PolicyControllingApp.mpc: + + Updated to use the ssliop base project. + +Wed Aug 31 12:03:40 2005 Chad Elliott <elliott_c@ociweb.com> + + * BiDirectionalGIOP/bidir_giop_pch.cpp: + + Added a pch cpp file since vc8 requires it in order to use + precompiled headers. + +Wed Aug 31 11:30:49 2005 Justin Michel <michel_j@ociweb.com> + + * SmartProxies/SmartProxies.mpc: + + One of the projects was incorrectly compiling IDL, which caused + a problem on nmake builds. Other platforms worked due to the + random order in which projects are built. + +Wed Aug 24 16:46:13 2005 Justin Michel <michel_j@ociweb.com> + + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + + Changed the project to derive from ciao_client. This simplifies the mpc, and + prevents the project from being built when ciao is disabled. + +Wed Aug 24 12:52:02 2005 Wallace Zhang <zhang_w@ociweb.com> + + * CIAO/Messenger/descriptors/run_test.pl: + + Delete one redundant line for creating CIAO_ROOT variable. + +Wed Aug 24 12:22:56 2005 Wallace Zhang <zhang_w@ociweb.com> + + * CIAO/Messenger/Administrator_Client.cpp: + * CIAO/Messenger/Administrator_Client_IDL2.mpc: + * CIAO/Messenger/Administrator_Client_IDL3.mpc: + + This is to test the tao_idl3_to_idl2 compiler. Don Busch provided + the three files. I made some changes to Administrator_Client_IDL2.mpc + to let it work within CIAO. + + * CIAO/Messenger/Administrator_exec_i.cpp: + + Added an EXIT option to the interactive user interface. + + * CIAO/Messenger/descriptors/ApplicationNodeMap.dat: + + Changed port number. There was a confliction of use of port number + 10000 in my system. Now I changed it to 11000 (22000,33000,44000). + + * CIAO/Messenger/descriptors/admin.dat: + + This file contains the input data for I/O redirection. + + * CIAO/Messenger/descriptors/run_test.pl: + + Add this perl script to automatically test this example. + + For more information, please refer to [RT 5889]. + +Wed Aug 17 14:18:54 2005 Steve Totten <totten_s@ociweb.com> + + * readme.txt: + Added instructions for generating solution/project files for vc71. + +Tue Aug 2 07:48:22 2005 Chad Elliott <elliott_c@ociweb.com> + + * ValueTypes/Bank/bank.mpc: + * ValueTypes/Bank/server.cpp: + + Fixed build errors due to incorrect 'after' usage and missing + throw specs. + +Mon Aug 1 16:40:04 2005 Justin Michel <michel_j@ociweb.com> + + * ValueTypes/Bank/README: + * ValueTypes/Bank/_pch.h: + * ValueTypes/Bank/_pch.cpp: + * ValueTypes/Bank/bank.idl: + * ValueTypes/Bank/bank.mpc: + * ValueTypes/Bank/client.cpp: + * ValueTypes/Bank/run_test.pl: + * ValueTypes/Bank/server.cpp: + + A new example that's simpler than the Messenger example + in some ways. + + * ValueTypes/Messenger/Message_i.h: + * ValueTypes/Messenger/Message_i.cpp: + * ValueTypes/Messenger/Messenger.idl: + * ValueTypes/Messenger/MessengerClient.cpp: + * ValueTypes/Messenger/MessengerServer.cpp: + + Removed use of factory, as this functionality is now + demonstrated with the Bank example. + + * ValueTypes/Notify/Event.idl: + * ValueTypes/Notify/Event_i.h: + * ValueTypes/Notify/consumer.cpp: + * ValueTypes/Notify/supplier.cpp: + + Removed some exception macros. + Use ACE_DEBUG instead of cout for better multithreading/multiprocess + behavior. + + * devguide_examples.lst: + + Added the Bank example. + +Mon Aug 1 15:45:11 2005 Wallace Zhang <zhang_w@ociweb.com> + + * devguide_examples.lst: + + Enable the EventServices/OMG_TypedEC/run_test.pl + +Wed Jul 27 12:50:45 2005 Justin Michel <michel_j@ociweb.com> + + * devguide_examples.lst: + + Add the new example to the list. + +Wed Jul 27 12:38:01 2005 Justin Michel <michel_j@ociweb.com> + + * ValueTypes/Notify/Event.idl: + * ValueTypes/Notify/Event_i.h: + * ValueTypes/Notify/Notify.mpc: + * ValueTypes/Notify/consumer.cpp: + * ValueTypes/Notify/notify.conf: + * ValueTypes/Notify/readme.txt: + * ValueTypes/Notify/run_test.pl: + * ValueTypes/Notify/supplier.cpp: + + A new example, showing how to use valuetypes with the + notification service. + +Mon Jul 25 09:21:31 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH/AMH_Messenger_i.cpp: + + Use the inout() method on the String_var. + +Mon Jul 18 12:01:17 2005 Chad Elliott <elliott_c@ociweb.com> + + * SmartProxies/MessengerClient.cpp: + + Added a catch for ... since a constructor can throw an integer + exception. + + * SmartProxies/SmartProxies.mpc: + + Updated to remove smart_proxies from the LoggerServer project and + ensure that the client is built after the server and the logger. + +Wed Jul 6 10:40:42 2005 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/OMG_Basic/EchoEventConsumer_i.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp: + * EventServices/OMG_TypedEC/Consumer_i.cpp: + * EventServices/RTEC_Basic/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Basic/EchoEventSupplier_i.cpp: + * EventServices/RTEC_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Federated/EchoEventSupplier_i.cpp: + * EventServices/RTEC_Filter/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Filter/EchoEventSupplier_i.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.cpp: + * ImplRepo/IORTable/MessengerServer.cpp: + * ImplRepo/MessengerServer.cpp: + * LocalObjects/ServantLocator/MessengerLocator_i.h: + * NotifyService/EventSequence/EventSequenceConsumer_i.cpp: + * NotifyService/EventSequence/EventSequenceSupplier_i.cpp: + * NotifyService/Filtering/StructuredEventConsumer_i.cpp: + * NotifyService/Filtering/StructuredEventSupplier_i.cpp: + * NotifyService/Messenger/StructuredEventConsumer_i.cpp: + * NotifyService/Messenger/StructuredEventSupplier_i.cpp: + * NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp: + * NotifyService/OfferSubscriptions/StructuredEventSupplier_i.cpp: + * NotifyService/QoSProperties/StructuredEventConsumer_i.cpp: + * NotifyService/QoSProperties/StructuredEventSupplier_i.cpp: + * NotifyService/RTNotify/StructuredEventConsumer_i.cpp: + * NotifyService/RTNotify/StructuredEventSupplier_i.cpp: + * NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp: + * NotifyService/SupplierSideNC/StructuredEventSupplier_i.cpp: + + Modifications to go along with the skeleton refactoring merge. + +Tue May 31 15:19:38 2005 Chris Cleeland <cleeland_c@ociweb.com> + + * Security/ParticipatingApp/MessengerClient.cpp: + + Added line continuation characters into the strings in the + sample service configuration files. Without them, some + preprocessors were getting confused. + + * Security/ParticipatingApp/run_test.pl: + + Increased the time to wait for the IOR file to show up. + +Tue May 10 10:15:40 2005 Justin Michel <michel_j@ociweb.com> + + * ImplRepo/IORTable/MessengerServer.cpp: + + Missing .in() on String_vars causes warnings on some compilers. + +Fri May 6 09:21:37 2005 Justin Michel <michel_j@ociweb.com> + + * CIAO/CIAO.mwc: + * CIAO/Messenger/Messenger.mwc: + + Removed unwanted vcproj, sln, and mwc files. + Added a new ciao feature to allow disabling all CIAO mpc generation. + +Fri Apr 29 10:20:17 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + + Add a separate ORB thread to this test to avoid deadlocks between + the two supplier processes. + +Thu Apr 28 10:30:17 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + Remove separate ORB thread as it is no longer needed. + + * EventServices/RTEC_MCast_Federated/run_test.pl: + + Modify test to remove redirection as it was causing the EchoEventSuppliers + to not be killed. Also changed the ports to random ports to avoid collisions. + +Wed Apr 27 15:20:58 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + Clean up this file for the new devguide. + +Mon Apr 25 15:24:51 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_MCast_Federated/README: + * EventServices/RTEC_MCast_Federated/run_test.pl: + + Improve the timing of this test. It was previously based on sleep() + calls in the perl script and supplier code. + +Mon Apr 25 14:04:35 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_Federated/run_test.pl: + * EventServices/RTEC_Federated/supplier.conf: + + Try to alleviate some deadlocking issues with IIOP Gateway on + some platforms. + +Fri Apr 22 11:56:42 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/SupplierMain.cpp: + + Another compiler warning removed. + +Fri Apr 22 11:51:20 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/Consumer_i.cpp: + + Get rid of unused parameter warning. + +Fri Apr 22 09:55:58 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Federated/README: + * EventServices/RTEC_Federated/run_test.pl: + + Fix this example so that it actually federates event channels. + +Thu Apr 21 21:28:42 2005 Paul Calabrese <calabrese_p@ociweb.com> + + + * EventServices/OMG_Basic/ExceptionUtil.h: + * EventServices/OMG_SupplierSideEC/ExceptionUtil.h: + * EventServices/RTEC_Basic/ExceptionUtil.h: + * EventServices/RTEC_Federated/ExceptionUtil.h: + * EventServices/RTEC_Filter/ExceptionUtil.h: + * EventServices/RTEC_MCast_Federated/ExceptionUtil.h: + + Removed these unused files. + +Thu Apr 21 21:17:48 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/OMG_TypedEC/Consumer_i.h: + * EventServices/OMG_TypedEC/Consumer_i.cpp: + * EventServices/OMG_TypedEC/Messenger.idl: + * EventServices/OMG_TypedEC/Messenger_i.h: + * EventServices/OMG_TypedEC/Messenger_i.cpp: + * EventServices/OMG_TypedEC/README: + * EventServices/OMG_TypedEC/SupplierMain.cpp: + + Cosmetic updates for DevGuide. + +Thu Apr 21 15:37:43 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/README: + + Convert commands to use *IOR environment variables. + +Thu Apr 21 14:56:15 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/README: + + Add a README for this example. + +Thu Apr 21 13:43:58 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_TypedEC/ConsumerMain.cpp: + * EventServices/OMG_TypedEC/Consumer_i.h: + * EventServices/OMG_TypedEC/Consumer_i.cpp: + * EventServices/OMG_TypedEC/Messenger.idl: + * EventServices/OMG_TypedEC/Messenger_i.h: + * EventServices/OMG_TypedEC/Messenger_i.cpp: + * EventServices/OMG_TypedEC/OMG_TypedEC.mpc: + * EventServices/OMG_TypedEC/SupplierMain.cpp: + * EventServices/OMG_TypedEC/run_test.pl: + + Add a new example using typed event channels. + +Wed Apr 20 15:22:14 2005 Don Busch <busch_d@ociweb.com> + + * Messaging/AMIcallback/MessengerServer.cpp: + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/MessengerHandler.cpp: + + Added std:: prefix to cout, cerr, endl. + Changed message.inout() to message.in() in client. + Changed exception handlling to use try/catch and orb->shutdown() in + MessengerHandler to correct error. + + * Messaging/RelativeRoundtripTimeout/MessengerClient.cpp: + + Changed SET/ADD_OVERRIDE usage to match DevGuide + +Fri Apr 15 12:30:02 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * EventServices/OMG_Basic/EchoEventConsumerMain.cpp: + * EventServices/OMG_Basic/EchoEventSupplierMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Basic/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Filter/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Filter/EchoEventSupplierMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + Rename naming_client variables for readability. + +Tue Apr 5 06:48:00 2005 Chad Elliott <elliott_c@ociweb.com> + + * ImplRepo/Basic/Messenger_i.h: + * ImplRepo/Basic/Messenger_i.cpp: + * ImplRepo/IORTable/Messenger_i.h: + * ImplRepo/IORTable/Messenger_i.cpp: + + Added throw specs to match the base class. + +Mon Apr 4 15:54:56 2005 Justin Michel <michel_j@ociweb.com> + + * ImplRepo/Activator/run_test.pl: + * ImplRepo/Basic/ImplRepo_Basic.mpc: + * ImplRepo/Basic/Messenger.idl: + * ImplRepo/Basic/MessengerClient.cpp: + * ImplRepo/Basic/MessengerServer.cpp: + * ImplRepo/Basic/Messenger_i.h: + * ImplRepo/Basic/Messenger_i.cpp: + * ImplRepo/Basic/run_test.pl: + * ImplRepo/IORTable/ImplRepo_IORTable.mpc: + * ImplRepo/IORTable/Messenger.idl: + * ImplRepo/IORTable/MessengerClient.cpp: + * ImplRepo/IORTable/MessengerServer.cpp: + * ImplRepo/IORTable/Messenger_i.h: + * ImplRepo/IORTable/Messenger_i.cpp: + * ImplRepo/IORTable/run_test.pl: + + Add samples corresponding to the new devguide ImR chapter. + +Fri Apr 1 08:55:43 2005 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Added a !NO_IFR configuration to the IFR related test. + The IFR_Service will not run on MacOS X unless TAO is built + statically due to gcc's in ability to deal with template + instantiated singletons correctly. + +Thu Mar 31 13:18:21 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * NotifyService/RTNotify/Messenger.idl: + * NotifyService/RTNotify/MessengerClient.cpp: + * NotifyService/RTNotify/MessengerConsumer.cpp: + * NotifyService/RTNotify/MessengerServer.cpp: + * NotifyService/RTNotify/Messenger_i.h: + * NotifyService/RTNotify/Messenger_i.cpp: + * NotifyService/RTNotify/Priorities.h: + * NotifyService/RTNotify/README: + * NotifyService/RTNotify/RTNotify.mpc: + * NotifyService/RTNotify/StructuredEventConsumer_i.h: + * NotifyService/RTNotify/StructuredEventConsumer_i.cpp: + * NotifyService/RTNotify/StructuredEventSupplier_i.h: + * NotifyService/RTNotify/StructuredEventSupplier_i.cpp: + * NotifyService/RTNotify/notify.conf: + * NotifyService/RTNotify/nsclient.conf: + * NotifyService/RTNotify/run_test.pl: + * devguide_examples.lst: + + Add a a new DevGuide example for RT Notification. + +Wed Mar 30 07:59:23 2005 Chad Elliott <elliott_c@ociweb.com> + + * ValueTypes/Messenger/run_test.pl: + + Increase the timeout for slower machines. + +Wed Mar 30 11:04:12 2005 Justin Michel <michel_j@ociweb.com> + + * ImplRepo/MessengerServer.cpp: + + Update all examples to use _tao_poa_downcast() instead of + RTTI, because I think it's slightly easier to read. Note: The files + still have to include tao/PortableServer/POA.h. + +Tue Mar 29 17:07:14 2005 Justin Michel <michel_j@ociweb.com> + + * ImplRepo/MessengerServer.cpp: + * ImplRepo/run_test.pl: + + Many fixes and some minor new features in the ImR. + Eliminates most of the known bugs and design flaws. + PER_CLIENT activation now works correctly. + Added a new version of id_to_reference() to TAO_POA that takes + an additional parameter to allow specifying direct or indirect + binding. + +Tue Mar 29 10:28:24 2005 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + Clone the endpoint before passing it to the + TAO_ECG_UDP_{Sender,Receiver}::init() method. + +Mon Mar 28 09:18:54 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Receiver.mpc: + + Added the *_svnt libraries to the *_exec projects. + +Mon Mar 28 08:44:59 2005 Chad Elliott <elliott_c@ociweb.com> + + * NotifyService/SupplierSideNC/Messenger_i.cpp: + + The static initialization trick doesn't work with static builds + either. + +Mon Mar 28 08:22:09 2005 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Temporarily disable the ParticipatingApp Security example until it + is re-written. + +Mon Mar 28 07:49:32 2005 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + The RTCORBA example does not run in static builds. + +Mon Mar 28 07:46:13 2005 Chad Elliott <elliott_c@ociweb.com> + + * NotifyService/SupplierSideNC/Messenger_i.cpp: + + Added an include of the CosNotification library initializer header + to work around static construction issues on SunOS and MacOS X. + + * NotifyService/SupplierSideNC/run_test.pl: + + Removed a Kill() call on a non-existent Process Object. + +Mon Mar 28 07:29:00 2005 Chad Elliott <elliott_c@ociweb.com> + + * NamingService/Naming_Context_Ext/run_test.pl: + * NamingService/corbaname_Messenger/run_test.pl: + + Wait for the ns ior file to avoid timing issues. + + * Security/ParticipatingApp/run_test.pl: + + Use the right Process object when killing the server. + +Fri Mar 25 08:45:55 2005 Chad Elliott <elliott_c@ociweb.com> + + * ImplRepo/run_test.pl: + + Increased the timeout for the implrepo.ior. + +Fri Mar 25 08:16:15 2005 Chad Elliott <elliott_c@ociweb.com> + + * devguide_examples.lst: + + Added a list that can be used with auto_run_tests.pl. + We can maintain this separately from the other test lists and + bring it forward to new releases of TAO. + +Fri Mar 25 06:15:27 2005 Chad Elliott <elliott_c@ociweb.com> + + * Security/ParticipatingApp/Messenger_i.cpp: + + Added #include of ace/OS_NS_string.h to get ACE_OS::memcpy. + +Fri Mar 18 10:43:38 2005 Paul Calabrese <calabrese_p@ociweb.com> + + * NotifyService/EventSequence/run_test.pl: + * NotifyService/Filtering/MessengerConsumer.cpp: + * NotifyService/Filtering/run_test.pl: + * NotifyService/Messenger/MessengerServer.cpp: + * NotifyService/Messenger/Messenger_i.cpp: + * NotifyService/Messenger/StructuredEventConsumer_i.h: + * NotifyService/Messenger/StructuredEventSupplier_i.h: + * NotifyService/Messenger/run_test.pl: + * NotifyService/OfferSubscriptions/MessengerServer.cpp: + * NotifyService/OfferSubscriptions/run_test.pl: + * NotifyService/QoSProperties/run_test.pl: + * NotifyService/SupplierSideNC/MessengerConsumer.cpp: + * NotifyService/SupplierSideNC/MessengerServer.cpp: + * NotifyService/SupplierSideNC/run_test.pl: + + Clean up the examples including: + - Fix problems with the run_test.pl scripts + - Enforce some consistency across these examples + - Make some changes to more directly reflect the code in the DevGuide + - Fix some spelling errors + - Remove some unneeded code + +Thu Mar 17 09:02:18 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Messenger_exec_i.cpp: + + Reordered the initialization list to avoid build warnings from + gcc. + +Mon Mar 7 07:26:00 2005 Chad Elliott <elliott_c@ociweb.com> + + * Messaging/AMIcallback/AMIcallback.mpc: + + Work around the internal compiler error on Linux Itanium with g++ + 2.96. + +Fri Mar 4 06:22:14 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Receiver_exec_i.cpp: + + Added a missing n to make a \n. + +Thu Mar 3 06:34:44 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/History_exec_i.h: + + Added a space between < and :: to avoid build problems with gcc + 3.4.2, again. + +Tue Mar 1 06:19:43 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Receiver.mpc: + + Made this project require 'cidl'. + +Mon Feb 28 11:05:34 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/History_exec.h: + + Added a space between < and :: to avoid build problems with gcc + 3.4.2. + +Mon Feb 28 08:35:04 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Administrator.mpc: + * CIAO/Messenger/Messenger.mpc: + * CIAO/Messenger/Receiver.mpc: + + Made these projects require 'cidl'. + +Mon Feb 28 06:21:01 2005 Chad Elliott <elliott_c@ociweb.com> + + * CIAO/Messenger/Messenger.mwc: + + Removed this file. It is not a valid mwc file and does not + provide the necessary include paths even if it were valid. + +Fri Feb 18 11:51:44 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH_AMI/AMH_AMI.mpc: + + Added a 'verbatim' section to set the VDIR for the gnuace project + type. This will alleviate link errors due to implicit template + instantiation deficiencies. + +Tue Feb 15 07:01:41 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH_AMI/AMH_AMI.mpc: + + Corrected build ordering and added an empty IDL_Files section for + the client. + + * AMH_AMI/middle_i.cpp: + + Removed build warnings from gcc. + +Tue Feb 15 06:22:53 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH_AMI/AMH_AMI.mpc: + * AMH_AMI/amh_ami_pch.h: + * AMH_AMI/inner_cb.cpp: + + Fixed precompiled header compile problems. + +Mon Feb 14 16:47:12 2005 Steve Totten <totten_s@ociweb.com> + + * AMH_AMI/AMH_AMI.mpc: + * NamingService/corbaname_Messenger/corbaname_Messenger.mpc: + Fixed clash between duplicate case-insensitive project names + "client" in these two project files because they appear in + the same workspace (DevGuideExamples.mwc). Used the + wildcard "*" in all the project names to make sure they are + unique. + +Mon Feb 14 13:21:51 2005 Phil Mesnier <mesnier_p@ociweb.com> + + * AMH_AMI/*: + + A new example for the AMH chapter of the devguide. This is a + duplicate log entry for the TAO/OCIChangeLog tag: + Mon Feb 14 11:25:15 2005 Phil Mesnier <mesnier_p@ociweb.com> + + +Mon Feb 14 11:25:15 2005 Phil Mesnier <mesnier_p@ociweb.com> + + * AMH_AMI/*: + + This is a new example used to reinforce concepts in the new AMH + chapter of the dev guide. + +Fri Feb 4 08:47:10 2005 Chad Elliott <elliott_c@ociweb.com> + + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/Messenger_i.cpp: + + Changed OS_NS_time.h to OS_NS_sys_time.h. + +Thu Feb 3 07:42:31 2005 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_Basic/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Filter/EchoEventConsumer_i.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp: + * LocalObjects/ServantLocator/MessengerLocator_i.cpp: + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/Messenger_i.cpp: + * Messaging/RelativeRoundtripTimeout/Messenger_i.cpp: + * NamingService/Naming_Server/NamingTask.cpp: + * NotifyService/Messenger/Messenger_i.cpp: + * PortableInterceptors/Auth/ClientInterceptor.cpp: + * PortableInterceptors/Auth/ServerInterceptor.cpp: + * PortableInterceptors/IOR/Messenger_i.cpp: + * PortableInterceptors/PICurrent/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp: + * PortableInterceptors/SimpleCodec/Messenger_i.cpp: + + Added various ACE includes for non-debug windows builds. + +Wed Feb 2 13:35:36 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH/amh_pch.h: + * BiDirectionalGIOP/bidir_giop_pch.h: + * GettingStarted/started_pch.h: + * ValueTypes/Messenger/_pch.h: + + Removed tao/Invocation.h from these precompiled header files. + +Fri Jan 21 07:00:42 2005 Chad Elliott <elliott_c@ociweb.com> + + * AMH/AMH.mpc: + + The client project doesn't really require AMH, but since the + server and client are in the same directory and share the + generated idl code it has to inherit from amh. + +Wed Jan 19 15:46:42 MST 2005 Trevor Fields <fields_t@ociweb.com> + + * BiDirectionalGIOP/callback_i.cpp: + * BiDirectionalGIOP/client.cpp: + * BiDirectionalGIOP/simple_i.cpp: + * EventServices/OMG_Basic/EchoEventConsumer_i.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp: + * InterfaceRepo/IFRBrowser.cpp: + * LocalObjects/Messenger/Messenger_i.cpp: + * LocalObjects/ServantLocator/MessengerLocator_i.cpp: + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Messaging/AMIcallback/MessengerServer.cpp: + * Messaging/RelativeRoundtripTimeout/Messenger_i.cpp: + * Multithreading/GracefulShutdown/MessengerServer.h: + * NamingService/Naming_Server/MessengerTask.cpp: + * NamingService/Naming_Server/NamingTask.cpp: + * NotifyService/EventSequence/EventSequenceConsumer_i.cpp: + * NotifyService/EventSequence/MessengerConsumer.cpp: + * NotifyService/EventSequence/Messenger_i.cpp: + * NotifyService/Filtering/MessengerConsumer.cpp: + * NotifyService/Filtering/Messenger_i.cpp: + * NotifyService/Filtering/StructuredEventConsumer_i.cpp: + * NotifyService/Messenger/MessengerConsumer.cpp: + * NotifyService/Messenger/Messenger_i.cpp: + * NotifyService/Messenger/StructuredEventConsumer_i.cpp: + * NotifyService/OfferSubscriptions/MessengerConsumer.cpp: + * NotifyService/OfferSubscriptions/Messenger_i.cpp: + * NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp: + * NotifyService/QoSProperties/MessengerConsumer.cpp: + * NotifyService/QoSProperties/MessengerServer.cpp: + * NotifyService/QoSProperties/Messenger_i.cpp: + * NotifyService/QoSProperties/StructuredEventConsumer_i.cpp: + * NotifyService/SupplierSideNC/MessengerConsumer.cpp: + * NotifyService/SupplierSideNC/Messenger_i.cpp: + * NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp: + * PortableInterceptors/Auth/ClientInitializer.cpp: + * PortableInterceptors/Auth/ClientInterceptor.cpp: + * PortableInterceptors/Auth/Messenger_i.cpp: + * PortableInterceptors/Auth/ServerInitializer.cpp: + * PortableInterceptors/Auth/ServerInterceptor.cpp: + * PortableInterceptors/IOR/ClientInitializer.cpp: + * PortableInterceptors/IOR/ClientInterceptor.cpp: + * PortableInterceptors/IOR/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/Messenger_i.cpp: + * PortableInterceptors/PICurrent/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/Messenger_i.cpp: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ClientInterceptor.cpp: + * PortableInterceptors/SimpleCodec/ServerInterceptor.cpp: + * SmartProxies/Logger_i.cpp: + * SmartProxies/Smart_Messenger_Proxy.cpp: + Added missing std:: prefix on the iostreams. + +Tue Jan 11 10:05:36 2005 Phil Mesnier <mesnier_p@ociweb.com> + + * AMH/*: + + Added new example directory for code related to new AMH chapter + of TAO 1.4a book. + +Mon Jan 10 07:51:16 2005 Chad Elliott <elliott_c@ociweb.com> + + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + + Put back the registration with the reactor which was accidentally + removed. + + * EventServices/RTEC_MCast_Federated/run_test.pl: + + Increased the timeout for the first supplier. + +Mon Jan 10 07:14:37 2005 Chad Elliott <elliott_c@ociweb.com> + + * BiDirectionalGIOP/BiDirectionalGIOP.mpc: + * BiDirectionalGIOP/README: + * BiDirectionalGIOP/bidir_giop_pch.h: + * BiDirectionalGIOP/callback.idl: + * BiDirectionalGIOP/callback_i.h: + * BiDirectionalGIOP/callback_i.cpp: + * BiDirectionalGIOP/client.cpp: + * BiDirectionalGIOP/run_test.pl: + * BiDirectionalGIOP/server.cpp: + * BiDirectionalGIOP/simple.idl: + * BiDirectionalGIOP/simple_i.h: + * BiDirectionalGIOP/simple_i.cpp: + * DevGuideExamples.mwc: + * EventServices/OMG_Basic/.cvsignore: + * EventServices/OMG_Basic/EchoEventConsumerMain.cpp: + * EventServices/OMG_Basic/EchoEventConsumer_i.h: + * EventServices/OMG_Basic/EchoEventConsumer_i.cpp: + * EventServices/OMG_Basic/EchoEventSupplierMain.cpp: + * EventServices/OMG_Basic/ExceptionUtil.h: + * EventServices/OMG_Basic/OMG_Basic.mpc: + * EventServices/OMG_Basic/README: + * EventServices/OMG_Basic/run_test.pl: + * EventServices/OMG_SupplierSideEC/.cvsignore: + * EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.h: + * EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp: + * EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp: + * EventServices/OMG_SupplierSideEC/ExceptionUtil.h: + * EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc: + * EventServices/OMG_SupplierSideEC/README: + * EventServices/OMG_SupplierSideEC/run_test.pl: + * EventServices/RTEC_Basic/.cvsignore: + * EventServices/RTEC_Basic/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Basic/EchoEventConsumer_i.h: + * EventServices/RTEC_Basic/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Basic/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Basic/EchoEventSupplier_i.h: + * EventServices/RTEC_Basic/EchoEventSupplier_i.cpp: + * EventServices/RTEC_Basic/ExceptionUtil.h: + * EventServices/RTEC_Basic/README: + * EventServices/RTEC_Basic/RTEC_Basic.mpc: + * EventServices/RTEC_Basic/run_test.pl: + * EventServices/RTEC_Federated/.cvsignore: + * EventServices/RTEC_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Federated/EchoEventConsumer_i.h: + * EventServices/RTEC_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Federated/EchoEventSupplier_i.h: + * EventServices/RTEC_Federated/EchoEventSupplier_i.cpp: + * EventServices/RTEC_Federated/ExceptionUtil.h: + * EventServices/RTEC_Federated/README: + * EventServices/RTEC_Federated/RTEC_Federated.mpc: + * EventServices/RTEC_Federated/run_test.pl: + * EventServices/RTEC_Federated/supplier.conf: + * EventServices/RTEC_Filter/.cvsignore: + * EventServices/RTEC_Filter/EchoEventConsumerMain.cpp: + * EventServices/RTEC_Filter/EchoEventConsumer_i.h: + * EventServices/RTEC_Filter/EchoEventConsumer_i.cpp: + * EventServices/RTEC_Filter/EchoEventSupplierMain.cpp: + * EventServices/RTEC_Filter/EchoEventSupplier_i.h: + * EventServices/RTEC_Filter/EchoEventSupplier_i.cpp: + * EventServices/RTEC_Filter/ExceptionUtil.h: + * EventServices/RTEC_Filter/README: + * EventServices/RTEC_Filter/RTEC_Filter.mpc: + * EventServices/RTEC_Filter/ec.conf: + * EventServices/RTEC_Filter/run_test.pl: + * EventServices/RTEC_MCast_Federated/.cvsignore: + * EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.h: + * EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp: + * EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.h: + * EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.cpp: + * EventServices/RTEC_MCast_Federated/ExceptionUtil.h: + * EventServices/RTEC_MCast_Federated/README: + * EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.h: + * EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp: + * EventServices/RTEC_MCast_Federated/run_test.pl: + * EventServices/RTEC_MCast_Federated/supplier.conf: + * GettingStarted/GettingStarted.mpc: + * GettingStarted/Messenger.idl: + * GettingStarted/MessengerClient.cpp: + * GettingStarted/MessengerServer.cpp: + * GettingStarted/Messenger_i.h: + * GettingStarted/Messenger_i.cpp: + * GettingStarted/README: + * GettingStarted/run_test.pl: + * GettingStarted/started_pch.h: + * GettingStarted/started_pch.cpp: + * ImplRepo/ImplRepo.mpc: + * ImplRepo/Messenger.idl: + * ImplRepo/MessengerClient.cpp: + * ImplRepo/MessengerServer.cpp: + * ImplRepo/Messenger_i.h: + * ImplRepo/Messenger_i.cpp: + * ImplRepo/README: + * ImplRepo/run_test.pl: + * InterfaceRepo/IFRBrowser.cpp: + * InterfaceRepo/InterfaceRepo.mpc: + * InterfaceRepo/run_test.pl: + * InterfaceRepo/test.idl: + * LocalObjects/Messenger/Messenger.idl: + * LocalObjects/Messenger/Messenger.mpc: + * LocalObjects/Messenger/MessengerServer.cpp: + * LocalObjects/Messenger/Messenger_i.h: + * LocalObjects/Messenger/Messenger_i.cpp: + * LocalObjects/Messenger/run_test.pl: + * LocalObjects/ServantLocator/Messenger.idl: + * LocalObjects/ServantLocator/MessengerClient.cpp: + * LocalObjects/ServantLocator/MessengerLocator_i.h: + * LocalObjects/ServantLocator/MessengerLocator_i.cpp: + * LocalObjects/ServantLocator/MessengerServer.cpp: + * LocalObjects/ServantLocator/Messenger_i.h: + * LocalObjects/ServantLocator/Messenger_i.cpp: + * LocalObjects/ServantLocator/ServantLocator.mpc: + * LocalObjects/ServantLocator/run_test.pl: + * Messaging/AMIcallback/AMIcallback.mpc: + * Messaging/AMIcallback/Messenger.idl: + * Messaging/AMIcallback/MessengerClient.cpp: + * Messaging/AMIcallback/MessengerHandler.h: + * Messaging/AMIcallback/MessengerHandler.cpp: + * Messaging/AMIcallback/MessengerServer.cpp: + * Messaging/AMIcallback/Messenger_i.h: + * Messaging/AMIcallback/Messenger_i.cpp: + * Messaging/AMIcallback/README: + * Messaging/AMIcallback/run_test.pl: + * Messaging/RelativeRoundtripTimeout/Messenger.idl: + * Messaging/RelativeRoundtripTimeout/MessengerClient.cpp: + * Messaging/RelativeRoundtripTimeout/MessengerServer.cpp: + * Messaging/RelativeRoundtripTimeout/Messenger_i.h: + * Messaging/RelativeRoundtripTimeout/Messenger_i.cpp: + * Messaging/RelativeRoundtripTimeout/README: + * Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc: + * Messaging/RelativeRoundtripTimeout/run_test.pl: + * Multithreading/GracefulShutdown/GracefulShutdown.mpc: + * Multithreading/GracefulShutdown/Messenger.idl: + * Multithreading/GracefulShutdown/MessengerClient.cpp: + * Multithreading/GracefulShutdown/MessengerServer.h: + * Multithreading/GracefulShutdown/MessengerServer.cpp: + * Multithreading/GracefulShutdown/MessengerShutdownTimer.h: + * Multithreading/GracefulShutdown/MessengerShutdownTimer.cpp: + * Multithreading/GracefulShutdown/Messenger_i.h: + * Multithreading/GracefulShutdown/Messenger_i.cpp: + * Multithreading/GracefulShutdown/README: + * Multithreading/GracefulShutdown/run_test.pl: + * Multithreading/README: + * Multithreading/Reactive/Messenger.idl: + * Multithreading/Reactive/MessengerClient.cpp: + * Multithreading/Reactive/MessengerServer.cpp: + * Multithreading/Reactive/Messenger_i.h: + * Multithreading/Reactive/Messenger_i.cpp: + * Multithreading/Reactive/README: + * Multithreading/Reactive/Reactive.mpc: + * Multithreading/Reactive/run_test.pl: + * Multithreading/Reactive/svc.conf: + * Multithreading/ThreadPerConnection/Messenger.idl: + * Multithreading/ThreadPerConnection/MessengerClient.cpp: + * Multithreading/ThreadPerConnection/MessengerServer.cpp: + * Multithreading/ThreadPerConnection/Messenger_i.h: + * Multithreading/ThreadPerConnection/Messenger_i.cpp: + * Multithreading/ThreadPerConnection/README: + * Multithreading/ThreadPerConnection/ThreadPerConnection.mpc: + * Multithreading/ThreadPerConnection/run_test.pl: + * Multithreading/ThreadPerConnection/server.conf: + * Multithreading/ThreadPool/Messenger.idl: + * Multithreading/ThreadPool/MessengerClient.cpp: + * Multithreading/ThreadPool/MessengerServer.cpp: + * Multithreading/ThreadPool/Messenger_i.h: + * Multithreading/ThreadPool/Messenger_i.cpp: + * Multithreading/ThreadPool/README: + * Multithreading/ThreadPool/ThreadPool.mpc: + * Multithreading/ThreadPool/run_test.pl: + * NamingService/Messenger/Messenger.idl: + * NamingService/Messenger/Messenger.mpc: + * NamingService/Messenger/MessengerClient.cpp: + * NamingService/Messenger/MessengerServer.cpp: + * NamingService/Messenger/Messenger_i.h: + * NamingService/Messenger/Messenger_i.cpp: + * NamingService/Messenger/README: + * NamingService/Messenger/run_test.pl: + * NamingService/Naming_Client/.cvsignore: + * NamingService/Naming_Client/Messenger.idl: + * NamingService/Naming_Client/MessengerClient.cpp: + * NamingService/Naming_Client/MessengerServer.cpp: + * NamingService/Naming_Client/Messenger_i.h: + * NamingService/Naming_Client/Messenger_i.cpp: + * NamingService/Naming_Client/Naming_Client.mpc: + * NamingService/Naming_Client/README: + * NamingService/Naming_Client/run_test.pl: + * NamingService/Naming_Context_Ext/Messenger.idl: + * NamingService/Naming_Context_Ext/MessengerClient.cpp: + * NamingService/Naming_Context_Ext/MessengerServer.cpp: + * NamingService/Naming_Context_Ext/Messenger_i.h: + * NamingService/Naming_Context_Ext/Messenger_i.cpp: + * NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc: + * NamingService/Naming_Context_Ext/README: + * NamingService/Naming_Context_Ext/run_test.pl: + * NamingService/Naming_Server/Messenger.idl: + * NamingService/Naming_Server/MessengerTask.h: + * NamingService/Naming_Server/MessengerTask.cpp: + * NamingService/Naming_Server/Messenger_i.h: + * NamingService/Naming_Server/Messenger_i.cpp: + * NamingService/Naming_Server/NamingMessenger.cpp: + * NamingService/Naming_Server/NamingTask.h: + * NamingService/Naming_Server/NamingTask.cpp: + * NamingService/Naming_Server/Naming_Server.mpc: + * NamingService/Naming_Server/README: + * NamingService/Naming_Server/run_test.pl: + * NamingService/corbaloc_Messenger/Messenger.idl: + * NamingService/corbaloc_Messenger/MessengerClient.cpp: + * NamingService/corbaloc_Messenger/MessengerServer.cpp: + * NamingService/corbaloc_Messenger/Messenger_i.h: + * NamingService/corbaloc_Messenger/Messenger_i.cpp: + * NamingService/corbaloc_Messenger/README: + * NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc: + * NamingService/corbaloc_Messenger/run_test.pl: + * NamingService/corbaname_Messenger/Messenger.idl: + * NamingService/corbaname_Messenger/MessengerClient.cpp: + * NamingService/corbaname_Messenger/MessengerServer.cpp: + * NamingService/corbaname_Messenger/Messenger_i.h: + * NamingService/corbaname_Messenger/Messenger_i.cpp: + * NamingService/corbaname_Messenger/README: + * NamingService/corbaname_Messenger/corbaname_Messenger.mpc: + * NamingService/corbaname_Messenger/run_test.pl: + * NotifyService/EventSequence/EventSequence.mpc: + * NotifyService/EventSequence/EventSequenceConsumer_i.h: + * NotifyService/EventSequence/EventSequenceConsumer_i.cpp: + * NotifyService/EventSequence/EventSequenceSupplier_i.h: + * NotifyService/EventSequence/EventSequenceSupplier_i.cpp: + * NotifyService/EventSequence/Messenger.idl: + * NotifyService/EventSequence/MessengerClient.cpp: + * NotifyService/EventSequence/MessengerConsumer.cpp: + * NotifyService/EventSequence/MessengerServer.cpp: + * NotifyService/EventSequence/Messenger_i.h: + * NotifyService/EventSequence/Messenger_i.cpp: + * NotifyService/EventSequence/README: + * NotifyService/EventSequence/run_test.pl: + * NotifyService/Filtering/Filtering.mpc: + * NotifyService/Filtering/Messenger.idl: + * NotifyService/Filtering/MessengerClient.cpp: + * NotifyService/Filtering/MessengerConsumer.cpp: + * NotifyService/Filtering/MessengerServer.cpp: + * NotifyService/Filtering/Messenger_i.h: + * NotifyService/Filtering/Messenger_i.cpp: + * NotifyService/Filtering/README: + * NotifyService/Filtering/StructuredEventConsumer_i.h: + * NotifyService/Filtering/StructuredEventConsumer_i.cpp: + * NotifyService/Filtering/StructuredEventSupplier_i.h: + * NotifyService/Filtering/StructuredEventSupplier_i.cpp: + * NotifyService/Filtering/run_test.pl: + * NotifyService/Messenger/Messenger.idl: + * NotifyService/Messenger/Messenger.mpc: + * NotifyService/Messenger/MessengerClient.cpp: + * NotifyService/Messenger/MessengerConsumer.cpp: + * NotifyService/Messenger/MessengerServer.cpp: + * NotifyService/Messenger/Messenger_i.h: + * NotifyService/Messenger/Messenger_i.cpp: + * NotifyService/Messenger/README: + * NotifyService/Messenger/StructuredEventConsumer_i.h: + * NotifyService/Messenger/StructuredEventConsumer_i.cpp: + * NotifyService/Messenger/StructuredEventSupplier_i.h: + * NotifyService/Messenger/StructuredEventSupplier_i.cpp: + * NotifyService/Messenger/run_test.pl: + * NotifyService/OfferSubscriptions/Messenger.idl: + * NotifyService/OfferSubscriptions/MessengerClient.cpp: + * NotifyService/OfferSubscriptions/MessengerConsumer.cpp: + * NotifyService/OfferSubscriptions/MessengerServer.cpp: + * NotifyService/OfferSubscriptions/Messenger_i.h: + * NotifyService/OfferSubscriptions/Messenger_i.cpp: + * NotifyService/OfferSubscriptions/OfferSubscriptions.mpc: + * NotifyService/OfferSubscriptions/README: + * NotifyService/OfferSubscriptions/StructuredEventConsumer_i.h: + * NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp: + * NotifyService/OfferSubscriptions/StructuredEventSupplier_i.h: + * NotifyService/OfferSubscriptions/StructuredEventSupplier_i.cpp: + * NotifyService/OfferSubscriptions/run_test.pl: + * NotifyService/QoSProperties/Messenger.idl: + * NotifyService/QoSProperties/MessengerClient.cpp: + * NotifyService/QoSProperties/MessengerConsumer.cpp: + * NotifyService/QoSProperties/MessengerServer.cpp: + * NotifyService/QoSProperties/Messenger_i.h: + * NotifyService/QoSProperties/Messenger_i.cpp: + * NotifyService/QoSProperties/QoSProperties.mpc: + * NotifyService/QoSProperties/README: + * NotifyService/QoSProperties/StructuredEventConsumer_i.h: + * NotifyService/QoSProperties/StructuredEventConsumer_i.cpp: + * NotifyService/QoSProperties/StructuredEventSupplier_i.h: + * NotifyService/QoSProperties/StructuredEventSupplier_i.cpp: + * NotifyService/QoSProperties/run_test.pl: + * NotifyService/SupplierSideNC/Messenger.idl: + * NotifyService/SupplierSideNC/MessengerClient.cpp: + * NotifyService/SupplierSideNC/MessengerConsumer.cpp: + * NotifyService/SupplierSideNC/MessengerServer.cpp: + * NotifyService/SupplierSideNC/MessengerSupplier.cpp: + * NotifyService/SupplierSideNC/Messenger_i.h: + * NotifyService/SupplierSideNC/Messenger_i.cpp: + * NotifyService/SupplierSideNC/README: + * NotifyService/SupplierSideNC/StructuredEventConsumer_i.h: + * NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp: + * NotifyService/SupplierSideNC/StructuredEventSupplier_i.h: + * NotifyService/SupplierSideNC/StructuredEventSupplier_i.cpp: + * NotifyService/SupplierSideNC/SupplierSideNC.mpc: + * NotifyService/SupplierSideNC/run_test.pl: + * PortableInterceptors/Auth/Auth.mpc: + * PortableInterceptors/Auth/ClientInitializer.h: + * PortableInterceptors/Auth/ClientInitializer.cpp: + * PortableInterceptors/Auth/ClientInterceptor.h: + * PortableInterceptors/Auth/ClientInterceptor.cpp: + * PortableInterceptors/Auth/Messenger.idl: + * PortableInterceptors/Auth/MessengerClient.cpp: + * PortableInterceptors/Auth/MessengerServer.cpp: + * PortableInterceptors/Auth/Messenger_i.h: + * PortableInterceptors/Auth/Messenger_i.cpp: + * PortableInterceptors/Auth/README: + * PortableInterceptors/Auth/ServerInitializer.h: + * PortableInterceptors/Auth/ServerInitializer.cpp: + * PortableInterceptors/Auth/ServerInterceptor.h: + * PortableInterceptors/Auth/ServerInterceptor.cpp: + * PortableInterceptors/Auth/run_test.pl: + * PortableInterceptors/IOR/ClientInitializer.h: + * PortableInterceptors/IOR/ClientInitializer.cpp: + * PortableInterceptors/IOR/ClientInterceptor.h: + * PortableInterceptors/IOR/ClientInterceptor.cpp: + * PortableInterceptors/IOR/IOR.mpc: + * PortableInterceptors/IOR/Messenger.idl: + * PortableInterceptors/IOR/MessengerClient.cpp: + * PortableInterceptors/IOR/MessengerServer.cpp: + * PortableInterceptors/IOR/Messenger_i.h: + * PortableInterceptors/IOR/Messenger_i.cpp: + * PortableInterceptors/IOR/README: + * PortableInterceptors/IOR/ServerIORInterceptor.h: + * PortableInterceptors/IOR/ServerIORInterceptor.cpp: + * PortableInterceptors/IOR/ServerInitializer.h: + * PortableInterceptors/IOR/ServerInitializer.cpp: + * PortableInterceptors/IOR/ServerInterceptor.h: + * PortableInterceptors/IOR/ServerInterceptor.cpp: + * PortableInterceptors/IOR/run_test.pl: + * PortableInterceptors/PICurrent/ClientInitializer.h: + * PortableInterceptors/PICurrent/ClientInitializer.cpp: + * PortableInterceptors/PICurrent/ClientInterceptor.h: + * PortableInterceptors/PICurrent/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent/Messenger.idl: + * PortableInterceptors/PICurrent/MessengerClient.cpp: + * PortableInterceptors/PICurrent/MessengerServer.cpp: + * PortableInterceptors/PICurrent/Messenger_i.h: + * PortableInterceptors/PICurrent/Messenger_i.cpp: + * PortableInterceptors/PICurrent/PICurrent.mpc: + * PortableInterceptors/PICurrent/README: + * PortableInterceptors/PICurrent/ServerInitializer.h: + * PortableInterceptors/PICurrent/ServerInitializer.cpp: + * PortableInterceptors/PICurrent/ServerInterceptor.h: + * PortableInterceptors/PICurrent/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent/run_test.pl: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.h: + * PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.h: + * PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/Messenger.idl: + * PortableInterceptors/PICurrent_NameService/MessengerClient.cpp: + * PortableInterceptors/PICurrent_NameService/MessengerServer.cpp: + * PortableInterceptors/PICurrent_NameService/Messenger_i.h: + * PortableInterceptors/PICurrent_NameService/Messenger_i.cpp: + * PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc: + * PortableInterceptors/PICurrent_NameService/README: + * PortableInterceptors/PICurrent_NameService/ServerInitializer.h: + * PortableInterceptors/PICurrent_NameService/ServerInitializer.cpp: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.h: + * PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp: + * PortableInterceptors/PICurrent_NameService/run_test.pl: + * PortableInterceptors/SimpleCodec/ClientInitializer.h: + * PortableInterceptors/SimpleCodec/ClientInitializer.cpp: + * PortableInterceptors/SimpleCodec/ClientInterceptor.h: + * PortableInterceptors/SimpleCodec/ClientInterceptor.cpp: + * PortableInterceptors/SimpleCodec/Messenger.idl: + * PortableInterceptors/SimpleCodec/MessengerClient.cpp: + * PortableInterceptors/SimpleCodec/MessengerServer.cpp: + * PortableInterceptors/SimpleCodec/Messenger_i.h: + * PortableInterceptors/SimpleCodec/Messenger_i.cpp: + * PortableInterceptors/SimpleCodec/README: + * PortableInterceptors/SimpleCodec/ServerInitializer.h: + * PortableInterceptors/SimpleCodec/ServerInitializer.cpp: + * PortableInterceptors/SimpleCodec/ServerInterceptor.h: + * PortableInterceptors/SimpleCodec/ServerInterceptor.cpp: + * PortableInterceptors/SimpleCodec/SimpleCode.mpc: + * PortableInterceptors/SimpleCodec/run_test.pl: + * RTCORBA/Messenger.idl: + * RTCORBA/MessengerClient.cpp: + * RTCORBA/MessengerServer.cpp: + * RTCORBA/Messenger_i.h: + * RTCORBA/Messenger_i.cpp: + * RTCORBA/README: + * RTCORBA/RTCORBA.mpc: + * RTCORBA/common.h: + * RTCORBA/common.cpp: + * RTCORBA/run_test.pl: + * RTCORBA/svc.conf: + * Security/ParticipatingApp/Messenger.idl: + * Security/ParticipatingApp/MessengerClient.cpp: + * Security/ParticipatingApp/MessengerServer.cpp: + * Security/ParticipatingApp/Messenger_i.h: + * Security/ParticipatingApp/Messenger_i.cpp: + * Security/ParticipatingApp/ParticipatingApp.mpc: + * Security/ParticipatingApp/README: + * Security/ParticipatingApp/cacert.pem: + * Security/ParticipatingApp/client.conf: + * Security/ParticipatingApp/clientcert.pem: + * Security/ParticipatingApp/clientkey.pem: + * Security/ParticipatingApp/run_test.pl: + * Security/ParticipatingApp/server.conf: + * Security/ParticipatingApp/servercert.pem: + * Security/ParticipatingApp/serverkey.pem: + * Security/PolicyControllingApp/Messenger.idl: + * Security/PolicyControllingApp/MessengerClient.cpp: + * Security/PolicyControllingApp/MessengerServer.cpp: + * Security/PolicyControllingApp/Messenger_i.h: + * Security/PolicyControllingApp/Messenger_i.cpp: + * Security/PolicyControllingApp/PolicyControllingApp.mpc: + * Security/PolicyControllingApp/README: + * Security/PolicyControllingApp/cacert.pem: + * Security/PolicyControllingApp/client.conf: + * Security/PolicyControllingApp/client1.conf: + * Security/PolicyControllingApp/clientcert.pem: + * Security/PolicyControllingApp/clientkey.pem: + * Security/PolicyControllingApp/run_test.pl: + * Security/PolicyControllingApp/server.conf: + * Security/PolicyControllingApp/server1.conf: + * Security/PolicyControllingApp/servercert.pem: + * Security/PolicyControllingApp/serverkey.pem: + * Security/SecurityUnawareApp/Messenger.idl: + * Security/SecurityUnawareApp/MessengerClient.cpp: + * Security/SecurityUnawareApp/MessengerI.cpp: + * Security/SecurityUnawareApp/MessengerServer.cpp: + * Security/SecurityUnawareApp/Messenger_i.h: + * Security/SecurityUnawareApp/Messenger_i.cpp: + * Security/SecurityUnawareApp/README: + * Security/SecurityUnawareApp/SecurityUnawareApp.mpc: + * Security/SecurityUnawareApp/cacert.pem: + * Security/SecurityUnawareApp/client.conf: + * Security/SecurityUnawareApp/client1.conf: + * Security/SecurityUnawareApp/clientcert.pem: + * Security/SecurityUnawareApp/clientkey.pem: + * Security/SecurityUnawareApp/run_test.pl: + * Security/SecurityUnawareApp/server.conf: + * Security/SecurityUnawareApp/servercert.pem: + * Security/SecurityUnawareApp/serverkey.pem: + * SmartProxies/Logger.idl: + * SmartProxies/LoggerServer.cpp: + * SmartProxies/Logger_i.h: + * SmartProxies/Logger_i.cpp: + * SmartProxies/Messenger.idl: + * SmartProxies/MessengerClient.cpp: + * SmartProxies/MessengerServer.cpp: + * SmartProxies/Messenger_i.h: + * SmartProxies/Messenger_i.cpp: + * SmartProxies/README: + * SmartProxies/SmartProxies.mpc: + * SmartProxies/Smart_Messenger_Proxy.h: + * SmartProxies/Smart_Messenger_Proxy.cpp: + * SmartProxies/run_test.pl: + * ValueTypes/Messenger/Message_i.h: + * ValueTypes/Messenger/Message_i.cpp: + * ValueTypes/Messenger/Messenger.idl: + * ValueTypes/Messenger/MessengerClient.cpp: + * ValueTypes/Messenger/MessengerServer.cpp: + * ValueTypes/Messenger/Messenger_i.h: + * ValueTypes/Messenger/Messenger_i.cpp: + * ValueTypes/Messenger/README: + * ValueTypes/Messenger/ValueTypes.mpc: + * ValueTypes/Messenger/_pch.h: + * ValueTypes/Messenger/_pch.cpp: + * ValueTypes/Messenger/run_test.pl: + * devguide_client.mpb: + * devguide_example.mpb: + * devguide_server.mpb: + * readme.txt: + + Brought over the TAO 1.3a DevGuideExamples and updated them for + TAO 1.4a. diff --git a/TAO/DevGuideExamples/DevGuideExamples.mwc b/TAO/DevGuideExamples/DevGuideExamples.mwc new file mode 100644 index 00000000000..bbf27b8533c --- /dev/null +++ b/TAO/DevGuideExamples/DevGuideExamples.mwc @@ -0,0 +1,3 @@ +workspace { + cmdline = -include $PWD +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..d7a67dbd214 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumerMain.cpp @@ -0,0 +1,83 @@ +// EchoEventConsumerMain.cpp +// Main program for a PushConsumer of Echo events. + + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/CosEventCommC.h> +#include <orbsvcs/CosEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> + +const int EVENTS_TILL_SHUTDOWN = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str("CosEventService"); + + // Downcast the object reference to an EventChannel reference. + CosEventChannelAdmin::EventChannel_var echoEC = + CosEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(echoEC.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "Found the EchoEventChannel." << std::endl; + + // Get a ConsumerAdmin object from the EventChannel. + CosEventChannelAdmin::ConsumerAdmin_var consumerAdmin = + echoEC->for_consumers(); + + // Get a ProxyPushSupplier from the ConsumerAdmin. + CosEventChannelAdmin::ProxyPushSupplier_var supplier = + consumerAdmin->obtain_push_supplier(); + + // Instantiate an EchoEventConsumer_i servant. + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENTS_TILL_SHUTDOWN); + + // Register it with the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + CosEventComm::PushConsumer_var consumer = + CosEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect to the ProxyPushSupplier, passing our PushConsumer object + // reference to it. + supplier->connect_push_consumer(consumer.in()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + orb->destroy(); + + std::cout << "Test complete." << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Consumer: Caught CORBA::Exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..cf1468ca9fa --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.cpp @@ -0,0 +1,42 @@ +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(CosEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ +} + +// Override the push() operation. +void EchoEventConsumer_i::push(const CORBA::Any & data) +{ + // Extract event data from the any. + const char* eventData; + if (data >>= eventData) + { + std::cout << "EchoEventConsumer_i::push(): Received event: " + << eventData << std::endl; + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Override the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.h new file mode 100644 index 00000000000..483c17de403 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventConsumer_i.h @@ -0,0 +1,29 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/CosEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/CosEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_CosEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const CORBA::Any & data); + + virtual void disconnect_push_consumer(); + + private: + CORBA::ORB_var orb_; + CosEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..713b8490c13 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/EchoEventSupplierMain.cpp @@ -0,0 +1,70 @@ +// Main program for a PushSupplier of Echo events. + +#include <orbsvcs/CosEventCommC.h> +#include <orbsvcs/CosEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> + +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EventChannel. + obj = root_context->resolve_str("CosEventService"); + + // Downcast the object reference to an EventChannel reference. + CosEventChannelAdmin::EventChannel_var echoEC = + CosEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(echoEC.in())) { + std::cerr << "Could not resolve EchoEventChannel." << std::endl; + return 1; + } + + // Get a SupplierAdmin object from the EventChannel. + CosEventChannelAdmin::SupplierAdmin_var supplierAdmin = + echoEC->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + CosEventChannelAdmin::ProxyPushConsumer_var consumer = + supplierAdmin->obtain_push_consumer(); + + // Connect to the ProxyPushConsumer as a PushSupplier + // (passing a nil PushSupplier object reference to it because + // we don't care to be notified about disconnects). + consumer->connect_push_supplier(CosEventComm::PushSupplier::_nil()); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup("Hello, world."); + + // Send one event per second. (approx) + while (1) { + // Insert the event data into an any. + CORBA::Any any; + any <<= eventData; + + // Now push the event to the consumer + consumer->push(any); + + ACE_Time_Value event_delay(0, 1000 * EVENT_DELAY_MS); + orb->run(event_delay); + } + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Supplier Caught CORBA::Exception. " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/OMG_Basic.mpc b/TAO/DevGuideExamples/EventServices/OMG_Basic/OMG_Basic.mpc new file mode 100644 index 00000000000..c625d77490d --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/OMG_Basic.mpc @@ -0,0 +1,18 @@ +project(*Supplier): namingexe, event_skel { + exename = EchoEventSupplier + includes += ../common + Source_Files { + EchoEventSupplierMain.cpp + } +} + +project(*Consumer): namingexe, event_skel { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/README b/TAO/DevGuideExamples/EventServices/OMG_Basic/README new file mode 100644 index 00000000000..475f9c6e0a2 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/README @@ -0,0 +1,62 @@ +OMG Event Service + + +File: DevGuideExamples/EventServices/OMG_Basic/README + + +This directory contains a simple example of using the CosEvent service. +This example uses the push/push model: + + EchoEventSupplier ----> CosEvent_Service ----> EchoEventConsumer + +This example also works fine with the CosEvent_Service server. + +------------------------------------------------------------------------- + +Note: To test this, you must first run the Naming Service and the +CosEvent Service, e.g.: + +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior & +$TAO_ROOT/orbsvcs/CosEvent_Service/CosEvent_Service -ORBInitRef NameService=file://ns.ior& + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier -ORBInitRef NameService=file://ns.ior + + It will publish an event to the event channel every second. + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ORBInitRef NameService=file://ns.ior + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the CosEventComm::PushConsumer interface. + + + +Execution via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl -ExeSubDir <Release> + + + diff --git a/TAO/DevGuideExamples/EventServices/OMG_Basic/run_test.pl b/TAO/DevGuideExamples/EventServices/OMG_Basic/run_test.pl new file mode 100644 index 00000000000..78ced481eb9 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_Basic/run_test.pl @@ -0,0 +1,61 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$esiorfile = PerlACE::LocalFile ("es.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; + +unlink $nsiorfile; +unlink $esiorfile; + +# start Naming Service + +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start Event Service +$EventService = "$ENV{TAO_ROOT}/orbsvcs/CosEvent_Service/CosEvent_Service"; +$ES = new PerlACE::Process($EventService, "-o $esiorfile $arg_ns_ref"); +$ES->Spawn(); +if (PerlACE::waitforfile_timed ($esiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$esiorfile>\n"; + $ES->Kill(); + unlink $nsiorfile; + exit 1; +} + +# start EchoEventSupplier +$S = new PerlACE::Process("EchoEventSupplier", $arg_ns_ref); +$S->Spawn(); + +# start EchoEventConsumer +$C = new PerlACE::Process("EchoEventConsumer", $arg_ns_ref); +$C->Spawn(); + +$CRET = $C->WaitKill(60); +$S->Kill(); +$NS->Kill(); +$ES->Kill(); + +unlink $nsiorfile; +unlink $esiorfile; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..f8c9316ea86 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumerMain.cpp @@ -0,0 +1,81 @@ +// EchoEventConsumerMain.cpp +// Main program for a PushConsumer of Echo events. + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/CosEventCommC.h> +#include <orbsvcs/CosEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const int EVENT_LIMIT = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str("CosEventService"); + + // Downcast the object reference to an EventChannel reference. + CosEventChannelAdmin::EventChannel_var echoEC = + CosEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(echoEC.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "Found the EchoEventChannel." << std::endl; + + // Get a ConsumerAdmin object from the EventChannel. + CosEventChannelAdmin::ConsumerAdmin_var consumerAdmin = + echoEC->for_consumers(); + + // Get a ProxyPushSupplier from the ConsumerAdmin. + CosEventChannelAdmin::ProxyPushSupplier_var supplier = + consumerAdmin->obtain_push_supplier(); + + // Instantiate an EchoEventConsumer_i servant. + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENT_LIMIT); + + // Register it with the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + CosEventComm::PushConsumer_var consumer = + CosEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect to the ProxyPushSupplier, passing our PushConsumer object + // reference to it. + supplier->connect_push_consumer(consumer.in()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + orb->destroy(); + + std::cout << "Test completed." << std::endl; + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..cf1468ca9fa --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.cpp @@ -0,0 +1,42 @@ +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(CosEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ +} + +// Override the push() operation. +void EchoEventConsumer_i::push(const CORBA::Any & data) +{ + // Extract event data from the any. + const char* eventData; + if (data >>= eventData) + { + std::cout << "EchoEventConsumer_i::push(): Received event: " + << eventData << std::endl; + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Override the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.h new file mode 100644 index 00000000000..483c17de403 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventConsumer_i.h @@ -0,0 +1,29 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/CosEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/CosEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_CosEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const CORBA::Any & data); + + virtual void disconnect_push_consumer(); + + private: + CORBA::ORB_var orb_; + CosEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..b35ac72fdf8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/EchoEventSupplierMain.cpp @@ -0,0 +1,88 @@ +// Main program for a PushSupplier of Echo events. + +#include <orbsvcs/CosEventCommC.h> +#include <orbsvcs/CosEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/CosEvent/CEC_EventChannel.h> +#include <orbsvcs/CosEvent/CEC_Default_Factory.h> + +#include <iostream> +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the CEC Factory so we can customize the CEC + TAO_CEC_Default_Factory::init_svcs (); + + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Get the root POA + CORBA::Object_var poa_object = orb->resolve_initial_references("RootPOA"); + if (CORBA::is_nil (poa_object.in ())) + ACE_ERROR_RETURN ((LM_ERROR, + " (%P|%t) Unable to initialize the POA.\n"), + -1); + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (poa_object.in ()); + PortableServer::POAManager_var poa_manager = root_poa->the_POAManager (); + poa_manager->activate (); + + // Create and activate the event channel servant + CosEventChannelAdmin::EventChannel_var echoEC; + + TAO_CEC_EventChannel_Attributes attr(root_poa.in(), root_poa.in()); + TAO_CEC_EventChannel* ec = new TAO_CEC_EventChannel(attr); + ec->activate(); + PortableServer::ObjectId_var oid = root_poa->activate_object(ec); + CORBA::Object_var ec_obj = root_poa->id_to_reference(oid.in()); + echoEC = CosEventChannelAdmin::EventChannel::_narrow(ec_obj.in()); + + // Bind the EventChannel. + CosNaming::Name_var name = root_context->to_name("CosEventService"); + root_context->rebind(name.in(), echoEC.in()); + + // Get a SupplierAdmin object from the EventChannel. + CosEventChannelAdmin::SupplierAdmin_var supplierAdmin = + echoEC->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + CosEventChannelAdmin::ProxyPushConsumer_var consumer = + supplierAdmin->obtain_push_consumer(); + + // Connect to the ProxyPushConsumer as a PushSupplier + // (passing a nil PushSupplier object reference to it because + // we don't care to be notified about disconnects). + consumer->connect_push_supplier(CosEventComm::PushSupplier::_nil()); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup("Hello, world."); + + while (1) { + // Insert the event data into an any. + CORBA::Any any; + any <<= eventData; + + // Now push the event to the consumer + consumer->push(any); + + ACE_Time_Value tv(0, 1000 * EVENT_DELAY_MS); + orb->run(tv); + } + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught unknown CORBA::Exception exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc new file mode 100644 index 00000000000..1caedc76b33 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/OMG_SupplierSideEC.mpc @@ -0,0 +1,19 @@ +project(*Supplier): namingexe, event_serv { + exename = EchoEventSupplier + includes += ../common + + Source_Files { + EchoEventSupplierMain.cpp + } +} + +project(*Consumer): namingexe, event_skel { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/README b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/README new file mode 100644 index 00000000000..aea980a3a44 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/README @@ -0,0 +1,61 @@ +OMG Event Service + + +File: DevGuideExamples/EventServices/OMG_SupplierSideEC/README + + +This directory contains an example that extends the previous examples +so that the event supplier creates its own local event channel. All +other code is identical to that in EventServices/OMG_Basic. + + EchoEventSupplier (contains EC) ------> EchoEventConsumer + +By default, the supplier will create a "Native" EC. Passing -wrapper +will force creation of a "Wrapper" EC that will utilize a Real-Time +Event Channel (RTEC) as the underlying implementation. + +------------------------------------------------------------------------- + +Note: To test this, you must first run the Naming Service + +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier -ORBInitRef NameService=file://ns.ior + + It will create an event channel and publish an event to it every + second. + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ORBInitRef NameService=file://ns.ior + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the CosEventComm::PushConsumer interface. + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/run_test.pl b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/run_test.pl new file mode 100644 index 00000000000..80e9b7846c7 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/run_test.pl @@ -0,0 +1,48 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$iorfile = PerlACE::LocalFile ("ns.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$iorfile"; + +unlink $iorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $iorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($iorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start EchoEventSupplier +$S = new PerlACE::Process("EchoEventSupplier", $arg_ns_ref); +$S->Spawn(); + +# Allow time for the supplier to register with the Naming Service +sleep(2); + +# start EchoEventConsumer +$C = new PerlACE::Process("EchoEventConsumer", $arg_ns_ref); +$CRET = $C->SpawnWaitKill(60); + +$S->Kill(); +$NS->Kill(); + +unlink $iorfile; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + + +exit 0; + + diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/ConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/ConsumerMain.cpp new file mode 100644 index 00000000000..5fedaa7c3f5 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/ConsumerMain.cpp @@ -0,0 +1,103 @@ +// ConsumerMain.cpp +// Main program for a TypedPushConsumer of Messenger objects. + + +#include "Messenger_i.h" +#include "Consumer_i.h" + +#include <orbsvcs/CosTypedEventCommC.h> +#include <orbsvcs/CosTypedEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> +#include <tao/AnyTypeCode/TypeCode.h> +#include <ace/OS_NS_stdio.h> +#include <iostream> + +const int EVENTS_TILL_SHUTDOWN = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EventChannel. + obj = root_context->resolve_str("CosEventService"); + + // Downcast the object reference to an TypedEventChannel reference. + CosTypedEventChannelAdmin::TypedEventChannel_var ec = + CosTypedEventChannelAdmin::TypedEventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not narrow TypedEventChannel." << std::endl; + return 1; + } + std::cout << "Found the TypedEventChannel." << std::endl; + + // Get a ConsumerAdmin object from the EventChannel. + CosTypedEventChannelAdmin::TypedConsumerAdmin_var consumerAdmin = + ec->for_consumers(); + + // Get a ProxyPushSupplier from the ConsumerAdmin. + CosEventChannelAdmin::ProxyPushSupplier_var supplier = + consumerAdmin->obtain_typed_push_supplier(::_tc_Messenger->id()); + + // Instantiate an Messenger_i servant. + Messenger_i servant(orb.in(), supplier.in(), EVENTS_TILL_SHUTDOWN); + + // Register it with the RootPOA. + // Activate the POA here before we connect our consumer. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var messenger_obj = poa->id_to_reference(oid.in()); + Consumer_i consumer_servant(orb.in(), messenger_obj.in()); + PortableServer::ObjectId_var cons_oid = + poa->activate_object(&consumer_servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(cons_oid.in()); + CosTypedEventComm::TypedPushConsumer_var consumer = + CosTypedEventComm::TypedPushConsumer::_narrow(consumer_obj.in()); + + // Connect to the ProxyPushSupplier, passing our PushConsumer object + // reference to it. + supplier->connect_push_consumer(consumer.in()); + + std::cout << "Ready to receive events..." << std::endl; + + CORBA::String_var str = orb->object_to_string (consumer.in ()); + const char* ior_file_name = "Consumer.ior"; + FILE *output_file= ACE_OS::fopen (ACE_TEXT_CHAR_TO_TCHAR(ior_file_name), + ACE_LIB_TEXT("w")); + if (output_file == 0) { + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for writing IOR: %s", + ior_file_name), + 1); + } + ACE_OS::fprintf (output_file, "%s", str.in ()); + ACE_OS::fclose (output_file); + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + // Disconnect the ProxyPushSupplier. + orb->destroy(); + + std::cout << "Test complete." << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA::Exception. " << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.cpp b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.cpp new file mode 100644 index 00000000000..57b72a2ee21 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.cpp @@ -0,0 +1,39 @@ +// Implements a PushConsumer. + +#include "Consumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +Consumer_i::Consumer_i(CORBA::ORB_ptr orb, + CORBA::Object_ptr obj) + : orb_(CORBA::ORB::_duplicate(orb)) + , object_(CORBA::Object::_duplicate(obj)) +{ +} + + +CORBA::Object_ptr +Consumer_i::get_typed_consumer () + throw (CORBA::SystemException) +{ + return CORBA::Object::_duplicate(object_.in()); +} + +// Override the push() operation. +void Consumer_i::push(const CORBA::Any &) + throw(CORBA::SystemException) +{ + throw CORBA::NO_IMPLEMENT (); +} + +// Override the disconnect_push_consumer() operation. +void Consumer_i::disconnect_push_consumer() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.h b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.h new file mode 100644 index 00000000000..d4d4388eaab --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Consumer_i.h @@ -0,0 +1,32 @@ +// Consumer_i.h +// Implements a TypedPushConsumer. + +#ifndef _Consumer_i_h_ +#define _Consumer_i_h_ + +#include <orbsvcs/CosTypedEventCommS.h> // for POA_CosTypedEventComm::TypedPushConsumer + +class Consumer_i +: public virtual POA_CosTypedEventComm::TypedPushConsumer +{ + public: + // Constructor + Consumer_i(CORBA::ORB_ptr orb, + CORBA::Object_ptr obj); + + // Override operations from TypedPushConsumer interface. + virtual CORBA::Object_ptr get_typed_consumer () + throw (CORBA::SystemException); + + virtual void push(const CORBA::Any & data) + throw(CORBA::SystemException); + + virtual void disconnect_push_consumer() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + CORBA::Object_var object_; +}; + +#endif // _Consumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger.idl b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger.idl new file mode 100644 index 00000000000..6f6cdf2f33c --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger.idl @@ -0,0 +1,10 @@ +// Messenger.idl + +interface Messenger +{ + // Modified to make message an in parameter and + // remove the return value. + void send_message(in string user_name, + in string subject, + in string message); +}; diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.cpp b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.cpp new file mode 100644 index 00000000000..5d91988b9a1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.cpp @@ -0,0 +1,40 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(CosEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +void Messenger_i::send_message (const char * user_name, + const char * subject, + const char * message) + throw (CORBA::SystemException) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.h b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.h new file mode 100644 index 00000000000..1b71a298e0a --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/Messenger_i.h @@ -0,0 +1,46 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include <orbsvcs/CosTypedEventChannelAdminC.h> + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (CORBA::ORB_ptr orb, + CosEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + //Destructor + virtual ~Messenger_i (void); + + virtual void send_message (const char * user_name, + const char * subject, + const char * message) + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; + CosEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/OMG_TypedEC.mpc b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/OMG_TypedEC.mpc new file mode 100644 index 00000000000..27c9419cc04 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/OMG_TypedEC.mpc @@ -0,0 +1,19 @@ +project(*Supplier): namingexe, event_skel { + exename = Supplier + includes += ../common + Source_Files { + SupplierMain.cpp + MessengerC.cpp + } +} + +project(*Consumer): namingexe, event_skel { + exename = Consumer + includes += ../common + + Source_Files { + ConsumerMain.cpp + Consumer_i.cpp + Messenger_i.cpp + } +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/README b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/README new file mode 100644 index 00000000000..bae2c8463e8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/README @@ -0,0 +1,17 @@ + +$TAO_ROOT/DevGuideExamples/EventServices/OMG_TypedEC + +This example is a simple demonstration of Typed Event Channel usage. +The Messenger interface is slightly modified for use in this example +to allow suppliers to send messages to all connected consumers. To +run the example, execute the following commands: + +export InterfaceRepositoryIOR=file://ifr.ior +export NameServiceIOR=file://ns.ior +$TAO_ROOT/orbsvcs/IFR_Service/IFR_Service -o ifr.ior & +$ACE_ROOT/bin/tao_ifr Messenger.idl +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior & +$TAO_ROOT/orbsvcs/CosEvent_Service/CosEvent_Service -t & +./Consumer & +./Supplier + diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/SupplierMain.cpp b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/SupplierMain.cpp new file mode 100644 index 00000000000..4d0567aefc1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/SupplierMain.cpp @@ -0,0 +1,74 @@ +// Main program for a TypedPushSupplier of Messenger objects. + +#include <orbsvcs/CosTypedEventCommC.h> +#include <orbsvcs/CosTypedEventChannelAdminC.h> +#include <orbsvcs/CosNamingC.h> +#include <tao/AnyTypeCode/TypeCode.h> + +#include <iostream> +#include "MessengerC.h" + +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EventChannel. + obj = root_context->resolve_str("CosEventService"); + + // Downcast the object reference to a TypedEventChannel reference. + CosTypedEventChannelAdmin::TypedEventChannel_var ec = + CosTypedEventChannelAdmin::TypedEventChannel::_narrow(obj.in ()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not resolve TypedEventChannel." << std::endl; + return 1; + } + + // Get a SupplierAdmin object from the EventChannel. + CosTypedEventChannelAdmin::TypedSupplierAdmin_var supplierAdmin = + ec->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + CosTypedEventChannelAdmin::TypedProxyPushConsumer_var consumer = + supplierAdmin->obtain_typed_push_consumer(::_tc_Messenger->id()); + + // Connect to the ProxyPushConsumer as a PushSupplier + // (passing a nil PushSupplier object reference to it because + // we don't care to be notified about disconnects). + consumer->connect_push_supplier(CosEventComm::PushSupplier::_nil()); + + // Obtain the interface from the event channel + CORBA::Object_var messenger_obj = consumer->get_typed_consumer(); + + // Narrow the interface + Messenger_var messenger = Messenger::_narrow(messenger_obj.in () ); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup("Hello, world."); + + // Send one event per second. (approx) + while (1) { + messenger->send_message("King Lizard", + "Proclamations", + eventData.in()); + + ACE_Time_Value event_delay(0, 1000 * EVENT_DELAY_MS); + orb->run(event_delay); + } + + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA::Exception. " << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/OMG_TypedEC/run_test.pl b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/run_test.pl new file mode 100644 index 00000000000..11adc6d33e6 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/OMG_TypedEC/run_test.pl @@ -0,0 +1,94 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$ifriorfile = PerlACE::LocalFile ("ifr.ior"); +$esiorfile = PerlACE::LocalFile ("es.ior"); +$consiorfile = PerlACE::LocalFile ("Consumer.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +$arg_ifr_ref = "-ORBInitRef InterfaceRepository=file://$ifriorfile"; + +unlink $nsiorfile; +unlink $ifriorfile; +unlink $esiorfile; +unlink $consiorfile; + +# start the Interface Repository Service +$IFRService = "$ENV{TAO_ROOT}/orbsvcs/IFR_Service/IFR_Service"; +$IF = new PerlACE::Process ($IFRService, "-o $ifriorfile"); +$IF->Spawn (); +if (PerlACE::waitforfile_timed ($ifriorfile, 15) == -1) { + print STDERR "ERROR: cannot find file <$ifriorfile>\n"; + $IF->Kill (); + exit 1; +} + +# load the IFR with the Messenger interface info +$TAO_IFR = "$ENV{ACE_ROOT}/bin/tao_ifr"; +$TI = new PerlACE::Process ($TAO_IFR, + "$arg_ifr_ref Messenger.idl"); +$TI->SpawnWaitKill (60); + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + $IF->Kill (); + exit 1; +} + +# start Event Service +$EventService = "$ENV{TAO_ROOT}/orbsvcs/CosEvent_Service/CosEvent_Service"; +$ES = new PerlACE::Process($EventService, + "-t -o $esiorfile $arg_ns_ref $arg_ifr_ref"); +$ES->Spawn(); +if (PerlACE::waitforfile_timed ($esiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$esiorfile>\n"; + $ES->Kill(); + $NS->Kill (); + $IF->Kill (); + unlink $nsiorfile; + exit 1; +} + +# start Consumer +$C = new PerlACE::Process("Consumer", "$arg_ns_ref"); +$C->Spawn(); +if (PerlACE::waitforfile_timed ($consiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$consiorfile>\n"; + $ES->Kill(); + $NS->Kill (); + $IF->Kill (); + $C->Kill (); + exit 1; +} + +# start Supplier +$S = new PerlACE::Process("Supplier", "$arg_ns_ref"); +$S->Spawn(); + +$CRET = $C->WaitKill(60); +$S->Kill(); +$NS->Kill(); +$ES->Kill(); +$IF->Kill(); + +unlink $nsiorfile; +unlink $ifriorfile; +unlink $esiorfile; +unlink $consiorfile; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..ba0a01976d4 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumerMain.cpp @@ -0,0 +1,88 @@ +// Main program for a PushConsumer of Echo events. + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const int EVENT_LIMIT = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str("EventService"); + + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "EchoEventConsumerMain.cpp: Found the EchoEventChannel." << std::endl; + + // Obtain a reference to the consumer administration object. + RtecEventChannelAdmin::ConsumerAdmin_var admin = ec->for_consumers(); + + // Obtain a reference to the push supplier proxy. + RtecEventChannelAdmin::ProxyPushSupplier_var supplier = + admin->obtain_push_supplier(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventConsumer_i servant. + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENT_LIMIT); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushConsumer_var consumer = + RtecEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect as a consumer. + ACE_ConsumerQOS_Factory qos; + qos.start_disjunction_group (1); + qos.insert_type (ACE_ES_EVENT_ANY, // Event Type + 0); // handle to the rt_info + supplier->connect_push_consumer (consumer.in (), + qos.get_ConsumerQOS ()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "EchoEventConsumerMain.cpp: Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + // Disconnect the ProxyPushSupplier. + orb->destroy(); + + std::cout << "Test completed." << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA::Exception" << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..08bb270168b --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.cpp @@ -0,0 +1,56 @@ +// EchoEventConsumer_i.cpp +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <ace/OS_NS_stdio.h> +#include <sstream> + +// Constructor duplicates the ORB reference. +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ + // Nothing to do. +} + +// Implement the push() operation. +void EchoEventConsumer_i::push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException) +{ + // Loop through the events, looking for shutdown events. + for (u_int i = 0; i < events.length (); ++i) { + //ACE_OS::printf("."); + // Extract event data from the any. + const char* eventData; + std::ostringstream out; + out << "Received event," + << " type: " << events[i].header.type + << " source: " << events[i].header.source; + if (events[i].data.any_value >>= eventData) { + out << " text: " << eventData; + } + + ACE_OS::printf("%s\n", out.str().c_str()); // printf is synchronized + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Implement the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.h new file mode 100644 index 00000000000..c59aa7944a8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventConsumer_i.h @@ -0,0 +1,31 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/RtecEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_RtecEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException); + + virtual void disconnect_push_consumer() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + RtecEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..57101632a30 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplierMain.cpp @@ -0,0 +1,107 @@ +// EchoEventSupplierMain.cpp +// Main program for a PushSupplier of Echo events. + +#include "EchoEventSupplier_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Get the Event Channel using Naming Services + obj = root_context->resolve_str("EventService"); + + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not resolve EchoEventChannel." << std::endl; + return 1; + } + + // Get a SupplierAdmin object from the EventChannel. + RtecEventChannelAdmin::SupplierAdmin_var admin = ec->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + RtecEventChannelAdmin::ProxyPushConsumer_var consumer = + admin->obtain_push_consumer(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventSupplier_i servant. + EchoEventSupplier_i servant(orb.in()); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushSupplier_var supplier = + RtecEventComm::PushSupplier::_narrow(supplier_obj.in()); + + // Publish the events the supplier provides. + ACE_SupplierQOS_Factory qos; + qos.insert (MY_SOURCE_ID, // Supplier's unique id + MY_EVENT_TYPE, // Event type + 0, // handle to the rt_info structure + 1); // number of calls + + // Connect as a supplier of the published events. + consumer->connect_push_supplier (supplier.in (), + qos.get_SupplierQOS ()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup("Hello, world."); + + // Create an event set for one event + RtecEventComm::EventSet events (1); + events.length (1); + + // Initialize event header. + events[0].header.source = MY_SOURCE_ID; + events[0].header.type = MY_EVENT_TYPE; + + // Initialize data fields in event. + events[0].data.any_value <<= eventData; + + std::cout << "Supplier starting sending of events" << std::endl; + + while (1) { + consumer->push (events); + ACE_Time_Value tv(0, 1000 * EVENT_DELAY_MS); + orb->run(tv); + } + + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Supplier::main() Caught CORBA::Exception" << std::endl << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.cpp new file mode 100644 index 00000000000..c2339c37ad1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.cpp @@ -0,0 +1,24 @@ +// EchoEventSupplier_i.cpp +// Implements a PushSupplier. + +#include "EchoEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +// Constructor duplicates the ORB reference. +EchoEventSupplier_i::EchoEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ + // Nothing to do. +} + +// Override the disconnect_push_Supplier() operation. +void EchoEventSupplier_i::disconnect_push_supplier() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.h new file mode 100644 index 00000000000..b06f44cf8e3 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/EchoEventSupplier_i.h @@ -0,0 +1,22 @@ +// EchoEventSupplier_i.h +// Implements a PushSupplier. + +#ifndef _EchoEventSupplier_i_h_ +#define _EchoEventSupplier_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushSupplier + +class EchoEventSupplier_i : public virtual POA_RtecEventComm::PushSupplier +{ + public: + // Constructor + EchoEventSupplier_i(CORBA::ORB_ptr orb); + + virtual void disconnect_push_supplier() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; +}; + +#endif // _EchoEventSupplier_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/README b/TAO/DevGuideExamples/EventServices/RTEC_Basic/README new file mode 100644 index 00000000000..5c4e89eacc8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/README @@ -0,0 +1,57 @@ +Real-Time Event Service + + +File: DevGuideExamples/EventServices/RTEC_Basic/README + + +This directory contains a simple example of using the RT Event service. +This example uses the push/push model: + + EchoEventSupplier ------> Event_Service ------> EchoEventConsumer + +------------------------------------------------------------------------- + +Note: To test this, you must first run the Naming Service and the +Event Service, e.g.: + +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& +$TAO_ROOT/orbsvcs/Event_Service/Event_Service -ORBInitRef NameService=file://ns.ior& + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier -ORBInitRef NameService=file://ns.ior + + It will publish an event to the event channel every 1 second. + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ORBInitRef NameService=file://ns.ior + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the RtecEventComm::PushConsumer interface. + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/RTEC_Basic.mpc b/TAO/DevGuideExamples/EventServices/RTEC_Basic/RTEC_Basic.mpc new file mode 100644 index 00000000000..a67c5f1c819 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/RTEC_Basic.mpc @@ -0,0 +1,20 @@ +project(*Supplier): namingexe, rteventexe, { + exename = EchoEventSupplier + includes += ../common + + Source_Files { + EchoEventSupplierMain.cpp + EchoEventSupplier_i.cpp + } +} + +project(*Consumer): namingexe, rteventexe, { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Basic/run_test.pl b/TAO/DevGuideExamples/EventServices/RTEC_Basic/run_test.pl new file mode 100644 index 00000000000..3fcc37a237c --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Basic/run_test.pl @@ -0,0 +1,60 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$esiorfile = PerlACE::LocalFile ("es.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; + +unlink $nsiorfile; +unlink $esiorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start Event Service +$EventService = "$ENV{TAO_ROOT}/orbsvcs/Event_Service/Event_Service"; +$ES = new PerlACE::Process($EventService, "-o $esiorfile $arg_ns_ref"); +$ES->Spawn(); +if (PerlACE::waitforfile_timed ($esiorfile, 15) == -1) { + print STDERR "ERROR: cannot find file <$esiorfile>\n"; + $ES->Kill(); + unlink $nsiorfile; + exit 1; +} + +# start EchoEventSupplier +$S = new PerlACE::Process("EchoEventSupplier", $arg_ns_ref); +$S->Spawn(); + +# start EchoEventConsumer +$C = new PerlACE::Process("EchoEventConsumer", $arg_ns_ref); +$CRET = $C->SpawnWaitKill(60); + +$S->Kill(); +$NS->Kill(); +$ES->Kill(); + +unlink $nsiorfile; +unlink $esiorfile; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + + +exit 0; + + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..d6b08f99a87 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumerMain.cpp @@ -0,0 +1,103 @@ +// EchoEventConsumerMain.cpp +// Main program for a PushConsumer of Echo events. + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +const int EVENT_LIMIT = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + const char* ecname = "EventService"; + for (int i = 0; argv[i] != 0; i++) { + if (strcmp(argv[i], "-ecname") == 0) { + if (argv[i+1] != 0) { + ecname = argv[i+1]; + } else { + std::cerr << "Missing Event channel name" << std::endl; + } + } + } + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context + = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str(ecname); + + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "EchoEventConsumerMain.cpp: Found the EchoEventChannel." << std::endl; + + // Obtain a reference to the consumer administration object. + RtecEventChannelAdmin::ConsumerAdmin_var admin = ec->for_consumers(); + + // Obtain a reference to the push supplier proxy. + RtecEventChannelAdmin::ProxyPushSupplier_var supplier = + admin->obtain_push_supplier(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventConsumer_i servant and register it + // with the RootPOA + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENT_LIMIT); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushConsumer_var consumer = + RtecEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect as a consumer. + ACE_ConsumerQOS_Factory qos; + qos.start_disjunction_group (); + qos.insert (MY_SOURCE_ID, // Source ID + MY_EVENT_TYPE, // Event Type + 0); // handle to the rt_info + supplier->connect_push_consumer (consumer.in (), + qos.get_ConsumerQOS ()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "EchoEventConsumerMain.cpp: Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + // Disconnect the ProxyPushSupplier. + orb->destroy(); + + std::cout << "Test completed." << std::endl; + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..08bb270168b --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.cpp @@ -0,0 +1,56 @@ +// EchoEventConsumer_i.cpp +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <ace/OS_NS_stdio.h> +#include <sstream> + +// Constructor duplicates the ORB reference. +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ + // Nothing to do. +} + +// Implement the push() operation. +void EchoEventConsumer_i::push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException) +{ + // Loop through the events, looking for shutdown events. + for (u_int i = 0; i < events.length (); ++i) { + //ACE_OS::printf("."); + // Extract event data from the any. + const char* eventData; + std::ostringstream out; + out << "Received event," + << " type: " << events[i].header.type + << " source: " << events[i].header.source; + if (events[i].data.any_value >>= eventData) { + out << " text: " << eventData; + } + + ACE_OS::printf("%s\n", out.str().c_str()); // printf is synchronized + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Implement the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.h new file mode 100644 index 00000000000..c59aa7944a8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventConsumer_i.h @@ -0,0 +1,31 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/RtecEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_RtecEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException); + + virtual void disconnect_push_consumer() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + RtecEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..5ecf0c4c43f --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplierMain.cpp @@ -0,0 +1,204 @@ +// EchoEventSupplierMain.cpp +// Main program for a PushSupplier of Echo events. + +#include "EchoEventSupplier_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/Event/EC_Event_Channel.h> +#include <orbsvcs/Event/EC_Gateway_IIOP.h> +#include <orbsvcs/Event/EC_Default_Factory.h> + +#include <ace/Thread_Manager.h> +#include <iostream> +#include <fstream> + +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +const int EVENT_DELAY_MS = 10; + +ACE_THR_FUNC_RETURN orb_thread(void *orb_ptr) +{ + CORBA::ORB_var orb = CORBA::ORB::_duplicate((CORBA::ORB_ptr) orb_ptr); + orb->run(); + return 0; +} + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the EC Factory so we can customize the EC + TAO_EC_Default_Factory::init_svcs (); + + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + const char* ecname = "EventService"; + const char* remote_ecname = 0; + const char* iorfile = 0; + for (int i = 0; argv[i] != 0; i++) { + if (strcmp(argv[i], "-ecname") == 0) { + if (argv[i+1] != 0) { + i++; + ecname = argv[i]; + } else { + std::cerr << "Missing Event channel name" << std::endl; + } + } + if (strcmp(argv[i], "-gateway") == 0) { + if (argv[i+1] != 0) { + i++; + remote_ecname = argv[i]; + } else { + std::cerr << "Missing Event channel name" << std::endl; + } + } + if (strcmp(argv[i], "-iorfile") == 0) { + if (argv[i+1] != 0) { + i++; + iorfile = argv[i]; + } + } + } + + // Get the POA + CORBA::Object_var object = orb->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (object.in ()); + PortableServer::POAManager_var poa_manager = poa->the_POAManager (); + poa_manager->activate (); + + // Spawn a thread for the orb + ACE_Thread_Manager *thread_mgr = ACE_Thread_Manager::instance(); + thread_mgr->spawn(orb_thread, orb.in()); + + // Create a local event channel and register it with the RootPOA. + TAO_EC_Event_Channel_Attributes attributes (poa.in (), poa.in ()); + TAO_EC_Event_Channel ec_impl (attributes); + ec_impl.activate (); + PortableServer::ObjectId_var oid = poa->activate_object(&ec_impl); + CORBA::Object_var ec_obj = poa->id_to_reference(oid.in()); + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(ec_obj.in()); + + // Find the Naming Service. + object = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(object.in()); + CosNaming::Name_var name = root_context->to_name(ecname); + root_context->rebind(name.in(), ec.in()); + + // Get a SupplierAdmin object from the EventChannel. + RtecEventChannelAdmin::SupplierAdmin_var admin = ec->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + RtecEventChannelAdmin::ProxyPushConsumer_var consumer = + admin->obtain_push_consumer(); + + // Instantiate an EchoEventSupplier_i servant. + EchoEventSupplier_i servant(orb.in()); + + // Register it with the RootPOA. + oid = poa->activate_object(&servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushSupplier_var supplier = + RtecEventComm::PushSupplier::_narrow(supplier_obj.in()); + + // Publish the events the supplier provides. + ACE_SupplierQOS_Factory qos; + qos.insert (MY_SOURCE_ID, // Supplier's unique id + MY_EVENT_TYPE, // Event type + 0, // handle to the rt_info structure + 1); // number of calls + + // Connect as a supplier of the published events. + consumer->connect_push_supplier (supplier.in (), + qos.get_SupplierQOS ()); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup(ecname); + + // Create an event set for one event + RtecEventComm::EventSet event (1); + event.length (1); + // Initialize event header. + event[0].header.source = MY_SOURCE_ID; + event[0].header.ttl = 1; + event[0].header.type = MY_EVENT_TYPE; + // Initialize data fields in event. + event[0].data.any_value <<= eventData; + + TAO_EC_Gateway_IIOP gateway; + int gateway_initialized = 0; + + std::cout << "Supplier starting sending of events.\n"; + + while (1) { + + consumer->push (event); + ACE_Time_Value tv(0, 1000 * EVENT_DELAY_MS); + orb->run(tv); + + if ((remote_ecname != 0) && (!gateway_initialized)) { + + try { + // Get the remote event channel object + CORBA::Object_var obj = root_context->resolve_str(remote_ecname); + RtecEventChannelAdmin::EventChannel_var remote_ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + + int ok = 0; + if (!CORBA::is_nil(remote_ec.in())) { + // Now check if we can talk to it... + try { + RtecEventChannelAdmin::SupplierAdmin_var adm = + remote_ec->for_suppliers(); + ok = 1; + } catch(const CORBA::UserException&) { + // What is the correct exception(s) to catch here? + } + } + + // There is a good remote event channel so initialize the + // gateway. + if (ok) { + gateway.init(remote_ec.in(), ec.in()); + + PortableServer::ObjectId_var gateway_oid = + poa->activate_object(&gateway); + CORBA::Object_var gateway_obj = + poa->id_to_reference(gateway_oid.in()); + RtecEventChannelAdmin::Observer_var obs = + RtecEventChannelAdmin::Observer::_narrow(gateway_obj.in()); + RtecEventChannelAdmin::Observer_Handle local_ec_obs_handle = + ec->append_observer (obs.in ()); + ACE_UNUSED_ARG (local_ec_obs_handle); + gateway_initialized = 1; + std::cout << "Gateway initialized\n"; + if (iorfile != 0) { + CORBA::String_var str = orb->object_to_string( ec.in() ); + std::ofstream iorFile( iorfile ); + iorFile << str.in() << std::endl; + iorFile.close(); + } + } + } catch(const CosNaming::NamingContext::NotFound&) { + // Try again later... + } + } + } + + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.cpp new file mode 100644 index 00000000000..c2339c37ad1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.cpp @@ -0,0 +1,24 @@ +// EchoEventSupplier_i.cpp +// Implements a PushSupplier. + +#include "EchoEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +// Constructor duplicates the ORB reference. +EchoEventSupplier_i::EchoEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ + // Nothing to do. +} + +// Override the disconnect_push_Supplier() operation. +void EchoEventSupplier_i::disconnect_push_supplier() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.h new file mode 100644 index 00000000000..b06f44cf8e3 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/EchoEventSupplier_i.h @@ -0,0 +1,22 @@ +// EchoEventSupplier_i.h +// Implements a PushSupplier. + +#ifndef _EchoEventSupplier_i_h_ +#define _EchoEventSupplier_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushSupplier + +class EchoEventSupplier_i : public virtual POA_RtecEventComm::PushSupplier +{ + public: + // Constructor + EchoEventSupplier_i(CORBA::ORB_ptr orb); + + virtual void disconnect_push_supplier() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; +}; + +#endif // _EchoEventSupplier_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/README b/TAO/DevGuideExamples/EventServices/RTEC_Federated/README new file mode 100644 index 00000000000..c3c2e9b8576 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/README @@ -0,0 +1,84 @@ +Real-Time Event Service + + +File: DevGuideExamples/EventServices/RTEC_Federated/README + + +This directory contains an example that shows how to create and +federate real-time event channels. + +------------------------------------------------------------------------- + +Note: To test this, you must first run the Naming Service, e.g.: + + $TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +After running the naming service, start a couple of suppliers: + + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -ORBSvcConf supplier.conf -ecname name1 -gateway name2 + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -ORBSvcConf supplier.conf -ecname name2 -gateway name1 + +Now start some consumers: + + ./EchoEventConsumer -ORBInitRef NameService=file://ns.ior -ecname name1 + ./EchoEventConsumer -ORBInitRef NameService=file://ns.ior -ecname name2 + +It may be easiest to start these in separate windows. You should +see events from both suppliers on both event channels. + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier -ORBInitRef NameService=file://ns.ior -ORBSvcConf supplier.conf -ecname <name> -gateway <rname> -iorfile <file> + + This will create a local RTEC event channel and bind it under + the root context of the naming service with the name <name>. + It will also create a gateway that links from the remote event + channel bound under <rname> to the locally created event channel. + After initializing the local event channel, it will idle until + it locates the remote event channel, initialize the gateway, + and then publish an event to the local event channel every 10 + milliseconds. This event will contain the string <name> in the + any_value field. When the gateway is initialized, you'll see a + message stating "Gateway initialized". If you pass the -iorfile + parameter, this server also writes the EC's IOR to <file> when + the gateway is initialized. + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ORBInitRef NameService=file://ns.ior -ecname <name> + + This will look for an event channel bound to <name> in the Root context + of the Naming Service. It will consume events from this channel and + print the type, source, and string contents contained in any_value. + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the RtecEventComm::PushConsumer interface. + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/RTEC_Federated.mpc b/TAO/DevGuideExamples/EventServices/RTEC_Federated/RTEC_Federated.mpc new file mode 100644 index 00000000000..718344d8d9e --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/RTEC_Federated.mpc @@ -0,0 +1,20 @@ +project(*Supplier): namingexe, rteventexe, rtevent_serv { + exename = EchoEventSupplier + includes += ../common + + Source_Files { + EchoEventSupplierMain.cpp + EchoEventSupplier_i.cpp + } +} + +project(*Consumer): namingexe, rteventexe { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/run_test.pl b/TAO/DevGuideExamples/EventServices/RTEC_Federated/run_test.pl new file mode 100644 index 00000000000..7f2282debce --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/run_test.pl @@ -0,0 +1,94 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$iorfile = PerlACE::LocalFile ("ns.ior"); +$ec1iorfile = PerlACE::LocalFile ("ec1.ior"); +$ec2iorfile = PerlACE::LocalFile ("ec2.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$iorfile"; + +unlink $iorfile; +unlink $ec1iorfile; +unlink $ec2iorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $iorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($iorfile, 10) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start Supplier +if ( -e "supplier.conf" ) +{ + $supplier_conf_file = "supplier.conf"; +} +else{ + $supplier_conf_file = "../supplier.conf"; +} +$args1 = "-ORBSvcConf $supplier_conf_file -ecname ec1 -gateway ec2 -iorfile $ec1iorfile"; +$S1 = new PerlACE::Process("EchoEventSupplier", "$arg_ns_ref $args1"); +$S1->Spawn(); + +$args2 = "-ORBSvcConf $supplier_conf_file -ecname ec2 -gateway ec1 -iorfile $ec2iorfile"; +$S2 = new PerlACE::Process("EchoEventSupplier", "$arg_ns_ref $args2"); +$S2->Spawn(); + +if ((PerlACE::waitforfile_timed ($ec1iorfile, 15) == -1) || + (PerlACE::waitforfile_timed ($ec2iorfile, 2) == -1)) { + print STDERR "ERROR: cannot find files <$ec1iorfile> and <$ec2iorfile>\n"; + $NS->Kill(); + $S1->Kill(); + $S2->Kill(); + exit 1; +} + +$args3 = "-ecname ec1"; +$C1 = new PerlACE::Process("EchoEventConsumer", "$arg_ns_ref $args3"); +$C1->Spawn(); + +$args4 = "-ecname ec2"; +$C2 = new PerlACE::Process("EchoEventConsumer", "$arg_ns_ref $args4"); +$C2->Spawn(); + +if ($C1->WaitKill(60) == -1) { + print STDERR "consumer1 timedout \n"; + + $C2->Kill(); + $S1->Kill(); + $S2->Kill(); + $NS->Kill(); + + unlink $iorfile; + + exit 1; +} + +if ($C2->WaitKill(10) == -1) { + print STDERR "consumer2 timedout \n"; + + $S1->Kill(); + $S2->Kill(); + $NS->Kill(); + + unlink $iorfile; + + exit 1; +} + +$NS->Kill(); +$S1->Kill(); +$S2->Kill(); + +unlink $iorfile; +unlink $ec1iorfile; +unlink $ec2iorfile; + +exit 0; diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Federated/supplier.conf b/TAO/DevGuideExamples/EventServices/RTEC_Federated/supplier.conf new file mode 100644 index 00000000000..87ebf02489e --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Federated/supplier.conf @@ -0,0 +1,6 @@ +# $Id +# Use 5 dispatching threads and the rw wait strategy to resolve deadlock +# issues in the gateway at disconnect time. +static Resource_Factory "-ORBFlushingStrategy blocking" +static EC_Factory "-ECobserver basic -ECDispatching mt -ECDispatchingThreads 5" +static Client_Strategy_Factory "-ORBWaitStrategy rw -ORBTransportMuxStrategy exclusive" diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..c926df1a023 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumerMain.cpp @@ -0,0 +1,91 @@ +// EchoEventConsumerMain.cpp +// Main program for a PushConsumer of Echo events. + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const RtecEventComm::EventSourceID MY_SUPPLIER_ID_START = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventSourceID MY_SUPPLIER_ID_END = ACE_ES_EVENT_SOURCE_ANY + 3; +const RtecEventComm::EventType MY_EVENT_START = ACE_ES_EVENT_UNDEFINED + 1; +const RtecEventComm::EventType MY_EVENT_END = ACE_ES_EVENT_UNDEFINED + 4; + +const int EVENT_LIMIT = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = + CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str("EventService"); + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "EchoEventConsumerMain.cpp: Found the EchoEventChannel." << std::endl; + + // Obtain a reference to the consumer administration object. + RtecEventChannelAdmin::ConsumerAdmin_var admin = ec->for_consumers(); + + // Obtain a reference to the push supplier proxy. + RtecEventChannelAdmin::ProxyPushSupplier_var supplier = + admin->obtain_push_supplier(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventConsumer_i servant and register it + // with the RootPOA + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENT_LIMIT); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushConsumer_var consumer = + RtecEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect as a consumer. + ACE_ConsumerQOS_Factory qos; + qos.start_disjunction_group (1); + qos.insert_type (MY_EVENT_START, // Event Type + 0); // handle to the rt_info + supplier->connect_push_consumer (consumer.in (), + qos.get_ConsumerQOS ()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "EchoEventConsumerMain.cpp: Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + // Disconnect the ProxyPushSupplier. + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..08bb270168b --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.cpp @@ -0,0 +1,56 @@ +// EchoEventConsumer_i.cpp +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <ace/OS_NS_stdio.h> +#include <sstream> + +// Constructor duplicates the ORB reference. +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ + // Nothing to do. +} + +// Implement the push() operation. +void EchoEventConsumer_i::push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException) +{ + // Loop through the events, looking for shutdown events. + for (u_int i = 0; i < events.length (); ++i) { + //ACE_OS::printf("."); + // Extract event data from the any. + const char* eventData; + std::ostringstream out; + out << "Received event," + << " type: " << events[i].header.type + << " source: " << events[i].header.source; + if (events[i].data.any_value >>= eventData) { + out << " text: " << eventData; + } + + ACE_OS::printf("%s\n", out.str().c_str()); // printf is synchronized + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Implement the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.h new file mode 100644 index 00000000000..c59aa7944a8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventConsumer_i.h @@ -0,0 +1,31 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/RtecEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_RtecEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException); + + virtual void disconnect_push_consumer() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + RtecEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..5232c12ffd0 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplierMain.cpp @@ -0,0 +1,118 @@ +// EchoEventSupplierMain.cpp +// Main program for a PushSupplier of Echo events. + +#include "EchoEventSupplier_i.h" + +#include <orbsvcs/RtecEventCommC.h> // for Event Communication interfaces +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> // for Naming Service interfaces + +#include <iostream> +const RtecEventComm::EventSourceID MY_SOURCE_ID_START = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventSourceID MY_SOURCE_ID_END = ACE_ES_EVENT_SOURCE_ANY + 3; +const RtecEventComm::EventType MY_EVENT_START = ACE_ES_EVENT_UNDEFINED + 1; +const RtecEventComm::EventType MY_EVENT_END = ACE_ES_EVENT_UNDEFINED + 4; + +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Get the Event Channel using Naming Services + obj = root_context->resolve_str("EventService"); + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not resolve EchoEventChannel." << std::endl; + return 1; + } + + // Get a SupplierAdmin object from the EventChannel. + RtecEventChannelAdmin::SupplierAdmin_var admin = ec->for_suppliers(); + + // Get a ProxyPushConsumer from the SupplierAdmin. + RtecEventChannelAdmin::ProxyPushConsumer_var consumer = + admin->obtain_push_consumer(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventConsumer_i servant. + EchoEventSupplier_i servant(orb.in()); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushSupplier_var supplier = + RtecEventComm::PushSupplier::_narrow(supplier_obj.in()); + + // Publish the events the supplier provides. + ACE_SupplierQOS_Factory qos; + RtecEventComm::EventSourceID supplier_id = MY_SOURCE_ID_START; + for (; supplier_id <= MY_SOURCE_ID_END; ++supplier_id) { + RtecEventComm::EventType event_type = MY_EVENT_START; + for (; event_type <= MY_EVENT_END; ++event_type) + { + qos.insert (supplier_id, event_type, + 0, // handle to the rt_info structure + 1); // number of calls + } + } + + // Connect as a supplier of the published events. + consumer->connect_push_supplier (supplier.in (), qos.get_SupplierQOS ()); + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup("Hello, world."); + + // Create an event set for one event + RtecEventComm::EventSet event (1); + event.length (1); + + // Initialize event header. + event[0].header.source = MY_SOURCE_ID_START; + event[0].header.type = MY_EVENT_START; + + // Initialize data fields in event. + event[0].data.any_value <<= eventData; + + std::cout << "Supplier starting sending events.\n"; + while (1) { + + event[0].header.type++; + if (event[0].header.type > MY_EVENT_END) { + event[0].header.type = MY_EVENT_START; + } + event[0].header.source++; + if (event[0].header.source > MY_SOURCE_ID_END) { + event[0].header.source = MY_SOURCE_ID_START; + } + consumer->push (event); + + ACE_Time_Value tv(0, EVENT_DELAY_MS * 1000); + orb->run(tv); + } + + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.cpp new file mode 100644 index 00000000000..112e33922c5 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.cpp @@ -0,0 +1,25 @@ +// EchoEventSupplier_i.cpp +// Implements a PushSupplier. + +#include "EchoEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +// Constructor duplicates the ORB reference. +EchoEventSupplier_i::EchoEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ + // Nothing to do. +} + +// Override the disconnect_push_Supplier() operation. +void EchoEventSupplier_i::disconnect_push_supplier() + throw(CORBA::SystemException) +{ + + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.h b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.h new file mode 100644 index 00000000000..b06f44cf8e3 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/EchoEventSupplier_i.h @@ -0,0 +1,22 @@ +// EchoEventSupplier_i.h +// Implements a PushSupplier. + +#ifndef _EchoEventSupplier_i_h_ +#define _EchoEventSupplier_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushSupplier + +class EchoEventSupplier_i : public virtual POA_RtecEventComm::PushSupplier +{ + public: + // Constructor + EchoEventSupplier_i(CORBA::ORB_ptr orb); + + virtual void disconnect_push_supplier() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; +}; + +#endif // _EchoEventSupplier_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/README b/TAO/DevGuideExamples/EventServices/RTEC_Filter/README new file mode 100644 index 00000000000..c1cd7a23fad --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/README @@ -0,0 +1,57 @@ +Real-Time Event Service + + +File: DevGuideExamples/EventServices/RTEC_Filter/README + + +This directory contains some example code for the filters, correlations, +and timeouts features of the RT Event service. For now the code is all +in the EchoEventConsumerMain.cpp file. Simply, comment out the filters/ +timeouts/correlations required, remake, and run as below. + +------------------------------------------------------------------------- + +Note: To test this, you must first run the Naming Service and the +Event Service, e.g.: + +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& +$TAO_ROOT/orbsvcs/Event_Service/Event_Service -ORBSvcConf ec.conf -ORBInitRef NameService=file://ns.ior& + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier -ORBInitRef NameService=file://ns.ior + + It will publish an event to the event channel every 1 second. + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ORBInitRef NameService=file://ns.ior + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the RtecEventComm::PushConsumer interface. + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/RTEC_Filter.mpc b/TAO/DevGuideExamples/EventServices/RTEC_Filter/RTEC_Filter.mpc new file mode 100644 index 00000000000..a67c5f1c819 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/RTEC_Filter.mpc @@ -0,0 +1,20 @@ +project(*Supplier): namingexe, rteventexe, { + exename = EchoEventSupplier + includes += ../common + + Source_Files { + EchoEventSupplierMain.cpp + EchoEventSupplier_i.cpp + } +} + +project(*Consumer): namingexe, rteventexe, { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/ec.conf b/TAO/DevGuideExamples/EventServices/RTEC_Filter/ec.conf new file mode 100644 index 00000000000..0d41159fbd9 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/ec.conf @@ -0,0 +1,2 @@ +# $Id$ +static EC_Factory "-ECFiltering prefix" diff --git a/TAO/DevGuideExamples/EventServices/RTEC_Filter/run_test.pl b/TAO/DevGuideExamples/EventServices/RTEC_Filter/run_test.pl new file mode 100644 index 00000000000..c4fa28f1ec1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_Filter/run_test.pl @@ -0,0 +1,61 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$esiorfile = PerlACE::LocalFile ("es.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; + +unlink $nsiorfile; +unlink $esiorfile; + +# start Naming Service + +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start Event Service +$EventService = "$ENV{TAO_ROOT}/orbsvcs/Event_Service/Event_Service"; +$ES = new PerlACE::Process($EventService, "-o $esiorfile $arg_ns_ref"); +$ES->Spawn(); +if (PerlACE::waitforfile_timed ($esiorfile, 15) == -1) { + print STDERR "ERROR: cannot find file <$esiorfile>\n"; + $ES->Kill(); + unlink $nsiorfile; + exit 1; +} + +# start EchoEventSupplier +$S = new PerlACE::Process("EchoEventSupplier", $arg_ns_ref); +$S->Spawn(); + +# start EchoEventConsumer +$C = new PerlACE::Process("EchoEventConsumer", $arg_ns_ref); +$C->Spawn(); + +$CRET = $C->WaitKill(60); +$S->Kill(); +$NS->Kill(); +$ES->Kill(); + +unlink $nsiorfile; +unlink $esiorfile; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp new file mode 100644 index 00000000000..e3a6d584cdc --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumerMain.cpp @@ -0,0 +1,103 @@ +// EchoEventConsumerMain.cpp +// Main program for a PushConsumer of Echo events. + +#include "EchoEventConsumer_i.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> + +#include <iostream> +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +const int EVENT_LIMIT = 20; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + const char* ecname = "EventService"; + for (int i = 0; argv[i] != 0; i++) { + if (strcmp(argv[i], "-ecname") == 0) { + if (argv[i+1] != 0) { + ecname = argv[i+1]; + } else { + std::cerr << "Missing Event channel name" << std::endl; + } + } + } + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Find the EchoEventChannel. + obj = root_context->resolve_str(ecname); + + // Downcast the object reference to an EventChannel reference. + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(obj.in()); + if (CORBA::is_nil(ec.in())) { + std::cerr << "Could not narrow EchoEventChannel." << std::endl; + return 1; + } + std::cout << "EchoEventConsumerMain.cpp: Found the EchoEventChannel." << std::endl; + + // Obtain a reference to the consumer administration object. + RtecEventChannelAdmin::ConsumerAdmin_var admin = ec->for_consumers(); + + // Obtain a reference to the push supplier proxy. + RtecEventChannelAdmin::ProxyPushSupplier_var supplier = + admin->obtain_push_supplier(); + + // Get the RootPOA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Instantiate an EchoEventConsumer_i servant. + EchoEventConsumer_i servant(orb.in(), supplier.in(), EVENT_LIMIT); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushConsumer_var consumer = + RtecEventComm::PushConsumer::_narrow(consumer_obj.in()); + + // Connect as a consumer. + ACE_ConsumerQOS_Factory qos; + qos.start_disjunction_group (); + qos.insert (MY_SOURCE_ID, // Source ID + MY_EVENT_TYPE, // Event Type + 0); // handle to the rt_info + supplier->connect_push_consumer (consumer.in (), + qos.get_ConsumerQOS ()); + + // Activate the POA via its POAManager. + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + poa_manager->activate(); + + std::cout << "EchoEventConsumerMain.cpp: Ready to receive events..." << std::endl; + + // Enter the ORB event loop. + orb->run(); + + // If we have reached this, we must be shutting down... + // Disconnect the ProxyPushSupplier. + orb->destroy(); + + return 0; + + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp new file mode 100644 index 00000000000..08bb270168b --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.cpp @@ -0,0 +1,56 @@ +// EchoEventConsumer_i.cpp +// Implements a PushConsumer. + +#include "EchoEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <ace/OS_NS_stdio.h> +#include <sstream> + +// Constructor duplicates the ORB reference. +EchoEventConsumer_i::EchoEventConsumer_i( + CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit) + : orb_(CORBA::ORB::_duplicate(orb)) + , supplier_(RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(supplier)) + , event_limit_(event_limit) +{ + // Nothing to do. +} + +// Implement the push() operation. +void EchoEventConsumer_i::push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException) +{ + // Loop through the events, looking for shutdown events. + for (u_int i = 0; i < events.length (); ++i) { + //ACE_OS::printf("."); + // Extract event data from the any. + const char* eventData; + std::ostringstream out; + out << "Received event," + << " type: " << events[i].header.type + << " source: " << events[i].header.source; + if (events[i].data.any_value >>= eventData) { + out << " text: " << eventData; + } + + ACE_OS::printf("%s\n", out.str().c_str()); // printf is synchronized + } + if (--event_limit_ <= 0) { + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + } +} + +// Implement the disconnect_push_consumer() operation. +void EchoEventConsumer_i::disconnect_push_consumer() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.h b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.h new file mode 100644 index 00000000000..c59aa7944a8 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventConsumer_i.h @@ -0,0 +1,31 @@ +// EchoEventConsumer_i.h +// Implements a PushConsumer. + +#ifndef _EchoEventConsumer_i_h_ +#define _EchoEventConsumer_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushConsumer +#include <orbsvcs/RtecEventChannelAdminC.h> + +class EchoEventConsumer_i : public virtual POA_RtecEventComm::PushConsumer +{ + public: + // Constructor + EchoEventConsumer_i(CORBA::ORB_ptr orb, + RtecEventChannelAdmin::ProxyPushSupplier_ptr supplier, + int event_limit); + + // Override operations from PushConsumer interface. + virtual void push(const RtecEventComm::EventSet& events) + throw(CORBA::SystemException); + + virtual void disconnect_push_consumer() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + RtecEventChannelAdmin::ProxyPushSupplier_var supplier_; + int event_limit_; +}; + +#endif // _EchoEventConsumer_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp new file mode 100644 index 00000000000..1ea25b53d15 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplierMain.cpp @@ -0,0 +1,243 @@ +// EchoEventSupplierMain.cpp +// Main program for a PushSupplier of Echo events. + +#include "EchoEventSupplier_i.h" +#include "SimpleAddressServer.h" + +#include <orbsvcs/RtecEventCommC.h> +#include <orbsvcs/RtecEventChannelAdminC.h> +#include <orbsvcs/Time_Utilities.h> +#include <orbsvcs/Event_Utilities.h> +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/Event/EC_Event_Channel.h> +#include <orbsvcs/Event/EC_Default_Factory.h> +#include <orbsvcs/Event/ECG_Mcast_EH.h> +#include <orbsvcs/Event/ECG_UDP_Sender.h> +#include <orbsvcs/Event/ECG_UDP_Receiver.h> +#include <orbsvcs/Event/ECG_UDP_Out_Endpoint.h> +#include <orbsvcs/Event/ECG_UDP_EH.h> + +#include <tao/ORB_Core.h> + +#include <ace/Auto_Ptr.h> +#include <iostream> +#include <fstream> + +const RtecEventComm::EventSourceID MY_SOURCE_ID = ACE_ES_EVENT_SOURCE_ANY + 1; +const RtecEventComm::EventType MY_EVENT_TYPE = ACE_ES_EVENT_UNDEFINED + 1; + +const int EVENT_DELAY_MS = 10; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + // Initialize the EC Factory so we can customize the EC + TAO_EC_Default_Factory::init_svcs (); + + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + const char* ecname = "EventService"; + const char* address = "localhost"; + const char* iorfile = 0; + u_short port = 12345; + u_short listenport = 12345; + int mcast = 1; + + for (int i = 0; argv[i] != 0; i++) { + if (strcmp(argv[i], "-ecname") == 0) { + if (argv[i+1] != 0) { + i++; + ecname = argv[i]; + } else { + std::cerr << "Missing Event channel name" << std::endl; + } + } else if (strcmp(argv[i], "-address") == 0) { + if (argv[i+1] != 0) { + i++; + address = argv[i]; + } else { + std::cerr << "Missing address" << std::endl; + } + } else if (strcmp(argv[i], "-port") == 0) { + if (argv[i+1] != 0) { + i++; + port = ACE_OS::atoi(argv[i]); + } else { + std::cerr << "Missing port" << std::endl; + } + } else if (strcmp(argv[i], "-listenport") == 0) { + if (argv[i+1] != 0) { + i++; + listenport = ACE_OS::atoi(argv[i]); + } else { + std::cerr << "Missing port" << std::endl; + } + } else if (strcmp(argv[i], "-iorfile") == 0) { + if (argv[i+1] != 0) { + i++; + iorfile = argv[i]; + } + } else if (strcmp(argv[i], "-udp") == 0) { + mcast = 0; + } + } + + // Get the POA + CORBA::Object_var object = orb->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (object.in ()); + PortableServer::POAManager_var poa_manager = poa->the_POAManager (); + poa_manager->activate (); + + // Create a local event channel and register it + TAO_EC_Event_Channel_Attributes attributes (poa.in (), poa.in ()); + TAO_EC_Event_Channel ec_impl (attributes); + ec_impl.activate (); + PortableServer::ObjectId_var oid = poa->activate_object(&ec_impl); + CORBA::Object_var ec_obj = poa->id_to_reference(oid.in()); + RtecEventChannelAdmin::EventChannel_var ec = + RtecEventChannelAdmin::EventChannel::_narrow(ec_obj.in()); + + // Find the Naming Service. + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root_context = CosNaming::NamingContextExt::_narrow(obj.in()); + + // Bind the Event Channel using Naming Services + CosNaming::Name_var name = root_context->to_name(ecname); + root_context->rebind(name.in(), ec.in()); + + // Get a proxy push consumer from the EventChannel. + RtecEventChannelAdmin::SupplierAdmin_var admin = ec->for_suppliers(); + RtecEventChannelAdmin::ProxyPushConsumer_var consumer = + admin->obtain_push_consumer(); + + // Instantiate an EchoEventSupplier_i servant. + EchoEventSupplier_i servant(orb.in()); + + // Register it with the RootPOA. + oid = poa->activate_object(&servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + RtecEventComm::PushSupplier_var supplier = + RtecEventComm::PushSupplier::_narrow(supplier_obj.in()); + + // Connect to the EC. + ACE_SupplierQOS_Factory qos; + qos.insert (MY_SOURCE_ID, MY_EVENT_TYPE, 0, 1); + consumer->connect_push_supplier (supplier.in (), qos.get_SupplierQOS ()); + + // Initialize the address server with the desired address. + // This will be used by the sender object and the multicast + // receiver. + ACE_INET_Addr send_addr (port, address); + SimpleAddressServer addr_srv_impl (send_addr); + + PortableServer::ObjectId_var addr_srv_oid = + poa->activate_object(&addr_srv_impl); + CORBA::Object_var addr_srv_obj = poa->id_to_reference(addr_srv_oid.in()); + RtecUDPAdmin::AddrServer_var addr_srv = + RtecUDPAdmin::AddrServer::_narrow(addr_srv_obj.in()); + + // Create and initialize the sender object + TAO_EC_Servant_Var<TAO_ECG_UDP_Sender> sender = + TAO_ECG_UDP_Sender::create(); + TAO_ECG_UDP_Out_Endpoint endpoint; + if (endpoint.dgram ().open (ACE_Addr::sap_any) == -1) { + std::cerr << "Cannot open send endpoint" << std::endl; + return 1; + } + + // TAO_ECG_UDP_Sender::init() takes a TAO_ECG_Refcounted_Endpoint. + // If we don't clone our endpoint and pass &endpoint, the sender will + // attempt to delete endpoint during shutdown. + TAO_ECG_UDP_Out_Endpoint* clone; + ACE_NEW_RETURN (clone, + TAO_ECG_UDP_Out_Endpoint (endpoint), + -1); + sender->init (ec.in (), addr_srv.in (), clone); + + // Setup the subscription and connect to the EC + ACE_ConsumerQOS_Factory cons_qos_fact; + cons_qos_fact.start_disjunction_group (); + cons_qos_fact.insert (ACE_ES_EVENT_SOURCE_ANY, ACE_ES_EVENT_ANY, 0); + RtecEventChannelAdmin::ConsumerQOS sub = cons_qos_fact.get_ConsumerQOS (); + sender->connect (sub); + + // Create and initialize the receiver + TAO_EC_Servant_Var<TAO_ECG_UDP_Receiver> receiver = + TAO_ECG_UDP_Receiver::create(); + + // TAO_ECG_UDP_Receiver::init() takes a TAO_ECG_Refcounted_Endpoint. + // If we don't clone our endpoint and pass &endpoint, the receiver will + // attempt to delete endpoint during shutdown. + ACE_NEW_RETURN (clone, + TAO_ECG_UDP_Out_Endpoint (endpoint), + -1); + receiver->init (ec.in (), clone, addr_srv.in ()); + + // Setup the registration and connect to the event channel + ACE_SupplierQOS_Factory supp_qos_fact; + supp_qos_fact.insert (MY_SOURCE_ID, MY_EVENT_TYPE, 0, 1); + RtecEventChannelAdmin::SupplierQOS pub = supp_qos_fact.get_SupplierQOS (); + receiver->connect (pub); + + // Create the appropriate event handler and register it with the reactor + auto_ptr<ACE_Event_Handler> eh; + if (mcast) { + auto_ptr<TAO_ECG_Mcast_EH> mcast_eh(new TAO_ECG_Mcast_EH (receiver.in())); + mcast_eh->reactor (orb->orb_core ()->reactor ()); + mcast_eh->open (ec.in()); + ACE_AUTO_PTR_RESET(eh,mcast_eh.release(),ACE_Event_Handler); + //eh.reset(mcast_eh.release()); + } else { + auto_ptr<TAO_ECG_UDP_EH> udp_eh (new TAO_ECG_UDP_EH (receiver.in())); + udp_eh->reactor (orb->orb_core ()->reactor ()); + ACE_INET_Addr local_addr (listenport); + if (udp_eh->open (local_addr) == -1) { + std::cerr << "Cannot open EH" << std::endl; + } + ACE_AUTO_PTR_RESET(eh,udp_eh.release(),ACE_Event_Handler); + //eh.reset(udp_eh.release()); + } + + // Create an event (just a string in this case). + const CORBA::String_var eventData = CORBA::string_dup(ecname); + + // Create an event set for one event + RtecEventComm::EventSet event (1); + event.length (1); + + // Initialize event header. + event[0].header.source = MY_SOURCE_ID; + event[0].header.ttl = 1; + event[0].header.type = MY_EVENT_TYPE; + + // Initialize data fields in event. + event[0].data.any_value <<= eventData; + + if (iorfile != 0) { + CORBA::String_var str = orb->object_to_string( ec.in() ); + std::ofstream iorFile( iorfile ); + iorFile << str.in() << std::endl; + iorFile.close(); + } + std::cout << "Starting main loop" << std::endl; + + const int EVENT_DELAY_MS = 10; + + while (1) { + consumer->push (event); + + ACE_Time_Value tv(0, 1000 * EVENT_DELAY_MS); + orb->run(tv); + } + + orb->destroy(); + return 0; + } + catch(const CORBA::Exception& exc) + { + std::cerr << "Caught CORBA::Exception" << std::endl << exc << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.cpp b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.cpp new file mode 100644 index 00000000000..c2339c37ad1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.cpp @@ -0,0 +1,24 @@ +// EchoEventSupplier_i.cpp +// Implements a PushSupplier. + +#include "EchoEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +// Constructor duplicates the ORB reference. +EchoEventSupplier_i::EchoEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ + // Nothing to do. +} + +// Override the disconnect_push_Supplier() operation. +void EchoEventSupplier_i::disconnect_push_supplier() + throw(CORBA::SystemException) +{ + // Deactivate this object. + CORBA::Object_var obj = orb_->resolve_initial_references("POACurrent"); + PortableServer::Current_var current = PortableServer::Current::_narrow(obj.in()); + PortableServer::POA_var poa = current->get_POA(); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.h b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.h new file mode 100644 index 00000000000..b06f44cf8e3 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/EchoEventSupplier_i.h @@ -0,0 +1,22 @@ +// EchoEventSupplier_i.h +// Implements a PushSupplier. + +#ifndef _EchoEventSupplier_i_h_ +#define _EchoEventSupplier_i_h_ + +#include <orbsvcs/RtecEventCommS.h> // for POA_CosEventComm::PushSupplier + +class EchoEventSupplier_i : public virtual POA_RtecEventComm::PushSupplier +{ + public: + // Constructor + EchoEventSupplier_i(CORBA::ORB_ptr orb); + + virtual void disconnect_push_supplier() + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; +}; + +#endif // _EchoEventSupplier_i_h_ diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/README b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/README new file mode 100644 index 00000000000..27b6aaee1e1 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/README @@ -0,0 +1,138 @@ +Real-Time Event Service + + +File: DevGuideExamples/EventServices/RTEC_MCast_Federated/README + + +This directory contains an example that shows how to create and +federate real-time event channels using the classes in EC_Gateway_UDP.h. +Depending on the options, it will use either UDP or multicast to link +the event channels. + +------------------------------------------------------------------------- + +Note: To run this example, you must first run the Naming Service, e.g.: + + $TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +------------------------------------------------------------------------- + +To start the supplier/EC processes on a single host and federate them +using UDP, do the following (after starting the Naming_Service): + + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -udp -ecname name1 -port 1233 -listenport 1234 + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -udp -ecname name2 -port 1234 -listenport 1233 + +This will start two EC/supplier processes on the same node. One (name1) +will listen on port 1234 and send on port 1233. The other (name2) will +do the opposite. You should be able to use any available port as long as +the port and listenport options are symmetric (listenport of one process +must be the port of the other). The -address option can be used to +specify a supplier/EC process on another host. Here is an example of two +processes on different hosts: + +On node1: + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -udp -ecname name1 -port 1233 -listenport 1234 -address node2 +On node2: + ./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -udp -ecname name2 -port 1234 -listenport 1233 -address node1 + +When using UDP, this example is limited to federating two ECs. + +------------------------------------------------------------------------- + +To start the supplier/EC processes and federate them using multicast, do the +following (after starting the Naming_Service): + +./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -ORBSvcConf supplier.conf -ecname name1 -address 224.9.9.2 -port 1234 +./EchoEventSupplier -ORBInitRef NameService=file://ns.ior -ORBSvcConf supplier.conf -ecname name2 -address 224.9.9.2 -port 1234 + +The -address and -port options should be passed a valid and available +multicast address and port. + +------------------------------------------------------------------------- + +To start the consumers, simply do the following (this works the same for +both types of federations): + +./EchoEventConsumer -ORBInitRef NameService=file://ns.ior -ecname name1 +./EchoEventConsumer -ORBInitRef NameService=file://ns.ior -ecname name2 + +It may be easiest to start these in separate windows. Each consumer +connects to one EC (specified by the -ecname option). You should see +events from both suppliers on each event channel (each supplier passes +events containing with the name of the EC they are using). + +------------------------------------------------------------------------- + +EchoEventSupplerMain.cpp + + Main program for a PushSupplier. + + EchoEventSupplier [ -ORBSvcConf supplier.conf ] [ -udp ] -ecname <name> + [ -address <address> ] [ -port <port> ] + [ -listenport <lport> ] + + This will create a local RTEC event channel and bind it under + the root context of the naming service with the name <name>. + It will also federate with remote event channels specified via + the other options. By default, it uses multicast to federate + the ECs (specifying -udp forces use of UDP). <address> is + the address of the remote EC when using UDP and the multicast + address when using multicast. <port> is the port to send + to when using UDP and the multicast port when using multicast. + <lport> is the port to listen on for UDP (and not used by + multicast. You must pass -ORBSvcConf supplier.conf when + using multicast so as to enable Observers. + + After initializing the local event channel and setting up the + connection for the federation, it publishes an event to the + local event channel every 10 milliseconds. This event will + contain the string <name> in the any_value field. + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumerMain.cpp + + Main program for a PushConsumer. + + To run it: + + EchoEventConsumer -ecname <name> + + This will look for an event channel bound to <name> in the Root context + of the Naming Service. It will consume events from this channel and + print the type, source, and string contents contained in any_value. + + Use Control-C to kill the process. + +------------------------------------------------------------------------- + +EchoEventConsumer_i.{h,cpp} + + Call which implements the RtecEventComm::PushConsumer interface. + +------------------------------------------------------------------------- + +SimpleAddressServer.{h,cpp} + + This is a servant class that implements the RtecUDPAdmin::AddrServer + interface. It is used by the UDP/multicast senders to return an + address that they will send out particular events on. It is also + used by the multicast event handler, to determine which addresses + to listen to based on consumer subscriptions. This simple + implementation always returns the same address. + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + +By default, this script uses multicast; pass -udp to the +script to use udp. diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc new file mode 100644 index 00000000000..373818b574d --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/RTEC_MCast_Federated.mpc @@ -0,0 +1,21 @@ +project(*_Dev_Supplier): namingexe, rteventexe, rtevent_serv { + exename = EchoEventSupplier + includes += ../common + + Source_Files { + EchoEventSupplierMain.cpp + EchoEventSupplier_i.cpp + SimpleAddressServer.cpp + } +} + +project(*_Dev_Consumer): namingexe, rteventexe { + exename = EchoEventConsumer + includes += ../common + + Source_Files { + EchoEventConsumerMain.cpp + EchoEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp new file mode 100644 index 00000000000..8e593774e67 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.cpp @@ -0,0 +1,41 @@ +// SimpleAddressServer.cpp + +#include "SimpleAddressServer.h" +#include <ace/INET_Addr.h> +#include <ace/OS_NS_string.h> + +SimpleAddressServer::SimpleAddressServer (const ACE_INET_Addr& address) { +#if defined (ACE_HAS_IPV6) + if (address.get_type() == PF_INET6) + { + RtecUDPAdmin::UDP_Addr_v6 v6; + sockaddr_in6 *in6 = + reinterpret_cast<sockaddr_in6 *>(address.get_addr()); + ACE_OS::memcpy (v6.ipaddr,&in6->sin6_addr,16); + v6.port = address.get_port_number(); + this->address_.v6_addr (v6); + return; + } +#endif /* ACE_HAS_IPV6 */ + RtecUDPAdmin::UDP_Addr v4; + v4.ipaddr = address.get_ip_address (); + v4.port = address.get_port_number (); + this->address_.v4_addr (v4); +} + +void +SimpleAddressServer::get_addr (const RtecEventComm::EventHeader&, + RtecUDPAdmin::UDP_Addr& address) + throw (CORBA::SystemException) { + if (this->address_._d() == RtecUDPAdmin::Rtec_inet6) + throw CORBA::DATA_CONVERSION(0, CORBA::COMPLETED_YES); + address = this->address_.v4_addr(); +} + +void +SimpleAddressServer::get_address(const RtecEventComm::EventHeader&, + RtecUDPAdmin::UDP_Address& address) + throw (CORBA::SystemException) +{ + address = this->address_; +} diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.h b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.h new file mode 100644 index 00000000000..ae92a697c0e --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/SimpleAddressServer.h @@ -0,0 +1,27 @@ +// SimpleAddressServer.h + +#ifndef SIMPLEADDRESSSERVER_H +#define SIMPLEADDRESSSERVER_H + +#include <orbsvcs/RtecUDPAdminS.h> + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_INET_Addr; +ACE_END_VERSIONED_NAMESPACE_DECL + +class SimpleAddressServer : public POA_RtecUDPAdmin::AddrServer { +public: + SimpleAddressServer (const ACE_INET_Addr& address); + virtual void get_addr (const RtecEventComm::EventHeader& header, + RtecUDPAdmin::UDP_Addr& address) + throw (CORBA::SystemException); + + virtual void get_address(const RtecEventComm::EventHeader& header, + RtecUDPAdmin::UDP_Address& address) + throw (CORBA::SystemException); + +private: + RtecUDPAdmin::UDP_Address address_; +}; + +#endif diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/run_test.pl b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/run_test.pl new file mode 100644 index 00000000000..350558eb25b --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/run_test.pl @@ -0,0 +1,144 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +if (!defined $ENV{TAO_ROOT}) { + $ENV{TAO_ROOT} = "$ENV{ACE_ROOT}/TAO"; +} + +sub usage() { + print "Usage:\n"; + print " run_test [-h] [-debug]\n\n"; + print " -udp -- Federate using udp\n"; + print " -mcast -- Federate using multicast (the default)\n"; + print " -h -- Prints this information\n"; + print " -debug -- Sets the debug flag for the test\n"; + exit; +} + +my $udp = 0; +my $i = 0; +my $flags = ""; +while ($i <= $#ARGV) { + if ($ARGV[$i] eq "-h" || $ARGV[$i] eq "-help" || + $ARGV[$i] eq "--help" || $ARGV[$i] eq "-?") { + usage (); + } elsif ($ARGV[$i] eq "-debug") { + $flags .= " -ORBDebugLevel 10 "; + } elsif ($ARGV[$i] eq "-udp") { + $udp = 1; + } elsif ($ARGV[$i] eq "-mcast") { + $udp = 0; + } else { + print "ERROR: Unknown Option: ".$ARGV[$i]."\n\n"; + usage (); + } + $i++; +} + +if ($udp) { + print "Using UDP to link the event channels.\n\n"; +} else { + print "Using multicast to link the event channels.\n\n"; +} + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$ec1iorfile = PerlACE::LocalFile ("ec1.ior"); +$ec2iorfile = PerlACE::LocalFile ("ec2.ior"); + +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +$end_point = "-ORBEndpoint iiop://localhost"; +$ns_port = PerlACE::random_port(); + +unlink $nsiorfile; +unlink $ec1iorfile; +unlink $ec2iorfile; + +# start Naming Service + +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "$flags -o $nsiorfile $end_point:$ns_port"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start EchoEventSupplier +my($port1) = 10001 + PerlACE::uniqueid() ; +my($port2) = 10001 + PerlACE::uniqueid() ; +my($mport) = 10001 + PerlACE::uniqueid() ; +if ( -e "supplier.conf" ) +{ + $supplier_conf_file = "supplier.conf"; +} +else{ + $supplier_conf_file = "../supplier.conf"; +} + +$args1 = "$flags $arg_ns_ref -ORBSvcConf $supplier_conf_file $end_point -iorfile $ec1iorfile"; +if ($udp) { + $args1 .= " -udp -ecname ec1 -port $port1 -listenport $port2 "; +} else { + $args1 .= " -ecname ec1 -address 224.9.9.2 -port $mport "; +} +$S1 = new PerlACE::Process("EchoEventSupplier", $args1); +$S1->Spawn(); + +$args2 = "$flags $arg_ns_ref -ORBSvcConf $supplier_conf_file $end_point -iorfile $ec2iorfile"; +if ($udp) { + $args2 .= " -udp -ecname ec2 -port $port2 -listenport $port1 "; +} else { + $args2 .= " -ecname ec2 -address 224.9.9.2 -port $mport "; +} +$S2 = new PerlACE::Process("EchoEventSupplier", $args2); +$S2->Spawn(); + +if ((PerlACE::waitforfile_timed ($ec1iorfile, 15) == -1) || + (PerlACE::waitforfile_timed ($ec2iorfile, 2) == -1)) { + print STDERR "ERROR: cannot find files <$ec1iorfile> and <$ec2iorfile>\n"; + $NS->Kill(); + $S1->Kill(); + $S2->Kill(); + exit 1; +} + +$args3 = "$flags $arg_ns_ref -ecname ec1 $end_point"; +$C1 = new PerlACE::Process("EchoEventConsumer", $args3); +$C1->Spawn(); + + +$args4 = "$flags $arg_ns_ref -ecname ec2 $end_point"; +$C2 = new PerlACE::Process("EchoEventConsumer", $args4); +$C2->Spawn(); + +if ($C1->WaitKill(30) == -1) { + $S1->Kill(); + $S2->Kill(); + $NS->Kill(); + $C2->Kill(); + + exit 1; +} + +if ($C2->WaitKill(5) == -1) { + $S1->Kill(); + $S2->Kill(); + $NS->Kill(); + exit 1; +} + +$NS->Kill(); +$S1->Kill(); +$S2->Kill(); + +unlink $nsiorfile; +unlink $ec1iorfile; +unlink $ec2iorfile; + +exit 0; diff --git a/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/supplier.conf b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/supplier.conf new file mode 100644 index 00000000000..d9eeea24f43 --- /dev/null +++ b/TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/supplier.conf @@ -0,0 +1,2 @@ +# $Id$ +static EC_Factory "-ECobserver basic" diff --git a/TAO/DevGuideExamples/GettingStarted/GettingStarted.mpc b/TAO/DevGuideExamples/GettingStarted/GettingStarted.mpc new file mode 100644 index 00000000000..3660526de6b --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/GettingStarted.mpc @@ -0,0 +1,17 @@ +project(*Server): taoexe, portableserver { + idlflags += -Wb,pch_include=started_pch.h + + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe { + idlflags += -Wb,pch_include=started_pch.h + + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/GettingStarted/Messenger.idl b/TAO/DevGuideExamples/GettingStarted/Messenger.idl new file mode 100644 index 00000000000..335d899f058 --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/Messenger.idl @@ -0,0 +1,8 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/GettingStarted/MessengerClient.cpp b/TAO/DevGuideExamples/GettingStarted/MessengerClient.cpp new file mode 100644 index 00000000000..36687e6a31c --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/MessengerClient.cpp @@ -0,0 +1,40 @@ +#include "started_pch.h" + +#include "MessengerC.h" +#include <iostream> + +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var msg = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", msg.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << msg.in() << std::endl; + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/GettingStarted/MessengerServer.cpp b/TAO/DevGuideExamples/GettingStarted/MessengerServer.cpp new file mode 100644 index 00000000000..6afe84f8d5c --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/MessengerServer.cpp @@ -0,0 +1,45 @@ +#include "started_pch.h" + +#include "Messenger_i.h" +#include <iostream> +#include <fstream> + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Messenger_i servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = poa->activate_object( &servant ); + obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/GettingStarted/Messenger_i.cpp b/TAO/DevGuideExamples/GettingStarted/Messenger_i.cpp new file mode 100644 index 00000000000..2e6a819f7d2 --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/Messenger_i.cpp @@ -0,0 +1,36 @@ +#include "started_pch.h" +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean +Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::string_free(message); + message = CORBA::string_dup("Thanks for the message."); + return true; +} + diff --git a/TAO/DevGuideExamples/GettingStarted/Messenger_i.h b/TAO/DevGuideExamples/GettingStarted/Messenger_i.h new file mode 100644 index 00000000000..4af885c4b50 --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/GettingStarted/README b/TAO/DevGuideExamples/GettingStarted/README new file mode 100644 index 00000000000..1ae24245c7b --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/README @@ -0,0 +1,43 @@ +File: DevGuideExamples/GettingStarted/README + + +This directory contains a CORBA example illustrating a simple client and +a server with a Interface Messenger. The Messenger Interface has +an operation for sending a message (send_message). The MessengerClient +will send a message which is displayed by the MessengerServer when +received. The MessengerClient will then confirm that the message has +been sent successfully. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/GettingStarted/run_test.pl b/TAO/DevGuideExamples/GettingStarted/run_test.pl new file mode 100644 index 00000000000..7c83927dfc1 --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/run_test.pl @@ -0,0 +1,44 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +# start MessengerServer + +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C = new PerlACE::Process("MessengerClient"); +$C->Spawn(); + +$CRET = $C->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/GettingStarted/started_pch.cpp b/TAO/DevGuideExamples/GettingStarted/started_pch.cpp new file mode 100644 index 00000000000..c7253a683cd --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/started_pch.cpp @@ -0,0 +1 @@ +#include "started_pch.h" diff --git a/TAO/DevGuideExamples/GettingStarted/started_pch.h b/TAO/DevGuideExamples/GettingStarted/started_pch.h new file mode 100644 index 00000000000..1b4e8d10348 --- /dev/null +++ b/TAO/DevGuideExamples/GettingStarted/started_pch.h @@ -0,0 +1,10 @@ +#ifndef PCH_H +#define PCH_H + +#ifdef USING_PCH +#include <tao/corba.h> +#include <tao/ORB_Core.h> +#include <tao/Stub.h> +#endif + +#endif diff --git a/TAO/DevGuideExamples/ImplRepo/Activator/run_test.pl b/TAO/DevGuideExamples/ImplRepo/Activator/run_test.pl new file mode 100644 index 00000000000..da22251c496 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Activator/run_test.pl @@ -0,0 +1,121 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; +use Sys::Hostname; + +my $WAIT_TIMEOUT = 2; +my $DEBUG_LEVEL = 1; +my $OBJ_REF_STYLE = "-orbobjrefstyle url"; + +my $implrepo_server = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImplRepo_Service"; +my $imr_activator = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImR_Activator"; +my $tao_imr = "$ENV{ACE_ROOT}/bin/tao_imr"; + +my $implrepo_ior = "imr.ior"; +my $activator_ior = "activator.ior"; +my $messenger_ior = "messenger.ior"; + +my $imr_init_ref = "-ORBInitRef ImplRepoService=file://$implrepo_ior"; + +my $Svr = new PerlACE::Process('../Basic/MessengerServer', "-orbuseimr 1 $OBJ_REF_STYLE $imr_init_ref"); +my $Cli = new PerlACE::Process('../Basic/MessengerClient'); + +my $server_cmd = $Svr->Executable(); + +sub CleanupOutput { + unlink $messenger_ior; + unlink $implrepo_ior; + unlink $activator_ior; +} + +sub SpawnWait { + my $process = shift; + my $file = shift; + + print ">>> " . $process->CommandLine() . "\n"; + $process->Spawn(); + my $ret = PerlACE::waitforfile_timed($file, $WAIT_TIMEOUT); + if ($ret == -1) { + print STDERR "ERROR: Cannot find file <$file>\n"; + } + return $ret; +} + +# Use url object reference style for readability, and startup timeout of 2 seconds. +# Unlike the chapter we'll forgo using -m, because we want to be able to run this +# as a test in our nightly builds, and multicast could interfere with other machines. +my $ImR = new PerlACE::Process ($implrepo_server, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -t 2 -o $implrepo_ior"); +my $Act = new PerlACE::Process ($imr_activator, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -o $activator_ior $imr_init_ref"); + +my $imr_util = new PerlACE::Process ("$tao_imr"); +# We want the tao_imr executable to be found exactly in the path +# given, without being modified by the value of -ExeSubDir. +# So, we tell its Process object to ignore the setting of -ExeSubDir. +$imr_util->IgnoreExeSubDir(1); + +sub RunImRUtil { + my $cmd = shift; + print ">>> " . $imr_util->CommandLine() . "\n"; + $imr_util->Arguments("$imr_init_ref $cmd"); + return $imr_util->SpawnWaitKill(5); +} + +CleanupOutput(); + +#### Start the example + +if (SpawnWait($ImR, $implrepo_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +if (SpawnWait($Act, $activator_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +#instead of using tao_imr add, we'll use tao_imr update, because +#we want to run the server once to generate the ior file. + +if (SpawnWait($Svr, $messenger_ior) != 0) { + $Act->Kill(); + $ImR->Kill(); + exit 1; +} + +RunImRUtil("list -v"); + +RunImRUtil("shutdown MessengerService"); +$Svr->WaitKill($WAIT_TIMEOUT); + +RunImRUtil("list -v"); + +# Note : If the server registers itself, then it won't set the +# activator name. If we don't set it here, then the activator +# won't be able to start the server. +my $actname = hostname; +RunImRUtil("update MessengerService -l $actname -c \"$server_cmd $OBJ_REF_STYLE -ORBUseIMR 1 $imr_init_ref\""); + +RunImRUtil("list -v"); + +if ($Cli->SpawnWaitKill(1000) != 0) { + print STDERR "Error : Client failed to run correctly."; +} + +$Act->Kill(); + +RunImRUtil("list -v"); + +RunImRUtil("shutdown MessengerService"); + +$ImR->Kill(); + +#### Clean up any output files + +CleanupOutput(); + +exit 0; diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/ImplRepo_Basic.mpc b/TAO/DevGuideExamples/ImplRepo/Basic/ImplRepo_Basic.mpc new file mode 100644 index 00000000000..4bd5d1438bd --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/ImplRepo_Basic.mpc @@ -0,0 +1,13 @@ +project(*Server): taoexe, portableserver, avoids_minimum_corba, avoids_corba_e_micro { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, anytypecode, avoids_minimum_corba { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/Messenger.idl b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger.idl new file mode 100644 index 00000000000..2c75f1cb614 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger.idl @@ -0,0 +1,3 @@ +interface Messenger { + boolean send_message (in string user_name, in string subject, inout string message); +}; diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/MessengerClient.cpp b/TAO/DevGuideExamples/ImplRepo/Basic/MessengerClient.cpp new file mode 100644 index 00000000000..550b6acc92e --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/MessengerClient.cpp @@ -0,0 +1,26 @@ +#include "MessengerC.h" +#include <iostream> + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { + try { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object("file://messenger.ior"); + + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Unable to get a Messenger reference." << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup("Hello!"); + messenger->send_message("TAO User", "TAO Test", message.inout()); + std::cout << "message was sent" << std::endl; + std::cout << "Reply was : " << message.in() << std::endl; + + return 0; + } catch(const CORBA::Exception& ex) { + std::cerr << "Client main() Caught Exception: " << ex << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/MessengerServer.cpp b/TAO/DevGuideExamples/ImplRepo/Basic/MessengerServer.cpp new file mode 100644 index 00000000000..97acc809411 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/MessengerServer.cpp @@ -0,0 +1,74 @@ +#include "Messenger_i.h" +#include <iostream> +#include <fstream> + + +PortableServer::POA_ptr +createPersistentPOA(PortableServer::POA_ptr root_poa, + const char* poa_name) +{ + CORBA::PolicyList policies; + policies.length(2); + + policies[0] = root_poa->create_lifespan_policy(PortableServer::PERSISTENT); + policies[1] = root_poa->create_id_assignment_policy(PortableServer::USER_ID); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + PortableServer::POA_var poa = + root_poa->create_POA(poa_name, mgr.in(), policies); + + policies[0]->destroy(); + policies[1]->destroy(); + + return poa._retn(); +} + +void writeIORFile(const char* ior) { + std::ofstream out("messenger.ior"); + out << ior; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj.in()); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + + const char* poa_name = "MessengerService"; + + PortableServer::POA_var poa = createPersistentPOA(root_poa.in(), poa_name); + + Messenger_i servant; + + PortableServer::ObjectId_var object_id = + PortableServer::string_to_ObjectId("object"); + + poa->activate_object_with_id(object_id.in(), &servant); + + obj = poa->id_to_reference(object_id.in()); + CORBA::String_var ior = orb->object_to_string(obj.in()); + + writeIORFile(ior.in()); + + mgr->activate(); + + std::cout << "Messenger server ready." << std::endl; + + orb->run(); + + std::cout << "Messenger server shutting down." << std::endl; + + root_poa->destroy(1,1); + orb->destroy(); + + return 0; + } catch(const CORBA::Exception& ex) { + std::cerr << "Server main() Caught Exception" << ex << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.cpp b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.cpp new file mode 100644 index 00000000000..c224376be09 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.cpp @@ -0,0 +1,16 @@ +#include "Messenger_i.h" +#include <iostream> +#include <exception> + +CORBA::Boolean Messenger_i::send_message( + const char * user_name, + const char * subject, + char *& message) +{ + std::cout << "Message from: " << user_name << std::endl + << "Subject: " << subject << std::endl + << "Message: " << message << std::endl; + message = CORBA::string_dup("A reply."); + return 1; +} + diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.h b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.h new file mode 100644 index 00000000000..af61f133d87 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/Messenger_i.h @@ -0,0 +1,17 @@ +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +class Messenger_i : public virtual POA_Messenger +{ + int count; +public: + Messenger_i() : count(0) {} + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + +#endif diff --git a/TAO/DevGuideExamples/ImplRepo/Basic/run_test.pl b/TAO/DevGuideExamples/ImplRepo/Basic/run_test.pl new file mode 100644 index 00000000000..e6f49f05aad --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Basic/run_test.pl @@ -0,0 +1,92 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +my $WAIT_TIMEOUT = 2; +my $DEBUG_LEVEL = 1; +my $OBJ_REF_STYLE = "-orbobjrefstyle url"; + +my $implrepo_server = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImplRepo_Service"; +my $imr_activator = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImR_Activator"; +my $tao_imr = "$ENV{ACE_ROOT}/bin/tao_imr"; + +my $implrepo_ior = "imr.ior"; +my $activator_ior = "activator.ior"; +my $messenger_ior = "messenger.ior"; + +my $imr_init_ref = "-ORBInitRef ImplRepoService=file://$implrepo_ior"; + +my $Svr = new PerlACE::Process('MessengerServer', "-orbuseimr 1 $OBJ_REF_STYLE $imr_init_ref"); +my $Cli = new PerlACE::Process('MessengerClient'); + +sub CleanupOutput { + unlink $messenger_ior; + unlink $implrepo_ior; + unlink $activator_ior; +} + +sub SpawnWait { + my $process = shift; + my $file = shift; + + print ">>> " . $process->CommandLine() . "\n"; + $process->Spawn(); + my $ret = PerlACE::waitforfile_timed($file, $WAIT_TIMEOUT); + if ($ret == -1) { + print STDERR "ERROR: Cannot find file <$file>\n"; + } + return $ret; +} + +# Use url object reference style for readability, and startup timeout of 2 seconds. +# Unlike the chapter we'll forgo using -m, because we want to be able to run this +# as a test in our nightly builds, and multicast could interfere with other machines. +my $ImR = new PerlACE::Process ($implrepo_server, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -t 2 -o $implrepo_ior"); +my $Act = new PerlACE::Process ($imr_activator, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -o $activator_ior $imr_init_ref"); + +my $imr_util = new PerlACE::Process ("$tao_imr", + "$imr_init_ref add MessengerService -c \"$Svr->Executable() $OBJ_REF_STYLE -ORBUseIMR 1 $imr_init_ref\""); + +# We want the tao_imr executable to be found exactly in the path +# given, without being modified by the value of -ExeSubDir. +# So, we tell its Process object to ignore the setting of -ExeSubDir. +$imr_util->IgnoreExeSubDir(1); + +sub RunImRUtil { + my $cmd = shift; + print ">>> " . $imr_util->CommandLine() . "\n"; + $imr_util->Arguments("$imr_init_ref $cmd"); + return $imr_util->SpawnWaitKill(5); +} + +CleanupOutput(); + +#### Start the example + +if (SpawnWait($ImR, $implrepo_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +if (SpawnWait($Svr, $messenger_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +if ($Cli->SpawnWaitKill($WAIT_TIMEOUT) != 0) { + print STDERR "Error : Client failed to run correctly."; +} + +$Svr->Kill(); +$ImR->Kill(); + + +#### Clean up any output files + +CleanupOutput(); + +exit 0; diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/ImplRepo_IORTable.mpc b/TAO/DevGuideExamples/ImplRepo/IORTable/ImplRepo_IORTable.mpc new file mode 100644 index 00000000000..881362f4ab3 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/ImplRepo_IORTable.mpc @@ -0,0 +1,13 @@ +project(*Server): taoexe, portableserver, avoids_minimum_corba, iortable, avoids_corba_e_micro { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, anytypecode, avoids_minimum_corba { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger.idl b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger.idl new file mode 100644 index 00000000000..2c75f1cb614 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger.idl @@ -0,0 +1,3 @@ +interface Messenger { + boolean send_message (in string user_name, in string subject, inout string message); +}; diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerClient.cpp b/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerClient.cpp new file mode 100644 index 00000000000..2fe9f2239fe --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerClient.cpp @@ -0,0 +1,35 @@ +#include "MessengerC.h" +#include <ace/SString.h> +#include <iostream> + + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { + try { + if (argc <= 1) { + std::cerr << "Error: Must specify the name of an IOR file." << std::endl; + return 1; + } + ACE_CString ior = "file://"; + ior += argv[1]; + + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object(ior.c_str()); + + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Unable to get a Messenger reference." << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup("Hello!"); + messenger->send_message("TAO User", "TAO Test", message.inout()); + std::cout << "message was sent" << std::endl; + std::cout << "Reply was : " << message.in() << std::endl; + + return 0; + } catch(const CORBA::Exception& ex) { + std::cerr << "Client main() Caught Exception: " << ex << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerServer.cpp b/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerServer.cpp new file mode 100644 index 00000000000..893ce40442c --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/MessengerServer.cpp @@ -0,0 +1,93 @@ +#include "Messenger_i.h" +#include <tao/PortableServer/Root_POA.h> +#include <tao/IORTable/IORTable.h> +#include <iostream> +#include <fstream> +#include <fstream> + +PortableServer::POA_ptr +createPersistentPOA(PortableServer::POA_ptr root_poa, + const char* poa_name) { + + PortableServer::LifespanPolicy_var life = + root_poa->create_lifespan_policy(PortableServer::PERSISTENT); + + PortableServer::IdAssignmentPolicy_var assign = + root_poa->create_id_assignment_policy(PortableServer::USER_ID); + + CORBA::PolicyList pols; + pols.length(2); + pols[0] = PortableServer::LifespanPolicy::_duplicate(life.in()); + pols[1] = PortableServer::IdAssignmentPolicy::_duplicate(assign.in()); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + PortableServer::POA_var poa = + root_poa->create_POA(poa_name, mgr.in(), pols); + + life->destroy(); + assign->destroy(); + + return poa._retn(); +} + +void writeIORFile(const char* ior, const char* name) { + std::ofstream out(name); + out << ior; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj.in()); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + + const char* poa_name = "MessengerService"; + + PortableServer::POA_var poa = createPersistentPOA(root_poa.in(), poa_name); + + Messenger_i servant1, servant2; + + PortableServer::ObjectId_var id1 = PortableServer::string_to_ObjectId("Object1"); + poa->activate_object_with_id(id1.in(), &servant1); + PortableServer::ObjectId_var id2 = PortableServer::string_to_ObjectId("Object2"); + poa->activate_object_with_id(id2.in(), &servant2); + + obj = poa->id_to_reference(id1.in()); + CORBA::String_var ior1 = orb->object_to_string(obj.in()); + obj = poa->id_to_reference(id2.in()); + CORBA::String_var ior2 = orb->object_to_string(obj.in()); + + TAO_Root_POA* tpoa = dynamic_cast<TAO_Root_POA*>(poa.in()); + obj = tpoa->id_to_reference_i(id1.in(), false); + CORBA::String_var direct_ior1 = orb->object_to_string(obj.in()); + + obj = orb->resolve_initial_references("IORTable"); + IORTable::Table_var ior_table = IORTable::Table::_narrow(obj.in()); + ior_table->bind("MessengerService/Object1", direct_ior1.in()); + ior_table->bind("MessengerService/Object2", ior2.in()); + + writeIORFile(ior1.in(), "messenger1.ior"); + writeIORFile(ior2.in(), "messenger2.ior"); + + mgr->activate(); + + std::cout << "Messenger server ready." << std::endl; + + orb->run(); + + std::cout << "Messenger server shutting down." << std::endl; + + root_poa->destroy(1,1); + orb->destroy(); + + return 0; + } catch(const CORBA::Exception& ex) { + std::cerr << "Server main() Caught Exception" << ex << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.cpp b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.cpp new file mode 100644 index 00000000000..800d00fc5c0 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.cpp @@ -0,0 +1,17 @@ +#include "Messenger_i.h" +#include <iostream> + + +CORBA::Boolean Messenger_i::send_message( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException) +{ + std::cout << "Message from: " << user_name << std::endl + << "Subject: " << subject << std::endl + << "Message: " << message << std::endl; + message = CORBA::string_dup("A reply."); + return 1; +} + diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.h b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.h new file mode 100644 index 00000000000..ec79e9d3d3c --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/Messenger_i.h @@ -0,0 +1,17 @@ +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +class Messenger_i : public virtual POA_Messenger +{ +public: + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC ((CORBA::SystemException)); +}; + +#endif diff --git a/TAO/DevGuideExamples/ImplRepo/IORTable/run_test.pl b/TAO/DevGuideExamples/ImplRepo/IORTable/run_test.pl new file mode 100644 index 00000000000..6fa9bb20774 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/IORTable/run_test.pl @@ -0,0 +1,129 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +my $WAIT_TIMEOUT = 2; +my $DEBUG_LEVEL = 1; +my $OBJ_REF_STYLE = "-orbobjrefstyle url"; + +my $implrepo_server = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImplRepo_Service"; +my $imr_activator = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImR_Activator"; +my $tao_imr = "$ENV{ACE_ROOT}/bin/tao_imr"; + +my $implrepo_ior = "imr.ior"; +my $activator_ior = "activator.ior"; +my $messenger1_ior = "messenger1.ior"; +my $messenger2_ior = "messenger2.ior"; +my $messenger3_ior = "messenger3.ior"; +my $messenger4_ior = "messenger4.ior"; + +my $imr_init_ref = "-ORBInitRef ImplRepoService=file://$implrepo_ior"; + +my $Svr = new PerlACE::Process('MessengerServer', "-orbuseimr 1 $OBJ_REF_STYLE $imr_init_ref"); +my $Cli = new PerlACE::Process('MessengerClient'); + +sub CleanupOutput { + unlink $messenger1_ior; + unlink $messenger2_ior; + unlink $messenger3_ior; + unlink $messenger4_ior; + unlink $implrepo_ior; + unlink $activator_ior; +} + +sub SpawnWait { + my $process = shift; + my $file = shift; + + print ">>> " . $process->CommandLine() . "\n"; + $process->Spawn(); + my $ret = PerlACE::waitforfile_timed($file, $WAIT_TIMEOUT); + if ($ret == -1) { + print STDERR "ERROR: Cannot find file <$file>\n"; + } + return $ret; +} + +sub SpawnWaitKill { + my $process = shift; + + print ">>> " . $process->CommandLine() . "\n"; + return $process->SpawnWaitKill($WAIT_TIMEOUT); +} + +# Use url object reference style for readability, and startup timeout of 2 seconds. +# Unlike the chapter we'll forgo using -m, because we want to be able to run this +# as a test in our nightly builds, and multicast could interfere with other machines. +my $ImR = new PerlACE::Process ($implrepo_server, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -t 2 -o $implrepo_ior"); +my $Act = new PerlACE::Process ($imr_activator, "-d $DEBUG_LEVEL $OBJ_REF_STYLE -o $activator_ior $imr_init_ref"); + +my $imr_util = new PerlACE::Process ("$tao_imr", + "$imr_init_ref add MessengerService -c \"$Svr->Executable() $OBJ_REF_STYLE -ORBUseIMR 1 $imr_init_ref\""); + +# We want the tao_imr executable to be found exactly in the path +# given, without being modified by the value of -ExeSubDir. +# So, we tell its Process object to ignore the setting of -ExeSubDir. +$imr_util->IgnoreExeSubDir(1); + +sub RunImRUtil { + my $cmd = shift; + print ">>> " . $imr_util->CommandLine() . "\n"; + $imr_util->Arguments("$imr_init_ref $cmd"); + return $imr_util->SpawnWaitKill(5); +} + +CleanupOutput(); + +#### Start the example + +if (SpawnWait($ImR, $implrepo_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +if (SpawnWait($Svr, $messenger2_ior) != 0) { + $ImR->Kill(); + exit 1; +} + +$Cli->Arguments($messenger1_ior); +if (SpawnWaitKill($Cli, $WAIT_TIMEOUT) != 0) { + print STDERR "Error : Client 1 failed to run correctly."; +} + +$Cli->Arguments($messenger2_ior); +if (SpawnWaitKill($Cli, $WAIT_TIMEOUT) != 0) { + print STDERR "Error : Client 2 failed to run correctly."; +} + +#Since we didn't start the ImR with a known endpoint, we'll +#have to use the tao_imr utility to create a our urls. +RunImRUtil("ior MessengerService/Object1 -f $messenger3_ior"); +RunImRUtil("ior MessengerService/Object2 -f $messenger4_ior"); + +$Cli->Arguments($messenger3_ior); +if (SpawnWaitKill($Cli, $WAIT_TIMEOUT) != 0) { + print STDERR "Error : Client 3 failed to run correctly."; +} + +# Notice that this one results in two calls through the ImR, because +# we bound an indirect reference in the IORTable. If we were using +# PER_CLIENT activation, this would be bad. +$Cli->Arguments($messenger4_ior); +if (SpawnWaitKill($Cli, $WAIT_TIMEOUT) != 0) { + print STDERR "Error : Client 4 failed to run correctly."; +} + +$Svr->Kill(); +$ImR->Kill(); + + +#### Clean up any output files + +CleanupOutput(); + +exit 0; diff --git a/TAO/DevGuideExamples/ImplRepo/ImplRepo.mpc b/TAO/DevGuideExamples/ImplRepo/ImplRepo.mpc new file mode 100644 index 00000000000..67e78b8f0c2 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/ImplRepo.mpc @@ -0,0 +1,13 @@ +project(*Server): taoexe, portableserver, iortable, avoids_minimum_corba, avoids_corba_e_micro { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, anytypecode, avoids_minimum_corba { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/ImplRepo/Messenger.idl b/TAO/DevGuideExamples/ImplRepo/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/ImplRepo/MessengerClient.cpp b/TAO/DevGuideExamples/ImplRepo/MessengerClient.cpp new file mode 100644 index 00000000000..4791f8f3c7c --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/MessengerClient.cpp @@ -0,0 +1,36 @@ + +#include "MessengerC.h" +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Destringify ior + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + std::cout << "message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Client main() Caught CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/ImplRepo/MessengerServer.cpp b/TAO/DevGuideExamples/ImplRepo/MessengerServer.cpp new file mode 100644 index 00000000000..6699a412342 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/MessengerServer.cpp @@ -0,0 +1,101 @@ +// MessengerServer.cpp +// This version uses the Implementation Repository. + +#include "Messenger_i.h" +#include <tao/IORTable/IORTable.h> +#include <tao/PortableServer/Root_POA.h> +#include <iostream> + +PortableServer::POA_ptr +createPOA(PortableServer::POA_ptr root_poa, const char* poa_name) +{ + PortableServer::LifespanPolicy_var life = + root_poa->create_lifespan_policy(PortableServer::PERSISTENT); + + PortableServer::IdAssignmentPolicy_var assign = + root_poa->create_id_assignment_policy(PortableServer::USER_ID); + + CORBA::PolicyList pols; + pols.length(2); + pols[0] = PortableServer::LifespanPolicy::_duplicate(life.in()); + pols[1] = PortableServer::IdAssignmentPolicy::_duplicate(assign.in()); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + PortableServer::POA_var poa = + root_poa->create_POA(poa_name, mgr.in(), pols); + + life->destroy(); + assign->destroy(); + + return poa._retn(); +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj.in()); + + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); + + const char* poa_name = "MessengerService"; + + PortableServer::POA_var messenger_poa = createPOA(root_poa.in(), poa_name); + + Messenger_i messenger_servant; + + PortableServer::ObjectId_var object_id = + PortableServer::string_to_ObjectId("messenger_object"); + + // + // Activate the servant with the messenger POA, + // obtain its object reference, and get a + // stringified IOR. + // + messenger_poa->activate_object_with_id(object_id.in(), &messenger_servant); + + // + // Create binding between "MessengerService" and + // the messenger object reference in the IOR Table. + // Use a TAO extension to get the non imrified poa + // to avoid forwarding requests back to the ImR. + + TAO_Root_POA* tpoa = dynamic_cast<TAO_Root_POA*>(messenger_poa.in()); + obj = tpoa->id_to_reference_i(object_id.in(), false); + CORBA::String_var messenger_ior = orb->object_to_string(obj.in()); + obj = orb->resolve_initial_references("IORTable"); + IORTable::Table_var table = IORTable::Table::_narrow(obj.in()); + table->bind(poa_name, messenger_ior.in()); + + // + // This server is now ready to run. + // This version does not create an IOR + // file as demonstrated in the + // Developer's Guide. It assumes that + // users create IORs for the client using + // the tao_imr utility. + // + // + // Stop discarding requests. + // + mgr->activate(); + + std::cout << "Messenger server ready." << std::endl; + + orb->run(); + + std::cout << "Messenger server shutting down." << std::endl; + + root_poa->destroy(1,1); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Server main() Caught CORBA::Exception" << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/ImplRepo/Messenger_i.cpp b/TAO/DevGuideExamples/ImplRepo/Messenger_i.cpp new file mode 100644 index 00000000000..de1edefd4fa --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Messenger_i.cpp @@ -0,0 +1,32 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) +{ + std::cout << "Message from: " << user_name << std::endl + << "Subject: " << subject << std::endl + << "Message: " << message << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/ImplRepo/Messenger_i.h b/TAO/DevGuideExamples/ImplRepo/Messenger_i.h new file mode 100644 index 00000000000..e386c4c71da --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/ImplRepo/README b/TAO/DevGuideExamples/ImplRepo/README new file mode 100644 index 00000000000..d255104cc4c --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/README @@ -0,0 +1,28 @@ + +DevGuideExamples/ImplRepo/README + +This directory contains a CORBA example illustrating use of the TAO +Implementation Repository with a simple server (MessengerServer) and +a client (MessengerClient). + +How to Run +---------- + +Start the Implementation Repository (ImplRepo) server: +------------------------------------------------------ +$TAO_ROOT/orbsvcs/ImplRepo_Service/ImplRepo_Service -o implrepo.ior + +Register the server's POA name and start-up command with the ImplRepo: +---------------------------------------------------------------------- +$TAO_ROOT/orbsvcs/ImplRepo_Service/tao_imr -ORBInitRef \ + ImplRepoService=file://implrepo.ior add MessengerService \ + -c "MessengerServer -ORBUseIMR 1 -ORBInitRef ImplRepoService=file://implrepo.ior" + +Generate an IMRified Object Reference for the MessengerService: +--------------------------------------------------------------- +$TAO_ROOT/orbsvcs/ImplRepo_Service/tao_imr -ORBInitRef \ + ImplRepoService=file://implrepo.ior ior MessengerService -f Messenger.ior + +Run the client (ImplRepo should automatically start the server): +---------------------------------------------------------------- +./MessengerClient diff --git a/TAO/DevGuideExamples/ImplRepo/run_test.pl b/TAO/DevGuideExamples/ImplRepo/run_test.pl new file mode 100644 index 00000000000..e97deca65b0 --- /dev/null +++ b/TAO/DevGuideExamples/ImplRepo/run_test.pl @@ -0,0 +1,108 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$implrepo_server = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImplRepo_Service"; +$imr_activator = "$ENV{TAO_ROOT}/orbsvcs/ImplRepo_Service/ImR_Activator"; +$tao_imr = "$ENV{ACE_ROOT}/bin/tao_imr"; + +# Note : We don't actually use SVR, but we need a way to get the +# path to the -ExeSubDir +my $SVR = new PerlACE::Process ('MessengerServer'); +my $server = $SVR->Executable (); + +# The Tests +$implrepo_ior = "implrepo.ior"; +$activator_ior = "activator.ior"; +$messenger_ior = "Messenger.ior"; + +# Make sure the files are gone, so we can wait on them. +unlink $messenger_ior; +unlink $implrepo_ior; +unlink $activator_ior; + +$IR = new PerlACE::Process ($implrepo_server, "-d 1 -orbobjrefstyle url -t 5 -o $implrepo_ior"); +print ">>> " . $IR->CommandLine() . "\n"; +$IR->Spawn(); +if (PerlACE::waitforfile_timed ($implrepo_ior, 10) == -1) { + print STDERR "ERROR: cannot find file <$implrepo_ior>\n"; + $IR->Kill(); + exit 1; +} + +$imr_init_ref = "-ORBInitRef ImplRepoService=file://$implrepo_ior"; + +$ACT = new PerlACE::Process ($imr_activator, "-d 1 -orbobjrefstyle url -o $activator_ior $imr_init_ref"); +print ">>> " . $ACT->CommandLine() . "\n"; +$ACT->Spawn(); +if (PerlACE::waitforfile_timed ($activator_ior, 15) == -1) { + print STDERR "ERROR: cannot find file <$activator_ior>\n"; + $IR->Kill(); + $ACT->Kill(); + exit 1; +} + + +$add_imr = new PerlACE::Process ("$tao_imr", + "$imr_init_ref add MessengerService -c \"$server -orbobjrefstyle url -ORBUseIMR 1 $imr_init_ref\""); +print ">>> " . $add_imr->CommandLine() . "\n"; +# We want the tao_imr executable to be found exactly in the path +# given, without being modified by the value of -ExeSubDir. +# So, we tell its Process object to ignore the setting of -ExeSubDir. + +$add_imr->IgnoreExeSubDir (1); + +## Note : Instead of using tao_imr to generate the ior, it's easy enough +## to just create one by hand. The ior is just a normal corbaloc ior with +## the poa_name of the server and ip address of the imr. +## (ie corbaloc::localhost:8888/Messengerservice) +## Of course, to do this, you'd have to start the imr on port 8888. +## We use the "tao_imr ior" command, because we don't know which port was used. +$add_imr->SpawnWaitKill(10); +$set_ior = new PerlACE::Process ("$tao_imr", + "$imr_init_ref ior MessengerService -f $messenger_ior"); +print ">>> " . $set_ior->CommandLine() . "\n"; +$set_ior->IgnoreExeSubDir (1); +$set_ior->SpawnWaitKill(10); +if (PerlACE::waitforfile_timed ($messenger_ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$messenger_ior>\n"; + $IR->Kill(); + $ACT->Kill(); + exit 1; +} + +$C1 = new PerlACE::Process("MessengerClient"); +print ">>> " . $C1->CommandLine() . "\n"; +if ($C1->SpawnWaitKill(10) != 0) { + print "client 1 timed failed\n"; + $IR->Kill (); + $ACT->Kill(); + exit 1; +} + +$shutdown = new PerlACE::Process ("$tao_imr", + "$imr_init_ref shutdown MessengerService"); +$shutdown->IgnoreExeSubDir (1); +$shutdown->SpawnWaitKill(5); + +$C2 = new PerlACE::Process("MessengerClient"); +if ($C2->SpawnWaitKill(5) != 0) { + $IR->Kill (); + $ACT->Kill(); + exit 1; +} + +$shutdown->SpawnWaitKill(5); + +$IR->Kill(); +$ACT->Kill(); + +unlink $messenger_ior; +unlink $implrepo_ior; +unlink $activator_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/InterfaceRepo/IFRBrowser.cpp b/TAO/DevGuideExamples/InterfaceRepo/IFRBrowser.cpp new file mode 100644 index 00000000000..f70f029d769 --- /dev/null +++ b/TAO/DevGuideExamples/InterfaceRepo/IFRBrowser.cpp @@ -0,0 +1,277 @@ +// +// IFRBrowser.cpp +// +// A rudimentary interface repository +// browser, very rudimentary +// + +#include <tao/IFR_Client/IFR_BasicC.h> +#include <tao/ORB.h> +#include <ace/Log_Msg.h> + +#include <iostream> + +const char* programLabel = "IFR Browser"; + +void listContents(const CORBA::ContainedSeq &repoContents); +void listInterface(CORBA::InterfaceDef_ptr interfaceDef); +void listOperation(CORBA::OperationDescription* operationDescr); +void listParameter(CORBA::ParameterDescription* parameterDescr); + +const char* decodeTypeCode(const CORBA::TypeCode_ptr typeCode); +const char* decodeParameterMode(CORBA::ParameterMode mode); +const char* decodeOperationMode(CORBA::OperationMode mode); + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = + orb->resolve_initial_references("InterfaceRepository"); + + CORBA::Repository_var ifrRepo = CORBA::Repository::_narrow(obj.in()); + + if (CORBA::is_nil(ifrRepo.in())) + { + ACE_DEBUG((LM_ERROR, + ACE_TEXT("(%N) failed to narrow interface repository referece.\n") + )); + return -1; + } + + CORBA::ContainedSeq_var repoContents = ifrRepo->contents(CORBA::dk_all, 1); + + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: the interface repository contains %d elements.\n"), + programLabel, + repoContents->length() + )); + listContents(repoContents.in()); + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "main() Caught CORBA::Exception : " << ex << std::endl; + } + return 1; +} + +void listContents(const CORBA::ContainedSeq& repoContents) +{ + // + // List the contents of each element. + // + for(unsigned int i = 0; i < repoContents.length(); ++i) + { + CORBA::Contained::Description_var desc = repoContents[i]->describe(); + switch(desc->kind) + { + case CORBA::dk_Constant: + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: element[%d] is a constant definition.\n"), + programLabel, + i + 1 + )); + break; + case CORBA::dk_Typedef: + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: element[%d] is a typedef definition.\n"), + programLabel, + i + 1 + )); + break; + case CORBA::dk_Exception: + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: element[%d] is an exception definition.\n"), + programLabel, + i + 1 + )); + break; + case CORBA::dk_Interface: + { + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: element[%d] is an interface definition.\n") + ACE_TEXT("%s: listing element[%d]...\n"), + programLabel, + i + 1, + programLabel, + i + 1 + )); + CORBA::InterfaceDef_var interfaceDef = + CORBA::InterfaceDef::_narrow(repoContents[i]); + listInterface(interfaceDef.in()); + break; + } + case CORBA::dk_Module: { + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: element[%d] is a module definition.\n"), + programLabel, + i + 1 + )); + CORBA::ModuleDef_var moduleDef = + CORBA::ModuleDef::_narrow(repoContents[i]); + CORBA::ContainedSeq_var moduleContents = + moduleDef->contents(CORBA::dk_all,1); + CORBA::String_var moduleId = moduleDef->id(); + CORBA::String_var moduleName = moduleDef->name(); + + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s:\n// %s\nmodule %s\n{\n") + ACE_TEXT("%s: the module contains %d elements.\n"), + programLabel, + moduleId.in(), + moduleName.in(), + programLabel, + moduleContents->length() + )); + listContents(moduleContents.in()); + ACE_DEBUG((LM_INFO, ACE_TEXT("}\n"))); + break; + } + default: + break; + } + } +} + +void listInterface(CORBA::InterfaceDef_ptr interfaceDef) +{ + CORBA::InterfaceDef::FullInterfaceDescription_var fullDescr = + interfaceDef->describe_interface(); + + const char* interfaceName = + fullDescr->name; + const char* interfaceRepoId = + fullDescr->id; + + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s:\n\t// %s\n\tinterface %s\n\t{"), + programLabel, + interfaceRepoId, + interfaceName + )); + + + unsigned int operationsCount; + if ((operationsCount = fullDescr->operations.length()) > 0) + { + for(unsigned int i = 0; i < operationsCount; ++i) + { + listOperation(&(fullDescr->operations[i])); + } + } + + unsigned int attributesCount; + if ((attributesCount = fullDescr->attributes.length()) > 0) + { + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s: %s has %d attribute(s).\n"), + programLabel, + interfaceName, + attributesCount + )); + } + + ACE_DEBUG((LM_INFO, "\n\t}\n")); +} + +void listOperation(CORBA::OperationDescription* operationDescr) +{ + const char* operationName = + operationDescr->name; + const char* operationRepoId = + operationDescr->id; + const char* operationResult = + decodeTypeCode(operationDescr->result.in()); + const char* operationMode = + decodeOperationMode(operationDescr->mode); + + ACE_DEBUG((LM_INFO, + ACE_TEXT("\n\t\t// %s \n\t\t%s %s %s"), + operationRepoId, + operationResult, + operationName, + operationMode + )); + + CORBA::ParDescriptionSeq* params = &(operationDescr->parameters); + CORBA::ULong paramsCount = params->length(); + if (paramsCount > 0) + { + ACE_DEBUG((LM_INFO, "\n\t\t(\n\t\t")); + for(CORBA::ULong i =0; i < paramsCount; ++i) + { + listParameter(&((*params)[i])); + if(i < (paramsCount - 1)) + { + ACE_DEBUG((LM_INFO, ",\n\t\t")); + } + } + ACE_DEBUG((LM_INFO, "\n\t\t);\n")); + } + else + { + ACE_DEBUG((LM_INFO, "();\n")); + } +} + +void listParameter(CORBA::ParameterDescription *parameterDescr) +{ + const char *typCode = + decodeTypeCode(parameterDescr->type.in()); + const char *paramMode = + decodeParameterMode(parameterDescr->mode); + ACE_DEBUG((LM_INFO, + ACE_TEXT("%s %s %s"), + paramMode, + typCode, + parameterDescr->name.in() + )); +} + +const char* decodeTypeCode(const CORBA::TypeCode_ptr typeCode) +{ + const char* code = ""; + if (typeCode->equivalent(CORBA::_tc_void)) { + code = "void"; + } else if (typeCode->equivalent(CORBA::_tc_boolean)) { + code = "boolean"; + } else if (typeCode->equivalent(CORBA::_tc_string)) { + code = "string"; + } + return code; +} + +const char* decodeParameterMode(CORBA::ParameterMode mode) +{ + const char* paramMode; + switch(mode) + { + case CORBA::PARAM_IN: + { + paramMode = "in"; + break; + } + case CORBA::PARAM_OUT: + { + paramMode = "out"; + break; + } + case CORBA::PARAM_INOUT: + { + paramMode = "inout"; + break; + } + default: + paramMode = ""; + } + return paramMode; +} + +const char* decodeOperationMode(CORBA::OperationMode mode) +{ + return (mode == CORBA::OP_NORMAL) ? "synchronous" : "asynchronous"; +} diff --git a/TAO/DevGuideExamples/InterfaceRepo/InterfaceRepo.mpc b/TAO/DevGuideExamples/InterfaceRepo/InterfaceRepo.mpc new file mode 100644 index 00000000000..af4711a25c4 --- /dev/null +++ b/TAO/DevGuideExamples/InterfaceRepo/InterfaceRepo.mpc @@ -0,0 +1,3 @@ +project(*Browser): taoexe, portableserver, ifr_client { + exename = IFRBrowser +} diff --git a/TAO/DevGuideExamples/InterfaceRepo/run_test.pl b/TAO/DevGuideExamples/InterfaceRepo/run_test.pl new file mode 100644 index 00000000000..ed9447f8f79 --- /dev/null +++ b/TAO/DevGuideExamples/InterfaceRepo/run_test.pl @@ -0,0 +1,84 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use Env (TAO_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$status = 0; + +$ifr_iorfile= "if_repo.ior"; + +$ifr_server = "$ENV{TAO_ROOT}/orbsvcs/IFR_Service/IFR_Service"; +$tao_ifr = "$ENV{ACE_ROOT}/bin/tao_ifr"; +$test_idl = "test.idl"; + +$lookup_by_name = ""; +$other = ""; + +for ($i = 0; $i <= $#ARGV; $i++) { + if ($ARGV[$i] eq "-n") { + $lookup_by_name = "-n"; + } + else { + $other .= $ARGV[$i]; + } +} + +$TAO_IFR = new PerlACE::Process ($tao_ifr); +$IFR = new PerlACE::Process ($ifr_server); +$CL = new PerlACE::Process ("IFRBrowser", "-ORBInitRef InterfaceRepository=file://$ifr_iorfile $lookup_by_name"); + +# We want the tao_ifr executable to be found exactly in the path +# given, without being modified by the value of -ExeSubDir. +# So, we tell its Process object to ignore the setting of -ExeSubDir. + +$TAO_IFR->IgnoreExeSubDir (1); + +unlink $ifr_iorfile; + +$IFR->Spawn (); + +if (PerlACE::waitforfile_timed ($ifr_iorfile, 15) == -1) { + print STDERR "ERROR: cannot find file <$ifr_iorfile>\n"; + $IFR->Kill (); + exit 1; +} + +$TAO_IFR->Arguments ("-ORBInitRef InterfaceRepository=file://$ifr_iorfile $test_idl"); + +$tresult = $TAO_IFR->SpawnWaitKill (30); + +if ($tresult != 0) { + print STDERR "ERROR: tao_ifr (test.idl) returned $tresult\n"; + exit 1; +} + +$client = $CL->SpawnWaitKill (5); +if ($client != 0) { + print STDERR "ERROR: client returned $client\n"; + $status = 1; +} + +# remove the interface from the Interface Repository. +$TAO_IFR->Arguments ("-ORBInitRef InterfaceRepository=file://$ifr_iorfile -r $test_idl"); + +$tresult = $TAO_IFR->SpawnWaitKill (30); + +if ($tresult != 0) { + print STDERR "ERROR: tao_ifr (-r test.idl) returned $tresult\n"; + $status = 1; +} + +$server = $IFR->TerminateWaitKill (5); +if ($server != 0) { + print STDERR "ERROR: IFR returned $server\n"; + $status = 1; +} + +unlink $ifr_iorfile; + +exit $status; + diff --git a/TAO/DevGuideExamples/InterfaceRepo/test.idl b/TAO/DevGuideExamples/InterfaceRepo/test.idl new file mode 100644 index 00000000000..8ac11a758fb --- /dev/null +++ b/TAO/DevGuideExamples/InterfaceRepo/test.idl @@ -0,0 +1,14 @@ +// -*- C++ -*- +// $Id$ + +module warehouse +{ + interface inventory + { + boolean getCDinfo (in string artist, + inout string title, + out float price); + }; +}; + + diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.idl b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.idl new file mode 100644 index 00000000000..b2936ef6131 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.idl @@ -0,0 +1,9 @@ +// Messenger.idl + +local interface Messenger +{ + boolean send_message (in string user_name, + in string subject, + inout string message); +}; + diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.mpc b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.mpc new file mode 100644 index 00000000000..6105ab2e210 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger.mpc @@ -0,0 +1,2 @@ +project(LocalObject*Server): taoexe, portableserver { +} diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/LocalObjects/Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..3446a3bf42b --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/MessengerServer.cpp @@ -0,0 +1,27 @@ + +#include "Messenger_i.h" +#include <iostream> +int main (int, char **) +{ + try { + // Construct a Messenger object and use it "as if" it's a corba object. + // Put it into CORBA object reference + // comparable to activation, narrow, etc. + Messenger_var messenger(new Messenger_i); + + // Send a message the the Messenger object. + CORBA::String_var message = CORBA::string_dup ("Hello!"); + messenger->send_message("TAO User", "TAO Test", message.inout()); + + // Print the Messenger's reply. + std::cout << "Reply: " << message.in() << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA::Exception : " << ex << std::endl; + return 1; + } + + return 0; +} + + diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..7e56f932f05 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.cpp @@ -0,0 +1,29 @@ +#include "Messenger_i.h" +#include <iostream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::string_free(message); + message = CORBA::string_dup("Thanks for the message."); + return 1; + +} + diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.h b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.h new file mode 100644 index 00000000000..22e63abdc41 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/Messenger_i.h @@ -0,0 +1,32 @@ +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" +#include <tao/LocalObject.h> + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual Messenger, + public virtual TAO_Local_RefCounted_Object +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/LocalObjects/Messenger/run_test.pl b/TAO/DevGuideExamples/LocalObjects/Messenger/run_test.pl new file mode 100644 index 00000000000..20a2ff037d3 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/Messenger/run_test.pl @@ -0,0 +1,15 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$S = new PerlACE::Process("MessengerServer"); +$S->SpawnWaitKill(10); + +exit 0; + + + diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger.idl b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger.idl new file mode 100644 index 00000000000..9998b3eadb3 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger.idl @@ -0,0 +1,9 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message (in string user_name, + in string subject, + inout string message); +}; + diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerClient.cpp b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerClient.cpp new file mode 100644 index 00000000000..7ff64b41629 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerClient.cpp @@ -0,0 +1,37 @@ +#include "MessengerC.h" +#include <iostream> + +int main (int argc, char *argv []) +{ + try { + // Initialize the ORB + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + // Converts the contents of the file to an object reference + CORBA::Object_var obj = orb->string_to_object ("file://Messenger.ior"); + if (CORBA::is_nil (obj.in())) { + std::cerr << "Nill Messenger reference" << std::endl; + return 1; + } + + // Narrow the object reference to a Messenger object reference + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil (messenger.in())) { + std::cerr << "Not a Messenger object reference" << std::endl; + return 1; + } + + // Create a message and send it to the Messenger + CORBA::String_var message = CORBA::string_dup("Hello!"); + messenger->send_message ("TAO User", "TAO Test", message.inout()); + + orb->destroy(); + std::cout << "Message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Client Caught a CORBA exception: " << ex << std::endl; + return 1; + } + std::cout << "Message was sent" << std::endl; + return 0; +} diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.cpp b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.cpp new file mode 100644 index 00000000000..9628e3ac26f --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.cpp @@ -0,0 +1,56 @@ +// $Id$ + +#include "MessengerLocator_i.h" +#include "Messenger_i.h" + +#include <ace/SString.h> +#include <iostream> + +Messenger_Locator_i::Messenger_Locator_i() +{ +} + +PortableServer::Servant +Messenger_Locator_i::preinvoke (const PortableServer::ObjectId &oid, + PortableServer::POA_ptr, + const char *, + void * & cookie ) + throw (CORBA::SystemException, PortableServer::ForwardRequest) +{ + // Get the ObjectId in string format. + CORBA::String_var oid_str = PortableServer::ObjectId_to_string (oid); + + std::cout << "preinvoke called..." << oid_str << std::endl; + + // Check if the ObjectId is valid. + ACE_CString cstr(oid_str.in()); + if (cstr == "Messenger") { + // Create the required servant + PortableServer::ServantBase_var servant = new Messenger_i (); + + // Set a flag so that we know to delete it in postinvoke(). + cookie = (void *)1; + + return servant._retn(); + } + else { + throw CORBA::OBJECT_NOT_EXIST (); + } +} + +void +Messenger_Locator_i::postinvoke (const PortableServer::ObjectId &, + PortableServer::POA_ptr, + const char *, + void * cookie, + PortableServer::Servant servant) + throw (CORBA::SystemException) +{ + + std::cout << "postinvoke called..." << std::endl; + + // Delete the servant as it is no longer needed. + if (cookie != 0) { + delete servant; + } +} diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.h b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.h new file mode 100644 index 00000000000..f969ecffa78 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerLocator_i.h @@ -0,0 +1,31 @@ +#ifndef MESSENGER_LOCATOR_I_H +#define MESSENGER_LOCATOR_I_H + +#include "tao/corba.h" +#include "tao/PortableServer/PortableServer.h" +#include "tao/PortableServer/ServantLocatorC.h" + +class Messenger_Locator_i : public PortableServer::ServantLocator, + public CORBA::LocalObject +{ + public: + Messenger_Locator_i(); + + // Preinvoke function + virtual PortableServer::Servant preinvoke (const PortableServer::ObjectId &oid, + PortableServer::POA_ptr poa, + const char * operation, + void * & cookie) + throw (CORBA::SystemException, PortableServer::ForwardRequest); + + // Postinvoke function + virtual void postinvoke (const PortableServer::ObjectId & oid, + PortableServer::POA_ptr poa, + const char * operation, + void * cookie, + PortableServer::Servant servant) + throw (CORBA::SystemException); + +}; + +#endif diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerServer.cpp b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerServer.cpp new file mode 100644 index 00000000000..956f6632183 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/MessengerServer.cpp @@ -0,0 +1,76 @@ + +#include "MessengerLocator_i.h" +#include "MessengerC.h" + +#include <tao/AnyTypeCode/TypeCode.h> +#include <iostream> +#include <fstream> +int main (int argc, char * argv[]) +{ + try { + // Initialize the ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Get a reference to the POA + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var rootPOA = PortableServer::POA::_narrow (obj.in()); + + // Active the POA Manager + PortableServer::POAManager_var mgr = rootPOA->the_POAManager(); + mgr->activate(); + + // Create the policies and assign them for the child POA + CORBA::PolicyList policies(3); + policies.length(3); + + policies[0] = rootPOA->create_id_assignment_policy(PortableServer::USER_ID); + policies[1] = rootPOA->create_request_processing_policy(PortableServer::USE_SERVANT_MANAGER); + policies[2] = rootPOA->create_servant_retention_policy(PortableServer::NON_RETAIN); + + // Create the POA with these policies + PortableServer::POA_var childPOA = rootPOA->create_POA("childPOA", mgr.in(), policies); + + // Destroy the policy objects + for (CORBA::ULong i = 0; i != policies.length(); ++i) { + policies[i]->destroy(); + } + + // Create our Messenger's ServantLocator. + PortableServer::ServantLocator_var locator = new Messenger_Locator_i; + + // Set the Servant Manager with the childPOA. + childPOA->set_servant_manager(locator.in()); + + // Get the object id for the user-created ID in the childPOA. + PortableServer::ObjectId_var child_oid = PortableServer::string_to_ObjectId("Messenger"); + + // Create the object without creating a servant. + CORBA::Object_var messenger_obj = + childPOA->create_reference_with_id(child_oid.in(), ::_tc_Messenger->id()); + + // Put the object reference into an IOR string + CORBA::String_var str = orb->object_to_string(messenger_obj.in()); + + // Write the IOR string to a file + std::ofstream iorFile("Messenger.ior"); // Throws exception if there's a problem. + iorFile << str.in(); + iorFile.close(); + + std::cout << "IOR written to the file Messenger.ior." << std::endl; + + // Accept requests from clients. + orb->run(); + + // Release resources + rootPOA->destroy(1,1); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Server Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} + + diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.cpp b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.cpp new file mode 100644 index 00000000000..dce1646bb24 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.cpp @@ -0,0 +1,45 @@ +// -*- C++ -*- +// +// $Id$ + +// **** Code generated by the The ACE ORB (TAO) IDL Compiler **** +// TAO and the TAO IDL Compiler have been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// and +// Distributed Object Computing Laboratory +// University of California at Irvine +// Irvine, CA +// USA +// http://doc.ece.uci.edu/ +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean +Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + return true; +} + diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.h b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.h new file mode 100644 index 00000000000..9af2c134dc2 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/Messenger_i.h @@ -0,0 +1,48 @@ +// -*- C++ -*- +// +// $Id$ + +// **** Code generated by the The ACE ORB (TAO) IDL Compiler **** +// TAO and the TAO IDL Compiler have been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// and +// Distributed Object Computing Laboratory +// University of California at Irvine +// Irvine, CA +// USA +// http://doc.ece.uci.edu/ +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/ServantLocator.mpc b/TAO/DevGuideExamples/LocalObjects/ServantLocator/ServantLocator.mpc new file mode 100644 index 00000000000..821064369cd --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/ServantLocator.mpc @@ -0,0 +1,14 @@ +project(*Server): taoexe, portableserver, anytypecode, avoids_minimum_corba, avoids_corba_e_compact, avoids_corba_e_micro { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + MessengerLocator_i.cpp + } +} + +project(*Client): taoexe, anytypecode, avoids_minimum_corba, avoids_corba_e_compact, avoids_corba_e_micro { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/LocalObjects/ServantLocator/run_test.pl b/TAO/DevGuideExamples/LocalObjects/ServantLocator/run_test.pl new file mode 100644 index 00000000000..cc79c4e93a8 --- /dev/null +++ b/TAO/DevGuideExamples/LocalObjects/ServantLocator/run_test.pl @@ -0,0 +1,35 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$messenger_ior = "Messenger.ior"; + +unlink $messenger_ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($messenger_ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$implrepo_ior>\n"; + $S->Kill(); + exit 1; +} + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient"); + +if ($C->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $S->Kill(); + exit 1; +} + +$S->Kill(); + +unlink $messenger_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/AMIcallback.mpc b/TAO/DevGuideExamples/Messaging/AMIcallback/AMIcallback.mpc new file mode 100644 index 00000000000..cb49b4153aa --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/AMIcallback.mpc @@ -0,0 +1,26 @@ +project(*Server): messaging, taoexe, portableserver, ami { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): messaging, taoexe, portableserver, ami { + Source_Files { + MessengerHandler.cpp + MessengerClient.cpp + } + verbatim(gnuace, local) { + ## Using the -g option causes an internal compiler error with g++ 2.96 + ## on Linux Itanium when compiling MessengerHandler.cpp. + ifeq ($(CXX), g++) + ifeq ($(findstring 2.96, $(CXX_VERSION)), 2.96) + ifeq ($(shell uname -s), Linux) + ifeq ($(shell uname -m), ia64) + DCFLAGS = -O0 + endif + endif + endif + endif + } +} diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger.idl b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger.idl new file mode 100644 index 00000000000..ad65ac16b8d --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger.idl @@ -0,0 +1,15 @@ +// Messenger.idl + +exception MessengerUnableToSendMessage +{ +}; + +interface Messenger +{ + + boolean send_message(in string user_name, + in string subject, + inout string message, + out long time_sent) + raises (MessengerUnableToSendMessage); +}; diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerClient.cpp b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerClient.cpp new file mode 100644 index 00000000000..7aa13bd568b --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerClient.cpp @@ -0,0 +1,98 @@ +#include "MessengerC.h" +#include "MessengerHandler.h" + +#include <ace/OS_NS_stdio.h> +#include <ace/OS_NS_unistd.h> +#include <ace/OS_NS_sys_time.h> +#include <iostream> + +//----------------------------------------------------------------------------- + +int +main(int argc, char * argv[]) +{ + try { + + // assume any command line parameter means we want an automated test. + bool automated = argc > 1; + + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object("file://MessengerServer.ior"); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + // Get reference to Root POA. + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Register an AMI handler for the Messenger interface + MessengerHandler servant(orb.in()); + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + AMI_MessengerHandler_var handler = AMI_MessengerHandler::_narrow(obj.in()); + + CORBA::String_var user = CORBA::string_alloc(81); + CORBA::String_var subject = CORBA::string_alloc(81); + CORBA::String_var message = CORBA::string_alloc(81); + + if (! automated) { + std::cout << "Enter user name -->"; + std::cin.getline(user, 81); + + std::cout << "Enter subject -->"; + std::cin.getline(subject, 81); + + std::cout << "Enter message -->"; + std::cin.getline(message, 81); + } else { + user = CORBA::string_dup("TestUser"); + subject = CORBA::string_dup("TestSubject"); + message = CORBA::string_dup("Have a nice day."); + } + + // Record the time the request was made. + ACE_Time_Value time_sent = ACE_OS::gettimeofday(); + + messenger->sendc_send_message(handler.in(), user.in(), subject.in(), message.in()); + + // Do some work to prove that we can send the message asynchronously, do some work, + // then come back later and retrieve the results. + for (int i = 0; i < 10; ++i) { + ACE_OS::printf("."); + ACE_OS::sleep(ACE_Time_Value(0, 10 * 1000)); + } + + // Our simple servant will exit as soon as it receives the results. + orb->run(); + + if (servant.message_was_sent()) + { + // Note : We can't use the + ACE_Time_Value delay = ACE_OS::gettimeofday() - time_sent; + std::cout << std::endl << "Reply Delay = " << delay.msec() << "ms" << std::endl; + } + + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.cpp b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.cpp new file mode 100644 index 00000000000..783f00801da --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.cpp @@ -0,0 +1,58 @@ +#include "MessengerHandler.h" +#include <ace/OS_NS_time.h> +#include <iostream> + +// Implementation skeleton constructor +MessengerHandler::MessengerHandler (CORBA::ORB_ptr orb) +: time_(0) +, orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +// Implementation skeleton destructor +MessengerHandler::~MessengerHandler (void) +{ +} + +void MessengerHandler::send_message ( + CORBA::Boolean ami_return_val, + const char * message, + CORBA::Long time + ) + throw (CORBA::SystemException) + +{ + if (ami_return_val) + { + time_ = time; + time_t t = time_; + const ACE_TCHAR * time_str = ACE_OS::ctime(&t); + if (time_str != 0) { + std::cout << std::endl << "Message sent at " << + ACE_TEXT_ALWAYS_CHAR (time_str) << std::endl; + } + std::cout << "Content of message: " << message << std::endl; + } + else + { + std::cerr << "Error: Message was not sent." << std::endl; + } + // Our simple test just shuts down after sending one message. + orb_->shutdown(0); +} + +void MessengerHandler::send_message_excep (Messaging::ExceptionHolder* excep_holder) + throw (CORBA::SystemException) +{ + // We'll print an error message and shut down the orb + try + { + excep_holder->raise_exception(); + } + catch(const CORBA::Exception& ex) + { + std::cerr << "A CORBA Exception was thrown: " << ex << std::endl; + } + orb_->shutdown(0); +} + diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.h b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.h new file mode 100644 index 00000000000..62ac6198202 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerHandler.h @@ -0,0 +1,38 @@ +#ifndef MESSENGERHANDLER_H +#define MESSENGERHANDLER_H + +#include "MessengerS.h" + +class MessengerHandler : public virtual POA_AMI_MessengerHandler +{ +public: + //Constructor + MessengerHandler (CORBA::ORB_ptr orb); + + //Destructor + virtual ~MessengerHandler (void); + +virtual void send_message ( + CORBA::Boolean ami_return_val, + const char * message, + CORBA::Long time + ) + throw(CORBA::SystemException); + +virtual void send_message_excep ( + Messaging::ExceptionHolder * excep_holder + ) + throw(CORBA::SystemException); + + + int message_was_sent() + { + return time_ > 0; + } + +private: + CORBA::Long time_; + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerServer.cpp b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerServer.cpp new file mode 100644 index 00000000000..04d8e7ac7e9 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/MessengerServer.cpp @@ -0,0 +1,65 @@ +#include "Messenger_i.h" +#include <fstream> +#include <iostream> +#include <fstream> + +int +main(int argc, char * argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Set a wait time to an integer if it has been passed as a + // command line argument. Otherwise, have + // Messenger_i::send_message() throw an exception if e + // has been passed as the command lin argument. + unsigned int seconds_to_wait = 0; + CORBA::Boolean servant_throws_exception = 0; + if (argc == 2) + { + if (argv[1][0] == 'e') + { + servant_throws_exception = 1; + std::cout << "Messenger_i::send_message() will throw an exception." << std::endl; + } + else + { + seconds_to_wait = atoi(argv[1]); + std::cout << "Messenger_i::send_message() will wait " + << seconds_to_wait << " seconds" << std::endl; + } + } + + // Get reference to Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i servant(seconds_to_wait, servant_throws_exception); + + // Write its stringified reference to stdout + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + Messenger_var messenger = Messenger::_narrow(obj.in()); + CORBA::String_var str = orb->object_to_string(messenger.in()); + std::ofstream fout("MessengerServer.ior"); + fout << str.in() << std::endl; + fout.close(); + std::cout << "IOR written to file MessengerServer.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.cpp b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.cpp new file mode 100644 index 00000000000..e80cab4fb2e --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.cpp @@ -0,0 +1,60 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/OS_NS_unistd.h> +#include <ace/OS_NS_sys_time.h> +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (unsigned int seconds_to_wait, + CORBA::Boolean throw_exception) + : seconds_to_wait_(seconds_to_wait) + , throw_exception_(throw_exception) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message, + CORBA::Long_out time_sent + ) + throw (CORBA::SystemException, MessengerUnableToSendMessage) +{ + if (throw_exception_) + { + std::cout << "Throwing MessengerUnableToSendMessage exception." << std::endl; + throw MessengerUnableToSendMessage(); + } + + std::cout << "Write a letter to " << user_name << " as follows:" << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Dear " << user_name << ',' << std::endl; + std::cout << message << std::endl; + + if (seconds_to_wait_ > 0) + { + std::cout << "Waiting for " << seconds_to_wait_ << " seconds..." << std::flush; + ACE_OS::sleep(seconds_to_wait_); + std::cout << " Done waiting" << std::endl; + } + + // Record the time the message was sent + time_sent = static_cast<CORBA::Long> (ACE_OS::gettimeofday().sec()); + + // We will assume the message has been sent, so return true + return 1; +} + + diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.h b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.h new file mode 100644 index 00000000000..61785d4edf2 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/Messenger_i.h @@ -0,0 +1,51 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_IMPL_H_ +#define MESSENGER_IMPL_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + + +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (unsigned int seconds_to_wait = 0, + CORBA::Boolean throw_exception = 0); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message, + CORBA::Long_out time_sent + ) + throw (CORBA::SystemException, MessengerUnableToSendMessage); + +private: + // Specify an amount of time to wait inside + // send_message in order illustrate AMI callback usage + unsigned int seconds_to_wait_; + + // Force an exception to be thrown to test client-side + // exception handling + CORBA::Boolean throw_exception_; + +}; + + + +#endif /* MESSENGER_IMPL_H_ */ diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/README b/TAO/DevGuideExamples/Messaging/AMIcallback/README new file mode 100644 index 00000000000..71f32802adb --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/README @@ -0,0 +1,39 @@ +CORBA Messaging + + +File: DevGuideExamples/Messaging/AMIcallback/README + + +This directory contains an example illustrating the Asynchronous +Method Invocation (AMI) feature of TAO. This feature permits +requests to be made that do not require a client to block while +waiting for a reply from a server. + +This example is based on the Messenger example in GettingStarted +directory. A message is send by MessengerClient and displayed by +MessengerServer. The server responds to provide confirmation +that the message was received. The delay for this exchange of +messages is then displayed. + + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/Messaging/AMIcallback/run_test.pl b/TAO/DevGuideExamples/Messaging/AMIcallback/run_test.pl new file mode 100644 index 00000000000..29a8c0df380 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/AMIcallback/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior="MessengerServer.ior"; +unlink $ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file $ior\n"; + $S->Kill(); + exit 1; +} + + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", "-automated"); + +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); +unlink $ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger.idl b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerClient.cpp b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerClient.cpp new file mode 100644 index 00000000000..cf9044566b1 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerClient.cpp @@ -0,0 +1,74 @@ +#include "MessengerC.h" +#include <tao/TimeBaseC.h> +#include "tao/Messaging/Messaging.h" +#include <iostream> +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try { + + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object("file://MessengerServer.ior"); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + Messenger_var messenger = Messenger::_narrow(obj.in()); + ACE_ASSERT(! CORBA::is_nil(messenger.in())); + + obj = orb->resolve_initial_references("ORBPolicyManager"); + CORBA::PolicyManager_var policy_manager = CORBA::PolicyManager::_narrow(obj.in()); + ACE_ASSERT(! CORBA::is_nil(policy_manager.in())); + obj = orb->resolve_initial_references("PolicyCurrent"); + CORBA::PolicyCurrent_var policy_current = CORBA::PolicyCurrent::_narrow (obj.in()); + ACE_ASSERT(! CORBA::is_nil(policy_current.in())); + + // Set the RelativeRoundtripTimeout value + long msecs = 0; + if (argc > 1) { + msecs = ACE_OS::atoi(argv[1]); + } else { + std::cout << "Enter relative roundtrip timeout in milliseconds -->"; + std::cin >> msecs; + } + // TimeT is in 10ths of a microsecond (10000 == 1.0e-3 * 1.0e7). + TimeBase::TimeT relative_rt_timeout = msecs * 10000; + + CORBA::Any relative_rt_timeout_as_any; + relative_rt_timeout_as_any <<= relative_rt_timeout; + CORBA::PolicyList policy_list(1); + policy_list.length(1); + policy_list[0] = + orb->create_policy(Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE, + relative_rt_timeout_as_any); + + // We demonstrate setting the policy at each of three levels. In practice, + // you would only need to set the policy for one of these. + // Set timeouts for the whole orb. + policy_manager->set_policy_overrides(policy_list, CORBA::ADD_OVERRIDE); + // Set timeouts for the current thread. + policy_current->set_policy_overrides(policy_list, CORBA::ADD_OVERRIDE); + // Set timeouts for the messenger object. + obj = messenger->_set_policy_overrides(policy_list, CORBA::SET_OVERRIDE); + messenger = Messenger::_narrow(obj.in()); + ACE_ASSERT(! CORBA::is_nil(messenger.in())); + + policy_list[0]->destroy(); + policy_list[0] = CORBA::Policy::_nil(); + + CORBA::String_var message = CORBA::string_dup("Hello!"); + + try { + messenger->send_message ("TAO User", "TAO Test", message.inout()); + std::cerr << "ERROR: Message did not timeout." << std::endl; + } catch(const CORBA::TIMEOUT&) { + std::cout << "Message Timed out as expected." << std::endl; + } + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerServer.cpp b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerServer.cpp new file mode 100644 index 00000000000..77105c49492 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/MessengerServer.cpp @@ -0,0 +1,41 @@ +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + // Get reference to Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Write its stringified reference to a file + PortableServer::ObjectId_var oid = poa->activate_object(&messenger_servant); + obj = poa->id_to_reference(oid.in()); + Messenger_var messenger = Messenger::_narrow(obj.in()); + CORBA::String_var str = orb->object_to_string(messenger.in()); + std::ofstream fout("MessengerServer.ior"); + fout << str.in() << std::endl; + fout.close(); + std::cout << "IOR written to file MessengerServer.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA::Exception " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.cpp b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.cpp new file mode 100644 index 00000000000..72d8c63d04a --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.cpp @@ -0,0 +1,38 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/OS_NS_unistd.h> +#include <iostream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) +{ + // Force a delay in the reply in order to test the Relative Roundtrip Timeout Policy + ACE_OS::sleep(ACE_Time_Value(0, 100 * 1000)); + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + return true; +} + diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.h b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.h new file mode 100644 index 00000000000..af12e09474a --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/README b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/README new file mode 100644 index 00000000000..b5f4c440ade --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/README @@ -0,0 +1,40 @@ +CORBA Messaging + + +File: DevGuideExamples/Messaging/RelativeRoundtripTimeout/README + + +This directory contains an example illustrating the relative +round trip timeout policy defined in CORBA Messaging. + +At each request invocation on the server, the client checks +against a user-specified timout value. If the time spent since +the start of the request exceeds the timeout value, a CORBA::TIMEOUT +exception is raised. + +This example is based on the Messenger example in GettingStarted +directory. + + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc new file mode 100644 index 00000000000..5d04c506cb0 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/RelativeRoundtripTimeout.mpc @@ -0,0 +1,13 @@ +project(*Server): taoexe, portableserver { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, portableserver, messaging { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/run_test.pl b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/run_test.pl new file mode 100644 index 00000000000..6a87492da33 --- /dev/null +++ b/TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior="MessengerServer.ior"; +unlink $ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file $ior\n"; + $S->Kill(); + exit 1; +} + + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", "20"); + +if ($C->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); +unlink $ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/GracefulShutdown.mpc b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/GracefulShutdown.mpc new file mode 100644 index 00000000000..9ef4e48adea --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/GracefulShutdown.mpc @@ -0,0 +1,16 @@ +project(Multithreading*Server): taoexe, portableserver { + exename = MessengerServer + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + MessengerShutdownTimer.cpp + } +} + +project(Multithreading*Client): taoexe { + exename = MessengerClient + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger.idl b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger.idl new file mode 100644 index 00000000000..30bc8126513 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger.idl @@ -0,0 +1,11 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); + + oneway void shutdown(); +}; + diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerClient.cpp b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerClient.cpp new file mode 100644 index 00000000000..5316eaffca3 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerClient.cpp @@ -0,0 +1,81 @@ +#include "MessengerC.h" +#include <ace/Get_Opt.h> +#include <ace/Argv_Type_Converter.h> +#include <iostream> + +int call_shutdown = 0; + +int parse_args (int argc, ACE_TCHAR* argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("x")); + int c; + + while ((c = get_opts ()) != -1) + { + switch (c) + { + case 'x': + call_shutdown = 1; + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s\n " + "-x - call shutdown on server\n", + argv[0]), + -1); + + } + } + return 0; +} + +int ACE_TMAIN( int argc, ACE_TCHAR* argv[] ) +{ + try { + // Initialize the ORB. + ACE_Argv_Type_Converter conv(argc, argv); + CORBA::ORB_var orb = CORBA::ORB_init(conv.get_argc(), + conv.get_TCHAR_argv()); + + // Parse arguments. + if (parse_args (argc, argv) != 0) + return 1; + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << message.in() << std::endl; + + // Shutdown server? + if (call_shutdown == 1) + { + messenger->shutdown(); + orb->perform_work(); + } + + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.cpp b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.cpp new file mode 100644 index 00000000000..7ba804bc56a --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.cpp @@ -0,0 +1,221 @@ +#include "MessengerServer.h" +#include "Messenger_i.h" +#include "MessengerShutdownTimer.h" +#include <ace/Get_Opt.h> +#include <ace/Argv_Type_Converter.h> +#include <ace/Reactor.h> +#include <tao/ORB_Core.h> +#include <iostream> +#include <fstream> + +// By default, shutdown when client calls Messenger::shutdown(). +MessengerServer::ShutdownMethod s_method = MessengerServer::s_client_call; + +int loop_iterations; +int timeout; + +// Constructor. +MessengerServer::MessengerServer (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) + , monitor_(0) +{ +} + +// Destructor. +MessengerServer::~MessengerServer () +{ + if (monitor_ != 0) + delete monitor_; + orb_->destroy (); +} + +// run the ORB's event loop continuously +void MessengerServer::run () +{ + std::cout << "Running the ORB event loop continuously..." << std::endl; + orb_->run (); + std::cout << "Finished running the ORB." << std::endl; +} + +// run the ORB's event loop for some number of seconds +void MessengerServer::run (int seconds) +{ + std::cout << "Running the ORB event loop for " << seconds + << " seconds..." << std::endl; + ACE_Time_Value tv ((long)seconds, 0); + orb_->run (tv); + std::cout << "Finished running the ORB." << std::endl; +} + +// handle ORB events in a polling loop for some number of iterations +void MessengerServer::poll (int iterations) +{ + std::cout << "Polling for ORB events for " << iterations + << " iterations..." << std::endl; + int x = iterations; + do + { + std::cout << "iteration: " << iterations - x << std::endl; + ACE_Time_Value tv (1,0); + orb_->perform_work (tv); + } + while ((--x > 0) && (orb_->orb_core ()->has_shutdown() == 0)); + std::cout << "Finished running the ORB." << std::endl; +} + +// schedule a shutdown timer with the ORB's reactor to timeout +// after some seconds +void MessengerServer::schedule_shutdown_timer (int seconds) +{ + // Create a shutdown timer. + std::cout << "Creating shutdown timer" << std::endl; + MessengerShutdownTimer * timer = new MessengerShutdownTimer (orb_.in()); + + // Schedule the timer to shutdown the ORB, with no repeat. + ACE_Time_Value tv ((long)seconds, 0); + std::cout << "Scheduling shutdown timer" << std::endl; + orb_->orb_core ()->reactor ()->schedule_timer ( + timer, // handler : ACE_Event_Handler * + 0, // args : void * + tv // relative timeout value : ACE_Time_Value & + ); +} + +// spawn thread to monitor console and shutdown on console input +void MessengerServer::shutdown_on_console_input () +{ + // Spawn a thread to monitor console and shutdown on console input. + monitor_ = new MessengerServer::ConsoleMonitor (orb_.in()); + monitor_->activate (); + std::cout << "Enter any input on keyboard to shut down ORB..." << std::endl; +} + +// parse arguments +int MessengerServer::parse_args (int argc, ACE_TCHAR* argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("xp:t:cr:")); + int c; + + while ((c = get_opts ()) != -1) + { + switch (c) + { + case 'x': + s_method = MessengerServer::s_client_call; + break; + case 'p': + s_method = MessengerServer::s_polling_loop; + loop_iterations = ACE_OS::atoi(get_opts.opt_arg()); + break; + case 't': + s_method = MessengerServer::s_timer; + timeout = ACE_OS::atoi(get_opts.opt_arg()); + break; + case 'c': + s_method = MessengerServer::s_console_input; + break; + case 'r': + s_method = MessengerServer::s_run_time_value; + timeout = ACE_OS::atoi(get_opts.opt_arg()); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s\n " + "-x (default) - shutdown on client invocation\n" + "-p <n> - use polling loop for <n> iterations\n" + "-t <n> - schedule timer for <n> seconds\n" + "-c - shutdown on console input\n" + "-r <n> - run ORB for <n> seconds\n", + argv[0]), + -1); + + } + } + return 0; +} + + +// ------------------------------------------------------------------ +// main +// ------------------------------------------------------------------ + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + ACE_Argv_Type_Converter conv(argc, argv); + CORBA::ORB_var orb = CORBA::ORB_init(conv.get_argc(), + conv.get_TCHAR_argv()); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Messenger_i messenger_servant (orb.in()); + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Create a MessengerServer object. + MessengerServer * server = new MessengerServer (orb.in()); + + // Parse arguments to determine how we should shutdown. + if (server->parse_args (argc, argv) != 0) + return 1; + + switch (s_method) + { + // shutdown on client invocation + case MessengerServer::s_client_call: + std::cout << "Will shutdown on client invocation." << std::endl; + server->run (); + break; + + // shutdown after some iterations through loop + case MessengerServer::s_polling_loop: + server->poll (loop_iterations); + break; + + // schedule a timer to shutdown + case MessengerServer::s_timer: + server->schedule_shutdown_timer (timeout); + server->run (); + break; + + // shutdown on console input + case MessengerServer::s_console_input: + server->shutdown_on_console_input (); + server->run (); + break; + + // use CORBA::ORB::run() with time value + case MessengerServer::s_run_time_value: + server->run (timeout); + break; + } + + // Finished. + delete server; + + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.h b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.h new file mode 100644 index 00000000000..5621cf17e1f --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerServer.h @@ -0,0 +1,74 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MESSENGERSERVER_H_ +#define MESSENGERSERVER_H_ + +#include "MessengerS.h" +#include <ace/Task.h> +#include <iostream> + +//Class MessengerServer +class MessengerServer +{ +public: + //Constructor + MessengerServer (CORBA::ORB_ptr orb); + + //Destructor + virtual ~MessengerServer (void); + + // parse arguments + int parse_args (int argc, ACE_TCHAR* argv[]); + + // run the ORB's event loop continuously + void run (); + + // run the ORB's event loop for some number of seconds + void run (int seconds); + + // handle ORB events in a polling loop for some number of iterations + void poll (int iterations); + + // schedule a shutdown timer with the ORB's reactor to timeout + // after some seconds + void schedule_shutdown_timer (int seconds); + + // spawn thread to monitor console and shutdown on console input + void shutdown_on_console_input (); + + enum ShutdownMethod { + s_client_call, // shutdown on client invocation + s_polling_loop, // shutdown after some iterations through loop + s_timer, // schedule a timer to shutdown + s_console_input, // shutdown on console input + s_run_time_value // use CORBA::ORB::run() with time value + }; + + // Task to monitor console input. + class ConsoleMonitor : public ACE_Task_Base + { + public: + ConsoleMonitor (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) + { + } + + virtual int svc() + { + char c; + std::cin.get (c); + orb_->shutdown (1); + return 0; + } + private: + CORBA::ORB_var orb_; + }; + +private: + + CORBA::ORB_var orb_; + ConsoleMonitor * monitor_; + +}; + +#endif /* MESSENGERSERVER_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.cpp b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.cpp new file mode 100644 index 00000000000..e16053c3933 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.cpp @@ -0,0 +1,17 @@ +/* -*- C++ -*- $Id$ */ + +#include "MessengerShutdownTimer.h" + +MessengerShutdownTimer::MessengerShutdownTimer (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +int MessengerShutdownTimer::handle_timeout ( + const ACE_Time_Value &, + const void*) +{ + ACE_DEBUG((LM_DEBUG, "In MessengerShutdownTimer::handle_timeout\n")); + orb_->shutdown (0); + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.h b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.h new file mode 100644 index 00000000000..07b8290ff41 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/MessengerShutdownTimer.h @@ -0,0 +1,24 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MESSENGERSHUTDOWNTIMER_H_ +#define MESSENGERSHUTDOWNTIMER_H_ + +#include <ace/Event_Handler.h> +#include <tao/corba.h> + +class MessengerShutdownTimer : public ACE_Event_Handler +{ +public: + // Constructor + MessengerShutdownTimer (CORBA::ORB_ptr orb); + + virtual int handle_timeout ( + const ACE_Time_Value & current_time, + const void * act); + +private: + CORBA::ORB_var orb_; +}; + + +#endif /* MESSENGERSHUTDOWNTIMER_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.cpp b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.cpp new file mode 100644 index 00000000000..f0a8ae0b4cb --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.cpp @@ -0,0 +1,43 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::string_free(message); + message = CORBA::string_dup("Thanks for the message."); + return 1; +} + +void Messenger_i::shutdown () + throw(CORBA::SystemException) +{ + orb_->shutdown(0); +} diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.h b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.h new file mode 100644 index 00000000000..07e3829072f --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/Messenger_i.h @@ -0,0 +1,44 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (CORBA::ORB_ptr orb); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + + virtual void shutdown () + throw(CORBA::SystemException); + +private: + CORBA::ORB_var orb_; + +}; + +#endif /* MESSENGER_I_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/README b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/README new file mode 100644 index 00000000000..d0c42b5bc98 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/README @@ -0,0 +1,63 @@ +File: DevGuideExamples/Multithreading/GracefulShutdown/README + +This directory contains a CORBA example illustrating a simple client +and a server with an interface Messenger. This example extends the +Getting Started example to show various techniques for gracefully +shutting down a TAO server. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer [options] + +where [options] can be one of the following: + + -x - (default) shutdown the ORB when the client invokes the + Messenger::shutdown() operation + + -p <n> - use non-blocking ORB operations in a polling loop to shutdown + after <n> iterations + + -t <n> - schedule a timer with the ORB's reactor to shutdown in + <n> seconds + + -r <n> - use the overloaded version of CORBA::ORB::run() that takes + an ACE_Time_Value parameter indicating how long run() + should process events before returning, where <n> is the + number of seconds the ORB will run. + + -c - spawn a separate thread to shutdown the ORB on any + input from the console (terminal) + + + +To start the client: +------------------ +./MessengerClient [-x] + +where -x indicates the client will invoke Messenger::shutdown() +on the server to shut it down. + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/Multithreading/GracefulShutdown/run_test.pl b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/run_test.pl new file mode 100644 index 00000000000..842015a4ff0 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/GracefulShutdown/run_test.pl @@ -0,0 +1,203 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +$server_args = "-ORBEndpoint iiop://localhost"; + +# ------------------------------------------------------------------- +# Test 1: Shutdown on client invocation +# ------------------------------------------------------------------- + +# start MessengerServer + +print STDOUT "\n\nTest 1: Shutdown on client invocation.\n"; +print STDOUT "Running MessengerServer...\n"; +$S1 = new PerlACE::Process("MessengerServer", $server_args . " -x"); +$S1->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S1->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C1 = new PerlACE::Process("MessengerClient", "-x"); +$C1->Spawn(); + +$C1RET = $C1->WaitKill(15); +$S1->Kill(); + +# clean-up + +unlink $ior; + +if ($C1RET != 0) { + print STDERR "ERROR: Client returned <$C1RET>\n"; + exit 1 ; +} + +# ------------------------------------------------------------------- +# Test 2: Shutdown after <n> iterations through polling loop +# ------------------------------------------------------------------- + +# start MessengerServer + +$iter = 10; +print STDOUT "\n\nTest 2: Shutdown after <$iter> iterations through polling loop.\n"; +print STDOUT "Running MessengerServer...\n"; +$S2 = new PerlACE::Process("MessengerServer", $server_args . " -p " . $iter); +$S2->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S2->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C2 = new PerlACE::Process("MessengerClient"); +$C2->Spawn(); + +$C2RET = $C2->WaitKill(15); +$S2->WaitKill($iter+5); + +# clean-up + +unlink $ior; + +if ($C2RET != 0) { + print STDERR "ERROR: Client returned <$C2RET>\n"; + exit 1 ; +} + +# ------------------------------------------------------------------- +# Test 3: Schedule a timer with the ORB's reactor to shutdown +# in <n> seconds +# ------------------------------------------------------------------- + +# start MessengerServer + +$sec = 10; +print STDOUT "\n\nTest 3: Schedule a timer with the ORB's reactor to shutdown in <$sec> seconds.\n"; +print STDOUT "Running MessengerServer...\n"; +$S3 = new PerlACE::Process("MessengerServer", $server_args . " -t " . $sec); +$S3->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S3->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C3 = new PerlACE::Process("MessengerClient"); +$C3->Spawn(); + +$C3RET = $C3->WaitKill(15); +$S3->WaitKill($sec+5); + +# clean-up + +unlink $ior; + +if ($C3RET != 0) { + print STDERR "ERROR: Client returned <$C3RET>\n"; + exit 1 ; +} + +# ------------------------------------------------------------------- +# Test 4: Use the overloaded version of CORBA::ORB::run() that takes +# an ACE_Time_Value parameter indicating how long run() +# should process events before returning. +# ------------------------------------------------------------------- + +# start MessengerServer + +print STDOUT "\n\nTest 4: Use the overloaded version of CORBA::ORB::run()\n"; +print STDOUT "that takes an ACE_Time_Value parameter indicating how long\n"; +print STDOUT "run() should process events before returning (<$sec> seconds).\n"; +print STDOUT "Running MessengerServer...\n"; +$S4 = new PerlACE::Process("MessengerServer", $server_args . " -r " . $sec); +$S4->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S4->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C4 = new PerlACE::Process("MessengerClient"); +$C4->Spawn(); + +$C4RET = $C4->WaitKill(15); +$S4->WaitKill($sec+5); + +# clean-up + +unlink $ior; + +if ($C4RET != 0) { + print STDERR "ERROR: Client returned <$C4RET>\n"; + exit 1 ; +} + + +# ------------------------------------------------------------------- +# Test 5: Spawn a separate thread to shutdown the ORB on any +# input from the console (terminal) +# ------------------------------------------------------------------- + +# start MessengerServer + +print STDOUT "\n\nTest 5: Spawn a separate thread to shutdown the ORB on any input from the console (terminal).\n"; +print STDOUT "Running MessengerServer...\n"; +$S5 = new PerlACE::Process("MessengerServer", $server_args . " -c"); +$S5->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S5->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C5 = new PerlACE::Process("MessengerClient"); +$C5->Spawn(); + +$C5RET = $C5->WaitKill(15); +print STDOUT "Enter any input to shutdown MessengerServer...\n"; +$S5->WaitKill(15); + +# clean-up + +unlink $ior; + +if ($C5RET != 0) { + print STDERR "ERROR: Client returned <$C5RET>\n"; + exit 1 ; +} + + +exit 0; + + + diff --git a/TAO/DevGuideExamples/Multithreading/README b/TAO/DevGuideExamples/Multithreading/README new file mode 100644 index 00000000000..33afe107074 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/README @@ -0,0 +1,21 @@ +File: DevGuideExamples/Multithreading/README + + +This directory contains subdirectories containing CORBA examples +illustrating TAO's various concurrency models: + +Reactive + + Contains an example of a single-threaded server that uses the + reactive concurrency model. + +ThreadPerConnection + + Contains an example of a multithreaded server that uses the + thread-per-connection concurrency model. + +ThreadPool + + Contains an example of a multithreaded server that provides a pool + of threads for concurrent processing of client requests. + diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/Messenger.idl b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger.idl new file mode 100644 index 00000000000..335d899f058 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger.idl @@ -0,0 +1,8 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/MessengerClient.cpp b/TAO/DevGuideExamples/Multithreading/Reactive/MessengerClient.cpp new file mode 100644 index 00000000000..d3eac221e2c --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/MessengerClient.cpp @@ -0,0 +1,36 @@ +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << message.in() << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/MessengerServer.cpp b/TAO/DevGuideExamples/Multithreading/Reactive/MessengerServer.cpp new file mode 100644 index 00000000000..2050c170c13 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/MessengerServer.cpp @@ -0,0 +1,42 @@ +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.cpp b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.cpp new file mode 100644 index 00000000000..abb3fdbc848 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.cpp @@ -0,0 +1,37 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + +{ + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + CORBA::string_free(message); + message = CORBA::string_dup("Thanks for the message."); + return 1; +} + diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.h b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.h new file mode 100644 index 00000000000..af12e09474a --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/README b/TAO/DevGuideExamples/Multithreading/Reactive/README new file mode 100644 index 00000000000..04a34332995 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/README @@ -0,0 +1,48 @@ +File: DevGuideExamples/Multithreading/Reactive/README + + +This directory contains a CORBA example illustrating a simple client and +a server with an interface Messenger. The Messenger interface has +an operation for sending a message (send_message). The MessengerClient +will send a message which is displayed by the MessengerServer when +received. The MessengerClient will then confirm that the message has +been sent successfully. + +This version of the MessengerServer illustrates the single-threaded +reactive concurrency model for servers as described in the +Multithreading with TAO chapter. The svc.conf file shows run time +configuration options for optimizing single-threaded TAO applications. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/Reactive.mpc b/TAO/DevGuideExamples/Multithreading/Reactive/Reactive.mpc new file mode 100644 index 00000000000..d583bac9a11 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/Reactive.mpc @@ -0,0 +1,13 @@ +project(Multithreading*Server): taoexe, portableserver, avoids_minimum_corba { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(Multithreading*Client): taoexe, avoids_minimum_corba { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/run_test.pl b/TAO/DevGuideExamples/Multithreading/Reactive/run_test.pl new file mode 100644 index 00000000000..8fd94a64b3e --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/run_test.pl @@ -0,0 +1,44 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +# start MessengerServer + +$S = new PerlACE::Process("MessengerServer", "-ORBEndpoint iiop://localhost"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +# start MessengerClient + +$C = new PerlACE::Process("MessengerClient"); +$C->Spawn(); + +$CRET = $C->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/Multithreading/Reactive/svc.conf b/TAO/DevGuideExamples/Multithreading/Reactive/svc.conf new file mode 100644 index 00000000000..3cd02504e29 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/Reactive/svc.conf @@ -0,0 +1,4 @@ +# svc.conf file for single-threaded reactive server. +static Server_Strategy_Factory "-ORBConcurrency reactive -ORBPOALock null" +dynamic Advanced_Resource_Factory Service_Object * TAO_Strategies:_make_TAO_Advanced_Resource_Factory () "-ORBReactorType select_st -ORBInputCDRAllocator null" +static Client_Strategy_Factory "-ORBProfileLock null -ORBClientConnectionHandler st" diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger.idl b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger.idl new file mode 100644 index 00000000000..335d899f058 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger.idl @@ -0,0 +1,8 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerClient.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerClient.cpp new file mode 100644 index 00000000000..d3eac221e2c --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerClient.cpp @@ -0,0 +1,36 @@ +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << message.in() << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerServer.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerServer.cpp new file mode 100644 index 00000000000..2050c170c13 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/MessengerServer.cpp @@ -0,0 +1,42 @@ +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests from clients. + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.cpp new file mode 100644 index 00000000000..1ef3f40cf89 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.cpp @@ -0,0 +1,41 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/Thread.h> +#include <iostream> + +#include <sstream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char* /*user_name*/, + const char* /*subject*/, + char *& message + ) + throw(CORBA::SystemException) + +{ + CORBA::string_free(message); + + std::ostringstream ostr; + ostr << "Message handled on thread " << ACE_Thread::self(); + message = CORBA::string_dup(ostr.str().c_str()); + return 1; +} + diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.h b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.h new file mode 100644 index 00000000000..af12e09474a --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/README b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/README new file mode 100644 index 00000000000..ab8aff2ffcd --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/README @@ -0,0 +1,71 @@ +File: DevGuideExamples/Multithreading/ThreadPerConnection/README + + +This directory contains a CORBA example illustrating a simple client and +a server with an interface Messenger. This example is based on the +Getting Started example, but adds concurrent request processing +capabilities to the server using the thread-per-connection concurrency +model. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer -ORBSvcConf server.conf + + +To start the client: +------------------ +./MessengerClient + + +Tip: +---- +Run several clients simultaneously against the server. Each client +should establish a separate connection to the server and each client's +requests should be handled on a separate thread in the server. To +verify this, the server returns the thread ID that handled the request +in the reply message that is printed by the client. + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + +Here is sample output from the Perl script: + +Starting MessengerServer +IOR written to file Messenger.ior + + +Starting 4 MessengerClients. +Each client should get a new connection +and its own thread in the server. + +Reply: Message handled on thread 992 +Reply: Message handled on thread 1952 +Reply: Message handled on thread 1676 +Reply: Message handled on thread 1016 + + +NOTE: + + Since the Perl script starts several clients simultaneously, output + may become garbled since each client writes its output to stdout. + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/ThreadPerConnection.mpc b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/ThreadPerConnection.mpc new file mode 100644 index 00000000000..6173af10a64 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/ThreadPerConnection.mpc @@ -0,0 +1,13 @@ +project(Multithreading*Server): taoexe, portableserver { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(Multithreading*Client): taoexe, anytypecode { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/run_test.pl b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/run_test.pl new file mode 100644 index 00000000000..63d67218306 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/run_test.pl @@ -0,0 +1,74 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +# start MessengerServer + +print STDOUT "Starting MessengerServer\n"; + +$S = new PerlACE::Process("MessengerServer", "-ORBSvcConf server.conf -ORBEndpoint iiop://localhost"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +# start several MessengerClients + +print STDOUT "\n\nStarting 4 MessengerClients.\n"; +print STDOUT "Each client should get a new connection \ +and its own thread in the server.\n\n"; + +$C1 = new PerlACE::Process("MessengerClient"); +$C2 = new PerlACE::Process("MessengerClient"); +$C3 = new PerlACE::Process("MessengerClient"); +$C4 = new PerlACE::Process("MessengerClient"); +$C1->Spawn(); +$C2->Spawn(); +$C3->Spawn(); +$C4->Spawn(); + +$C1RET = $C1->WaitKill(15); +$C2RET = $C2->WaitKill(15); +$C3RET = $C3->WaitKill(15); +$C4RET = $C4->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($C1RET != 0) { + print STDERR "ERROR: Client 1 returned <$C1RET>\n"; + exit 1 ; +} + +if ($C2RET != 0) { + print STDERR "ERROR: Client 1 returned <$C2RET>\n"; + exit 1 ; +} + +if ($C3RET != 0) { + print STDERR "ERROR: Client 1 returned <$C3RET>\n"; + exit 1 ; +} + +if ($C4RET != 0) { + print STDERR "ERROR: Client 1 returned <$C4RET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/server.conf b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/server.conf new file mode 100644 index 00000000000..3b6d80259ef --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPerConnection/server.conf @@ -0,0 +1,2 @@ +# server.conf file for thread-per-connection server. +static Server_Strategy_Factory "-ORBConcurrency thread-per-connection -ORBThreadPerConnectionTimeout 1000" diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger.idl b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger.idl new file mode 100644 index 00000000000..335d899f058 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger.idl @@ -0,0 +1,8 @@ +// Messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerClient.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerClient.cpp new file mode 100644 index 00000000000..d3eac221e2c --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerClient.cpp @@ -0,0 +1,36 @@ +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Read and destringify the Messenger object's IOR. + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Could not get Messenger IOR." << std::endl; + return 1; + } + + // Narrow the IOR to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "IOR was not a Messenger object reference." << std::endl; + return 1; + } + + // Send a message the the Messenger object. + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + // Print the Messenger's reply. + std::cout << "Reply: " << message.in() << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerServer.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerServer.cpp new file mode 100644 index 00000000000..af34d103c0d --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/MessengerServer.cpp @@ -0,0 +1,73 @@ +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +// 1. Define a "task" class for implenting the thread pool threads. +#include <ace/Task.h> + +class ORB_Task : public ACE_Task_Base +{ +public: + ORB_Task (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) { } + virtual ~ORB_Task () { } + virtual int svc () + { + this->orb_->run(); + return 0; + } +private: + CORBA::ORB_var orb_; +}; + +// 2. Establish the number of threads. +static const int nthreads = 4; + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to the RootPOA. + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate the POAManager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a servant. + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // 3. Create and activate threads for the thread pool. + ORB_Task task (orb.in()); + int retval = task.activate (THR_NEW_LWP | THR_JOINABLE, nthreads); + if (retval != 0) { + std::cerr << "Failed to activate " << nthreads << " threads." << std::endl; + return 1; + } + + // 4. Wait for threads to finish. + task.wait(); + + // Clean up. + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.cpp b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.cpp new file mode 100644 index 00000000000..1ef3f40cf89 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.cpp @@ -0,0 +1,41 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/Thread.h> +#include <iostream> + +#include <sstream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char* /*user_name*/, + const char* /*subject*/, + char *& message + ) + throw(CORBA::SystemException) + +{ + CORBA::string_free(message); + + std::ostringstream ostr; + ostr << "Message handled on thread " << ACE_Thread::self(); + message = CORBA::string_dup(ostr.str().c_str()); + return 1; +} + diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.h b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.h new file mode 100644 index 00000000000..af12e09474a --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/README b/TAO/DevGuideExamples/Multithreading/ThreadPool/README new file mode 100644 index 00000000000..1c63df9bc76 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/README @@ -0,0 +1,74 @@ +File: DevGuideExamples/Multithreading/ThreadPool/README + + +This directory contains a CORBA example illustrating a simple client +and a server with an interface Messenger. This example is based on the +Getting Started example, but adds concurrent request processing +capabilities to the server using the thread pool concurrency model. +The server creates 4 threads for the thread pool. + + +How to Run +---------- + +To start the server : +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + +Tip: +---- +Run several clients simultaneously against the server. Some client +requests should be handled by separate threads in the server. To +verify this, the server returns the thread ID that handled the request +in the reply message that is printed by the client. You may see the +same thread used to handle multiple requests, but it is unlikely that +the same thread will be used to handle all of the requests. + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + +Here is sample output from the Perl script: + +Starting MessengerServer +IOR written to file Messenger.ior + + +Starting 9 MessengerClients. +The server should use different threads to handle requests. + +Reply: Message handled on thread 1620 +Reply: Message handled on thread 1620 +Reply: Message handled on thread 1620 +Reply: Message handled on thread 1868 +Reply: Message handled on thread 1592 +Reply: Message handled on thread 1868 +Reply: Message handled on thread 1300 +Reply: Message handled on thread 1620 +Reply: Message handled on thread 1620 + +NOTE: + + Since the Perl script starts several clients simultaneously, output + may become garbled since each client writes its output to stdout. + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/ThreadPool.mpc b/TAO/DevGuideExamples/Multithreading/ThreadPool/ThreadPool.mpc new file mode 100644 index 00000000000..f2b2ee0a993 --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/ThreadPool.mpc @@ -0,0 +1,13 @@ +project(Multithreading*Server): taoexe, portableserver, avoids_minimum_corba { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(Multithreading*Client): taoexe, anytypecode, avoids_minimum_corba { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Multithreading/ThreadPool/run_test.pl b/TAO/DevGuideExamples/Multithreading/ThreadPool/run_test.pl new file mode 100644 index 00000000000..d81c189697f --- /dev/null +++ b/TAO/DevGuideExamples/Multithreading/ThreadPool/run_test.pl @@ -0,0 +1,113 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = PerlACE::LocalFile ("Messenger.ior"); +unlink $ior; + +# start MessengerServer + +print STDOUT "Starting MessengerServer\n"; + +$S = new PerlACE::Process("MessengerServer", "-ORBEndpoint iiop://localhost"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +# start several MessengerClients + +print STDOUT "\n\nStarting 9 MessengerClients.\n"; +print STDOUT "The server should use different threads to handle requests.\n\n"; + +$C1 = new PerlACE::Process("MessengerClient"); +$C2 = new PerlACE::Process("MessengerClient"); +$C3 = new PerlACE::Process("MessengerClient"); +$C4 = new PerlACE::Process("MessengerClient"); +$C5 = new PerlACE::Process("MessengerClient"); +$C6 = new PerlACE::Process("MessengerClient"); +$C7 = new PerlACE::Process("MessengerClient"); +$C8 = new PerlACE::Process("MessengerClient"); +$C9 = new PerlACE::Process("MessengerClient"); +$C1->Spawn(); +$C2->Spawn(); +$C3->Spawn(); +$C4->Spawn(); +$C5->Spawn(); +$C6->Spawn(); +$C7->Spawn(); +$C8->Spawn(); +$C9->Spawn(); + +$C1RET = $C1->WaitKill(15); +$C2RET = $C2->WaitKill(15); +$C3RET = $C3->WaitKill(15); +$C4RET = $C4->WaitKill(15); +$C5RET = $C5->WaitKill(15); +$C6RET = $C6->WaitKill(15); +$C7RET = $C7->WaitKill(15); +$C8RET = $C8->WaitKill(15); +$C9RET = $C9->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($C1RET != 0) { + print STDERR "ERROR: Client 1 returned <$C1RET>\n"; + exit 1 ; +} + +if ($C2RET != 0) { + print STDERR "ERROR: Client 1 returned <$C2RET>\n"; + exit 1 ; +} + +if ($C3RET != 0) { + print STDERR "ERROR: Client 1 returned <$C3RET>\n"; + exit 1 ; +} + +if ($C4RET != 0) { + print STDERR "ERROR: Client 1 returned <$C4RET>\n"; + exit 1 ; +} + +if ($C5RET != 0) { + print STDERR "ERROR: Client 1 returned <$C5RET>\n"; + exit 1 ; +} + +if ($C6RET != 0) { + print STDERR "ERROR: Client 1 returned <$C6RET>\n"; + exit 1 ; +} + +if ($C7RET != 0) { + print STDERR "ERROR: Client 1 returned <$C7RET>\n"; + exit 1 ; +} + +if ($C8RET != 0) { + print STDERR "ERROR: Client 1 returned <$C8RET>\n"; + exit 1 ; +} + +if ($C9RET != 0) { + print STDERR "ERROR: Client 1 returned <$C9RET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/NamingService/Messenger/Messenger.idl b/TAO/DevGuideExamples/NamingService/Messenger/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/Messenger/Messenger.mpc b/TAO/DevGuideExamples/NamingService/Messenger/Messenger.mpc new file mode 100644 index 00000000000..af04735e956 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/Messenger.mpc @@ -0,0 +1,13 @@ +project(NamingService*Server): namingexe, naming_skel { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(NamingService*Client): namingexe { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/NamingService/Messenger/MessengerClient.cpp b/TAO/DevGuideExamples/NamingService/Messenger/MessengerClient.cpp new file mode 100644 index 00000000000..47d4117d0fd --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/MessengerClient.cpp @@ -0,0 +1,50 @@ + +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Find the Naming Service + CORBA::Object_var naming_obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root = + CosNaming::NamingContextExt::_narrow(naming_obj.in()); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Resolve the Messenger object + CosNaming::Name name; + name.length( 2 ); + name[0].id = CORBA::string_dup( "example" ); + name[1].id = CORBA::string_dup( "Messenger" ); + CORBA::Object_var obj = root->resolve_str("example/Messenger"); + + // Narrow the Messenger object reference + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup("Hello!"); + + // Send a message + messenger->send_message("TAO User", "TAO Test", message.inout()); + + std::cout << "Message was sent" << std::endl; + + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/NamingService/Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..3335ca8eb2d --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/MessengerServer.cpp @@ -0,0 +1,63 @@ + +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Find the Naming Service + CORBA::Object_var naming_obj = + orb->resolve_initial_references( "NameService" ); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow( naming_obj.in() ); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Bind the example Naming Context, if necessary + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup( "example" ); + try { + CORBA::Object_var dummy = root->resolve( name ); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = root->bind_new_context( name ); + } + + // Bind the Messenger object + name.length( 2 ); + name[1].id = CORBA::string_dup( "Messenger" ); + + // Create an object + Messenger_i messenger_servant; + PortableServer::ObjectId_var oid = poa->activate_object(&messenger_servant); + obj = poa->id_to_reference( oid.in() ); + root->rebind(name, obj.in()); + + std::cout << "Messenger object bound in Naming Service" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..8215d5e4cef --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.cpp @@ -0,0 +1,34 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.h b/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.h new file mode 100644 index 00000000000..e386c4c71da --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/Messenger/README b/TAO/DevGuideExamples/NamingService/Messenger/README new file mode 100644 index 00000000000..3fe9385257c --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/README @@ -0,0 +1,43 @@ +OMG Naming Service + +File: DevGuideExamples/NamingService/Messenger/README + + +The Original Messenger example, introduced in Chapters 4 and 5 +(GettingStartedUNIX and GettingStartedVC), is modified to utilize the +Naming Service. The client now uses the Naming Service rather than +reading the server object's IOR as a string from a file. + +The Client code is stored in: + +DevGuideExamples/NamingService/Messenger/MessengerClient.cpp + +The Server code is stored in: + +DevGuideExamples/NamingService/Messenger/MessengerServer.cpp + + +How to Run +---------- + +To start the Naming_Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the server: +------------------ +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the client: +------------------ +./MessengerClient -ORBInitRef NameService=file://ns.ior + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the three steps shown +above. This script can be run via the following command: + +./run_test.pl + diff --git a/TAO/DevGuideExamples/NamingService/Messenger/run_test.pl b/TAO/DevGuideExamples/NamingService/Messenger/run_test.pl new file mode 100644 index 00000000000..6042d28aef5 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Messenger/run_test.pl @@ -0,0 +1,58 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + + +$TARGETHOSTNAME = "localhost"; +$def_port = 2809; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; + +unlink $nsiorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Give the server some time +# to bind the object reference +# with the Naming Service +sleep 3; + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); + +if ($C->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $S->Kill(); + $NS->Kill(); + exit 1; +} + +# clean-up + +$C->Kill(); +$S->Kill(); +$NS->Kill(); + +unlink $nsiorfile; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger.idl b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerClient.cpp b/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerClient.cpp new file mode 100644 index 00000000000..97b470fe7de --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerClient.cpp @@ -0,0 +1,46 @@ + +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/Naming/Naming_Client.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Find the Naming Service + TAO_Naming_Client naming_client; + + if (naming_client.init (orb.in ()) != 0) { + std::cerr << "Could not initialize naming client." << std::endl; + return 1; + } + + // Resolve the Messenger object + CosNaming::Name name; + name.length( 2 ); + name[0].id = CORBA::string_dup( "example" ); + name[1].id = CORBA::string_dup( "Messenger" ); + CORBA::Object_var obj = naming_client->resolve(name); + + // Narrow + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + std::cout << "Message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerServer.cpp b/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerServer.cpp new file mode 100644 index 00000000000..e43928265fe --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/MessengerServer.cpp @@ -0,0 +1,62 @@ + +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/Naming/Naming_Client.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Find the Naming Service + TAO_Naming_Client naming_client; + + if(naming_client.init(orb.in()) != 0){ + std::cerr << "Could not initialize naming client." << std::endl; + return 1; + } + + // Bind the example Naming Context, if necessary + CosNaming::Name name; + name.length(1); + name[0].id = CORBA::string_dup("example"); + try { + CORBA::Object_var dummy = naming_client->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = naming_client->bind_new_context( name ); + } + + // Bind the Messenger object + name.length( 2 ); + name[1].id = CORBA::string_dup( "Messenger" ); + + // Create an object + Messenger_i servant; + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + naming_client->rebind(name, obj.in()); + + std::cout << "Messenger object bound in Naming Service" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.cpp new file mode 100644 index 00000000000..bf7f62b4262 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.cpp @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + std::cout << "Hello"; + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.h b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.h new file mode 100644 index 00000000000..e386c4c71da --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/Naming_Client.mpc b/TAO/DevGuideExamples/NamingService/Naming_Client/Naming_Client.mpc new file mode 100644 index 00000000000..06588cc5311 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/Naming_Client.mpc @@ -0,0 +1,13 @@ +project(*Server): namingexe, naming_skel { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): namingexe { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/README b/TAO/DevGuideExamples/NamingService/Naming_Client/README new file mode 100644 index 00000000000..097832f20c3 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/README @@ -0,0 +1,45 @@ +OMG Naming Service + +File: DevGuideExamples/NamingService/Naming_Client/README + + +The example in this directory is a modification of the code given +in the NamingService/Messenger example. It illustrates how to use the +TAO_Naming_Client class for accessing the Naming Service. This class +simplifies the interface for accessing and using the Naming Service. +The TAO_Naming_Client class is used by both the Client and +Server to access the Naming Service. + +The Client code is stored in: + +DevGuideExamples/NamingService/Naming_Client/MessengerClient.cpp + +The Server code is stored in: + +DevGuideExamples/NamingService/Naming_Client/MessengerServer.cpp + + +How to Run +---------- + +To start the Naming_Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior + +To start the server: +------------------ +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the client: +------------------ +./MessengerClient -ORBInitRef NameService=file://ns.ior + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the three steps shown +above. This script can be run via the following command: + +./run_test.pl + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Client/run_test.pl b/TAO/DevGuideExamples/NamingService/Naming_Client/run_test.pl new file mode 100644 index 00000000000..74ab7ac6f5a --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Client/run_test.pl @@ -0,0 +1,61 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + + +$TARGETHOSTNAME = "localhost"; +$def_port = 2809; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; + +unlink $nsiorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file <$nsiorfile>\n"; + $NS->Kill(); + exit 1; +} + +# start MessengerServer +$MessengerServer = "MessengerServer"; +$S = new PerlACE::Process($MessengerServer, $arg_ns_ref); +$S->Spawn(); + +# Give the server some time +# to bind the object reference +# with the Naming Service +sleep 3; + +# start MessengerClient +$MessengerClient = "MessengerClient"; +$C = new PerlACE::Process($MessengerClient, $arg_ns_ref ); + +if ($C->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $S->Kill(); + $NS->Kill(); + exit 1; +} + + +# clean-up + +$C->Kill(); +$S->Kill(); +$NS->Kill(); + +unlink $nsiorfile; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger.idl b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerClient.cpp b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerClient.cpp new file mode 100644 index 00000000000..246ca22262d --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerClient.cpp @@ -0,0 +1,50 @@ + +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +#include <fstream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + char url[200]; + std::ifstream iorFile( "url.ior" ); + iorFile >> url; + iorFile.close(); + + std::cout << "url: " << url << std::endl; + + // Find the Naming Service & the Message Server name in it + CORBA::Object_var obj = orb->string_to_object(url); + + // Narrow + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup("Hello!"); + messenger->send_message( "TAO User", "TAO Test", message.inout()); + + std::cout << "Message was sent" << std::endl; + + std::cout << "Now try the same thing with the simple name." << std::endl; + obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root = + CosNaming::NamingContextExt::_narrow(obj.in()); + obj = root->resolve_str("Simple/Messenger"); + messenger = Messenger::_narrow(obj.in()); + messenger->send_message( "ACE User", "TAO Test", message.inout()); + + std::cout << "Message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerServer.cpp b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerServer.cpp new file mode 100644 index 00000000000..9b1307f477b --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/MessengerServer.cpp @@ -0,0 +1,127 @@ + +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +#include <fstream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Find the Naming Service + obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var root = + CosNaming::NamingContextExt::_narrow(obj.in()); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Bind a new context. + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup( "root.esc-dot" ); + name[0].kind = CORBA::string_dup( "kind1" ); + + try { + obj = root->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = root->bind_new_context(name); + } + + name.length( 2 ); + name[1].id = CORBA::string_dup( "leaf/esc-slash" ); + name[1].kind = CORBA::string_dup( "kind2" ); + + // Create an object + Messenger_i servant; + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var messenger_obj = poa->id_to_reference(oid.in()); + root->rebind(name, messenger_obj.in()); + + // Also try rebinding to a simple path. + CosNaming::Name_var simp_name = root->to_name("Simple"); + try { + obj = root->resolve(simp_name.in()); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = + root->bind_new_context(simp_name.in()); + } + simp_name = root->to_name("Simple/Messenger"); + root->rebind(simp_name.in(), messenger_obj.in()); + + // Convert Name to String Name. + CORBA::String_var str_name = root->to_string(name); + std::cout << "str_name: " << str_name.in() << std::endl; + CORBA::String_var str_simple = root->to_string(simp_name.in()); + std::cout << "simple: " << str_simple.in() << std::endl; + + // Convert String Name to Name. + CosNaming::Name_var tname = root->to_name(str_name.in()); + + std::cout << "converted back to a CosNaming::Name: " << std::endl; + std::cout << " name[0] = " << (* tname)[0].id.in() << " , " + << (* tname)[0].kind.in() << std::endl; + std::cout << " name[1] = " << (* tname)[1].id.in() << " , " + << (* tname)[1].kind.in() << std::endl; + + // Find the application object by resolve_str. + try { + obj = root->resolve_str(str_name.in()); + } + catch(const CosNaming::NamingContext::NotFound&) { + std::cerr<<"Couldn't resolve the string name: " << str_name << std::endl; + return 1; + } + + // Create an URL string for application object. + CORBA::String_var address = CORBA::string_dup (":localhost:2809/key/str"); + + std::cout << "call to_url(\"" << address.in() << "\"" << std::endl; + std::cout << " ,\"" << str_simple.in() << "\")"<< std::endl; + + CORBA::String_var url_string = root->to_url(address.in(), str_simple.in()); + + std::cout << "to_url result: " << url_string.in() << std::endl; + + + // Write NS url to a file to let client read NS URL to get + // NamingContext reference. + CORBA::String_var ns_addr = CORBA::string_dup(":localhost:2809"); + + std::cout << "call to_url(\"" <<ns_addr.in() << "\",\"" + << str_simple.in() << "\")"<< std::endl; + + CORBA::String_var url = root->to_url(ns_addr.in(), str_simple.in()); + std::cout << "to_url result: " << url.in() << std::endl; + + + std::ofstream iorFile("url.ior"); + iorFile << url.in() << std::endl; + iorFile.close(); + + std::cout << "Naming Service URL written to file url.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.cpp new file mode 100644 index 00000000000..bf37e302a03 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.cpp @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.h b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.h new file mode 100644 index 00000000000..c94ed6ed7ae --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc new file mode 100644 index 00000000000..06588cc5311 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/Naming_Context_Ext.mpc @@ -0,0 +1,13 @@ +project(*Server): namingexe, naming_skel { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): namingexe { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/README b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/README new file mode 100644 index 00000000000..956b719eadf --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/README @@ -0,0 +1,32 @@ + +DevGuideExamples/NamingService/Naming_Context_Ext/README + +The example in this directory illustratues how to convert between CosNames, +Stringified Names, and URLs. + +A Name can be converted to a stringified Name by to_string operation. A stringified +Name can be converted to a Name by to_name operation. The resolve_str operation +resolves an object by passing a strigified Name. + +The MessengerServer writes its corbaname URL to a file by calling to_url and +the MessengerClient reads the URL file to get the MessengerServer object reference. + + + +How to Run: +----------- +To start the Naming_Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -ORBEndPoint iiop://localhost:2809 & + + +To start the server: +------------------ +./MessengerServer -ORBInitRef NameService=iiop://localhost:2809/NameService + + +To start the client: +------------------ +./MessengerClient + + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/run_test.pl b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/run_test.pl new file mode 100644 index 00000000000..d67c19f4ba7 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Context_Ext/run_test.pl @@ -0,0 +1,54 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsref="-ORBInitRef NameService=iiop://localhost:2809/NameService"; +$nsior = "ns.ior"; +$ior="url.ior"; +unlink $ior; + +# start Naming Service +unlink($nsior); +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-ORBEndPoint iiop://localhost:2809 -o $nsior"); +$NS->Spawn(); + +if (PerlACE::waitforfile_timed ($nsior, 10) == -1) { + print STDERR "ERROR: cannot find IOR file <$nsior>\n"; + $NS->Kill (); + exit 1; +} + +# start MessengerServer +$MessengerServer = "MessengerServer"; +$S = new PerlACE::Process($MessengerServer, $nsref ); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($ior, 15) == -1) { + print STDERR "ERROR: cannot find file $ior\n"; + $NS->Kill(); + $S->Kill(); + exit 1; +} + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $nsref); +if ($C->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $S->Kill(); + $NS->Kill(); + exit 1; +} + +# clean-up +$S->Kill(); +$NS->Kill(); +unlink $ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger.idl b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.cpp b/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.cpp new file mode 100644 index 00000000000..05fa548cd75 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.cpp @@ -0,0 +1,82 @@ +#include "MessengerTask.h" +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +MessengerTask::MessengerTask() +{ + // cast away constness to make Sun CC family of compilers happy. + char* argv[] = {const_cast<char *>("Messenger"), 0 }; + int argc = 1; + orb_ = CORBA::ORB_init(argc, argv, "ServerORB"); +} + +void MessengerTask::end() +{ + orb_->shutdown(0); + wait(); +} + +int MessengerTask::svc() +{ + + try { + // Get reference to Root POA + CORBA::Object_var obj = orb_->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Find the Naming Service + obj = orb_->resolve_initial_references("NameService"); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow(obj.in()); + + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + // Bind the example Naming Context, if necessary + CosNaming::Name name; + name.length(1); + name[0].id = CORBA::string_dup("example"); + try { + root->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) { + root->bind_new_context(name); + } + + // Bind the Messenger object + name.length(2); + name[1].id = CORBA::string_dup("Messenger"); + + // Create an object + Messenger_i servant; + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + root->rebind(name, obj.in()); + + std::cout << "Messenger object bound in Naming Service" << std::endl; + + // Normally we run the orb and the orb is shutdown by + // calling MessengerTask::end(). To simplify the coordination + // between the main thread and this Messenger thread, specify + // the time period to let the Messenger thread finish by itself. + // Accept requests + ACE_Time_Value tv(1); + orb_->run(tv); + orb_->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) { + std::cerr << "CORBA exception: " << ex << std::endl; + } + + return -1; +} + + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.h b/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.h new file mode 100644 index 00000000000..bf6f5ea22fb --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/MessengerTask.h @@ -0,0 +1,18 @@ +#ifndef MESSENGERTASK_H +#define MESSENGERTASK_H + +#include <tao/corba.h> +#include <ace/Task.h> + +class MessengerTask : public ACE_Task_Base +{ +public: + MessengerTask(); + virtual int svc(); + + void end(); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.cpp new file mode 100644 index 00000000000..63306d0951e --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.cpp @@ -0,0 +1,37 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" + +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.h b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.h new file mode 100644 index 00000000000..c94ed6ed7ae --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/Messenger_i.h @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/NamingMessenger.cpp b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingMessenger.cpp new file mode 100644 index 00000000000..8b1eac7a372 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingMessenger.cpp @@ -0,0 +1,23 @@ +#include "NamingTask.h" +#include "MessengerTask.h" +#include <ace/OS.h> + +int main(int argc, char* argv[]) +{ + // Start the Naming Service task + NamingTask namingService(argc, argv); + namingService.activate(); + // Wait for the Naming Service initialized. + namingService.waitInit(); + + // Start the Messenger task + MessengerTask messenger; + messenger.activate(); + + // Wait the Messenger task finish. + messenger.wait(); + // Shutdown the Naming Service. + namingService.end(); + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.cpp b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.cpp new file mode 100644 index 00000000000..fae419b9364 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.cpp @@ -0,0 +1,64 @@ +#include "NamingTask.h" +#include <orbsvcs/Naming/Naming_Server.h> +#include <ace/OS_NS_unistd.h> +#include <iostream> + +NamingTask::NamingTask (int argc, char** argv) +: argc_ (argc), + argv_ (argv), + initialized_(false) +{ + orb_ = CORBA::ORB_init(argc, argv, "NamingORB"); +} + +void NamingTask::waitInit () +{ + // Wait for Naming Service initialized. + while (! initialized_) { + ACE_OS::sleep(ACE_Time_Value(0, 100 * 1000)); + } +} + +void NamingTask::end() +{ + orb_->shutdown(0); + wait(); +} + +int NamingTask::svc() +{ + try { + // Get reference to Root POA + CORBA::Object_var obj = orb_->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA Manager + PortableServer::POAManager_var poaManager = poa->the_POAManager(); + poaManager->activate(); + + // Initialize the naming service + // We are not going to look for other naming servers + TAO_Naming_Server naming; + if (naming.init(orb_.in(), + poa.in(), + ACE_DEFAULT_MAP_SIZE, + 0, + 0) == 0) { + std::cout << "The Naming Service Task is ready." << std::endl; + initialized_ = true; + // Accept requests + orb_->run(); + orb_->destroy(); + return 0; + } + else { + std::cerr << "Unable to initialize the Naming Service." << std::endl; + } + } + catch(const CORBA::Exception& ex) { + std::cerr << "NamingTask::svc() CORBA::Exception: " << ex << std::endl; + } + + return -1; +} + diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.h b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.h new file mode 100644 index 00000000000..9c7756497cf --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/NamingTask.h @@ -0,0 +1,22 @@ +#ifndef NAMINGTASK_H +#define NAMINGTASK_H + +#include <tao/corba.h> +#include <ace/Task.h> + +class NamingTask : public ACE_Task<ACE_MT_SYNCH> +{ +public: + NamingTask (int argc, char** argv); + virtual int svc(); + void waitInit (); + void end(); + +private: + int argc_; + char **argv_; + CORBA::ORB_var orb_; + bool initialized_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/Naming_Server.mpc b/TAO/DevGuideExamples/NamingService/Naming_Server/Naming_Server.mpc new file mode 100644 index 00000000000..225dcbfea04 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/Naming_Server.mpc @@ -0,0 +1,3 @@ +project(*Messenger): namingexe, naming_serv { + requires += threads +} diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/README b/TAO/DevGuideExamples/NamingService/Naming_Server/README new file mode 100644 index 00000000000..0660fa94e7e --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/README @@ -0,0 +1,39 @@ +OMG Naming Service + +File: DevGuideExamples/NamingService/Naming_Server/README + +The example in NamingService/Naming_Client is modified to utilize +the TAO_Naming_Server class. This class enables the Naming Service +to easily be collocated within an application. In this example, +the Naming Service is collocated with a server that supports the +Messenger Interface described in GettingStartedUNIX (or GettingStartedVC). + +The Server code is stored in: + +DevGuideExamples/NamingService/Naming_Server/MessengerServer.cpp + + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer -o ns.ior + +To start the client: +------------------ +./MessengerClient -ORBInitRef NameService=file://ns.ior + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the three steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: This example has been changed from the example that appears in the +dev-guide in order to pass command line parameters to the thread +that runs the naming server. diff --git a/TAO/DevGuideExamples/NamingService/Naming_Server/run_test.pl b/TAO/DevGuideExamples/NamingService/Naming_Server/run_test.pl new file mode 100644 index 00000000000..d2e2b3e0830 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/Naming_Server/run_test.pl @@ -0,0 +1,18 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$CS = new PerlACE::Process("NamingMessenger"); + +if ($CS->SpawnWaitKill(10) != 0) { + exit 1; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger.idl b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerClient.cpp b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerClient.cpp new file mode 100644 index 00000000000..a57f0676f92 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerClient.cpp @@ -0,0 +1,53 @@ + +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + const char* url = "corbaloc:rir:/NameService"; // default URL to InitRef + if ( argc < 2 ) { + std::cout << "Defaulting URL to " << url << std::endl; + std::cout << "Usage: " << argv[0] + << " [corbaloc URL] [-ORB options]" << std::endl; + } + else { + url = argv[1]; + } + + // Find the Naming Service + CORBA::Object_var obj = orb->string_to_object(url); + + CosNaming::NamingContextExt_var root = + CosNaming::NamingContextExt::_narrow(obj.in()); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Resolve the Messenger object + obj = root->resolve_str("example/Messenger"); + + // Narrow + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message("TAO User", "TAO Test", message.inout()); + + std::cout << "Message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "client:Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..47d29379dc4 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/MessengerServer.cpp @@ -0,0 +1,63 @@ + +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + + // Find the Naming Service + obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow(obj.in()); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Bind the example Naming Context, if necessary + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup("example"); + try { + obj = root->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = root->bind_new_context(name); + } + + // Bind the Messenger object + name.length(2); + name[1].id = CORBA::string_dup("Messenger"); + + // Create an object + Messenger_i servant; + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + Messenger_var messenger = Messenger::_narrow(obj.in()); + root->rebind(name, messenger.in()); + + std::cout << "Messenger object bound in Naming Service" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "server: Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..8f75d589951 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.cpp @@ -0,0 +1,33 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) +{ + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.h b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.h new file mode 100644 index 00000000000..e386c4c71da --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/README b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/README new file mode 100644 index 00000000000..94d7be77c45 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/README @@ -0,0 +1,171 @@ + +DevGuideExamples/NamingService/corbaloc_Messenger/README + +The example in this directory extends the example in GettingStartedUNIX +(or GettingStartedVC) to use the Naming_Service +and calling string_to_object instead of calling resolve_initial_references +to get the NameService object reference. + +This example only differs from the NamingService/Messenger example by a few lines +in the MessengerClient.cpp. (All other source files should be the same.) + +How to Run: +----------- +To start the Naming_Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -m 1 & + +Note: Must start the Naming_Service using multicast (-m 1) + for the default initial reference for NameService to work. + +To start the server: +------------------ +./MessengerServer +To start the client: +------------------ +./MessengerClient + + +This MessengerClient will optionally take parameter that is a URL (corbaloc:) +that addresses the Naming_Service. + +The MessengerServer and MessengerClient may also take an -ORBInitRef option +to help qualify the address of the Naming_Service. + +Here are some examples: + +REM start the name server +cd/d %TAO_ROOT%\orbsvcs\Naming_Service +title NS +Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0 + +REM start the example server +cd/d %EXAMPLES%\NamingService\corbaloc_Messenger\Debug +title server +REM use -ORBInitRef with IIOP +MessengerServer -ORBInitRef NameService=iiop://localhost:2809/NameService + +REM use -ORBDefaultInitRef with specific host and port +MessengerServer -ORBDefaultInitRef iiop://localhost:2809 + +REMuse -ORBDefaultInitRef <port 2809 is the default if not specified. +MessengerServer -ORBDefaultInitRef corbaloc::localhost + +REM crashes - ? is this a bug? +MessengerServer -ORBDefaultInitRef corbaloc:rir:/ + +REM -ORBInitRef with corbaloc and default port +MessengerServer -ORBInitRef NameService=corbaloc::localhost/NameService +REM and specific port +MessengerServer -ORBInitRef NameService=corbaloc::localhost:2809/NameService + +REM crashes +MessengerServer -ORBInitRef NameService=corbaloc:rir/NameService + +REM start the client +cd/d %EXAMPLES%\NamingService\corbaloc_Messenger\Debug +title client +MessengerClient -ORBInitRef NameService=iiop://localhost:2809/NameService corbaloc:rir:/NameService + + +REM use -ORBDefaultInitRef with specific host and default port == 2809 +MessengerClient -ORBDefaultInitRef corbaloc::localhost corbaloc:rir:/NameService + +REM use a corbaloc that does not require -ORBDefaultInitRef (port defaults) +MessengerClient corbaloc::localhost/NameService + +=========================== +REM !!! kill the previous Naming_Service and MessengerServer !!! + +REM start the name server (at another address) +cd/d %TAO_ROOT%\orbsvcs\Naming_Service +Naming_Service -ORBEndpoint iiop://localhost:9999 -m 0 + +REM start the example server +cd/d %EXAMPLES%\NamingService\corbaloc_Messenger\Debug +MessengerServer -ORBInitRef NameService=iiop://localhost:9999/NameService + + + +REM start the client +cd/d %EXAMPLES%\NamingService\corbaloc_Messenger\Debug +MessengerClient -ORBInitRef NameService=iiop://localhost:9999/NameService + + + +MessengerClient -ORBInitRef NameService=iiop://localhost:9999/NameService +Usage: MessengerClient [-ORB options] [corbaname URL for the name service] + +MessengerClient -ORBInitRef NameService=iiop://localhost:9999/NameService corbaloc:rir:/NameService +Message was sent + +MessengerClient -ORBInitRef NameService=iiop://localhost:9999/NameService corbaloc:rir:/ +Message was sent + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc:rir:/ +Caught a CORBA exception: TRANSIENT (IDL:omg.org/CORBA/TRANSIENT:1.0) + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc:iiop:localhost:9999/NameService +Message was sent + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc:localhost:9999/NameService +TAO (249|231) no usable transport protocol was found. +Caught a CORBA exception: BAD_PARAM (IDL:omg.org/CORBA/BAD_PARAM:1.0) + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc::localhost:9999/NameService +Message was sent + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc::1.0\localhost:9999/NameService +Caught a CORBA exception: TRANSIENT (IDL:omg.org/CORBA/TRANSIENT:1.0) + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc::1.0\@localhost:9999/NameService +Caught a CORBA exception: TRANSIENT (IDL:omg.org/CORBA/TRANSIENT:1.0) + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc::localhost:9999/NameService +Message was sent + +MessengerClient -ORBInitRef NameService=iiop://localhost:9669/NameService corbaloc::localhost/NameService +Caught a CORBA exception: TRANSIENT (IDL:omg.org/CORBA/TRANSIENT:1.0) + + + +===================== IIOPLOC ================= +REM iioploc: is TAO specific and deprecated + +REM start the name server +cd/d %TAO_ROOT%\orbsvcs\Naming_Service +title NS +Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0 + +REM -ORBInitRef with iioploc (TAO specific and deprecated) +MessengerServer -ORBInitRef NameService=iioploc://localhost:2809/NameService + +cd/d %EXAMPLES%\NamingService\corbaloc_Messenger\Debug +title client +MessengerClient iioploc://localhost:2809/NameService + +===== MCAST example ====== +!!! only on platforms supporting multicast (not Windows) !!! + + +# start the name server using MultiCast +cd $TAO_ROOT/orbsvcs/Naming_Service +Naming_Service -m 1 + +# start the example server +cd $EXAMPLES/NamingService/corbaloc_Messenger +MessengerServer + +cd $EXAMPLES/NamingService/corbaloc_Messenger +MessengerClient + + +--- specify the multicast address. +Naming_Service -m 1 -ORBNameServicePort 12345 +# -ORBNameServicePort 12345 is ingored if -m 1 is not specified. + + +MessengerServer -ORBInitRef NameService=mcast://:12345::/NameService + + +<TBD more using URL parameter> diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc new file mode 100644 index 00000000000..06588cc5311 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/corbaloc_Messenger.mpc @@ -0,0 +1,13 @@ +project(*Server): namingexe, naming_skel { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): namingexe { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/run_test.pl b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/run_test.pl new file mode 100644 index 00000000000..82ff480aca7 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaloc_Messenger/run_test.pl @@ -0,0 +1,109 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + + +$TARGETHOSTNAME = "localhost"; +$def_port = 2809; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-ORBEndpoint iiop://$TARGETHOSTNAME:$def_port"); +$NS->Spawn(); + +sleep(1); + +# List of tests to test corbaloc URL syntax. +@corbaloc_servers = ( "-ORBDefaultInitRef corbaloc::$TARGETHOSTNAME", + "-ORBInitRef NameService=corbaloc::$TARGETHOSTNAME/NameService", + "-ORBInitRef NameService=corbaloc::$TARGETHOSTNAME:$def_port/NameService"); + + +@servers_comments = ( "Using -ORBDefaultInitRef with default port $def_port and default transport IIOP: \n", + "Using -ORBInitRef with corbaloc URL: \n", + "Using -ORBInitRef with corbaloc URL and specified port: \n"); + +@corbaloc_clients = ( "corbaloc::$TARGETHOSTNAME/NameService", + "-ORBInitRef NameService=iiop://$TARGETHOSTNAME:$def_port/NameService corbaloc:rir:/NameService"); + +@clients_comments = ( "Using the URL parameter: \n"); + "Using a corbaloc:rir form URL(must specify initial reference): \n", + + + + +$MessengerServer= "MessengerServer"; +$MessengerClient= "MessengerClient"; + +$test_number = 0; + +foreach $o (@corbaloc_servers) { + + # Run messenger server for each test. + #print "Start $MessengerServer $o \n"; + $SR = new PerlACE::Process($MessengerServer, $o); + $SR->Spawn(); + + sleep(1); + + #print "Start $MessengerClient \n"; + $CL = new PerlACE::Process($MessengerClient, "-ORBDefaultInitRef iiop://$TARGETHOSTNAME:$def_port"); + $test_number++; + + if ($CL->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $SR->Kill(); + $NS->Kill(); + exit 1; + } + + print "======================================\n"; + print "Finish Test $test_number: $servers_comments[$test_number] \n"; + print " $MessengerServer $o\n"; + print "======================================\n\n"; + + $SR->Kill(1); +} + + +#print "Start $MessengerServer \n"; +$SR = new PerlACE::Process($MessengerServer, "-ORBDefaultInitRef iiop://$TARGETHOSTNAME:$def_port"); +$SR->Spawn(); + +sleep(1); + +$i = 0; +foreach $o (@corbaloc_clients) { + + # Run the client for each test. + #print "Start $MessengerClient $o \n"; + $CL = new PerlACE::Process($MessengerClient, $o); + + + if ($CL->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $SR->Kill(); + $NS->Kill(); + exit 1; + } + + $test_number++; + print "======================================\n"; + print "Finish Test $test_number: $clients_comments[$i]\n"; + print " $MessengerClient $o"; + print "\n======================================\n\n"; + + $i ++; +} + + +# clean up + +$SR->Kill(); +$NS->Kill(); + +exit 0; diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger.idl b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerClient.cpp b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerClient.cpp new file mode 100644 index 00000000000..f8166069f8e --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerClient.cpp @@ -0,0 +1,42 @@ + +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + const char *url = "corbaname:rir:#example/Messenger"; // default URL to InitRef + if ( argc < 2 ) { + std::cout << "Defaulting URL to " << url << std::endl; + std::cout << "Usage: " << argv[0] + << " [-ORB options] [corbaname URL for message server]" << std::endl; + } + else { + url = argv[1]; + } + + // Find the Naming Service & the Message Server name in it + CORBA::Object_var obj = orb->string_to_object(url); + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + std::cout << "Message was sent" << std::endl; + } + catch(const CORBA::Exception& ex) { + std::cerr << "client:Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..57c577ecedd --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/MessengerServer.cpp @@ -0,0 +1,62 @@ + +#include "Messenger_i.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Find the Naming Service + obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow(obj.in()); + if (CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Bind the example Naming Context, if necessary + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup("example"); + try { + CORBA::Object_var dummy = root->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) { + CosNaming::NamingContext_var dummy = root->bind_new_context( name ); + } + + // Bind the Messenger object + name.length( 2 ); + name[1].id = CORBA::string_dup("Messenger"); + + // Create an object + Messenger_i servant; + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + obj = poa->id_to_reference(oid.in()); + Messenger_var messenger = Messenger::_narrow(obj.in()); + root->rebind(name, messenger.in()); + + std::cout << "Messenger object bound in Naming Service" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "server:Caught a CORBA::Exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..fd6a487bd02 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.cpp @@ -0,0 +1,33 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.h b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.h new file mode 100644 index 00000000000..0a3c9f1a2e8 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/Messenger_i.h @@ -0,0 +1,36 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/README b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/README new file mode 100644 index 00000000000..c6cd18edbbc --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/README @@ -0,0 +1,64 @@ + +DevGuideExamples/NamingService/corbaname_Messenger/README + +The example in this directory extends the example in GettingStartedUNIX +(or GettingStartedVC) to use the Naming_Service +and calling string_to_object instead of calling resolve_initial_references +to get the NameService object reference and look up the service in the Naming_Service. + +This example only differs from the NamingService/Messenger example by a few lines +in the MessengerClient.cpp. (All other source files should be the same.) + +How to Run: +----------- +To start the Naming_Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service & + +To start the server: +------------------ +./MessengerServer + +To start the client: +------------------ +./MessengerClient + + +This MessengerClient will optionally take parameter that is a URL (corbaname:) +that addresses the Naming_Service and the MessengerServer within it. + +The MessengerServer and MessengerClient may also take an -ORBInitRef option +to help qualify the address of the Naming_Service. + +Here are some examples: + +REM start the name server +cd/d %TAO_ROOT%\orbsvcs\Naming_Service +title NS +Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0 + +REM start the example server +cd/d %EXAMPLES%\NamingService\corbaname_Messenger\Debug +title server +REM use -ORBInitRef with IIOP +MessengerServer -ORBInitRef NameService=iiop://localhost:2809/NameService + + + +REM start the client +cd/d %EXAMPLES%\NamingService\corbaname_Messenger\Debug +title client + +REM use a corbaname that does not require -ORBDefaultInitRef +MessengerClient corbaname:iiop:localhost:2809#example/Messenger + +REM defaults to iiop protocol +MessengerClient corbaname::localhost:2809#example/Messenger + +REM default protocol (iiop) and default port (2809) +MessengerClient corbaname::localhost#example/Messenger + + + +REM use RIR +MessengerClient -ORBInitRef NameService=iiop://localhost:2809/NameService corbaname:rir:#example/Messenger diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/corbaname_Messenger.mpc b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/corbaname_Messenger.mpc new file mode 100644 index 00000000000..06588cc5311 --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/corbaname_Messenger.mpc @@ -0,0 +1,13 @@ +project(*Server): namingexe, naming_skel { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): namingexe { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/NamingService/corbaname_Messenger/run_test.pl b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/run_test.pl new file mode 100644 index 00000000000..4f903b76aea --- /dev/null +++ b/TAO/DevGuideExamples/NamingService/corbaname_Messenger/run_test.pl @@ -0,0 +1,70 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + + +$TARGETHOSTNAME = "localhost"; +$def_port = 2809; +$nsior = "ns.ior"; + +# start Naming Service +unlink($nsior); +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-ORBEndpoint iiop://$TARGETHOSTNAME:$def_port -o $nsior"); +$NS->Spawn(); + +if (PerlACE::waitforfile_timed ($nsior, 10) == -1) { + print STDERR "ERROR: cannot find IOR file <$nsior>\n"; + $NS->Kill (); + exit 1; +} + +# start the server +print "Start Messenger Server \n"; +$SR = new PerlACE::Process("MessengerServer", + "-ORBInitRef NameService=iiop://$TARGETHOSTNAME:$def_port/NameService"); +$SR->Spawn(); +sleep(2); + + +@corbaname_clients = ("corbaname:iiop:$TARGETHOSTNAME:2809#example/Messenger", + "corbaname::$TARGETHOSTNAME:2809#example/Messenger", + "corbaname::$TARGETHOSTNAME#example/Messenger", + "-ORBInitRef NameService=iiop://$TARGETHOSTNAME:2809/NameService corbaname:rir:#example/Messenger"); + +@clients_comments = ( "Using a corbaname that does not require -ORBDefaultInitRef: \n", + "Using defaults to iiop protocol: \n", + "Using default protocol (iiop) and default port ($def_port): \n", + "Using Resolve Initial Reference form(must tell ORB where NS is located with -ORBInitRef)\n"); + +# Run the client for each of the corbaname test. +$test_number = 0; +foreach $o (@corbaname_clients) { + + $CL = new PerlACE::Process("MessengerClient", $o); + + if ($CL->SpawnWaitKill(15) != 0) { + print STDERR "ERROR: client failed\n"; + $SR->Kill(); + $NS->Kill(); + exit 1; + } + + $test_number++; + + print "======================================\n"; + print "Finish Test $test_number: $clients_comments[$test_number]\n"; + print " $CL_NAME $o\n"; + print "======================================\n\n"; + +} + +# clean up +$SR->Kill (); +$NS->Kill (); + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequence.mpc b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequence.mpc new file mode 100644 index 00000000000..601d07f9c13 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequence.mpc @@ -0,0 +1,24 @@ +project(*Server): portableserver, orbsvcsexe, notification_skel, naming { + Source_Files { + EventSequenceSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): orbsvcsexe, notification, naming { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): portableserver, orbsvcsexe, notification_skel, naming { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + EventSequenceConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.cpp new file mode 100644 index 00000000000..d64c99f503e --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.cpp @@ -0,0 +1,50 @@ +#include "EventSequenceConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +EventSequenceConsumer_i::EventSequenceConsumer_i(CORBA::ORB_ptr orb) +: orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +EventSequenceConsumer_i::push_structured_events ( + const CosNotification::EventBatch& events + ) + throw (CORBA::SystemException, CosEventComm::Disconnected) +{ + + std::cout << "events received " << std::endl; + + const char* value = 0; + + for (unsigned int n = 0; n < events.length(); ++n) { + for (unsigned int i = 0; i < events[n].filterable_data.length(); ++i) { + events[n].filterable_data[i].value >>= value; + std::cout << events[n].filterable_data[i].name.in() << "\t" << value << std::endl; + } + } +} + +void +EventSequenceConsumer_i::disconnect_sequence_push_consumer () +throw(CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id(); + poa->deactivate_object(objectId.in()); + +} + +void +EventSequenceConsumer_i::offer_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.h b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.h new file mode 100644 index 00000000000..4ebd891c034 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceConsumer_i.h @@ -0,0 +1,28 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class EventSequenceConsumer_i : public POA_CosNotifyComm::SequencePushConsumer +{ +public: + EventSequenceConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_events ( + const CosNotification::EventBatch & events + ) + throw (CORBA::SystemException, CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); + + virtual void disconnect_sequence_push_consumer () + throw(CORBA::SystemException); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.cpp new file mode 100644 index 00000000000..10289d3c1f4 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.cpp @@ -0,0 +1,31 @@ +#include "EventSequenceSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +EventSequenceSupplier_i::EventSequenceSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +EventSequenceSupplier_i::disconnect_sequence_push_supplier () + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +EventSequenceSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.h b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.h new file mode 100644 index 00000000000..fd4c472d9e7 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/EventSequenceSupplier_i.h @@ -0,0 +1,23 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class EventSequenceSupplier_i : public POA_CosNotifyComm::SequencePushSupplier +{ +public: + // Constructor + EventSequenceSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_sequence_push_supplier () + throw(CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger.idl b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger.idl new file mode 100644 index 00000000000..54ab8dac3e0 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger.idl @@ -0,0 +1,7 @@ +// messenger.idl +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerClient.cpp new file mode 100644 index 00000000000..d2937e5d3f1 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerClient.cpp @@ -0,0 +1,39 @@ +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object("file://Messenger.ior"); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = + CORBA::string_dup("Where can I get TAO?"); + + messenger->send_message ( + "person@company.com", + "OCI's Distribution of TAO", + message.inout()); + } + catch(const CORBA::Exception& ex) + { + std::cerr << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerConsumer.cpp new file mode 100644 index 00000000000..35d5b2817ba --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerConsumer.cpp @@ -0,0 +1,86 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "EventSequenceConsumer_i.h" +#include <iostream> + +int +main(int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + + CosNaming::NamingContextExt_var naming_context = + CosNaming::NamingContextExt::_narrow(obj.in()); + + obj = naming_context->resolve_str("MyEventChannel"); + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(obj.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + obj = orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = PortableServer::POA::_narrow (obj.in()); + + EventSequenceConsumer_i servant(orb.in()); + + PortableServer::ObjectId_var objectId = poa->activate_object(&servant); + + obj = poa->id_to_reference (objectId.in()); + CosNotifyComm::SequencePushConsumer_var consumer = + CosNotifyComm::SequencePushConsumer::_narrow(obj.in()); + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::SEQUENCE_EVENT, + consumeradmin_proxy_id); + + CosNotifyChannelAdmin::SequenceProxyPushSupplier_var supplier_proxy = + CosNotifyChannelAdmin::SequenceProxyPushSupplier::_narrow(proxy_supplier.in()); + + supplier_proxy->connect_sequence_push_consumer(consumer.in()); + + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + supplier_proxy->subscription_change(added, removed); + + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + + poa_manager->activate(); + + orb->run(); + + orb->destroy(); + + return 0; + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + } + return 1; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerServer.cpp new file mode 100644 index 00000000000..a950d7522e3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/MessengerServer.cpp @@ -0,0 +1,51 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContextExt_var rootNC = + CosNaming::NamingContextExt::_narrow(obj.in()); + + obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + Messenger_i messenger_servant (orb.in()); + PortableServer::ObjectId_var oid = poa->activate_object (&messenger_servant); + obj = poa->id_to_reference(oid.in()); + CORBA::String_var str = orb->object_to_string (obj.in()); + + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) + { + std::cerr << " Caught Exception: " << ex << std::endl; + return 1; + } + + return 0; + +} + + + + + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.cpp new file mode 100644 index 00000000000..dfc5aecead6 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.cpp @@ -0,0 +1,125 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "Messenger_i.h" +#include "EventSequenceSupplier_i.h" + +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) +: orb_ (CORBA::ORB::_duplicate (orb)) +, supplier_(new EventSequenceSupplier_i(orb)) +{ + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + CosNaming::NamingContextExt_var naming_context = + CosNaming::NamingContextExt::_narrow (naming_obj.in()); + + CORBA::Object_var obj = naming_context->resolve_str("NotifyEventChannelFactory"); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ()); + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + CosNaming::Name_var name = naming_context->to_name("MyEventChannel"); + naming_context->rebind(name.in(), ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::SEQUENCE_EVENT, + supplieradmin_proxy_id); + + CORBA::Object_var poa_obj = orb_->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (poa_obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate (); + + PortableServer::ObjectId_var objectId = poa->activate_object(supplier_.get()); + CORBA::Object_var supplier_obj = poa->id_to_reference(objectId.in()); + + CosNotifyComm::SequencePushSupplier_var supplier = + CosNotifyComm::SequencePushSupplier::_narrow(supplier_obj.in()); + + consumer_proxy_ = + CosNotifyChannelAdmin::SequenceProxyPushConsumer::_narrow(proxy_consumer.in()); + + consumer_proxy_->connect_sequence_push_supplier(supplier.in()); +} + + +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException) +{ + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // OptionalHeaderFields + // PropertySeq + + // sequence<Property>: string name, any value + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + std::cout << "pushing " << std::endl; + CosNotification::EventBatch events; + events.length(4); + events[0] = event; + events[1] = event; + events[2] = event; + events[3] = event; + + consumer_proxy_->push_structured_events(events); + + return 1; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.h new file mode 100644 index 00000000000..ca025474fb0 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/Messenger_i.h @@ -0,0 +1,36 @@ +#ifndef MESSENGER_H_ +#define MESSENGER_H_ + +#include "MessengerS.h" + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <ace/Auto_Ptr.h> + +class EventSequenceSupplier_i; + +class Messenger_i : public POA_Messenger +{ + public: + Messenger_i (CORBA::ORB_ptr orb); + + virtual ~Messenger_i (void); + + CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::SequenceProxyPushConsumer_var consumer_proxy_; + auto_ptr<EventSequenceSupplier_i> supplier_; +}; + +#endif + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/README b/TAO/DevGuideExamples/NotifyService/EventSequence/README new file mode 100644 index 00000000000..d33d422278b --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/README @@ -0,0 +1,63 @@ +Event Notification Service + + +File: examples/NotifyService/EventSequence/README + +This directory contains an example which transmits an EventBatch using the Notification Service. + +This example extends the Messenger example in GettingStarted directory +to illustrate how the Notification channel can be used to push event batches +from the supplier to the consumer. The example uses the push/push model. + +The MessengerServer in this example plays the role of a server for +the MessengerClient and the role of a supplier for the MessengerConsumer. +The flow of messages is shown below: + +MessengerClient->MessengerSupplier->NotificationChannel->MessengerConsumer. + + +The Client code is stored in: + +examples/NotifyService/EventSequence/MessengerClient.cpp + +The Server code is stored in: + +examples/NotifyService/EventSequence/MessengerServer.cpp + +The Consumer code is stored in: + +examples/NotifyService/EventSequence/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.ior& + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/EventSequence/run_test.pl b/TAO/DevGuideExamples/NotifyService/EventSequence/run_test.pl new file mode 100644 index 00000000000..540c676a957 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/EventSequence/run_test.pl @@ -0,0 +1,75 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, "$arg_ns_ref -IORoutput $notify_ior"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/Filtering.mpc b/TAO/DevGuideExamples/NotifyService/Filtering/Filtering.mpc new file mode 100644 index 00000000000..823b95838b1 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/Filtering.mpc @@ -0,0 +1,27 @@ +project(*Server): portableserver, orbsvcsexe, notification_skel, naming { + exename = MessengerServer + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): orbsvcsexe, notification, naming { + exename = MessengerClient + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): portableserver, orbsvcsexe, notification_skel, naming { + exename = MessengerConsumer + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} + diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/Messenger.idl b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerClient.cpp new file mode 100644 index 00000000000..d82568ac816 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerClient.cpp @@ -0,0 +1,61 @@ +#include <orbsvcs/CosNamingC.h> +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var rootObj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var rootContext = + CosNaming::NamingContext::_narrow(rootObj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("MessengerService"); + + CORBA::Object_var messengerObj = rootContext->resolve(name); + + if (CORBA::is_nil(messengerObj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow(messengerObj.in()); + if (CORBA::is_nil(messenger.in ())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( + "We are experiencing network problems."); + messenger->send_message ("sysadmin@company.com", + "urgent", + message.inout()); + + message = CORBA::string_dup("Where can I get TAO?"); + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + + message = CORBA::string_dup( + "Please contact sales@company.com regarding your request."); + messenger->send_message ("sysadmin@company.com", + "OCI's Distribution of TAO", + message.inout()); + + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + std::cout << "MessengerClient: success" << std::endl; + return 0; +} + diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerConsumer.cpp new file mode 100644 index 00000000000..30b708ced6f --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerConsumer.cpp @@ -0,0 +1,156 @@ +#include <ace/Get_Opt.h> + +#include "orbsvcs/CosNotifyChannelAdminC.h" +#include "orbsvcs/CosNotifyCommC.h" +#include "orbsvcs/CosNamingC.h" + +#include "StructuredEventConsumer_i.h" +#include <iostream> + +#define CA_FILTER "($.From == 'sysadmin@company.com') and ($.Subject == 'urgent') " +#define TCL_GRAMMAR "EXTENDED_TCL" + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + return 1; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + name.length (1); + name[0].id = CORBA::string_dup("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in()); + + if (CORBA::is_nil(notify_factory.in())) { + std::cerr << "Unable to find notify factory" << std::endl; + return 1; + } + + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to find event channel" << std::endl; + return 1; + } + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::AND_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + if (CORBA::is_nil (consumer_admin.in())) { + std::cerr << "Unable to find consumer admin" << std::endl; + return 1; + } + + CosNotifyFilter::FilterFactory_var ffact = + ec->default_filter_factory (); + + // setup a filter at the consumer admin + CosNotifyFilter::Filter_var ca_filter = + ffact->create_filter (TCL_GRAMMAR); + + if (CORBA::is_nil (ca_filter.in())) { + std::cerr << "Unable to create filetr object" << std::endl; + return 1; + } + + CosNotifyFilter::ConstraintExpSeq constraint_list (1); + constraint_list.length (1); + constraint_list[0].event_types.length (0); + constraint_list[0].constraint_expr = CORBA::string_dup (CA_FILTER); + + ca_filter->add_constraints (constraint_list); + + consumer_admin ->add_filter (ca_filter.in()); + + CosNotification::EventTypeSeq added(1); + CosNotification::EventTypeSeq removed (0); + added.length (1); + removed.length (0); + + added[0].domain_name = CORBA::string_dup ("*"); + added[0].type_name = CORBA::string_dup ("*"); + + consumer_admin->subscription_change (added, removed); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + if (CORBA::is_nil (poa_object.in())) { + std::cerr << "Unable to initialize the POA." << std::endl; + return 1; + } + + PortableServer::POA_var poa = + PortableServer::POA::_narrow(poa_object.in()); + + StructuredEventConsumer_i servant(orb.in()); + /* + CosNotifyComm::StructuredPushConsumer_var consumer = + servant._this(); + */ + + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + CosNotifyComm::StructuredPushConsumer_var consumer = + CosNotifyComm::StructuredPushConsumer::_narrow(consumer_obj.in()); + + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + + // The proxy that we are connected to. + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = CosNotifyChannelAdmin::StructuredProxyPushSupplier:: + _narrow(proxy_supplier.in()); + + if (CORBA::is_nil (supplier_proxy.in())) { + std::cerr << "Unable to create structured push supplier proxy" << std::endl; + return 1; + } + + supplier_proxy->connect_structured_push_consumer(consumer.in()); + + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + + poa_manager->activate(); + + orb->run(); + orb->destroy (); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerServer.cpp new file mode 100644 index 00000000000..1e7b90c8408 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/MessengerServer.cpp @@ -0,0 +1,94 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <ace/Argv_Type_Converter.h> +#include <ace/Get_Opt.h> +#include <iostream> +#include <fstream> + +ACE_TString ior_output_file; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("o:")); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'o': + ior_output_file = get_opts.optarg; + break; + + case '?': + default: + std::cerr << "usage: " << argv[0] << " -o <ior>" << std::endl; + return -1; + break; + } + return 0; +} + +int +ACE_TMAIN(int argc, ACE_TCHAR* argv[]) +{ + try + { + // Initialize orb + ACE_Argv_Type_Converter conv(argc, argv); + CORBA::ORB_var orb = CORBA::ORB_init(conv.get_argc(), + conv.get_TCHAR_argv()); + + if (parse_args(argc, argv) != 0) { + return 1; + } + + // Find the Naming Service. + CORBA::Object_var rootObj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var rootNC = + CosNaming::NamingContext::_narrow(rootObj.in()); + + // Get the Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create our Messenger servant. + Messenger_i messenger_servant(orb.in()); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + // Generating the ior file is just for the purpose of synchronize the + // the startup of the server and consumer. + CORBA::String_var ior = orb->object_to_string(messenger_obj.in()); + if (ior_output_file != ACE_TEXT("")) { + std::ofstream outfile(ACE_TEXT_ALWAYS_CHAR(ior_output_file.c_str())); + outfile << ior.in(); + } + + // Bind it in the Naming Service. + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MessengerService"); + rootNC->rebind(name, messenger_obj.in()); + + // Accept requests + orb->run(); + orb->destroy(); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; + +} + + diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.cpp new file mode 100644 index 00000000000..9e5373e9c4c --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.cpp @@ -0,0 +1,161 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" + +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_ (CORBA::ORB::_duplicate(orb)) + +{ + try + { + CORBA::Object_var poa_obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_obj.in()); + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + name.length (1); + name[0].id = CORBA::string_dup("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in()); + + if (CORBA::is_nil(notify_factory.in())) { + std::cerr << "Unable to find notify factory" << std::endl; + } + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to crete event channel" << std::endl; + } + + name.length(1); + name[0].id = CORBA::string_dup("MyEventChannel"); + + naming_context->rebind(name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::AND_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + if (CORBA::is_nil (supplier_admin.in())) { + std::cerr << "Unable to find supplier admin" << std::endl; + } + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + PortableServer::ObjectId_var oid = poa->activate_object(servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + CosNotifyComm::StructuredPushSupplier_var supplier = + CosNotifyComm::StructuredPushSupplier::_narrow(supplier_obj.in()); + + consumer_proxy_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer:: + _narrow(proxy_consumer.in()); + + if (CORBA::is_nil (consumer_proxy_.in())) { + std::cerr << "Unable to find structured proxy push consumer" << std::endl; + } + + consumer_proxy_->connect_structured_push_supplier(supplier.in()); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + } + +} + + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException) +{ + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + try + { + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // sequence<Property>: string name, any value + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("From"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message"); + event.filterable_data[2].value <<= (const char *)message; + + consumer_proxy_->push_structured_event(event); + } + + catch(const CosNotifyComm::InvalidEventType&) { + std::cerr << "Invalid Event Type Exception " << std::endl; + return 1; + } + + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; +} + diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.h new file mode 100644 index 00000000000..2353918a2e9 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/Messenger_i.h @@ -0,0 +1,34 @@ +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "MessengerS.h" + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (CORBA::ORB_ptr orb); + + //Destructor + virtual ~Messenger_i (void); + + CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy_; + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/README b/TAO/DevGuideExamples/NotifyService/Filtering/README new file mode 100644 index 00000000000..6f140bc5a86 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/README @@ -0,0 +1,62 @@ +Event Notification Service + + +File: DevGuideExamples/NotifyService/Filtering/README + + +This example extends the NotifyService/Messenger example by +demonstrating how filtering can be incorporated into the utilization +of the Notification channel. Supplier-side, and consumer-side +filtering can be implemented, but only consumer_side filtering is +demonstrated in this example. + +Filters are configured to guarantee that only certain events are +passed to the consumer. The criteria is specified by imposing constraints +on the appropriate fields of a structured event. + + +The Client code is stored in: + +DevGuideExamples/NotifyService/Filtering/MessengerClient.cpp + +The Server code is stored in: + +DevGuideExamples/NotifyService/Filtering/MessengerServer.cpp + +The Consumer code is stored in: + +DevGuideExamples/NotifyService/Filtering/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.ior& + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..923dbfd6dcd --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.cpp @@ -0,0 +1,53 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event + ) + throw (CORBA::SystemException, + CosEventComm::Disconnected) +{ + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name << "\t" <<value<< std::endl; + } + + std::cerr << "MessengerConsumer: success" << std::endl; +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer( + ) + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType) + +{ + //Noop +} diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..9debf6c7d31 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventConsumer_i.h @@ -0,0 +1,33 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventConsumer_i : + public virtual POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification + ) + throw (CORBA::SystemException, + CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType); + + virtual void disconnect_structured_push_consumer( + ) + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..6c505c369ba --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.cpp @@ -0,0 +1,33 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier ( + ) + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..deb2df7d625 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/StructuredEventSupplier_i.h @@ -0,0 +1,28 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventSupplier_i : + public virtual POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier ( + ) + throw (CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/Filtering/run_test.pl b/TAO/DevGuideExamples/NotifyService/Filtering/run_test.pl new file mode 100644 index 00000000000..388e3d44d81 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Filtering/run_test.pl @@ -0,0 +1,75 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, "$arg_ns_ref -IORoutput $notify_ior"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", "$arg_ns_ref -o $messiorfile"); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.idl b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.mpc b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.mpc new file mode 100644 index 00000000000..3329ee1c1ee --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, namingexe, notification_skel { + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): taoexe, namingexe, notification { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): taoexe, portableserver, namingexe, notification_skel { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerClient.cpp new file mode 100644 index 00000000000..10e659ab20f --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerClient.cpp @@ -0,0 +1,39 @@ +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( + "Where can I get TAO?"); + for (int i=0; i<3; i++) { + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + } + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerConsumer.cpp new file mode 100644 index 00000000000..63dd7df2c85 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerConsumer.cpp @@ -0,0 +1,101 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "StructuredEventConsumer_i.h" +#include <iostream> + +int +main(int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = + PortableServer::POA::_narrow (poa_object.in()); + + StructuredEventConsumer_i servant (orb.in()); + + PortableServer::ObjectId_var objectId = poa->activate_object (&servant); + + CORBA::Object_var consumer_obj = poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushConsumer_var consumer = + CosNotifyComm::StructuredPushConsumer::_narrow (consumer_obj.in ()); + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = CosNotifyChannelAdmin::StructuredProxyPushSupplier:: + _narrow(proxy_supplier.in()); + + supplier_proxy->connect_structured_push_consumer(consumer.in()); + + + + + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + supplier_proxy->subscription_change(added, removed); + + + + + + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + + poa_manager->activate(); + + orb->run(); + + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..7d4127d6b92 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/MessengerServer.cpp @@ -0,0 +1,48 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + Messenger_i messenger_servant (orb.in ()); + PortableServer::ObjectId_var oid = poa->activate_object (&messenger_servant); + CORBA::Object_var messenger_obj = poa->id_to_reference (oid.in ()); + CORBA::String_var str = orb->object_to_string (messenger_obj.in()); + + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in () << std::endl; + iorFile.close (); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + orb->run (); + orb->destroy (); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; + +} + + + + + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..8b5557efcde --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.cpp @@ -0,0 +1,127 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> +#include <ace/OS_NS_stdio.h> + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_ (CORBA::ORB::_duplicate (orb)) +{ + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow (naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve (name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ()); + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + name[0].id = CORBA::string_dup ("MyEventChannel"); + + naming_context->rebind (name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + CORBA::Object_var poa_obj = orb_->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (poa_obj.in ()); + PortableServer::POAManager_var mgr = poa->the_POAManager (); + + mgr->activate (); + PortableServer::ObjectId_var objectId = poa->activate_object (servant); + + CORBA::Object_var supplier_obj = poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushSupplier_var supplier = + CosNotifyComm::StructuredPushSupplier::_narrow (supplier_obj.in ()); + + consumer_proxy_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow (proxy_consumer.in()); + + consumer_proxy_-> + connect_structured_push_supplier (supplier.in()); +} + + +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException) +{ + + ACE_OS::printf("Message from: %s\nSubject: %s\nMessage: %s\n", + user_name, subject, message); + //cout << "Message from: " << user_name << endl; + //cout << "Subject: " << subject << endl; + //cout << "Message: " << message << endl; + + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // OptionalHeaderFields + // PropertySeq + + // sequence<Property>: string name, any value + event.filterable_data.length (3); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + std::cout << "pushing " << std::endl; + consumer_proxy_->push_structured_event(event); + + return 1; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.h new file mode 100644 index 00000000000..6fffc18cbf4 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/Messenger_i.h @@ -0,0 +1,29 @@ +#ifndef MESSENGER_H_ +#define MESSENGER_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include "MessengerS.h" + +class Messenger_i : public POA_Messenger +{ + public: + Messenger_i (CORBA::ORB_ptr orb); + + virtual ~Messenger_i (void); + + CORBA::Boolean send_message (const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy_; +}; + +#endif + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/README b/TAO/DevGuideExamples/NotifyService/Messenger/README new file mode 100644 index 00000000000..350316f40c3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/README @@ -0,0 +1,64 @@ +Event Notification Service + + +File: examples/NotifyService/Messenger/README + +This directory contains a simple example of using the Notification Service. + +This example extends the Messenger example in GettingStarted directory +to illustrate how the Notification channel can be used to push messages +from the supplier to the consumer. Structured events are used to demonstrate +the operation of the channel. The example uses the push/push model. + +The MessengerServer in this example plays the role of a server for +the MessengerClient and the role of a supplier for the MessengerConsumer. +The flow of messages is shown below: + +MessengerClient->MessengerSupplier->NotificationChannel->MessengerConsumer. + + +The Client code is stored in: + +examples/NotifyService/Messenger/MessengerClient.cpp + +The Server code is stored in: + +examples/NotifyService/Messenger/MessengerServer.cpp + +The Consumer code is stored in: + +examples/NotifyService/Messenger/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.ior& + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..ae1208c30d3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.cpp @@ -0,0 +1,50 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event + ) + throw (CORBA::SystemException, CosEventComm::Disconnected) + +{ + + std::cout << "event received " << std::endl; + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name.in() << "\t" << value << std::endl; + } + +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer() + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..be60942df06 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventConsumer_i.h @@ -0,0 +1,31 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyCommS.h> + +class StructuredEventConsumer_i : + public virtual POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification + ) + throw (CORBA::SystemException, CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); + + virtual void disconnect_structured_push_consumer() + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..91139284edd --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.cpp @@ -0,0 +1,31 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier () + throw(CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..1b5b5dc7250 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/StructuredEventSupplier_i.h @@ -0,0 +1,24 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyCommS.h> + +class StructuredEventSupplier_i : + public virtual POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier () + throw(CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/Messenger/run_test.pl b/TAO/DevGuideExamples/NotifyService/Messenger/run_test.pl new file mode 100644 index 00000000000..540c676a957 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/Messenger/run_test.pl @@ -0,0 +1,75 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, "$arg_ns_ref -IORoutput $notify_ior"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger.idl b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerClient.cpp new file mode 100644 index 00000000000..f7e029ac598 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerClient.cpp @@ -0,0 +1,52 @@ +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + + +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var rootObj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var rootContext = + CosNaming::NamingContext::_narrow(rootObj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("MessengerService"); + + CORBA::Object_var messengerObj = rootContext->resolve(name); + + Messenger_var messenger = Messenger::_narrow(messengerObj.in()); + + if (CORBA::is_nil(messenger.in ())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + } + + CORBA::String_var message = CORBA::string_dup("Where can I get TAO?"); + + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + std::cout << "MessengerClient: success" << std::endl; + return 0; + +} + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerConsumer.cpp new file mode 100644 index 00000000000..f5f9f0e6aa8 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerConsumer.cpp @@ -0,0 +1,116 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "StructuredEventConsumer_i.h" +#include <iostream> + +int +main(int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + if (CORBA::is_nil (poa_object.in())) { + std::cerr << "Unable to initialize the POA." << std::endl; + return 1; + } + + PortableServer::POA_var poa = + PortableServer::POA::_narrow(poa_object.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + return 1; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to find event channel" << std::endl; + return 1; + } + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + if (CORBA::is_nil (consumer_admin.in())) { + std::cerr << "Unable to find consumer admin" << std::endl; + return 1; + } + + StructuredEventConsumer_i servant(orb.in()); + + CosNotifyComm::StructuredPushConsumer_var consumer = + servant._this(); + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + // The proxy that we are connected to. + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = CosNotifyChannelAdmin::StructuredProxyPushSupplier:: + _narrow(proxy_supplier.in()); + + if (CORBA::is_nil (supplier_proxy.in())) { + std::cerr << "Unable to create structured push supplier proxy" << std::endl; + return 1; + } + + supplier_proxy->connect_structured_push_consumer(consumer.in()); + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + supplier_proxy->subscription_change(added, removed); + + orb->run(); + + } + catch(const CORBA::Exception& ex) + { + std::cerr << "MessengerConsumer:: Caught exception: " << ex << std::endl; + return 1; + } + std::cerr << "MessengerConsumer: success" << std::endl; + return 0; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerServer.cpp new file mode 100644 index 00000000000..b3467a4e945 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/MessengerServer.cpp @@ -0,0 +1,63 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var rootObj = orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var rootNC = + CosNaming::NamingContext::_narrow(rootObj.in()); + + // Get reference to Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + + mgr->activate(); + + // Create an object + Messenger_i messenger_servant(orb.in()); + + Messenger_var messenger = messenger_servant._this(); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MessengerService"); + + rootNC->rebind(name, messenger.in()); + + CORBA::String_var str = orb->object_to_string (messenger.in()); + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in () << std::endl; + iorFile.close (); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + // Accept requests + orb->run(); + } + catch(const CORBA::Exception& ex) + { + std::cerr << "MessengerServer::Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} + + + + + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.cpp new file mode 100644 index 00000000000..d41222adcdc --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.cpp @@ -0,0 +1,163 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ + + CORBA::Object_var poa_object = + orb_->resolve_initial_references("RootPOA"); + + if (CORBA::is_nil (poa_object.in())) { + std::cerr << "Unable to initialize the POA." << std::endl; + } + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in()); + + if (CORBA::is_nil(notify_factory.in())) { + std::cerr << "Unable to find notify factory" << std::endl; + } + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to crete event channel" << std::endl; + } + + // name.length(1); + name[0].id = CORBA::string_dup("MyEventChannel"); + + naming_context->rebind(name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + if (CORBA::is_nil (supplier_admin.in())) { + std::cerr << "Unable to find supplier admin" << std::endl; + } + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + CosNotifyComm::StructuredPushSupplier_var supplier = + servant->_this(); + + s_proxy_consumer_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer:: + _narrow(proxy_consumer.in()); + + if (CORBA::is_nil (s_proxy_consumer_.in())) { + std::cerr << "Unable to find structured proxy push consumer" << std::endl; + } + + s_proxy_consumer_-> + connect_structured_push_supplier(supplier.in()); + + + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + s_proxy_consumer_->offer_change(added, removed); + +} + + + +Messenger_i::~Messenger_i (void) +{ +} + + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + + throw (CORBA::SystemException) + +{ + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // OptionalHeaderFields + // PropertySeq + + // sequence<Property>: string name, any value + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + s_proxy_consumer_->push_structured_event(event); + + return 1; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.h new file mode 100644 index 00000000000..2e6cabb4b3b --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/Messenger_i.h @@ -0,0 +1,30 @@ +#ifndef MESSENGER_H_ +#define MESSENGER_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include "MessengerS.h" + +class Messenger_i : public POA_Messenger +{ +public: + Messenger_i (CORBA::ORB_ptr orb); + virtual ~Messenger_i (void); + + CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message) + + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var s_proxy_consumer_; +}; + +#endif + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/OfferSubscriptions.mpc b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/OfferSubscriptions.mpc new file mode 100644 index 00000000000..3329ee1c1ee --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/OfferSubscriptions.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, namingexe, notification_skel { + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): taoexe, namingexe, notification { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): taoexe, portableserver, namingexe, notification_skel { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/README b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/README new file mode 100644 index 00000000000..a4e60f8ca9b --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/README @@ -0,0 +1,66 @@ +Event Notification Service + + +File: examples/NotifyService/OfferSubscriptions/README + + +This example extends the NotifyService/Messenger example by incorporating +"offers" and "subscriptions" into the utilization of the Notification +channel. + +The publication of "offers" by a supplier, informs consumers of the +Notification channel about the types of events it will be producing. This +is accomplished via the 'offer_change()' operation. + +Moreover, the example demonstrates how consumers can inform Notification +channel suppliers about the types of events in which they are interested. +The set of events in which a consumer is interested is called a "subscription" +and can be communicated via the 'subscription_change()' operation. + + + +The Client code is stored in: + +examples/NotifyService/OfferSubscriptions/MessengerClient.cpp + +The Server code is stored in: + +examples/NotifyService/OfferSubscriptions/MessengerServer.cpp + +The Consumer code is stored in: + +examples/NotifyService/OfferSubscriptions/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.ior& + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..61b436fbf8c --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.cpp @@ -0,0 +1,49 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event + ) + throw (CORBA::SystemException, CosEventComm::Disconnected) + +{ + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name << "\t" <<value<< std::endl; + } + +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer( + ) + throw(CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..9fd15085011 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventConsumer_i.h @@ -0,0 +1,29 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventConsumer_i : public POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification + ) + throw (CORBA::SystemException, CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); + + virtual void disconnect_structured_push_consumer( + ) + throw(CORBA::SystemException); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..6160191438a --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.cpp @@ -0,0 +1,31 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier () + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..be820a45533 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/StructuredEventSupplier_i.h @@ -0,0 +1,23 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventSupplier_i : public POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier () + throw (CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw(CORBA::SystemException, CosNotifyComm::InvalidEventType); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/run_test.pl b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/run_test.pl new file mode 100644 index 00000000000..540c676a957 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/OfferSubscriptions/run_test.pl @@ -0,0 +1,75 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, "$arg_ns_ref -IORoutput $notify_ior"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger.idl b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerClient.cpp new file mode 100644 index 00000000000..be4780fa3b6 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerClient.cpp @@ -0,0 +1,40 @@ +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( + "Where can I get TAO?"); + for (int i=0; i<3; i++) { + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + } + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerConsumer.cpp new file mode 100644 index 00000000000..5dceba9caa9 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerConsumer.cpp @@ -0,0 +1,100 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "StructuredEventConsumer_i.h" +#include <iostream> + +int +main(int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, adminid); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = + PortableServer::POA::_narrow (poa_object.in()); + + StructuredEventConsumer_i servant (orb.in()); + + PortableServer::ObjectId_var objectId = poa->activate_object (&servant); + + CORBA::Object_var consumer_obj = poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushConsumer_var consumer = + CosNotifyComm::StructuredPushConsumer::_narrow (consumer_obj.in ()); + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = + CosNotifyChannelAdmin::StructuredProxyPushSupplier::_narrow(proxy_supplier.in()); + + CosNotification::QoSProperties properties (1); + + properties.length (1); + properties[0].name = CORBA::string_dup (CosNotification::OrderPolicy); + properties[0].value <<= CosNotification::FifoOrder; + + supplier_proxy->set_qos (properties); + supplier_proxy->connect_structured_push_consumer(consumer.in()); + + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + supplier_proxy->subscription_change(added, removed); + + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + + poa_manager->activate(); + + orb->run(); + + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerServer.cpp new file mode 100644 index 00000000000..3719c25cc60 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/MessengerServer.cpp @@ -0,0 +1,46 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +#include <fstream> + +int +main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var rootObj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var rootNC = + CosNaming::NamingContext::_narrow(rootObj.in()); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + Messenger_i messenger_servant (orb.in ()); + PortableServer::ObjectId_var oid = poa->activate_object (&messenger_servant); + CORBA::Object_var messenger_obj = poa->id_to_reference (oid.in ()); + CORBA::String_var str = orb->object_to_string (messenger_obj.in()); + + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in () << std::endl; + iorFile.close (); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + orb->run (); + orb->destroy (); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.cpp new file mode 100644 index 00000000000..57591cc06b3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.cpp @@ -0,0 +1,140 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_ (CORBA::ORB::_duplicate (orb)) +{ + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow (naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve (name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ()); + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + initial_admin.length (4); + + initial_admin[0].name = CORBA::string_dup (CosNotification::MaxQueueLength); + initial_admin[0].value <<= (CORBA::Long)7; + + initial_admin[1].name = CORBA::string_dup (CosNotification::MaxSuppliers); + initial_admin[1].value <<= (CORBA::Long)1; + + initial_admin[2].name = CORBA::string_dup (CosNotification::MaxConsumers); + initial_admin[2].value <<= (CORBA::Long)1; + + initial_admin[3].name = CORBA::string_dup (CosNotification::RejectNewEvents); + initial_admin[3].value <<= CORBA::Any::from_boolean((CORBA::Boolean)1); + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + name[0].id = CORBA::string_dup ("MyEventChannel"); + + naming_context->rebind (name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + CORBA::Object_var poa_obj = orb_->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (poa_obj.in ()); + PortableServer::POAManager_var mgr = poa->the_POAManager (); + + mgr->activate (); + PortableServer::ObjectId_var objectId = poa->activate_object (servant); + + CORBA::Object_var supplier_obj = poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushSupplier_var supplier = + CosNotifyComm::StructuredPushSupplier::_narrow (supplier_obj.in ()); + + consumer_proxy_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow (proxy_consumer.in()); + + consumer_proxy_-> + connect_structured_push_supplier (supplier.in()); +} + + +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException) +{ + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // OptionalHeaderFields + // PropertySeq + + // sequence<Property>: string name, any value + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + std::cout << "pushing " << std::endl; + consumer_proxy_->push_structured_event(event); + + return 1; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.h new file mode 100644 index 00000000000..6fffc18cbf4 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/Messenger_i.h @@ -0,0 +1,29 @@ +#ifndef MESSENGER_H_ +#define MESSENGER_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include "MessengerS.h" + +class Messenger_i : public POA_Messenger +{ + public: + Messenger_i (CORBA::ORB_ptr orb); + + virtual ~Messenger_i (void); + + CORBA::Boolean send_message (const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy_; +}; + +#endif + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/QoSProperties.mpc b/TAO/DevGuideExamples/NotifyService/QoSProperties/QoSProperties.mpc new file mode 100644 index 00000000000..3329ee1c1ee --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/QoSProperties.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, namingexe, notification_skel { + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): taoexe, namingexe, notification { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): taoexe, portableserver, namingexe, notification_skel { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/README b/TAO/DevGuideExamples/NotifyService/QoSProperties/README new file mode 100644 index 00000000000..4808cc2b8d6 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/README @@ -0,0 +1,55 @@ +Event Notification Service + + +File: DevGuideExamples/NotifyService/QoSProperties/README + + +This example extends the NotifyService/Messenger example by +demonstrating how QoS features can be incorporated into the utilization +of the Notification channel. + +The Client code is stored in: + +DevGuideExamples/NotifyService/QoSProperties/MessengerClient.cpp + +The Server code is stored in: + +DevGuideExamples/NotifyService/QoSProperties/MessengerServer.cpp + +The Consumer code is stored in: + +DevGuideExamples/NotifyService/QoSProperties/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.ior& + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..90d663a26a7 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.cpp @@ -0,0 +1,58 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event + ) + throw ( + CORBA::SystemException, + CosEventComm::Disconnected + ) + +{ + + std::cout << "event received " << std::endl; + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name.in() << "\t" << value << std::endl; + } + +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer() + throw ( + CORBA::SystemException + ) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw ( + CORBA::SystemException, + CosNotifyComm::InvalidEventType + ) +{ +} diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..fbbc7fea45c --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventConsumer_i.h @@ -0,0 +1,38 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventConsumer_i : + public virtual POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification + ) + throw ( + CORBA::SystemException, + CosEventComm::Disconnected + ); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw ( + CORBA::SystemException, + CosNotifyComm::InvalidEventType + ); + + virtual void disconnect_structured_push_consumer() + throw ( + CORBA::SystemException + ); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..4cb4289f8c3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.cpp @@ -0,0 +1,36 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier () + throw ( + CORBA::SystemException + ) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw ( + CORBA::SystemException, + CosNotifyComm::InvalidEventType + ) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..58a744775fe --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/StructuredEventSupplier_i.h @@ -0,0 +1,29 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventSupplier_i : + public virtual POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier () + throw ( + CORBA::SystemException + ); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw ( + CORBA::SystemException, + CosNotifyComm::InvalidEventType + ); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/QoSProperties/run_test.pl b/TAO/DevGuideExamples/NotifyService/QoSProperties/run_test.pl new file mode 100644 index 00000000000..540c676a957 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/QoSProperties/run_test.pl @@ -0,0 +1,75 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, "$arg_ns_ref -IORoutput $notify_ior"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger.idl b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger.idl new file mode 100644 index 00000000000..df3027a9c49 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger.idl @@ -0,0 +1,8 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message(in string user_name, + in string subject, + inout string message); +}; diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerClient.cpp new file mode 100644 index 00000000000..10e659ab20f --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerClient.cpp @@ -0,0 +1,39 @@ +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( + "Where can I get TAO?"); + for (int i=0; i<3; i++) { + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + } + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerConsumer.cpp new file mode 100644 index 00000000000..99240cc2844 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerConsumer.cpp @@ -0,0 +1,183 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> +#include "orbsvcs/NotifyExtC.h" +#include "tao/RTCORBA/RTCORBA.h" + +#include "StructuredEventConsumer_i.h" +#include "Priorities.h" +#include <iostream> + +int +main(int argc, char *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = + PortableServer::POA::_narrow (poa_object.in()); + + CORBA::Object_var rtorb_obj = orb->resolve_initial_references ("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow (rtorb_obj.in ()); + + // Create an RT POA with a lane at the given priority. + CORBA::Policy_var priority_model_policy = + rt_orb->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED, + DEFAULT_PRIORITY); + + RTCORBA::ThreadpoolLanes lanes (2); + lanes.length (2); + + lanes[0].lane_priority = LOW_PRIORITY; + lanes[0].static_threads = 2; + lanes[0].dynamic_threads = 0; + lanes[1].lane_priority = HIGH_PRIORITY; + lanes[1].static_threads = 2; + lanes[1].dynamic_threads = 0; + + + // Create a thread-pool. + CORBA::ULong stacksize = 0; + CORBA::Boolean allow_request_buffering = 0; + CORBA::ULong max_buffered_requests = 0; + CORBA::ULong max_request_buffer_size = 0; + CORBA::Boolean allow_borrowing = 0; + + // Create the thread-pool. + RTCORBA::ThreadpoolId threadpool_id = + rt_orb->create_threadpool_with_lanes (stacksize, + lanes, + allow_borrowing, + allow_request_buffering, + max_buffered_requests, + max_request_buffer_size); + + // Create a thread-pool policy. + CORBA::Policy_var lanes_policy = + rt_orb->create_threadpool_policy (threadpool_id); + + CORBA::PolicyList poa_policy_list(2); + poa_policy_list.length (2); + poa_policy_list[0] = priority_model_policy; + poa_policy_list[1] = lanes_policy; + + PortableServer::POAManager_var poa_manager = poa->the_POAManager (); + + PortableServer::POA_var rt_poa = poa->create_POA ("RT POA", + poa_manager.in (), + poa_policy_list); + + StructuredEventConsumer_i servant (orb.in()); + + PortableServer::ObjectId_var objectId = + rt_poa->activate_object (&servant); + + CORBA::Object_var consumer_obj = + rt_poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushConsumer_var consumer = + CosNotifyComm::StructuredPushConsumer::_narrow (consumer_obj.in ()); + + NotifyExt::ThreadPoolLanesParams tpl_params; + + tpl_params.priority_model = NotifyExt::CLIENT_PROPAGATED; + tpl_params.server_priority = DEFAULT_PRIORITY; + tpl_params.stacksize = 0; + tpl_params.allow_borrowing = 0; + tpl_params.allow_request_buffering = 0; + tpl_params.max_buffered_requests = 0; + tpl_params.max_request_buffer_size = 0; + tpl_params.lanes.length (2); + tpl_params.lanes[0].lane_priority = LOW_PRIORITY; + tpl_params.lanes[0].static_threads = 2; + tpl_params.lanes[0].dynamic_threads = 0; + tpl_params.lanes[1].lane_priority = HIGH_PRIORITY; + tpl_params.lanes[1].static_threads = 2; + tpl_params.lanes[1].dynamic_threads = 0; + CosNotification::QoSProperties qos; + qos.length(1); + qos[0].name = CORBA::string_dup (NotifyExt::ThreadPoolLanes); + qos[0].value <<= tpl_params; + + consumer_admin->set_qos(qos); + CORBA::Object_var current_obj = + orb->resolve_initial_references ("RTCurrent"); + + RTCORBA::Current_var current = + RTCORBA::Current::_narrow (current_obj.in ()); + current->the_priority(HIGH_PRIORITY); + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = CosNotifyChannelAdmin::StructuredProxyPushSupplier:: + _narrow(proxy_supplier.in()); + + supplier_proxy->connect_structured_push_consumer(consumer.in()); + + + + + CosNotification::EventTypeSeq added (1); + CosNotification::EventTypeSeq removed (1); + added.length (1); + removed.length (1); + + added[0].domain_name = CORBA::string_dup ("OCI_TAO"); + added[0].type_name = CORBA::string_dup ("examples"); + + removed[0].domain_name = CORBA::string_dup ("*"); + removed[0].type_name = CORBA::string_dup ("*"); + + supplier_proxy->subscription_change(added, removed); + + + + + + poa_manager->activate(); + + orb->run(); + + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerServer.cpp new file mode 100644 index 00000000000..7d4127d6b92 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/MessengerServer.cpp @@ -0,0 +1,48 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + Messenger_i messenger_servant (orb.in ()); + PortableServer::ObjectId_var oid = poa->activate_object (&messenger_servant); + CORBA::Object_var messenger_obj = poa->id_to_reference (oid.in ()); + CORBA::String_var str = orb->object_to_string (messenger_obj.in()); + + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in () << std::endl; + iorFile.close (); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + orb->run (); + orb->destroy (); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught exception: " << ex << std::endl; + return 1; + } + + return 0; + +} + + + + + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.cpp new file mode 100644 index 00000000000..1c9e1e59676 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.cpp @@ -0,0 +1,157 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> +#include "orbsvcs/NotifyExtC.h" +#include <ace/OS_NS_stdio.h> + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" +#include "Priorities.h" +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) + : orb_ (CORBA::ORB::_duplicate (orb)) +{ + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow (naming_obj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("NotifyEventChannelFactory"); + + CORBA::Object_var obj = naming_context->resolve (name); + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ()); + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + name[0].id = CORBA::string_dup ("MyEventChannel"); + + naming_context->rebind (name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + NotifyExt::ThreadPoolLanesParams tpl_params; + + tpl_params.priority_model = NotifyExt::CLIENT_PROPAGATED; + tpl_params.server_priority = DEFAULT_PRIORITY; + tpl_params.stacksize = 0; + tpl_params.allow_borrowing = 0; + tpl_params.allow_request_buffering = 0; + tpl_params.max_buffered_requests = 0; + tpl_params.max_request_buffer_size = 0; + tpl_params.lanes.length (2); + tpl_params.lanes[0].lane_priority = LOW_PRIORITY; + tpl_params.lanes[0].static_threads = 2; + tpl_params.lanes[0].dynamic_threads = 0; + tpl_params.lanes[1].lane_priority = HIGH_PRIORITY; + tpl_params.lanes[1].static_threads = 2; + tpl_params.lanes[1].dynamic_threads = 0; + CosNotification::QoSProperties qos; + qos.length(1); + qos[0].name = CORBA::string_dup (NotifyExt::ThreadPoolLanes); + qos[0].value <<= tpl_params; + + supplier_admin->set_qos(qos); + CORBA::Object_var current_obj = + this->orb_->resolve_initial_references ("RTCurrent"); + + current_ = RTCORBA::Current::_narrow (current_obj.in ()); + current_->the_priority(HIGH_PRIORITY); + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + CORBA::Object_var poa_obj = orb_->resolve_initial_references ("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow (poa_obj.in ()); + PortableServer::POAManager_var mgr = poa->the_POAManager (); + + mgr->activate (); + PortableServer::ObjectId_var objectId = poa->activate_object (servant); + + CORBA::Object_var supplier_obj = poa->id_to_reference (objectId.in ()); + + CosNotifyComm::StructuredPushSupplier_var supplier = + CosNotifyComm::StructuredPushSupplier::_narrow (supplier_obj.in ()); + + consumer_proxy_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow (proxy_consumer.in()); + + consumer_proxy_-> + connect_structured_push_supplier (supplier.in()); +} + + +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException) +{ + ACE_OS::printf("Message from: %s\nSubject: %s\nMessage: %s\n", + user_name, subject, message); + //cout << "Message from: " << user_name << endl; + //cout << "Subject: " << subject << endl; + //cout << "Message: " << message << endl; + + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // OptionalHeaderFields + // PropertySeq + + // sequence<Property>: string name, any value + event.filterable_data.length (3); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + std::cout << "pushing " << std::endl; + current_->the_priority(HIGH_PRIORITY); + consumer_proxy_->push_structured_event(event); + + return 1; + +} + diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.h new file mode 100644 index 00000000000..10ef4594b50 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/Messenger_i.h @@ -0,0 +1,31 @@ +#ifndef MESSENGER_H_ +#define MESSENGER_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include "MessengerS.h" +#include "tao/RTCORBA/RTCORBA.h" + +class Messenger_i : public POA_Messenger +{ + public: + Messenger_i (CORBA::ORB_ptr orb); + + virtual ~Messenger_i (void); + + CORBA::Boolean send_message (const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException); + + private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy_; + RTCORBA::Current_var current_; +}; + +#endif + + + + + diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/Priorities.h b/TAO/DevGuideExamples/NotifyService/RTNotify/Priorities.h new file mode 100644 index 00000000000..f181f10aec1 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/Priorities.h @@ -0,0 +1,8 @@ +#ifndef _PRIORITIES_H_ +#define _PRIORITIES_H_ + +#define LOW_PRIORITY 0 +#define HIGH_PRIORITY 0 +#define DEFAULT_PRIORITY LOW_PRIORITY + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/README b/TAO/DevGuideExamples/NotifyService/RTNotify/README new file mode 100644 index 00000000000..590d2a265d4 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/README @@ -0,0 +1,67 @@ +Event Notification Service + + +File: examples/NotifyService/RTNotify/README + +This directory contains a simple example of using the Notification Service +with Real-Time CORBA. + +This example extends the basic Messenger notify service example to illustrate +how the Notification channel can be used with RT CORBA features. The supplier +and consumer both set up their proxies to use a thread pool with lanes and +the Notify_Service executable is configured to load the RT_Notification library +and associated features. A priority is set in the supplier and propagetd through +the channel into the consumer. + +The MessengerServer in this example plays the role of a server for +the MessengerClient and the role of a supplier for the MessengerConsumer. +The flow of messages is shown below: + +MessengerClient->MessengerSupplier->NotificationChannel->MessengerConsumer. + + +The Client code is stored in: + +examples/NotifyService/Messenger/MessengerClient.cpp + +The Server code is stored in: + +examples/NotifyService/Messenger/MessengerServer.cpp + +The Consumer code is stored in: + +examples/NotifyService/Messenger/MessengerConsumer.cpp + + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service -o ns.ior& + +To start the Notification Service: +--------------------------------- +$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service -ORBInitRef NameService=file://ns.iori -ORBSvcConf notify.conf & + +To start the server/supplier +---------------------------- +./MessengerServer -ORBInitRef NameService=file://ns.ior -ORBSvcConf nsclient.conf + +To start the consumer +--------------------- +./MessengerConsumer -ORBInitRef NameService=file://ns.ior -ORBSvcConf nsclient.conf + +To start the client +------------------- +./MessengerClient -ORBInitRef NameService=file://ns.ior + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/RTNotify.mpc b/TAO/DevGuideExamples/NotifyService/RTNotify/RTNotify.mpc new file mode 100644 index 00000000000..ddc1d2dddd5 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/RTNotify.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, namingexe, notification_skel, rtcorba { + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): taoexe, namingexe, notification { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): taoexe, portableserver, namingexe, notification_skel, rtportableserver { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..ae1208c30d3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.cpp @@ -0,0 +1,50 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event + ) + throw (CORBA::SystemException, CosEventComm::Disconnected) + +{ + + std::cout << "event received " << std::endl; + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name.in() << "\t" << value << std::endl; + } + +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer() + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..be60942df06 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventConsumer_i.h @@ -0,0 +1,31 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyCommS.h> + +class StructuredEventConsumer_i : + public virtual POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification + ) + throw (CORBA::SystemException, CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); + + virtual void disconnect_structured_push_consumer() + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..91139284edd --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.cpp @@ -0,0 +1,31 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier () + throw(CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq & + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..1b5b5dc7250 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/StructuredEventSupplier_i.h @@ -0,0 +1,24 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyCommS.h> + +class StructuredEventSupplier_i : + public virtual POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier () + throw(CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType); +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/notify.conf b/TAO/DevGuideExamples/NotifyService/RTNotify/notify.conf new file mode 100644 index 00000000000..837d36af6c7 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/notify.conf @@ -0,0 +1,6 @@ +dynamic TAO_RT_ORB_Loader Service_Object *TAO_RTCORBA:_make_TAO_RT_ORB_Loader () "-ORBPriorityMapping continuous" + +# Uncomment this line to use SCHED_FIFO +#dynamic TAO_RT_ORB_Loader Service_Object *TAO_RTCORBA:_make_TAO_RT_ORB_Loader () "-ORBSchedPolicy SCHED_FIFO -ORBScopePolicy PROCESS -ORBPriorityMapping continuous" + +dynamic TAO_Notify_Service Service_Object * TAO_RT_Notification:_make_TAO_RT_Notify_Service () "" diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/nsclient.conf b/TAO/DevGuideExamples/NotifyService/RTNotify/nsclient.conf new file mode 100644 index 00000000000..c121382ee7d --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/nsclient.conf @@ -0,0 +1,4 @@ +dynamic TAO_RT_ORB_Loader Service_Object *TAO_RTCORBA:_make_TAO_RT_ORB_Loader () "-ORBPriorityMapping continuous" + +# Uncomment this line to use SCHED_FIFO +#dynamic TAO_RT_ORB_Loader Service_Object *TAO_RTCORBA:_make_TAO_RT_ORB_Loader () "-ORBSchedPolicy SCHED_FIFO -ORBScopePolicy PROCESS -ORBPriorityMapping continuous" diff --git a/TAO/DevGuideExamples/NotifyService/RTNotify/run_test.pl b/TAO/DevGuideExamples/NotifyService/RTNotify/run_test.pl new file mode 100644 index 00000000000..6102b28335a --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/RTNotify/run_test.pl @@ -0,0 +1,80 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$notify_ior = PerlACE::LocalFile("notify.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start Notification Service + +$NotifyService = "$ENV{TAO_ROOT}/orbsvcs/Notify_Service/Notify_Service"; +$NFS = new PerlACE::Process($NotifyService, + "$arg_ns_ref -IORoutput $notify_ior " . + "-ORBSvcConf notify.conf"); +$NFS->Spawn(); +# the ior file is only used to wait for the service to start +if (PerlACE::waitforfile_timed ($notify_ior, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $notify_ior\n"; + $NS->Kill (); + $NFS->Kill (); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", + "$arg_ns_ref -ORBSvcConf nsclient.conf"); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 15) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + $NFS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", + "$arg_ns_ref -ORBSvcConf nsclient.conf"); +$MC->Spawn(); + +sleep(2); +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", ""); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NFS->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NFS->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; +unlink $notify_ior; + +exit 0; diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger.idl b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger.idl new file mode 100644 index 00000000000..2ad676a6cc5 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger.idl @@ -0,0 +1,14 @@ +// messenger.idl + + +interface Messenger +{ + + boolean send_message(in string user_name, + + in string subject, + + inout string message); + +}; + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerClient.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerClient.cpp new file mode 100644 index 00000000000..2d1b1147326 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerClient.cpp @@ -0,0 +1,56 @@ +#include <orbsvcs/CosNamingC.h> +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var rootObj = + orb->resolve_initial_references("NameService"); + + CosNaming::NamingContext_var rootContext = + CosNaming::NamingContext::_narrow(rootObj.in()); + + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup ("MessengerService"); + + CORBA::Object_var messengerObj = rootContext->resolve(name); + + if (CORBA::is_nil(messengerObj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow(messengerObj.in()); + if (CORBA::is_nil(messenger.in ())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = + CORBA::string_dup("Where can I get TAO?"); + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + + message = CORBA::string_dup("I need TAO now."); + messenger->send_message ("person@company.com", + "OCI's Distribution of TAO", + message.inout()); + + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + std::cout << "MessengerClient: success" << std::endl; + return 0; +} + + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerConsumer.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerConsumer.cpp new file mode 100644 index 00000000000..712be03f706 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerConsumer.cpp @@ -0,0 +1,139 @@ +#include <ace/Get_Opt.h> + +#include "orbsvcs/CosNotifyChannelAdminC.h" +#include "orbsvcs/CosNotifyCommC.h" +#include "orbsvcs/CosNamingC.h" + +#include "StructuredEventConsumer_i.h" +#include <iostream> + +#define CA_FILTER "Subject == 'OCI_TAO'" +#define TCL_GRAMMAR "TCL" + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + return 1; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + CosNaming::Name name(1); + name.length (1); + name[0].id = CORBA::string_dup("MyEventChannel"); + CORBA::Object_var ecObj = naming_context->resolve(name); + + CosNotifyChannelAdmin::EventChannel_var ec = + CosNotifyChannelAdmin::EventChannel::_narrow(ecObj.in()); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to find event channel" << std::endl; + return 1; + } + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::AND_OP; + + CosNotifyChannelAdmin::ConsumerAdmin_var consumer_admin = + ec->new_for_consumers(ifgop, + adminid); + + if (CORBA::is_nil (consumer_admin.in())) { + std::cerr << "Unable to find consumer admin" << std::endl; + return 1; + } + + CosNotifyFilter::FilterFactory_var ffact = + ec->default_filter_factory (); + + // setup a filter at the consumer admin + CosNotifyFilter::Filter_var ca_filter = + ffact->create_filter (TCL_GRAMMAR); + + if (CORBA::is_nil (ca_filter.in())) { + std::cerr << "Unable to create filetr object" << std::endl; + return 1; + } + + CosNotifyFilter::ConstraintExpSeq constraint_list (1); + constraint_list.length (1); + constraint_list[0].event_types.length (0); + constraint_list[0].constraint_expr = CORBA::string_dup (CA_FILTER); + + ca_filter->add_constraints (constraint_list); + + consumer_admin ->add_filter (ca_filter.in()); + + CosNotification::EventTypeSeq added(1); + CosNotification::EventTypeSeq removed (0); + added.length (1); + removed.length (0); + + added[0].domain_name = CORBA::string_dup ("*"); + added[0].type_name = CORBA::string_dup ("*"); + + consumer_admin->subscription_change (added, removed); + + CORBA::Object_var poa_object = + orb->resolve_initial_references("RootPOA"); + + if (CORBA::is_nil (poa_object.in())) { + std::cerr << "Unable to initialize the POA." << std::endl; + return 1; + } + + PortableServer::POA_var poa = + PortableServer::POA::_narrow(poa_object.in()); + + StructuredEventConsumer_i servant(orb.in()); + + PortableServer::ObjectId_var oid = poa->activate_object(&servant); + CORBA::Object_var consumer_obj = poa->id_to_reference(oid.in()); + CosNotifyComm::StructuredPushConsumer_var consumer = + CosNotifyComm::StructuredPushConsumer::_narrow(consumer_obj.in()); + + + CosNotifyChannelAdmin::ProxyID consumeradmin_proxy_id; + + CosNotifyChannelAdmin::ProxySupplier_var proxy_supplier = + consumer_admin->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + consumeradmin_proxy_id); + + + // The proxy that we are connected to. + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier_proxy; + supplier_proxy = CosNotifyChannelAdmin::StructuredProxyPushSupplier:: + _narrow(proxy_supplier.in()); + + if (CORBA::is_nil (supplier_proxy.in())) { + std::cerr << "Unable to create structured push supplier proxy" << std::endl; + return 1; + } + + supplier_proxy->connect_structured_push_consumer(consumer.in()); + + PortableServer::POAManager_var poa_manager = poa->the_POAManager(); + + poa_manager->activate(); + + orb->run(); + orb->destroy (); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; +} diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerServer.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerServer.cpp new file mode 100644 index 00000000000..dcf76593920 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerServer.cpp @@ -0,0 +1,59 @@ +#include <orbsvcs/CosNamingC.h> +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try + { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Find the Naming Service. + CORBA::Object_var rootObj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var rootNC = + CosNaming::NamingContext::_narrow(rootObj.in()); + + // Get the Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create our Messenger servant. + Messenger_i messenger_servant(orb.in()); + + // Register it with the RootPOA. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + // Bind it in the Naming Service. + CosNaming::Name name; + name.length (1); + name[0].id = CORBA::string_dup("MessengerService"); + rootNC->rebind(name, messenger_obj.in()); + + CORBA::String_var str = orb->object_to_string (messenger_obj.in()); + std::ofstream iorFile ("Messenger.ior"); + iorFile << str.in () << std::endl; + iorFile.close (); + std::cout << "IOR written to file Messenger.ior " << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; + +} + + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerSupplier.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerSupplier.cpp new file mode 100644 index 00000000000..c2e488603c2 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/MessengerSupplier.cpp @@ -0,0 +1,95 @@ +#include <orbsvcs/Notify/Notify_EventChannelFactory_i.h> +#include <orbsvcs/CosNamingC.h> +#include <ace/Profile_Timer.h> +#include "StructuredEventSupplier_i.h" +#include <iostream> + +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + CORBA::Object_var rootObj = orb->resolve_initial_references("NameService"); + CosNaming::NamingContext_var rootNC = + CosNaming::NamingContext::_narrow(rootObj.in()); + + // Get reference to Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate POA manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an Event Channel factory. + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + TAO_Notify_EventChannelFactory_i::create(poa.in()); + ACE_ASSERT (!CORBA::is_nil (notify_factory.in ())); + + // Create an Event Channel. + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, initial_admin, id); + + // Bind it in the Naming Service. + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("MyEventChannel"); + rootNC->rebind(name, ec.in()); + + // Become a structured push supplier. + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::OR_OP; + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb.in()); + CosNotifyComm::StructuredPushSupplier_var supplier = servant->_this(); + + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy = + CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow( + proxy_consumer.in()); + consumer_proxy->connect_structured_push_supplier(supplier.in()); + + // Set up events to push. + CosNotification::StructuredEvent event; + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + event.header.fixed_header.event_name = CORBA::string_dup("myevent"); + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("Message from:"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject:"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message:"); + event.filterable_data[2].value <<= (const char *)message; + + // Push events. + while (1) { + std::cout << "pushing " << std::endl; + consumer_proxy->push_structured_event (event); + ACE_OS::sleep (1); + } + } + catch(const CORBA::Exception& ex) { + return 1; + } + + return 0; +} + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.cpp new file mode 100644 index 00000000000..b05d25defca --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.cpp @@ -0,0 +1,172 @@ +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> +#include <orbsvcs/Notify/Notify_EventChannelFactory_i.h> + +// The static initialization trick doesn't work with static builds. +// On SunOS 5.8 and MacOS X, the static initialization trick used +// in the CosNotification_Serv library does not work. Including the +// initializer class here works around the problem. +#if defined (TAO_AS_STATIC_LIBS) || defined (sun) || defined (__APPLE__) +#include <orbsvcs/Notify/CosNotify_Initializer.h> +#endif /* sun || __APPLE__ */ + +#include "Messenger_i.h" +#include "StructuredEventSupplier_i.h" +#include <iostream> + +Messenger_i::Messenger_i (CORBA::ORB_ptr orb) +: orb_ (CORBA::ORB::_duplicate(orb)) + +{ + try + { + CORBA::Object_var poa_obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_obj.in()); + + CORBA::Object_var naming_obj = + orb_->resolve_initial_references ("NameService"); + + if (CORBA::is_nil(naming_obj.in())) { + std::cerr << "Unable to find naming service" << std::endl; + } + + CosNaming::NamingContext_var naming_context = + CosNaming::NamingContext::_narrow(naming_obj.in()); + + + // + // Create an instance of TAO's notification event channel + // + + CosNotifyChannelAdmin::EventChannelFactory_var notify_factory = + TAO_Notify_EventChannelFactory_i::create(poa.in()); + + if (CORBA::is_nil (notify_factory.in ())) { + std::cerr << "Unable to create the notify event channel" << std::endl; + return; + } + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosNotifyChannelAdmin::EventChannel_var ec = + notify_factory->create_channel (initial_qos, + initial_admin, + id); + + if (CORBA::is_nil (ec.in())) { + std::cerr << "Unable to create event channel" << std::endl; + return; + } + + + CosNaming::Name name(1); + name.length(1); + name[0].id = CORBA::string_dup("MyEventChannel"); + + naming_context->rebind(name, ec.in()); + + CosNotifyChannelAdmin::AdminID adminid; + CosNotifyChannelAdmin::InterFilterGroupOperator ifgop = + CosNotifyChannelAdmin::AND_OP; + + CosNotifyChannelAdmin::SupplierAdmin_var supplier_admin = + ec->new_for_suppliers (ifgop, adminid); + + if (CORBA::is_nil (supplier_admin.in())) { + std::cerr << "Unable to find supplier admin" << std::endl; + } + + CosNotifyChannelAdmin::ProxyID supplieradmin_proxy_id; + + CosNotifyChannelAdmin::ProxyConsumer_var proxy_consumer = + supplier_admin->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + supplieradmin_proxy_id); + + StructuredEventSupplier_i *servant = + new StructuredEventSupplier_i(orb_.in()); + + PortableServer::ObjectId_var oid = poa->activate_object(servant); + CORBA::Object_var supplier_obj = poa->id_to_reference(oid.in()); + CosNotifyComm::StructuredPushSupplier_var supplier = + CosNotifyComm::StructuredPushSupplier::_narrow(supplier_obj.in()); + + consumer_proxy_ = + CosNotifyChannelAdmin::StructuredProxyPushConsumer:: + _narrow(proxy_consumer.in()); + + if (CORBA::is_nil (consumer_proxy_.in())) { + std::cerr << "Unable to find structured proxy push consumer" << std::endl; + } + + consumer_proxy_->connect_structured_push_supplier(supplier.in()); + + } + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + } + +} + + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException) +{ + + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + + try + { + + // Event Definition + CosNotification::StructuredEvent event; + + event.header.fixed_header.event_type.domain_name = + CORBA::string_dup("OCI_TAO"); + // string + event.header.fixed_header.event_type.type_name = + CORBA::string_dup("examples"); + // string + event.header.fixed_header.event_name = + CORBA::string_dup("myevent"); + + // sequence<Property>: string name, any value + event.filterable_data.length (1); + event.filterable_data[0].name = CORBA::string_dup("From"); + event.filterable_data[0].value <<= (const char *)user_name; + event.filterable_data.length (2); + event.filterable_data[1].name = CORBA::string_dup("Subject"); + event.filterable_data[1].value <<= (const char *)subject; + event.filterable_data.length (3); + event.filterable_data[2].name = CORBA::string_dup("Message"); + event.filterable_data[2].value <<= (const char *)message; + + consumer_proxy_->push_structured_event(event); + } + + catch(const CosNotifyComm::InvalidEventType&) { + std::cerr << "Invalid Event Type Exception " << std::endl; + return 1; + } + + catch(const CORBA::Exception& ex) { + std::cerr << ex << std::endl; + return 1; + } + return 0; +} + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.h b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.h new file mode 100644 index 00000000000..2353918a2e9 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/Messenger_i.h @@ -0,0 +1,34 @@ +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include <orbsvcs/CosNotifyChannelAdminC.h> +#include <orbsvcs/CosNotifyCommC.h> +#include <orbsvcs/CosNamingC.h> + +#include "MessengerS.h" + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (CORBA::ORB_ptr orb); + + //Destructor + virtual ~Messenger_i (void); + + CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer_proxy_; + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/README b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/README new file mode 100644 index 00000000000..af40d53a719 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/README @@ -0,0 +1,43 @@ + +examples/NotifyService/SupplierSideNC/README + +This directory contains a simple example of using the Notification Service. + +This example extends the Messenger example in Filtering directory +to illustrate how the Notification channel can be used to push messages +from the supplier to the consumer. Furthermore, this example shows +how you could set up filters so that only a certain events are +passed to the consumer. + +This example uses the push/push model. + +In this example, the Notify Service initiation is incorporated into the +MessengerServer. + +The MessengerSupplier in this example plays the role of a server for +the MessengerClient and the role of a supplier for the MessengerConsumer. +The flow of messages is shown below: + +MessengerClient->(MessengerSupplier->NotificationChannel)->MessengerConsumer. + +How to Run +---------- + +To start the Naming Service: +---------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service & + +To start the supplier: +------------------ +./MessengerServer + +To start the consumer +--------------------- +./MessengerConsumer + +To start the client +------------------- +./MessengerClient +To start the client: +------------------ +./MessengerClient diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp new file mode 100644 index 00000000000..a507d01c29f --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.cpp @@ -0,0 +1,50 @@ +#include "StructuredEventConsumer_i.h" +#include <tao/PortableServer/PS_CurrentC.h> +#include <iostream> + +StructuredEventConsumer_i::StructuredEventConsumer_i(CORBA::ORB_ptr orb) + : orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventConsumer_i::push_structured_event( + const CosNotification::StructuredEvent &event) + throw (CORBA::SystemException, + CosEventComm::Disconnected) +{ + + const char *value; + + for (unsigned int i=0; i<event.filterable_data.length(); i++) { + event.filterable_data[i].value >>= value; + std::cout << event.filterable_data[i].name << "\t" <<value<< std::endl; + } + + std::cerr << "MessengerConsumer: success" << std::endl; +} + +void +StructuredEventConsumer_i::disconnect_structured_push_consumer() + throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventConsumer_i::offer_change( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq &) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType) + +{ + //Noop +} diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.h b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.h new file mode 100644 index 00000000000..37d4d3a82c3 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventConsumer_i.h @@ -0,0 +1,29 @@ +#ifndef _EVENTCONSUMER_I_H_ +#define _EVENTCONSUMER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventConsumer_i : public POA_CosNotifyComm::StructuredPushConsumer +{ +public: + StructuredEventConsumer_i(CORBA::ORB_ptr orb); + + virtual void push_structured_event( + const CosNotification::StructuredEvent ¬ification) + throw (CORBA::SystemException, + CosEventComm::Disconnected); + + virtual void offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType); + + virtual void disconnect_structured_push_consumer() + throw (CORBA::SystemException); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.cpp b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.cpp new file mode 100644 index 00000000000..be20808ff7e --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.cpp @@ -0,0 +1,31 @@ +#include "StructuredEventSupplier_i.h" +#include <tao/PortableServer/PS_CurrentC.h> + +StructuredEventSupplier_i::StructuredEventSupplier_i(CORBA::ORB_ptr orb) +: orb_(CORBA::ORB::_duplicate(orb)) +{ +} + +void +StructuredEventSupplier_i::disconnect_structured_push_supplier () +throw (CORBA::SystemException) +{ + + CORBA::Object_var obj = orb_->resolve_initial_references ("POACurrent"); + PortableServer::Current_var current = + PortableServer::Current::_narrow (obj.in()); + PortableServer::POA_var poa = current->get_POA (); + PortableServer::ObjectId_var objectId = current->get_object_id (); + poa->deactivate_object (objectId.in()); + +} + +void +StructuredEventSupplier_i::subscription_change ( + const CosNotification::EventTypeSeq &, + const CosNotification::EventTypeSeq &) + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType) +{ +} + diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.h b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.h new file mode 100644 index 00000000000..5de5db6220f --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/StructuredEventSupplier_i.h @@ -0,0 +1,25 @@ +#ifndef _EVENTSUPPLIER_I_H_ +#define _EVENTSUPPLIER_I_H_ + +#include <orbsvcs/CosNotifyChannelAdminS.h> + +class StructuredEventSupplier_i : public POA_CosNotifyComm::StructuredPushSupplier +{ +public: + // Constructor + StructuredEventSupplier_i(CORBA::ORB_ptr orb); + virtual void disconnect_structured_push_supplier () + throw (CORBA::SystemException); + + virtual void subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed) + + throw (CORBA::SystemException, + CosNotifyComm::InvalidEventType); + +private: + CORBA::ORB_var orb_; +}; + +#endif diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/SupplierSideNC.mpc b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/SupplierSideNC.mpc new file mode 100644 index 00000000000..50383993728 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/SupplierSideNC.mpc @@ -0,0 +1,23 @@ +project(*Server): taoexe, portableserver, namingexe, notification_serv { + Source_Files { + StructuredEventSupplier_i.cpp + MessengerServer.cpp + Messenger_i.cpp + } +} + +project(*Client): taoexe, namingexe, notification { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} + +project(*Consumer): taoexe, portableserver, namingexe, notification_skel { + IDL_Files { + } + Source_Files { + MessengerConsumer.cpp + StructuredEventConsumer_i.cpp + } +} diff --git a/TAO/DevGuideExamples/NotifyService/SupplierSideNC/run_test.pl b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/run_test.pl new file mode 100644 index 00000000000..3f7e4817547 --- /dev/null +++ b/TAO/DevGuideExamples/NotifyService/SupplierSideNC/run_test.pl @@ -0,0 +1,56 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile("ns.ior"); +$messiorfile = PerlACE::LocalFile("Messenger.ior"); +$arg_ns_ref = "-ORBInitRef NameService=file://$nsiorfile"; +unlink $nsiorfile; +unlink $messiorfile; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 10) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $arg_ns_ref); +$S->Spawn(); + +# Wait for the MessengerServer +if (PerlACE::waitforfile_timed ($messiorfile, 10) == -1) { + print STDERR "ERROR: Timed out waiting for $messiorfile\n"; + $S->Kill(); + $NS->Kill (); + exit 1; +} +# start MessengerConsumer +$MC = new PerlACE::Process("MessengerConsumer", $arg_ns_ref); +$MC->Spawn(); + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", $arg_ns_ref); +if ($C->SpawnWaitKill(10) != 0) { + $MC->Kill(); + $S->Kill(); + $NS->Kill(); + exit (1); +} + +$MC->Kill(); +$S->Kill(); +$NS->Kill(); + +unlink $nsiorfile; +unlink $messiorfile; + +exit 0; diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/Auth.mpc b/TAO/DevGuideExamples/PortableInterceptors/Auth/Auth.mpc new file mode 100644 index 00000000000..eefa89004eb --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/Auth.mpc @@ -0,0 +1,17 @@ +project(*Server): taoexe, portableserver, namingexe, pi_server, avoids_minimum_corba { + Source_Files { + Messenger_i.cpp + ServerInitializer.cpp + ServerInterceptor.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, namingexe, pi, avoids_minimum_corba, interceptors { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + ClientInitializer.cpp + ClientInterceptor.cpp + } +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.cpp new file mode 100644 index 00000000000..816f42d67e0 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.cpp @@ -0,0 +1,36 @@ +#include "ClientInitializer.h" +#include "ClientInterceptor.h" +#include <iostream> + +ClientInitializer::ClientInitializer (void) +{ +} + +void +ClientInitializer::pre_init (PortableInterceptor::ORBInitInfo_ptr) +{ +} + +void +ClientInitializer::post_init (PortableInterceptor::ORBInitInfo_ptr info) +{ + + // Create and register the request interceptors. + PortableInterceptor::ClientRequestInterceptor_ptr ci = + PortableInterceptor::ClientRequestInterceptor::_nil (); + + try + { + ci = new ClientInterceptor(); + } + catch(...) + { + std::cerr << "Exception ocurred creating ClientInterceptor" << std::endl; + } + + PortableInterceptor::ClientRequestInterceptor_var ci_interceptor = + ci; + + info->add_client_request_interceptor (ci_interceptor.in ()); +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.h new file mode 100644 index 00000000000..ffd77584d39 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInitializer.h @@ -0,0 +1,19 @@ +#ifndef CLIENTINITIALIZER_H +#define CLIENTINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/PI.h" + +class ClientInitializer : + public virtual PortableInterceptor::ORBInitializer, + public virtual TAO_Local_RefCounted_Object +{ +public: + ClientInitializer (void); + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info); + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info); +}; + +#endif + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.cpp new file mode 100644 index 00000000000..21cd2e19be7 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.cpp @@ -0,0 +1,96 @@ +#include "ClientInterceptor.h" +#include <tao/OctetSeqC.h> +#include <tao/PI/ClientRequestInfo.h> +#include <ace/OS_NS_string.h> +#include <iostream> + +const CORBA::ULong service_ctx_id = 0xdeed; + +ClientInterceptor:: +ClientInterceptor (void) + : myname_ ("Client_Authentication_Interceptor") +{ + std::cout << "Calling ClientInterceptor constructor." << std::endl; +} + +ClientInterceptor::~ClientInterceptor (void) +{ +} + +char * +ClientInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ClientInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ClientInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInterceptor::send_poll ( + PortableInterceptor::ClientRequestInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling send_poll()." << std::endl; +} + + +void +ClientInterceptor::send_request ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling send_request()." << std::endl; + + IOP::ServiceContext sc; + sc.context_id = service_ctx_id; + + const char user_name[] = "Ron Klein"; + std::cout << "User's Name: " << user_name << std::endl; + CORBA::ULong string_len = sizeof (user_name) + 1; + CORBA::Octet *buf = 0; + + buf = new CORBA::Octet [string_len]; + + ACE_OS::strcpy (reinterpret_cast<char*> (buf), user_name); + + sc.context_data.replace (string_len, string_len, buf, 1); + + // Add this context to the service context list. + ri->add_request_service_context (sc, 0); + +} + +void +ClientInterceptor::receive_reply ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_reply()." << std::endl; +} + +void +ClientInterceptor::receive_other ( + PortableInterceptor::ClientRequestInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling receive_other()." << std::endl; +} + +void +ClientInterceptor::receive_exception ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_exception()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.h new file mode 100644 index 00000000000..4882eaac54c --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ClientInterceptor.h @@ -0,0 +1,46 @@ +#ifndef CLIENTINTERCEPTOR_H +#define CLIENTINTERCEPTOR_H + +#include <tao/PortableInterceptorC.h> +#include <tao/LocalObject.h> +#include <tao/PI/PI.h> + +class ClientInterceptor +: public virtual PortableInterceptor::ClientRequestInterceptor, + public virtual TAO_Local_RefCounted_Object +{ + + public: + ClientInterceptor (void); + + virtual ~ClientInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger.idl b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerClient.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerClient.cpp new file mode 100644 index 00000000000..9c3ddf77134 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerClient.cpp @@ -0,0 +1,50 @@ +#include "MessengerC.h" +#include "ClientInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI library is linked in when building statically +#include <tao/PI/PI.h> +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +main (int argc, char *argv[]) +{ + try + { + PortableInterceptor::ORBInitializer_ptr temp_initializer = + PortableInterceptor::ORBInitializer::_nil (); + + temp_initializer = new ClientInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "Client ORB"); + + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + + if ( CORBA::is_nil(obj.in() ) ) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + Messenger_var messenger = Messenger::_narrow( obj.in() ); + + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + } + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerServer.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerServer.cpp new file mode 100644 index 00000000000..5a9757a9655 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/MessengerServer.cpp @@ -0,0 +1,59 @@ +#include "Messenger_i.h" +#include "MessengerS.h" +#include "ServerInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI_Server library is linked in when building statically +#include <tao/PI_Server/PI_Server.h> +#include <iostream> +#include <fstream> +int +main (int argc, char *argv[]) +{ + try + { + ServerInitializer *temp_initializer = 0; + + temp_initializer = new ServerInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "Server ORB"); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile ( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << std::endl << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.cpp new file mode 100644 index 00000000000..41786a4e1c8 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.cpp @@ -0,0 +1,43 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && (ACE_HAS_STANDARD_CPP_LIBRARY == 1) +#include <iostream> +#else +#include <iostream.h> +#endif + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + +{ + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.h b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.h new file mode 100644 index 00000000000..99ceb257dfd --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/Messenger_i.h @@ -0,0 +1,41 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/README b/TAO/DevGuideExamples/PortableInterceptors/Auth/README new file mode 100644 index 00000000000..6b6ce299369 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/README @@ -0,0 +1,36 @@ +Portable Interceptors + + +File: DevGuideExamples/PortableInterceptor/Auth/README + + +This directory contains an example illustrating client and server +Request Interceptors. + +This is a simple insecure authentication example that is based on +the Messenger example in GettingStarted directory. A message is +sent by MessengerClient and displayed by MessengerServer. A client-side +portable interceptor adds a username to each request sent to the server. +A server-side interceptor verifies that the supplied username is valid. + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.cpp new file mode 100644 index 00000000000..e22e1af87f0 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.cpp @@ -0,0 +1,44 @@ +#include "ServerInitializer.h" +#include "ServerInterceptor.h" + +#if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && (ACE_HAS_STANDARD_CPP_LIBRARY == 1) +#include <iostream> +#else +#include <iostream.h> +#endif + +ServerInitializer::ServerInitializer () +{ +} + +void +ServerInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ServerInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + + // Create and register the request interceptors. + PortableInterceptor::ServerRequestInterceptor_ptr si = + PortableInterceptor::ServerRequestInterceptor::_nil (); + + try + { + si = new ServerInterceptor (); + } + catch(...) + { + std::cerr << "Exception occured trying to create ServerInterceptor." << std::endl; + } + + PortableInterceptor::ServerRequestInterceptor_var si_interceptor = + si; + + info->add_server_request_interceptor (si_interceptor.in ()); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.h new file mode 100644 index 00000000000..f07b7821cb2 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInitializer.h @@ -0,0 +1,23 @@ +#ifndef SERVERINITIALIZER_H +#define SERVERINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI/PI.h" + +class ServerInitializer : +public virtual PortableInterceptor::ORBInitializer +{ + public: + ServerInitializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + private: + int interceptor_type_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.cpp new file mode 100644 index 00000000000..04b4e47f498 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.cpp @@ -0,0 +1,116 @@ +#include "ServerInterceptor.h" +#include <tao/PI_Server/ServerRequestInfoA.h> +#include <ace/OS_NS_string.h> +#if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && (ACE_HAS_STANDARD_CPP_LIBRARY == 1) +#include <iostream> +#else +#include <iostream.h> +#endif + +const IOP::ServiceId service_id = 0xdeed; +const unsigned int num_allowed_users = 4; +static const char* allowed_users[num_allowed_users+1] = + {"Ron Klein", "Scott Case", "Mark Hodge", "Greg Black", 0}; +const char* restricted_interfaces[1] = {"IDL:Messenger:1.0"}; + +ServerInterceptor::ServerInterceptor (void) + : myname_ ("Server_Authentication_Interceptor") +{ + std::cout << "Calling ServerInterceptor constructor." << std::endl; +} + +ServerInterceptor::~ServerInterceptor () +{ +} + +char * +ServerInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ServerInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ServerInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling destroy()." << std::endl; +} + +void +ServerInterceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_request_service_contexts()." << std::endl; +} + +void +ServerInterceptor::receive_request ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + bool permission_granted = false; + std::cout << "Calling receive_request()." << std::endl; + + if (ri->target_is_a(restricted_interfaces[0])){ + IOP::ServiceId id = service_id; + // Check that the request service context can be retrieved. + IOP::ServiceContext_var sc = + ri->get_request_service_context (id); + + CORBA::OctetSeq ocSeq = sc->context_data; + + const char * buf = + reinterpret_cast<const char *> (ocSeq.get_buffer ()); + + for (unsigned int i=0; i<num_allowed_users; ++i) { + if (ACE_OS::strcmp (buf, allowed_users[i]) == 0) + { + permission_granted = true; + } + } + } + + if (permission_granted == true) { + std::cout << "Permission Granted " << std::endl; + } + else { + std::cout << "Permission Denied " << std::endl; + throw CORBA::NO_PERMISSION(); + } +} + +void +ServerInterceptor::send_reply ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_reply()." << std::endl; +} + +void +ServerInterceptor::send_exception ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_exception()." << std::endl; +} + +void +ServerInterceptor::send_other ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_other()." << std::endl; +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.h new file mode 100644 index 00000000000..d0eb11ee704 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/ServerInterceptor.h @@ -0,0 +1,45 @@ +#ifndef SERVERINTERCEPTOR_H +#define SERVERINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI_Server/ServerRequestInterceptorA.h" + +class ServerInterceptor +: public PortableInterceptor::ServerRequestInterceptor +{ + public: + ServerInterceptor (void); + + ~ServerInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/Auth/run_test.pl b/TAO/DevGuideExamples/PortableInterceptors/Auth/run_test.pl new file mode 100644 index 00000000000..8804f7ba6d8 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/Auth/run_test.pl @@ -0,0 +1,36 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +# start MessengerServer +my($iorfile) = 'Messenger.ior'; +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ( + $iorfile, + $PerlACE::wait_interval_for_process_creation) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $SV->Kill(); + exit(1); +} + +# start MessengerClient +select undef, undef, undef, .5; +$C = new PerlACE::Process("MessengerClient"); + +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); + +exit 0; + + + diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.cpp new file mode 100644 index 00000000000..6abd46ca4c0 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.cpp @@ -0,0 +1,45 @@ +#include "ClientInitializer.h" +#include "ClientInterceptor.h" +#include <iostream> + +ClientInitializer::ClientInitializer (void) +{ +} + +void +ClientInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + + // get Codec factory + IOP::CodecFactory_var codec_factory = info->codec_factory(); + + // Create and register the request interceptors. + PortableInterceptor::ClientRequestInterceptor_ptr ci = + PortableInterceptor::ClientRequestInterceptor::_nil (); + + try + { + ci = new ClientInterceptor (codec_factory); + } + catch(...) + { + std::cerr << "Exception occurred trying to create ClientInterceptor." << std::endl; + } + + PortableInterceptor::ClientRequestInterceptor_var ci_interceptor = + ci; + + info->add_client_request_interceptor (ci_interceptor.in ()); +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.h new file mode 100644 index 00000000000..9536c6ce776 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInitializer.h @@ -0,0 +1,21 @@ +#ifndef CLIENTINITIALIZER_H +#define CLIENTINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/PI.h" + +class ClientInitializer : + public virtual PortableInterceptor::ORBInitializer, + public virtual TAO_Local_RefCounted_Object +{ + public: + ClientInitializer (void); + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); +}; + +#endif + diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.cpp new file mode 100644 index 00000000000..c919423a0eb --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.cpp @@ -0,0 +1,123 @@ +#include "ClientInterceptor.h" +#include "tao/OctetSeqC.h" +#include "tao/LocalObject.h" +#include "tao/PI/ClientRequestInfo.h" + +#include <iostream> + +const CORBA::ULong service_ctx_id = 0xdeed; + +ClientInterceptor:: +ClientInterceptor (IOP::CodecFactory_var cf) + : myname_ ("Client_Authentication_Interceptor") +{ + std::cout << "Calling ClientInterceptor constructor." << std::endl; + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + this->codec = cf->create_codec (encoding); +} + +ClientInterceptor::~ClientInterceptor (void) +{ +} + +char * +ClientInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ClientInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ClientInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInterceptor::send_poll ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_poll()." << std::endl; +} + + +void +ClientInterceptor::send_request ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling send_request()." << std::endl; + + const CORBA::ULong tagID = 9654; + + try + { + IOP::TaggedComponent_var myTag = ri->get_effective_component(tagID); + char *tag = + reinterpret_cast<char*> (myTag->component_data.get_buffer()); + + std::cout << "IOR Tag is : " << tag << std::endl; + } + catch(...) + { + std::cerr << "Tagged Component not found" << std::endl; + } + + IOP::ServiceContext sc; + sc.context_id = service_ctx_id; + + const CORBA::Long gid = 9007; + + std::cout << "GID: " << gid << std::endl; + + CORBA::Any gid_as_any; + gid_as_any <<= gid; + + sc.context_data = reinterpret_cast<CORBA::OctetSeq&>( + *codec->encode(gid_as_any)); + + // Add this context to the service context list. + ri->add_request_service_context (sc, 0); + +} + +void +ClientInterceptor::receive_reply ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_reply()." << std::endl; +} + +void +ClientInterceptor::receive_other ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_other()." << std::endl; +} + +void +ClientInterceptor::receive_exception ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_exception()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.h new file mode 100644 index 00000000000..445a601d082 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ClientInterceptor.h @@ -0,0 +1,48 @@ +#ifndef CLIENTINTERCEPTOR_H +#define CLIENTINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/ClientRequestInterceptorA.h" +#include "tao/PI/ORBInitInfo.h" + +class ClientInterceptor: + public virtual PortableInterceptor::ClientRequestInterceptor, + public virtual TAO_Local_RefCounted_Object +{ + + public: + ClientInterceptor (IOP::CodecFactory_var) ; + + virtual ~ClientInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; + IOP::Codec_var codec; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/IOR.mpc b/TAO/DevGuideExamples/PortableInterceptors/IOR/IOR.mpc new file mode 100644 index 00000000000..cc7e4118767 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/IOR.mpc @@ -0,0 +1,18 @@ +project(*Server): taoexe, portableserver, pi_server, avoids_minimum_corba, iorinterceptor { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + ServerInitializer.cpp + ServerInterceptor.cpp + ServerIORInterceptor.cpp + } +} + +project(*Client): taoexe, pi, avoids_minimum_corba, interceptors { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + ClientInitializer.cpp + ClientInterceptor.cpp + } +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger.idl b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger.idl new file mode 100644 index 00000000000..f2a0074c1e8 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger.idl @@ -0,0 +1,6 @@ +#include "orb.idl" + +interface Messenger +{ + void send_message(in CORBA::OctetSeq user_name); +}; diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerClient.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerClient.cpp new file mode 100644 index 00000000000..f60cd3143ed --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerClient.cpp @@ -0,0 +1,84 @@ +#include "MessengerC.h" +#include "ClientInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI library is linked in when building statically +#include <tao/PI/PI.h> +#include <iostream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + PortableInterceptor::ORBInitializer_ptr temp_initializer = + PortableInterceptor::ORBInitializer::_nil (); + + temp_initializer = new ClientInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Destringify ior + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + // Obtain a reference to the CodecFactory. + CORBA::Object_var obj2 = + orb->resolve_initial_references ("CodecFactory"); + + IOP::CodecFactory_var codec_factory; + + if(CORBA::is_nil(obj2.in())) + { + std::cerr << "Error: codec_factory" << std::endl; + ACE_OS::exit(1); + } + else + { + codec_factory = IOP::CodecFactory::_narrow (obj2.in ()); + std::cout << "got codec factory" << std::endl; + } + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + IOP::Codec_var codec = + codec_factory->create_codec (encoding); + + CORBA::Long uid = 64321; + + CORBA::Any uid_as_any; + + uid_as_any <<= uid; + CORBA::OctetSeq client_uid = *codec->encode (uid_as_any); + messenger->send_message( client_uid ); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Exception in MessengerClient: " << ex << std::endl; + return 1; + } + + std::cout << "message was sent" << std::endl; + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerServer.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerServer.cpp new file mode 100644 index 00000000000..03493a5c5af --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/MessengerServer.cpp @@ -0,0 +1,59 @@ +#include "Messenger_i.h" +#include "MessengerC.h" +#include "ServerInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI_Server library is linked in when building statically +#include <tao/PI_Server/PI_Server.h> +#include <iostream> +#include <fstream> + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + ServerInitializer *temp_initializer = 0; + temp_initializer = new ServerInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Exception in MessengerServer: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.cpp new file mode 100644 index 00000000000..eb4520c600b --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.cpp @@ -0,0 +1,75 @@ +#include <tao/CodecFactory/CodecFactory.h> +#include <ace/OS_NS_string.h> +#include <iostream> +#include "Messenger_i.h" + + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + + +void Messenger_i::send_message (const CORBA::OctetSeq & user_name) + ACE_THROW_SPEC (( + CORBA::SystemException + )) +{ + try + { + int argc = 1; + char **argv = new char *[argc]; + argv[0] = new char[ACE_OS::strlen ("MessengerServer")]; + strcpy (argv[0], "MessengerServer"); + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + // Obtain a reference to the CodecFactory. + CORBA::Object_var obj = + orb->resolve_initial_references ("CodecFactory"); + + IOP::CodecFactory_var codec_factory; + + if(CORBA::is_nil(obj.in())) + { + std::cerr << "Error: codec_factory" << std::endl; + ACE_OS::exit(1); + } + else + { + codec_factory = IOP::CodecFactory::_narrow (obj.in ()); + std::cout << "Server got codec factory" << std::endl; + } + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + IOP::Codec_var codec = + codec_factory->create_codec (encoding); + + CORBA::Any uid_as_any; + uid_as_any = *(codec->decode(user_name)); + + CORBA::Long uid; + uid_as_any >>= uid; + std::cout << "UID: " << uid << std::endl; + + } + + catch(...) + { + std::cerr << "exception received" << std::endl; + ACE_OS::exit(1); + } + +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.h new file mode 100644 index 00000000000..dc3e46058f5 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/Messenger_i.h @@ -0,0 +1,29 @@ +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ + public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + + virtual void send_message (const CORBA::OctetSeq & user_name) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/README b/TAO/DevGuideExamples/PortableInterceptors/IOR/README new file mode 100644 index 00000000000..1fc72cbf7f4 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/README @@ -0,0 +1,35 @@ +Portable Interceptors + + +File: DevGuideExamples/PortableInterceptor/IOR/README + + +This directory contains an example of using portable interceptors to add +tagged information to an IOR. + +This example is based on the Messenger example in GettingStarted +directory. A message is send by MessengerClient and displayed by +MessengerServer. On IOR creation, the server has added a special +tag "ServerRequiresAuth". The client is able to extract this tag. + + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + +Execution via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.cpp new file mode 100644 index 00000000000..43ad1333ee6 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.cpp @@ -0,0 +1,40 @@ +#include "ServerIORInterceptor.h" +#include <iostream> +char * +ServerIORInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return CORBA::string_dup ("ServerIORInterceptor"); +} + +void +ServerIORInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ServerIORInterceptor::establish_components ( + PortableInterceptor::IORInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + + const char * permission = "ServerRequiresAuth"; + + // arbitrary tag. + CORBA::ULong tagID = 9654; + + IOP::TaggedComponent myTag; + + myTag.tag = tagID; + myTag.component_data.length (ACE_OS::strlen(permission) + 1 ); + + CORBA::Octet *buf = myTag.component_data.get_buffer(); + + ACE_OS::memcpy (buf, permission, ACE_OS::strlen(permission) + 1); + + // add tagged component + info->add_ior_component (myTag); + + std::cout << "Created Tagged IOR." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.h new file mode 100644 index 00000000000..9dd6c080b45 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerIORInterceptor.h @@ -0,0 +1,50 @@ +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/IORInterceptor_Adapter.h" +#include "tao/IORInterceptor/IORInterceptor.h" + +class ServerIORInterceptor : +public virtual PortableInterceptor::IORInterceptor, +public virtual TAO_Local_RefCounted_Object +{ + public: + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void establish_components ( + PortableInterceptor::IORInfo_ptr info + ) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void components_established ( + PortableInterceptor::IORInfo_ptr /*info*/ + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + { + } + + virtual void adapter_manager_state_changed ( + PortableInterceptor::AdapterManagerId /*id*/, + PortableInterceptor::AdapterState /*state*/ + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + { + } + + virtual void adapter_state_changed ( + const PortableInterceptor::ObjectReferenceTemplateSeq& /*templates*/, + PortableInterceptor::AdapterState /*state*/ + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + { + } +}; diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.cpp new file mode 100644 index 00000000000..b275cf004ea --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.cpp @@ -0,0 +1,32 @@ +#include "ServerInitializer.h" +#include "ServerInterceptor.h" +#include "ServerIORInterceptor.h" + +ServerInitializer::ServerInitializer () +{ +} + +void +ServerInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ServerInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // get reference to the codec_factory + IOP::CodecFactory_var codec_factory = info->codec_factory(); + + // Create and register the request interceptors. + PortableInterceptor::ServerRequestInterceptor_var si = + new ServerInterceptor (codec_factory); + info->add_server_request_interceptor (si.in()); + + // add IOR Interceptor + PortableInterceptor::IORInterceptor_var iori = new ServerIORInterceptor; + info->add_ior_interceptor (iori.in()); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.h new file mode 100644 index 00000000000..f07b7821cb2 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInitializer.h @@ -0,0 +1,23 @@ +#ifndef SERVERINITIALIZER_H +#define SERVERINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI/PI.h" + +class ServerInitializer : +public virtual PortableInterceptor::ORBInitializer +{ + public: + ServerInitializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + private: + int interceptor_type_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.cpp new file mode 100644 index 00000000000..c70299b8523 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.cpp @@ -0,0 +1,125 @@ +#include "ServerInterceptor.h" +#include <tao/PI_Server/ServerRequestInfoA.h> +#include <tao/OctetSeqC.h> +#include <iostream> + +const IOP::ServiceId service_id = 0xdeed; +const CORBA::Long allowed_gid[4] = { 9006, 9007, 9008 }; +const char* restricted_interfaces[1] = {"IDL:Messenger:1.0"}; + +ServerInterceptor::ServerInterceptor (IOP::CodecFactory_var cf) + : myname_ ("Server_Authentication_Interceptor") +{ + std::cout << "Calling ServerInterceptor constructor." << std::endl; + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + this->codec = cf->create_codec (encoding); +} + +ServerInterceptor::~ServerInterceptor () +{ +} + +char * +ServerInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ServerInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ServerInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling destroy()." << std::endl; +} + +void +ServerInterceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_request_service_contexts()." << std::endl; +} + +void +ServerInterceptor::receive_request ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + bool permission_granted = false; + std::cout << "Calling receive_request()." << std::endl; + + if (ri->target_is_a(restricted_interfaces[0])){ + IOP::ServiceId id = service_id; + // Check that the request service context can be retrieved. + IOP::ServiceContext_var sc = + ri->get_request_service_context (id); + // need to construct an octet seq for decoding + CORBA::OctetSeq ocSeq = CORBA::OctetSeq( + sc->context_data.length(), + sc->context_data.length(), + sc->context_data.get_buffer(), + 0); + + CORBA::Any gid_as_any; + gid_as_any = *codec->decode(ocSeq); + + CORBA::Long gid; + gid_as_any >>= gid; + for (int i=0; i<3; ++i) { + if ( gid == allowed_gid[i] ) + { + permission_granted = true; + } + } + } + + if (permission_granted == true) { + std::cout << "Permission Granted " << std::endl; + } + else { + std::cout << "Permission Denied " << std::endl; + ACE_THROW_SPEC (CORBA::NO_PERMISSION()); + } +} + +void +ServerInterceptor::send_reply ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_reply()." << std::endl; +} + +void +ServerInterceptor::send_exception ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_exception()." << std::endl; +} + +void +ServerInterceptor::send_other ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_other()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.h new file mode 100644 index 00000000000..abcac4bc9f5 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/ServerInterceptor.h @@ -0,0 +1,47 @@ +#ifndef SERVERINTERCEPTOR_H +#define SERVERINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI_Server/ServerRequestInterceptorA.h" +#include "tao/PI/ORBInitInfo.h" + +class ServerInterceptor +: public PortableInterceptor::ServerRequestInterceptor +{ + public: + ServerInterceptor (IOP::CodecFactory_var); + + ~ServerInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; + IOP::Codec_var codec; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/IOR/run_test.pl b/TAO/DevGuideExamples/PortableInterceptors/IOR/run_test.pl new file mode 100644 index 00000000000..2bd452196e4 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/IOR/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +# start MessengerServer +my($iorfile) = 'Messenger.ior'; +unlink $iorfile; + +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ( + $iorfile, + $PerlACE::wait_interval_for_process_creation) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $SV->Kill(); + exit(1); +} + +# start MessengerClient +select undef, undef, undef, .5; +$C = new PerlACE::Process("MessengerClient"); + +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); + +unlink $iorfile; + +exit 0; diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.cpp new file mode 100644 index 00000000000..0b81911048d --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.cpp @@ -0,0 +1,56 @@ +#include "ClientInitializer.h" +#include "ClientInterceptor.h" +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +ClientInitializer::ClientInitializer (void) + : slot_ (0), + current_ (PortableInterceptor::Current::_nil()) +{ +} + +void +ClientInitializer::pre_init (PortableInterceptor::ORBInitInfo_ptr) +{ +} + +void +ClientInitializer::post_init (PortableInterceptor::ORBInitInfo_ptr info) +{ + // resolve Messenger object + CORBA::Object_var obj = info->resolve_initial_references( "Messenger" ); + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + ACE_ASSERT(false); + } + + // allocate slot + slot_ = info->allocate_slot_id(); + + // get PICurrent + CORBA::Object_var current_obj = info->resolve_initial_references("PICurrent"); + + current_ = + PortableInterceptor::Current::_narrow(current_obj.in()); + + // Create and register the request interceptors. + PortableInterceptor::ClientRequestInterceptor_var ci = + new ClientInterceptor(messenger, current_.in(), slot_); + info->add_client_request_interceptor (ci.in()); +} + +void +ClientInitializer::set_slot_data (void) +{ + // Set the recursion flag + CORBA::Any flag; + CORBA::Boolean x = 0; + flag <<= CORBA::Any::from_boolean(x); + current_->set_slot(slot_, flag); + + // Now that we're done with the PICurrent, we will release + // our reference to it. + current_ = PortableInterceptor::Current::_nil(); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.h new file mode 100644 index 00000000000..33131f3c1cc --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInitializer.h @@ -0,0 +1,25 @@ +#ifndef CLIENTINITIALIZER_H +#define CLIENTINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/PI.h" +#include "tao/PI/PICurrentC.h" + +class ClientInitializer : + public virtual PortableInterceptor::ORBInitializer, + public virtual TAO_Local_RefCounted_Object +{ + public: + ClientInitializer (void); + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info); + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info); + void set_slot_data (void); + + private: + PortableInterceptor::SlotId slot_; + PortableInterceptor::Current_var current_; +}; + +#endif + diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.cpp new file mode 100644 index 00000000000..52454103c10 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.cpp @@ -0,0 +1,109 @@ +#include "ClientInterceptor.h" +#include "tao/OctetSeqC.h" +#include "tao/PI/ClientRequestInfo.h" +#include "MessengerC.h" +#include "ace/OS_NS_string.h" +#include <iostream> + +const CORBA::ULong service_ctx_id = 0xdeed; + +ClientInterceptor:: +ClientInterceptor (Messenger_var theMessenger, + PortableInterceptor::Current_ptr thePic, + PortableInterceptor::SlotId theSlot) + : myname_ ("Client_Authentication_Interceptor") +{ + std::cout << "Calling ClientInterceptor constructor." << std::endl; + this->messenger = theMessenger; + this->pic = thePic; + this->slot = theSlot; +} + +ClientInterceptor::~ClientInterceptor (void) +{ +} + +char * +ClientInterceptor::name () +{ + std::cout << "Calling ClientInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ClientInterceptor::destroy () +{ +} + +void +ClientInterceptor::send_poll (PortableInterceptor::ClientRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_poll()." << std::endl; +} + + +void +ClientInterceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri) +{ + std::cout << "Calling send_request()." << std::endl; + + IOP::ServiceContext sc; + sc.context_id = service_ctx_id; + + const char user_name[] = "Ron Klein"; + std::cout << "User's Name: " << user_name << std::endl; + CORBA::ULong string_len = sizeof (user_name) + 1; + CORBA::Octet *buf = 0; + buf = new CORBA::Octet [string_len]; + + ACE_OS::strcpy (reinterpret_cast<char*> (buf), user_name); + + sc.context_data.replace (string_len, string_len, buf, 1); + + // recursive call setup + CORBA::Any *recurse = ri->get_slot(slot); + CORBA::Boolean x; + *recurse >>= CORBA::Any::to_boolean(x); + + CORBA::Any flag; + if (x == 0) + { + x = 1; + flag <<= CORBA::Any::from_boolean(x); + + pic->set_slot(slot, flag); + + // get server time + std::cout << "Server Time = " << messenger->get_time() << std::endl; + } + // Add this context to the service context list. + ri->add_request_service_context (sc, 0); + + // reset recursion test + x = 0; + flag <<= CORBA::Any::from_boolean(x); + pic->set_slot(slot,flag); + +} + +void +ClientInterceptor::receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_reply()." << std::endl; +} + +void +ClientInterceptor::receive_other (PortableInterceptor::ClientRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_other()." << std::endl; +} + +void +ClientInterceptor::receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_exception()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.h new file mode 100644 index 00000000000..538460c6e71 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ClientInterceptor.h @@ -0,0 +1,43 @@ +#ifndef CLIENTINTERCEPTOR_H +#define CLIENTINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/ClientRequestInterceptorA.h" +#include "tao/PI/PICurrentC.h" +#include "MessengerC.h" + +class ClientInterceptor: + public virtual PortableInterceptor::ClientRequestInterceptor, + public virtual TAO_Local_RefCounted_Object +{ + + public: + ClientInterceptor (Messenger_var theMessage, + PortableInterceptor::Current_ptr thePic, + PortableInterceptor::SlotId theSlot); + + virtual ~ClientInterceptor (); + + virtual char * name (); + + virtual void destroy (); + + virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr ri); + + virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri); + + virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri); + + virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr ri); + + virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri); + + private: + const char *myname_; + Messenger_var messenger; + PortableInterceptor::Current_ptr pic; + PortableInterceptor::SlotId slot; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger.idl b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger.idl new file mode 100644 index 00000000000..ceda3e3e52b --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger.idl @@ -0,0 +1,10 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + + string get_time (); + }; diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerClient.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerClient.cpp new file mode 100644 index 00000000000..f5115a69efb --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerClient.cpp @@ -0,0 +1,52 @@ +#include "MessengerC.h" +#include "ClientInitializer.h" + +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI library is linked in when building statically +#include <tao/PI/PI.h> +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +int +main (int argc, char *argv[]) +{ + try + { + ClientInitializer* temp_initializer = new ClientInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "Client ORB"); + + // Now that the ORB is initialized (and subsequently the + // PICurrent), we can set the slot data on the PICurrent for our + // interceptor initializer. + temp_initializer->set_slot_data (); + + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if ( CORBA::is_nil(obj.in() ) ) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "client Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerServer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerServer.cpp new file mode 100644 index 00000000000..ef2f97614c1 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/MessengerServer.cpp @@ -0,0 +1,63 @@ +#include "Messenger_i.h" +#include "MessengerS.h" +#include "ServerInitializer.h" + +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI_Server library is linked in when building statically +#include <tao/PI_Server/PI_Server.h> +#include <orbsvcs/CosNamingC.h> +#include <iostream> +#include <fstream> +#include <fstream> + +int +main (int argc, char *argv[]) +{ + try + { + ServerInitializer *temp_initializer = 0; + + temp_initializer = new ServerInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "Server ORB"); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile ( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << std::endl << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "server Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.cpp new file mode 100644 index 00000000000..866a54c890f --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.cpp @@ -0,0 +1,51 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/OS_NS_time.h> +#if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && (ACE_HAS_STANDARD_CPP_LIBRARY == 1) +#include <iostream> +#else +#include <iostream.h> +#endif + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message) + +{ + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; +} + +char * Messenger_i::get_time (void) +{ + time_t thetime; + struct tm * timeinfo = 0; + + ACE_OS::time(&thetime); + timeinfo = ACE_OS::localtime(&thetime); + char *timestring = CORBA::string_dup(ACE_OS::asctime(timeinfo)); + + return timestring; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.h new file mode 100644 index 00000000000..c1f0e3daa84 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/Messenger_i.h @@ -0,0 +1,37 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message); + + virtual char * get_time (void); +}; + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/PICurrent.mpc b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/PICurrent.mpc new file mode 100644 index 00000000000..53d7b4c1085 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/PICurrent.mpc @@ -0,0 +1,17 @@ +project(*Server): taoexe, portableserver, pi_server, namingexe { + Source_Files { + Messenger_i.cpp + ServerInitializer.cpp + ServerInterceptor.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, pi, namingexe, interceptors { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + ClientInitializer.cpp + ClientInterceptor.cpp + } +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/README b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/README new file mode 100644 index 00000000000..89211ca7106 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/README @@ -0,0 +1,34 @@ +Portable Interceptors + + +File: DevGuideExamples/PortableInterceptor/PICurrent_NameService/README + + +This directory contains an example that shows how the PICurrent can +be used to stop client-side interceptor recursions. + +This example is based on the Messenger example in GettingStarted +directory. A message is send by MessengerClient and displayed by +MessengerServer. When the client receives a reply, it asks the server +for the current time. This causes a recursive call at the receive_reply() +interception point. A flag is passed in the PICurrent to let the client +know the call is recursive. + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + +To start the client: +------------------ +./MessengerClient -ORBInitRef Messenger=file://Messenger.ior + +Execuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.cpp new file mode 100644 index 00000000000..fc609c531c5 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.cpp @@ -0,0 +1,22 @@ +#include "ServerInitializer.h" +#include "ServerInterceptor.h" + +ServerInitializer::ServerInitializer () +{ +} + +void +ServerInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr) +{ +} + +void +ServerInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info) +{ + // Create and register the request interceptors. + PortableInterceptor::ServerRequestInterceptor_var si = + new ServerInterceptor(); + info->add_server_request_interceptor (si.in()); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.h new file mode 100644 index 00000000000..fb880e8b5f4 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInitializer.h @@ -0,0 +1,21 @@ +#ifndef SERVERINITIALIZER_H +#define SERVERINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI/PI.h" + +class ServerInitializer : +public virtual PortableInterceptor::ORBInitializer +{ + public: + ServerInitializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info); + + private: + int interceptor_type_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.cpp new file mode 100644 index 00000000000..8dfb951ba97 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.cpp @@ -0,0 +1,98 @@ +#include "ServerInterceptor.h" +#include "tao/PI_Server/ServerRequestInfoA.h" +#include "ace/OS_NS_string.h" +#include <iostream> + +const IOP::ServiceId service_id = 0xdeed; +const unsigned int num_allowed_users = 4; +static const char* allowed_users[num_allowed_users+1] = + {"Ron Klein", "Scott Case", "Mark Hodge", "Greg Black", 0}; +const char* restricted_interfaces[1] = {"IDL:Messenger:1.0"}; + +ServerInterceptor::ServerInterceptor (void) + : myname_ ("Server_Authentication_Interceptor") +{ + std::cout << "Calling ServerInterceptor constructor." << std::endl; +} + +ServerInterceptor::~ServerInterceptor () +{ +} + +char * +ServerInterceptor::name () +{ + std::cout << "Calling ServerInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ServerInterceptor::destroy () +{ + std::cout << "Calling destroy()." << std::endl; +} + +void +ServerInterceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_request_service_contexts()." << std::endl; +} + +void +ServerInterceptor::receive_request ( + PortableInterceptor::ServerRequestInfo_ptr ri) +{ + bool permission_granted = false; + std::cout << "Calling receive_request()." << std::endl; + + if (ri->target_is_a(restricted_interfaces[0])){ + IOP::ServiceId id = service_id; + // Check that the request service context can be retrieved. + IOP::ServiceContext_var sc = + ri->get_request_service_context (id); + + CORBA::OctetSeq ocSeq = sc->context_data; + + const char * buf = + reinterpret_cast<const char *> (ocSeq.get_buffer ()); + + for (unsigned int i=0; i<num_allowed_users; ++i) { + if (ACE_OS::strcmp (buf, allowed_users[i]) == 0) + { + permission_granted = true; + } + } + } + + if (permission_granted == true) { + std::cout << "Permission Granted " << std::endl; + } + else { + std::cout << "Permission Denied " << std::endl; + ACE_THROW_SPEC (CORBA::NO_PERMISSION()); + } +} + +void +ServerInterceptor::send_reply ( + PortableInterceptor::ServerRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_reply()." << std::endl; +} + +void +ServerInterceptor::send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_exception()." << std::endl; +} + +void +ServerInterceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr ri) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_other()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.h new file mode 100644 index 00000000000..a8da1affe95 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/ServerInterceptor.h @@ -0,0 +1,34 @@ +#ifndef SERVERINTERCEPTOR_H +#define SERVERINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI_Server/ServerRequestInterceptorA.h" + +class ServerInterceptor +: public PortableInterceptor::ServerRequestInterceptor +{ + public: + ServerInterceptor (void); + + ~ServerInterceptor (); + + virtual char * name (); + + virtual void destroy (); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri); + + private: + const char *myname_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent/run_test.pl b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/run_test.pl new file mode 100644 index 00000000000..d31c1b8a2f5 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior = "Messenger.ior"; +unlink $ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file $ior\n"; + $S->Kill(); + exit 1; +} + +# start MessengerClient +select undef, undef, undef, .5; +$C = new PerlACE::Process("MessengerClient", " -ORBInitRef Messenger=file://$ior"); + +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); +#unlink $ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp new file mode 100644 index 00000000000..920ab847cf4 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.cpp @@ -0,0 +1,70 @@ +#include "ClientInitializer.h" +#include "ClientInterceptor.h" +#include "MessengerC.h" +#include <orbsvcs/CosNamingC.h> +#include <iostream> + +ClientInitializer::ClientInitializer (void) + : slot_ (0), + current_ (PortableInterceptor::Current::_nil()) +{ +} + +void +ClientInitializer::pre_init (PortableInterceptor::ORBInitInfo_ptr) +{ +} + +void +ClientInitializer::post_init (PortableInterceptor::ORBInitInfo_ptr info) +{ + // Find the Naming Service + CORBA::Object_var naming_obj = + info->resolve_initial_references("NameService"); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow(naming_obj.in()); + if( CORBA::is_nil(root.in())) { + std::cerr << "Nil Naming Context reference" << std::endl; + ACE_ASSERT(false); + } + + // Resolve the Messenger object + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup( "Messenger" ); + CORBA::Object_var obj = root->resolve( name ); + + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + ACE_ASSERT(false); + } + + // allocate slot + slot_ = info->allocate_slot_id(); + + // get PICurrent + CORBA::Object_var current_obj = info->resolve_initial_references("PICurrent"); + + current_ = + PortableInterceptor::Current::_narrow(current_obj.in()); + + // Create and register the request interceptors. + PortableInterceptor::ClientRequestInterceptor_var ci = + new ClientInterceptor(messenger, current_.in(), slot_); + info->add_client_request_interceptor (ci.in()); +} + +void +ClientInitializer::set_slot_data (void) +{ + // Set the recursion flag + CORBA::Any flag; + CORBA::Boolean x = 0; + flag <<= CORBA::Any::from_boolean(x); + current_->set_slot(slot_, flag); + + // Now that we're done with the PICurrent, we will release + // our reference to it. + current_ = PortableInterceptor::Current::_nil(); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.h new file mode 100644 index 00000000000..33131f3c1cc --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInitializer.h @@ -0,0 +1,25 @@ +#ifndef CLIENTINITIALIZER_H +#define CLIENTINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/PI.h" +#include "tao/PI/PICurrentC.h" + +class ClientInitializer : + public virtual PortableInterceptor::ORBInitializer, + public virtual TAO_Local_RefCounted_Object +{ + public: + ClientInitializer (void); + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info); + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info); + void set_slot_data (void); + + private: + PortableInterceptor::SlotId slot_; + PortableInterceptor::Current_var current_; +}; + +#endif + diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp new file mode 100644 index 00000000000..77792427eba --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.cpp @@ -0,0 +1,124 @@ +#include "ClientInterceptor.h" +#include "tao/OctetSeqC.h" +#include "tao/PI/ClientRequestInfo.h" +#include "MessengerC.h" +#include "ace/OS_NS_string.h" +#include <iostream> + +const CORBA::ULong service_ctx_id = 0xdeed; + +ClientInterceptor:: +ClientInterceptor (Messenger_var theMessenger, + PortableInterceptor::Current_ptr thePic, + PortableInterceptor::SlotId theSlot) + : myname_ ("Client_Authentication_Interceptor") +{ + std::cout << "Calling ClientInterceptor constructor." << std::endl; + this->messenger = theMessenger; + this->pic = thePic; + this->slot = theSlot; +} + +ClientInterceptor::~ClientInterceptor (void) +{ +} + +char * +ClientInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ClientInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ClientInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInterceptor::send_poll ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_poll()." << std::endl; +} + + +void +ClientInterceptor::send_request ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling send_request()." << std::endl; + + IOP::ServiceContext sc; + sc.context_id = service_ctx_id; + + const char user_name[] = "Ron Klein"; + std::cout << "User's Name: " << user_name << std::endl; + CORBA::ULong string_len = sizeof (user_name) + 1; + CORBA::Octet *buf = 0; + buf = new CORBA::Octet [string_len]; + + ACE_OS::strcpy (reinterpret_cast<char*> (buf), user_name); + + sc.context_data.replace (string_len, string_len, buf, 1); + + // recursive call setup + CORBA::Any *recurse = ri->get_slot(slot); + CORBA::Long x; + *recurse >>= x; + + CORBA::Any flag; + if (x == 0) + { + flag <<= 1; + + pic->set_slot(slot, flag); + + // get server time + std::cout << "Server Time = " << messenger->get_time() << std::endl; + } + // Add this context to the service context list. + ri->add_request_service_context (sc, 0); + + // reset recursion test + flag <<= 0; + pic->set_slot(slot,flag); + +} + +void +ClientInterceptor::receive_reply ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_reply()." << std::endl; +} + +void +ClientInterceptor::receive_other ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_other()." << std::endl; +} + +void +ClientInterceptor::receive_exception ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_exception()." << std::endl; +} + + diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.h new file mode 100644 index 00000000000..c65e5f0c6df --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ClientInterceptor.h @@ -0,0 +1,53 @@ +#ifndef CLIENTINTERCEPTOR_H +#define CLIENTINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/ClientRequestInterceptorA.h" +#include "tao/PI/PICurrentC.h" +#include "MessengerC.h" + +class ClientInterceptor: + public virtual PortableInterceptor::ClientRequestInterceptor, + public virtual TAO_Local_RefCounted_Object +{ + + public: + ClientInterceptor (Messenger_var theMessage, + PortableInterceptor::Current_ptr thePic, + PortableInterceptor::SlotId theSlot); + + virtual ~ClientInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; + Messenger_var messenger; + PortableInterceptor::Current_ptr pic; + PortableInterceptor::SlotId slot; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger.idl b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger.idl new file mode 100644 index 00000000000..ceda3e3e52b --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger.idl @@ -0,0 +1,10 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + + string get_time (); + }; diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerClient.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerClient.cpp new file mode 100644 index 00000000000..6e2128ba16c --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerClient.cpp @@ -0,0 +1,62 @@ +#include "MessengerC.h" +#include "ClientInitializer.h" + +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI library is linked in when building statically +#include <tao/PI/PI.h> +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +main (int argc, char *argv[]) +{ + try + { + ClientInitializer* temp_initializer = new ClientInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "Client ORB"); + + // Now that the ORB is initialized (and subsequently the + // PICurrent), we can set the slot data on the PICurrent for our + // interceptor initializer. + temp_initializer->set_slot_data (); + + CORBA::Object_var naming_obj = + orb->resolve_initial_references( "NameService" ); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow( naming_obj.in() ); + if ( CORBA::is_nil(root.in() ) ) { + std::cerr << "Couldn't find Naming Service." << std::endl; + return 1; + } + + // get Messenger + CosNaming::Name name; + name.length(1); + name[0].id = CORBA::string_dup( "Messenger" ); + + CORBA::Object_var obj = root->resolve( name ); + + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerServer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerServer.cpp new file mode 100644 index 00000000000..6f7c1f7c21e --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/MessengerServer.cpp @@ -0,0 +1,72 @@ +#include "Messenger_i.h" +#include "MessengerS.h" +#include "ServerInitializer.h" + +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI_Server library is linked in when building statically +#include <tao/PI_Server/PI_Server.h> +#include <orbsvcs/CosNamingC.h> +#include <iostream> +int +main (int argc, char *argv[]) +{ + try + { + ServerInitializer *temp_initializer = 0; + temp_initializer = new ServerInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "Server ORB"); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Find the Naming Service + CORBA::Object_var naming_obj = + orb->resolve_initial_references( "NameService" ); + CosNaming::NamingContext_var root = + CosNaming::NamingContext::_narrow( naming_obj.in() ); + if( CORBA::is_nil( root.in() ) ) { + std::cerr << "Nil Naming Context reference" << std::endl; + return 1; + } + + // Bind Messenger + CosNaming::Name name; + name.length( 1 ); + name[0].id = CORBA::string_dup( "Messenger" ); + + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + root->rebind(name, messenger_obj.in()); + + std::cout << "Messenger bound in Naming Service" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.cpp new file mode 100644 index 00000000000..b69a42ab285 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.cpp @@ -0,0 +1,61 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <ace/OS_NS_time.h> +#if defined (ACE_HAS_STANDARD_CPP_LIBRARY) && (ACE_HAS_STANDARD_CPP_LIBRARY == 1) +#include <iostream> +#else +#include <iostream.h> +#endif + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + + { + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; + } + +char * Messenger_i::get_time ( + + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + +{ + time_t thetime; + struct tm * timeinfo; + + ACE_OS::time(&thetime); + timeinfo = ACE_OS::localtime(&thetime); + char *timestring = CORBA::string_dup(ACE_OS::asctime(timeinfo)); + + return timestring; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.h new file mode 100644 index 00000000000..46135bf7dd9 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/Messenger_i.h @@ -0,0 +1,47 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual char * get_time ( + + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +}; + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc new file mode 100644 index 00000000000..eefa89004eb --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/PICurrent_NameService.mpc @@ -0,0 +1,17 @@ +project(*Server): taoexe, portableserver, namingexe, pi_server, avoids_minimum_corba { + Source_Files { + Messenger_i.cpp + ServerInitializer.cpp + ServerInterceptor.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, namingexe, pi, avoids_minimum_corba, interceptors { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + ClientInitializer.cpp + ClientInterceptor.cpp + } +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/README b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/README new file mode 100644 index 00000000000..04a008c682e --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/README @@ -0,0 +1,42 @@ +Portable Interceptors + + +File: DevGuideExamples/PortableInterceptor/PICurrent_NameService/README + + +This directory contains an example that shows how the PICurrent can +be used to stop client-side interceptor recursions. This example is +identical to the ../PICurrent example but uses the Naming Service. + +This example is based on the Messenger example in GettingStarted +directory. A message is send by MessengerClient and displayed by +MessengerServer. When the client receives a reply, it asks the server +for the current time. This causes a recursive call at the receive_reply() +interception point. A flag is passed in the PICurrent to let the client +know the call is recursive. + +How to Run +---------- + +Start the Naming Service: +------------------------- +$TAO_ROOT/orbsvcs/Naming_Service/Naming_Service \ + -ORBEndpoint iiop://localhost:9876 + +To start the server: +------------------ +./MessengerServer \ + -ORBInitRef NameService=iioploc://localhost:9876/NameService + +To start the client: +------------------ +./MessengerClient \ + -ORBInitRef NameService=iioploc://localhost:9876/NameService + +Execution via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.cpp new file mode 100644 index 00000000000..4ead54b7746 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.cpp @@ -0,0 +1,24 @@ +#include "ServerInitializer.h" +#include "ServerInterceptor.h" + +ServerInitializer::ServerInitializer () +{ +} + +void +ServerInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ServerInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Create and register the request interceptors. + PortableInterceptor::ServerRequestInterceptor_var si = + new ServerInterceptor(); + info->add_server_request_interceptor (si.in()); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.h new file mode 100644 index 00000000000..f07b7821cb2 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInitializer.h @@ -0,0 +1,23 @@ +#ifndef SERVERINITIALIZER_H +#define SERVERINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI/PI.h" + +class ServerInitializer : +public virtual PortableInterceptor::ORBInitializer +{ + public: + ServerInitializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + private: + int interceptor_type_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp new file mode 100644 index 00000000000..db1004b8a2f --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.cpp @@ -0,0 +1,112 @@ +#include "ServerInterceptor.h" +#include "tao/PI_Server/ServerRequestInfoA.h" +#include "ace/OS_NS_string.h" +#include <iostream> + +const IOP::ServiceId service_id = 0xdeed; +const unsigned int num_allowed_users = 4; +static const char* allowed_users[num_allowed_users+1] = + {"Ron Klein", "Scott Case", "Mark Hodge", "Greg Black", 0}; +const char* restricted_interfaces[1] = {"IDL:Messenger:1.0"}; + +ServerInterceptor::ServerInterceptor (void) + : myname_ ("Server_Authentication_Interceptor") +{ + std::cout << "Calling ServerInterceptor constructor." << std::endl; +} + +ServerInterceptor::~ServerInterceptor () +{ +} + +char * +ServerInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ServerInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ServerInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling destroy()." << std::endl; +} + +void +ServerInterceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_request_service_contexts()." << std::endl; +} + +void +ServerInterceptor::receive_request ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + bool permission_granted = false; + std::cout << "Calling receive_request()." << std::endl; + + if (ri->target_is_a(restricted_interfaces[0])){ + IOP::ServiceId id = service_id; + // Check that the request service context can be retrieved. + IOP::ServiceContext_var sc = + ri->get_request_service_context (id); + + CORBA::OctetSeq ocSeq = sc->context_data; + + const char * buf = + reinterpret_cast<const char *> (ocSeq.get_buffer ()); + + for (unsigned int i=0; i<num_allowed_users; ++i) { + if (ACE_OS::strcmp (buf, allowed_users[i]) == 0) + { + permission_granted = true; + } + } + } + + if (permission_granted == true) { + std::cout << "Permission Granted " << std::endl; + } + else { + std::cout << "Permission Denied " << std::endl; + ACE_THROW_SPEC (CORBA::NO_PERMISSION()); + } +} + +void +ServerInterceptor::send_reply ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_reply()." << std::endl; +} + +void +ServerInterceptor::send_exception ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_exception()." << std::endl; +} + +void +ServerInterceptor::send_other ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_other()." << std::endl; +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.h new file mode 100644 index 00000000000..d0eb11ee704 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/ServerInterceptor.h @@ -0,0 +1,45 @@ +#ifndef SERVERINTERCEPTOR_H +#define SERVERINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI_Server/ServerRequestInterceptorA.h" + +class ServerInterceptor +: public PortableInterceptor::ServerRequestInterceptor +{ + public: + ServerInterceptor (void); + + ~ServerInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/run_test.pl b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/run_test.pl new file mode 100644 index 00000000000..4664541b8a4 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/run_test.pl @@ -0,0 +1,46 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$nsiorfile = PerlACE::LocalFile ("ns.ior"); +unlink $nsiorfile; +$PORT=9876; + +# start Naming Service +$NameService = "$ENV{TAO_ROOT}/orbsvcs/Naming_Service/Naming_Service"; +$NS = new PerlACE::Process($NameService, "-o $nsiorfile -ORBEndpoint iiop://localhost:$PORT"); +$NS->Spawn(); +if (PerlACE::waitforfile_timed ($nsiorfile, 5) == -1) { + print STDERR "ERROR: cannot find file $nsiorfile\n"; + $NS->Kill(); + exit 1; +} + +# start MessengerServer +$IREF = "-ORBInitRef NameService=iioploc://localhost:$PORT/NameService"; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", $IREF); +$S->Spawn(); + +# start MessengerClient +sleep(1); +$C = new PerlACE::Process("MessengerClient", $IREF); +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + $NS->Kill(); + exit(1); +} +# clean-up + +$S->Kill(); +$NS->Kill(); + +exit 0; + + + diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.cpp new file mode 100644 index 00000000000..8049968e6e6 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.cpp @@ -0,0 +1,31 @@ +#include "ClientInitializer.h" +#include "ClientInterceptor.h" + +ClientInitializer::ClientInitializer (void) +{ +} + +void +ClientInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + + // get Codec factory + IOP::CodecFactory_var codec_factory = info->codec_factory(); + + // Create and register the request interceptors. + PortableInterceptor::ClientRequestInterceptor_var ci = + new ClientInterceptor (codec_factory); + info->add_client_request_interceptor (ci.in()); +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.h new file mode 100644 index 00000000000..9536c6ce776 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInitializer.h @@ -0,0 +1,21 @@ +#ifndef CLIENTINITIALIZER_H +#define CLIENTINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/PI.h" + +class ClientInitializer : + public virtual PortableInterceptor::ORBInitializer, + public virtual TAO_Local_RefCounted_Object +{ + public: + ClientInitializer (void); + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); +}; + +#endif + diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.cpp new file mode 100644 index 00000000000..16112bba847 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.cpp @@ -0,0 +1,106 @@ +#include "ClientInterceptor.h" +#include "tao/OctetSeqC.h" +#include "tao/PI/ClientRequestInfo.h" +#include <iostream> + +const CORBA::ULong service_ctx_id = 0xdeed; + +ClientInterceptor:: +ClientInterceptor (IOP::CodecFactory_var cf) + : myname_ ("Client_Authentication_Interceptor") +{ + std::cout << "Calling ClientInterceptor constructor." << std::endl; + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + this->codec = cf->create_codec (encoding); + +} + +ClientInterceptor::~ClientInterceptor (void) +{ +} + +char * +ClientInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ClientInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ClientInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ClientInterceptor::send_poll ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_poll()." << std::endl; +} + + +void +ClientInterceptor::send_request ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling send_request()." << std::endl; + + IOP::ServiceContext sc; + sc.context_id = service_ctx_id; + + const CORBA::Long gid = 9007; + std::cout << "GID: " << gid << std::endl; + + CORBA::Any gid_as_any; + gid_as_any <<= gid; + + sc.context_data = reinterpret_cast<CORBA::OctetSeq&> ( + *codec->encode(gid_as_any)); + + // Add this context to the service context list. + ri->add_request_service_context (sc, 0); + +} + +void +ClientInterceptor::receive_reply ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_reply()." << std::endl; +} + +void +ClientInterceptor::receive_other ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_other()." << std::endl; +} + +void +ClientInterceptor::receive_exception ( + PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling receive_exception()." << std::endl; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.h new file mode 100644 index 00000000000..a8bed32eb50 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ClientInterceptor.h @@ -0,0 +1,49 @@ +#ifndef CLIENTINTERCEPTOR_H +#define CLIENTINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/LocalObject.h" +#include "tao/PI/ClientRequestInterceptorA.h" +#include "tao/PI/ORBInitInfo.h" + +class ClientInterceptor: + public virtual PortableInterceptor::ClientRequestInterceptor, + public virtual TAO_Local_RefCounted_Object +{ + + public: + ClientInterceptor (IOP::CodecFactory_var) ; + + virtual ~ClientInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_poll (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_request (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_other (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; + IOP::Codec_var codec; + +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger.idl b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger.idl new file mode 100644 index 00000000000..f2a0074c1e8 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger.idl @@ -0,0 +1,6 @@ +#include "orb.idl" + +interface Messenger +{ + void send_message(in CORBA::OctetSeq user_name); +}; diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerClient.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerClient.cpp new file mode 100644 index 00000000000..3ee545b3f3a --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerClient.cpp @@ -0,0 +1,85 @@ +#include "MessengerC.h" +#include "ClientInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI library is linked in when building statically +#include <tao/PI/PI.h> +#include <iostream> + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + PortableInterceptor::ORBInitializer_ptr temp_initializer = + PortableInterceptor::ORBInitializer::_nil (); + + temp_initializer = new ClientInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Destringify ior + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + // Obtain a reference to the CodecFactory. + CORBA::Object_var obj2 = + orb->resolve_initial_references ("CodecFactory"); + + IOP::CodecFactory_var codec_factory; + + if(CORBA::is_nil(obj2.in())) + { + std::cerr << "Error: codec_factory" << std::endl; + ACE_OS::exit(1); + } + else + { + codec_factory = IOP::CodecFactory::_narrow (obj2.in ()); + std::cout << "got codec factory" << std::endl; + } + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + IOP::Codec_var codec = + codec_factory->create_codec (encoding); + + CORBA::Long uid = 64321; + + CORBA::Any uid_as_any; + + uid_as_any <<= uid; + CORBA::OctetSeq client_uid = *codec->encode (uid_as_any); + messenger->send_message( client_uid ); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Exception in MessengerClient: " << ex << std::endl; + return 1; + } + + std::cout << "Message was sent" << std::endl; + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerServer.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerServer.cpp new file mode 100644 index 00000000000..43be05f3d32 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/MessengerServer.cpp @@ -0,0 +1,61 @@ +#include "Messenger_i.h" +#include "MessengerC.h" +#include "ServerInitializer.h" +#include <tao/ORBInitializer_Registry.h> +// Ensure that the PI_Server library is linked in when building statically +#include <tao/PI_Server/PI_Server.h> +#include <iostream> +#include <fstream> + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + ServerInitializer *temp_initializer = 0; + + temp_initializer = new ServerInitializer; + + PortableInterceptor::ORBInitializer_var orb_initializer = + temp_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) + { + std::cerr << "Exception in MessengerServer: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.cpp new file mode 100644 index 00000000000..995ce6f626e --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.cpp @@ -0,0 +1,74 @@ +#include "Messenger_i.h" +#include <ace/OS_NS_string.h> +#include <tao/CodecFactory/CodecFactory.h> +#include <iostream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) +{ +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) +{ +} + + +void Messenger_i::send_message (const CORBA::OctetSeq & user_name) + ACE_THROW_SPEC (( + CORBA::SystemException + )) +{ + try + { + int argc = 1; + char **argv = new char *[argc]; + argv[0] = new char[ACE_OS::strlen ("MessengerServer")]; + strcpy (argv[0], "MessengerServer"); + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + // Obtain a reference to the CodecFactory. + CORBA::Object_var obj = + orb->resolve_initial_references ("CodecFactory"); + + IOP::CodecFactory_var codec_factory; + + if(CORBA::is_nil(obj.in())) + { + std::cerr << "Error: codec_factory" << std::endl; + ACE_OS::exit(1); + } + else + { + codec_factory = IOP::CodecFactory::_narrow (obj.in ()); + std::cout << "Server got codec factory" << std::endl; + } + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + IOP::Codec_var codec = + codec_factory->create_codec (encoding); + + CORBA::Any uid_as_any; + uid_as_any = *(codec->decode(user_name)); + + CORBA::Long uid; + uid_as_any >>= uid; + std::cout << "UID: " << uid << std::endl; + + } + catch(...) + { + std::cerr << "exception received" << std::endl; + ACE_OS::exit(1); + } + +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.h b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.h new file mode 100644 index 00000000000..fac0e58921c --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/Messenger_i.h @@ -0,0 +1,28 @@ +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ + public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + + + virtual void send_message (const CORBA::OctetSeq & user_name) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +}; + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/README b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/README new file mode 100644 index 00000000000..2300d5ad16f --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/README @@ -0,0 +1,36 @@ +Portable Interceptors + + +File: DevGuideExamples/PortableInterceptor/SimpleCodec/README + + +This directory contains an example illustrating marshaling of data in +client and server Request Interceptors. + +This example extends the authentication example in ../Auth. It is based on +the Messenger example in GettingStarted directory. A message is +sent by MessengerClient and displayed by MessengerServer. A client-side +portable interceptor adds an encoded (marshaled) GID to each request +sent to the server. A server-side interceptor verifies that the supplied +GID is valid. + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient + + +Execution via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.cpp new file mode 100644 index 00000000000..066634498f6 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.cpp @@ -0,0 +1,27 @@ +#include "ServerInitializer.h" +#include "ServerInterceptor.h" + +ServerInitializer::ServerInitializer () +{ +} + +void +ServerInitializer::pre_init ( + PortableInterceptor::ORBInitInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ +} + +void +ServerInitializer::post_init ( + PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // get reference to the codec_factory + IOP::CodecFactory_var codec_factory = info->codec_factory(); + + // Create and register the request interceptors. + PortableInterceptor::ServerRequestInterceptor_var si = + new ServerInterceptor (codec_factory); + info->add_server_request_interceptor (si.in()); +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.h b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.h new file mode 100644 index 00000000000..f07b7821cb2 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInitializer.h @@ -0,0 +1,23 @@ +#ifndef SERVERINITIALIZER_H +#define SERVERINITIALIZER_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI/PI.h" + +class ServerInitializer : +public virtual PortableInterceptor::ORBInitializer +{ + public: + ServerInitializer (); + + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info) + ACE_THROW_SPEC ((CORBA::SystemException)); + + private: + int interceptor_type_; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.cpp b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.cpp new file mode 100644 index 00000000000..08ddc68dca7 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.cpp @@ -0,0 +1,126 @@ +#include "ServerInterceptor.h" +#include <tao/PI_Server/ServerRequestInfoA.h> +#include <tao/OctetSeqC.h> +#include <iostream> + +const IOP::ServiceId service_id = 0xdeed; +const CORBA::Long allowed_gid[4] = { 9006, 9007, 9008 }; +const char* restricted_interfaces[1] = {"IDL:Messenger:1.0"}; + +ServerInterceptor::ServerInterceptor (IOP::CodecFactory_var cf) + : myname_ ("Server_Authentication_Interceptor") +{ + std::cout << "Calling ServerInterceptor constructor." << std::endl; + + // Set up a structure that contains information necessary to + // create a GIOP 1.2 CDR encapsulation Codec. + IOP::Encoding encoding; + encoding.format = IOP::ENCODING_CDR_ENCAPS; + encoding.major_version = 1; + encoding.minor_version = 2; + + // Obtain the CDR encapsulation Codec. + this->codec = cf->create_codec (encoding); + +} + +ServerInterceptor::~ServerInterceptor () +{ +} + +char * +ServerInterceptor::name () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling ServerInterceptor name() method" << std::endl; + return CORBA::string_dup (this->myname_); +} + +void +ServerInterceptor::destroy () + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + std::cout << "Calling destroy()." << std::endl; +} + +void +ServerInterceptor::receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + std::cout << "Calling receive_request_service_contexts()." << std::endl; +} + +void +ServerInterceptor::receive_request ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + bool permission_granted = false; + std::cout << "Calling receive_request()." << std::endl; + + if (ri->target_is_a(restricted_interfaces[0])){ + IOP::ServiceId id = service_id; + // Check that the request service context can be retrieved. + IOP::ServiceContext_var sc = + ri->get_request_service_context (id); + // need to construct an octet seq for decoding + CORBA::OctetSeq ocSeq = CORBA::OctetSeq( + sc->context_data.length(), + sc->context_data.length(), + sc->context_data.get_buffer(), + 0); + + CORBA::Any gid_as_any; + gid_as_any = *codec->decode(ocSeq); + + CORBA::Long gid; + gid_as_any >>= gid; + for (int i=0; i<3; ++i) { + if ( gid == allowed_gid[i] ) + { + permission_granted = true; + } + } + } + + if (permission_granted == true) { + std::cout << "Permission Granted " << std::endl; + } + else { + std::cout << "Permission Denied " << std::endl; + ACE_THROW_SPEC (CORBA::NO_PERMISSION()); + } +} + +void +ServerInterceptor::send_reply ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_reply()." << std::endl; +} + +void +ServerInterceptor::send_exception ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_exception()." << std::endl; +} + +void +ServerInterceptor::send_other ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)) +{ + ACE_UNUSED_ARG(ri); + std::cout << "Calling send_other()." << std::endl; +} + diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.h b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.h new file mode 100644 index 00000000000..abcac4bc9f5 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/ServerInterceptor.h @@ -0,0 +1,47 @@ +#ifndef SERVERINTERCEPTOR_H +#define SERVERINTERCEPTOR_H + +#include "tao/PortableInterceptorC.h" +#include "tao/PI_Server/ServerRequestInterceptorA.h" +#include "tao/PI/ORBInitInfo.h" + +class ServerInterceptor +: public PortableInterceptor::ServerRequestInterceptor +{ + public: + ServerInterceptor (IOP::CodecFactory_var); + + ~ServerInterceptor (); + + virtual char * name () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void destroy () + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void receive_request_service_contexts ( + PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri) + ACE_THROW_SPEC ((CORBA::SystemException, + PortableInterceptor::ForwardRequest)); + + private: + const char *myname_; + IOP::Codec_var codec; +}; + +#endif diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/SimpleCode.mpc b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/SimpleCode.mpc new file mode 100644 index 00000000000..051dea85fcd --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/SimpleCode.mpc @@ -0,0 +1,17 @@ +project(*Server): taoexe, portableserver, pi_server, avoids_minimum_corba { + Source_Files { + Messenger_i.cpp + ServerInitializer.cpp + ServerInterceptor.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, pi, avoids_minimum_corba, interceptors { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + ClientInitializer.cpp + ClientInterceptor.cpp + } +} diff --git a/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/run_test.pl b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/run_test.pl new file mode 100644 index 00000000000..8804f7ba6d8 --- /dev/null +++ b/TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/run_test.pl @@ -0,0 +1,36 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +# start MessengerServer +my($iorfile) = 'Messenger.ior'; +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ( + $iorfile, + $PerlACE::wait_interval_for_process_creation) == -1) { + print STDERR "ERROR: cannot find file <$iorfile>\n"; + $SV->Kill(); + exit(1); +} + +# start MessengerClient +select undef, undef, undef, .5; +$C = new PerlACE::Process("MessengerClient"); + +if ($C->SpawnWaitKill(15) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); + +exit 0; + + + diff --git a/TAO/DevGuideExamples/RTCORBA/Messenger.idl b/TAO/DevGuideExamples/RTCORBA/Messenger.idl new file mode 100644 index 00000000000..0ca944bcc16 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger +{ + boolean send_message (in string user_name, + in string subject, + inout string message); +}; + diff --git a/TAO/DevGuideExamples/RTCORBA/MessengerClient.cpp b/TAO/DevGuideExamples/RTCORBA/MessengerClient.cpp new file mode 100644 index 00000000000..b8273500174 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/MessengerClient.cpp @@ -0,0 +1,87 @@ +#include "MessengerC.h" +#include "common.h" +#include <iostream> +#include <tao/RTCORBA/RTCORBA.h> + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Get the RTORB + CORBA::Object_var obj = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow (obj.in()); + + // PolicyCurrent. + obj = orb->resolve_initial_references("PolicyCurrent"); + CORBA::PolicyCurrent_var policy_current = + CORBA::PolicyCurrent::_narrow(obj.in()); + if (CORBA::is_nil(policy_current.in())) { + std::cerr << "Unable to narrow the PolicyCurrent" << std::endl; + return 1; + } + + // Destringify ior + obj = orb->string_to_object( "file://Messenger.ior" ); + if( CORBA::is_nil( obj.in() ) ) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if( CORBA::is_nil( messenger.in() ) ) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + // Set the Private Connection Policy + CORBA::PolicyList policy_list(1); + policy_list.length (1); + policy_list[0] = rt_orb->create_private_connection_policy(); + policy_current->set_policy_overrides (policy_list, + CORBA::SET_OVERRIDE); + + // Get the RTCurrent. + obj = orb->resolve_initial_references ("RTCurrent"); + RTCORBA::Current_var current = + RTCORBA::Current::_narrow(obj.in ()); + + // Change to a priority that matches the server + current->the_priority(0); + + // Explicitly bind a connection to the server + CORBA::PolicyList_var inconsistent_policies; + CORBA::Boolean status = + messenger->_validate_connection(inconsistent_policies.out()); + if (!status) { + std::cerr << "Unable to explicitly bind to the server" << std::endl; + return 1; + } + + static const CORBA::Short increment = get_increment(); + for(CORBA::ULong i = 0; i < get_total_lanes(); i++) { + + // Set the priority to one that matches one of the lanes + CORBA::Short priority = i * increment; + current->the_priority(priority); + + // Send the message + CORBA::String_var message = CORBA::string_dup( "Hello!" ); + messenger->send_message( "TAO User", "TAO Test", message.inout() ); + } + } + catch(const CORBA::Exception& ex) { + std::cerr << "MessengerClient caught CORBA exception: " << ex << std::endl; + return 1; + } + catch(...) { + std::cerr << "MessengerClient exception" << std::endl; + return 1; + } + + std::cout << "messages were sent" << std::endl; + return 0; +} diff --git a/TAO/DevGuideExamples/RTCORBA/MessengerServer.cpp b/TAO/DevGuideExamples/RTCORBA/MessengerServer.cpp new file mode 100644 index 00000000000..dd33b8da371 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/MessengerServer.cpp @@ -0,0 +1,96 @@ +#include "Messenger_i.h" +#include "common.h" +#include <iostream> +#include <fstream> +#include <fstream> +#include <tao/RTCORBA/RTCORBA.h> + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Get the RTORB. + CORBA::Object_var obj = orb->resolve_initial_references("RTORB"); + RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow(obj.in()); + + // PolicyCurrent. + obj = orb->resolve_initial_references("PolicyCurrent"); + CORBA::PolicyCurrent_var policy_current = + CORBA::PolicyCurrent::_narrow(obj.in()); + if (CORBA::is_nil(policy_current.in())) { + std::cerr << "Unable to narrow the PolicyCurrent" << std::endl; + return 1; + } + + //Get reference to Root POA + obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create the thread-pool + const CORBA::Short increment = get_increment(); + RTCORBA::ThreadpoolLanes lanes(get_total_lanes()); + lanes.length(get_total_lanes()); + std::cout << "Creating " << get_total_lanes() << " lane" + << (get_total_lanes() == 1 ? "" : "s") << std::endl; + for(CORBA::ULong i = 0; i < get_total_lanes(); i++) { + lanes[i].static_threads = 1; + lanes[i].dynamic_threads = 0; + + lanes[i].lane_priority = i * increment; + std::cout << " Priority: " << lanes[i].lane_priority << std::endl; + } + + RTCORBA::ThreadpoolId threadpool_id = + rt_orb->create_threadpool_with_lanes (0, // Stack Size + lanes, + 0, // Allow borrowing + 0, // Allow request buffering + 0, // Max buffered requests + 0); // Max request buffer size + + CORBA::PolicyList poa_policy_list(2); + poa_policy_list.length (2); + + poa_policy_list[0] = + rt_orb->create_priority_model_policy(RTCORBA::CLIENT_PROPAGATED, 0); + poa_policy_list[1] = + rt_orb->create_threadpool_policy(threadpool_id); + + PortableServer::POA_var client_propagated_poa = + poa->create_POA ("client_propagated_poa", + mgr.in (), + poa_policy_list); + + // Create an object + Messenger_i messenger_servant(orb.in()); + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + client_propagated_poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = + client_propagated_poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/RTCORBA/Messenger_i.cpp b/TAO/DevGuideExamples/RTCORBA/Messenger_i.cpp new file mode 100644 index 00000000000..f39a72e1d26 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/Messenger_i.cpp @@ -0,0 +1,37 @@ +#include "Messenger_i.h" +#include <ace/Thread.h> +#include <iostream> + +// Implementation skeleton constructor +Messenger_i::Messenger_i(CORBA::ORB_ptr orb) +{ + CORBA::Object_var obj = orb->resolve_initial_references("RTCurrent"); + rt_current_ = RTCORBA::Current::_narrow(obj.in()); +} + +// Implementation skeleton destructor +Messenger_i::~Messenger_i() +{ +} + +CORBA::Boolean +Messenger_i::send_message (const char* user_name, + const char* subject, + char*& message) +{ + CORBA::Short priority = rt_current_->the_priority(); + + ACE_hthread_t current; + ACE_Thread::self (current); + int native_priority; + + std::cout << "Message from: " << user_name << std::endl + << "Subject: " << subject << std::endl + << "CORBA Priority: " << priority << std::endl; + if (ACE_Thread::getprio (current, native_priority) != -1) { + std::cout << "Native Priority: " << native_priority << std::endl; + } + std::cout << "Message: " << message << std::endl << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/RTCORBA/Messenger_i.h b/TAO/DevGuideExamples/RTCORBA/Messenger_i.h new file mode 100644 index 00000000000..3f494bb1d5f --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/Messenger_i.h @@ -0,0 +1,40 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include <tao/RTCORBA/RTCORBA.h> + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i(CORBA::ORB_ptr orb); + + //Destructor + virtual ~Messenger_i(); + + virtual CORBA::Boolean send_message(const char* user_name, + const char* subject, + char*& message); + +private: + RTCORBA::Current_var rt_current_; +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/RTCORBA/README b/TAO/DevGuideExamples/RTCORBA/README new file mode 100644 index 00000000000..8f0708c500b --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/README @@ -0,0 +1,18 @@ + +DevGuideExamples/RTCORBA/README + +This directory contains an RTCORBA example illustrating a simple client and +a server with a Interface Messenger. The Messenger Interface has +an operation for sending a message (send_message). + +How to Run +---------- + +To start the server: +------------------ +./MessengerServer + + +To start the client: +------------------ +./MessengerClient diff --git a/TAO/DevGuideExamples/RTCORBA/RTCORBA.mpc b/TAO/DevGuideExamples/RTCORBA/RTCORBA.mpc new file mode 100644 index 00000000000..1b4250330e3 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/RTCORBA.mpc @@ -0,0 +1,17 @@ +project(*Server): rt_server { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + common.cpp + } +} + + +project(*Client): rt_client { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + common.cpp + } +} + diff --git a/TAO/DevGuideExamples/RTCORBA/common.cpp b/TAO/DevGuideExamples/RTCORBA/common.cpp new file mode 100644 index 00000000000..4f5a17ce962 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/common.cpp @@ -0,0 +1,20 @@ +#include "common.h" + +CORBA::ULong +get_total_lanes() +{ +#if defined (linux) + return 1; +#elif defined (ACE_CONFIG_WIN32_H) + return 3; +#else + return 5; +#endif +} + +CORBA::Short +get_increment() +{ + return 1; +} + diff --git a/TAO/DevGuideExamples/RTCORBA/common.h b/TAO/DevGuideExamples/RTCORBA/common.h new file mode 100644 index 00000000000..5cb01bd5ba8 --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/common.h @@ -0,0 +1,9 @@ +#ifndef MESSENGER_COMMON_H +#define MESSENGER_COMMON_H + +#include <tao/corba.h> + +CORBA::ULong get_total_lanes(); +CORBA::Short get_increment(); + +#endif /* MESSENGER_COMMON_H */ diff --git a/TAO/DevGuideExamples/RTCORBA/run_test.pl b/TAO/DevGuideExamples/RTCORBA/run_test.pl new file mode 100644 index 00000000000..e672f005f3e --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ior="Messenger.ior"; +unlink $ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($ior, 5) == -1) { + print STDERR "ERROR: cannot find file $ior\n"; + $S->Kill(); + exit 1; +} + + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient"); + +if ($C->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); +unlink $ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/RTCORBA/svc.conf b/TAO/DevGuideExamples/RTCORBA/svc.conf new file mode 100644 index 00000000000..511f7c4974e --- /dev/null +++ b/TAO/DevGuideExamples/RTCORBA/svc.conf @@ -0,0 +1,3 @@ +# This is more portable across multiple systems + +static RT_ORB_Loader "-ORBPriorityMapping continuous" diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger.idl b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger.idl new file mode 100644 index 00000000000..8f8adf454b2 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger.idl @@ -0,0 +1,13 @@ +/* -*- C++ -*- $Id$ */ + +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + + void shutdown ( in string user_name ); + }; + diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerClient.cpp b/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerClient.cpp new file mode 100644 index 00000000000..7e6551a08a8 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerClient.cpp @@ -0,0 +1,115 @@ +/* -*- C++ -*- $Id$ */ + +#include "orbsvcs/SecurityC.h" +#include "MessengerC.h" + +#if 0 +The servers service configuration file +for this example is: +--------------------------------------- +# server.conf +dynamic SSLIOP_Factory Service_Object * + TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() + "-SSLNoProtection \ + -SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +--------------------------------------- + +The clients service configuration file +for this example is: +--------------------------------------- +# client.conf +dynamic SSLIOP_Factory Service_Object * + TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() + "-SSLNoProtection \ + -SSLAuthenticate SERVER \ + -SSLPrivateKey PEM:clientkey.pem \ + -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +--------------------------------------- +#endif + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + + CORBA::ORB_var orb = + CORBA::ORB_init( argc, argv ); + + CORBA::Object_var obj = + orb->string_to_object( "file://Messenger.ior" ); + + Messenger_var messenger = + Messenger::_narrow( obj.in() ); + + CORBA::String_var message = + CORBA::string_dup( "Terminating messenger service!" ); + + messenger->send_message( "Chief of Security", + "New Directive", + message.inout() ); + + messenger->shutdown("Chief of Security"); + + Security::QOP qop = + Security::SecQOPIntegrityAndConfidentiality; + + CORBA::Any want_protection; + want_protection <<= qop; + + CORBA::Policy_var policy = + orb->create_policy (Security::SecQOPPolicy, + want_protection); + + Security::EstablishTrust establish_trust; + establish_trust.trust_in_client = 0; + establish_trust.trust_in_target = 1; + + CORBA::Any want_trust; + want_trust <<= establish_trust; + + CORBA::Policy_var policy2 = + orb->create_policy (Security::SecEstablishTrustPolicy, + want_trust); + + + CORBA::PolicyList policy_list (2); + policy_list.length (1); + policy_list[0] = + CORBA::Policy::_duplicate (policy.in ()); + policy_list.length (2); + policy_list[1] = + CORBA::Policy::_duplicate (policy2.in ()); + + + CORBA::Object_var object = + obj->_set_policy_overrides (policy_list, + CORBA::SET_OVERRIDE); + + Messenger_var messenger2 = + Messenger::_narrow( object.in() ); + + message = + CORBA::string_dup( "Terminating messenger service!" ); + + messenger2->send_message( "Chief of Security", + "New Directive", + message.inout() ); + + messenger2->shutdown("Chief of Security"); + + orb->destroy(); + } + catch(const CORBA::Exception& ex) + { + ex._tao_print_exception("Client: main block"); + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerServer.cpp b/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerServer.cpp new file mode 100644 index 00000000000..5f4b7573a9e --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/MessengerServer.cpp @@ -0,0 +1,64 @@ +/* -*- C++ -*- $Id$ */ + +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + + CORBA::Object_var obj = + orb->resolve_initial_references( "RootPOA" ); + + PortableServer::POA_var poa = + PortableServer::POA::_narrow( obj.in() ); + + PortableServer::POAManager_var mgr = + poa->the_POAManager(); + mgr->activate(); + + obj = + orb->resolve_initial_references ("SSLIOPCurrent"); + + SSLIOP::Current_var ssliop_current = + SSLIOP::Current::_narrow (obj.in ()); + + Messenger_i messenger_servant(orb.in(), + ssliop_current.in() + ); + + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + + std::ofstream iorFile( "Messenger.ior" ); + + iorFile << str.in() << std::endl; + + iorFile.close(); + + std::cout << "IOR written to file Messenger.ior" << std::endl; + + orb->run(); + poa->destroy (1, 1); + orb->destroy (); + + std::cout << "Messenger Server is shut down!" + << std::endl; + std::cout << std::endl; + + } + catch(const CORBA::Exception& ex) { + ex._tao_print_exception("Server Error: main block"); + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.cpp b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.cpp new file mode 100644 index 00000000000..ca0a314fa0e --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.cpp @@ -0,0 +1,156 @@ +/* -*- C++ -*- $Id$ */ + +#include "Messenger_i.h" +#include <ace/OS_NS_string.h> +#include <iostream> + +Messenger_i::Messenger_i ( + CORBA::ORB_ptr orb, + SSLIOP::Current_ptr ssliop_current +) +: orb_(CORBA::ORB::_duplicate(orb)), + ssliop_current_(SSLIOP::Current::_duplicate(ssliop_current)) + { + } + +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + + { + if (ssliop_current_->no_context()) + std::cout << "Message from: " << user_name << std::endl; + else + std::cout << "SECURE message from: " << user_name << std::endl; + + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + std::cout << std::endl; + return 1; + } + + +void Messenger_i::shutdown ( + const char * user_name + ) + throw(CORBA::SystemException) +{ + if ( ! (ssliop_current_->no_context()) ) + { + // requestor is authentic, go ahead and + // shut the server down. Report access + // ID of requestor prior to shutdown. + + std::cout << "Shutdown command from: " << user_name << std::endl; + std::cout << "Status: User authenticated." << std::endl; + std::cout << "Action: Sever shutdown in progress..." << std::endl; + std::cout << std::endl; + +#if 0 + char name_buf[BUFSIZ]; + + // + // Populate an attribute type list + // to request the initiating principal's + // AccessId. + // + Security::AttributeTypeList requested_attributes; + requested_attributes.length(0); + Security::AttributeType desired_attribute; + desired_attribute.attribute_family.family_definer = 0; // OMG + desired_attribute.attribute_family.family = 1; // Privilege + // Attributes + desired_attribute.attribute_type = Security::AccessId; + requested_attributes.length(1); + requested_attributes[0] = desired_attribute; + // + // Request the attribtue + // + Security::AttributeList_var attrib_list = + this->current_->get_attributes(requested_attributes); + + if(attrib_list->length() > 0) + { + // + // Copy the values out + // + Security::SecAttribute attribute_returned; + + attribute_returned.defining_authority = + (attrib_list.in())[0].defining_authority ; + attribute_returned.value = + (attrib_list.in())[0].value; + + // Certificates are returned in + // X.509 format + // + const char x509[] = "x509"; + // + // Setup a Security::OID (sequence<octet>) + // to hold the attribute's defining authority. + // + Security::OID x509_defining_authority; + x509_defining_authority.length(sizeof (x509)); + // + // Populate the defining authority value. + // + CORBA::Octet *buf = + x509_defining_authority.get_buffer(); + ACE_OS_String::memcpy( buf, x509, sizeof(x509)); + // + // Confirm the defining authority is "x509". + // + if(attribute_returned.defining_authority == + x509_defining_authority) + { + // + // Get the buffer holding the certificate + // + CORBA::Octet *der_cert = + attribute_returned.value.get_buffer(); + // + // Convert the DER encoded certificate into + // OpenSSL's internal format. + // + X509 *peer = ::d2i_X509 (0, + &der_cert, + attribute_returned.value.length()); + + ::X509_NAME_oneline(::X509_get_subject_name (peer), + name_buf, + BUFSIZ); + + ::X509_free(peer); + } + } + // + // Report the certificate's subject name + // and terminate the server + // + std::cout << "Shutdown commanded by: " + << name_buf + << std::endl; + std::cout << std::endl; +#endif + + orb_->shutdown (0); + } + else + { + // requestor is not secure, + // ignore shutdown command + std::cout << "Shutdown command from: " << user_name << std::endl; + std::cout << "Status: User *NOT* authenticated." << std::endl; + std::cout << "Action: Ignored." << std::endl; + std::cout << std::endl; + } +} + + diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.h b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.h new file mode 100644 index 00000000000..389eb156981 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/Messenger_i.h @@ -0,0 +1,40 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include <openssl/ssl.h> +#include <openssl/x509.h> +#include <orbsvcs/SecurityC.h> +#include <orbsvcs/SSLIOPC.h> + +#include "MessengerS.h" + +class Messenger_i : public virtual POA_Messenger +{ +public: + Messenger_i ( + CORBA::ORB_ptr orb, + SSLIOP::Current_ptr ssliop_current + ); + + virtual ~Messenger_i (void); + + virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + + virtual void shutdown ( + const char * user_name + ) + throw(CORBA::SystemException); + +protected: + CORBA::ORB_var orb_; + SSLIOP::Current_var ssliop_current_; +}; + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/ParticipatingApp.mpc b/TAO/DevGuideExamples/Security/ParticipatingApp/ParticipatingApp.mpc new file mode 100644 index 00000000000..a2409f8b42b --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/ParticipatingApp.mpc @@ -0,0 +1,15 @@ +project(*Server): portableserver, orbsvcsexe, security, ssliop { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(ParticipatingApp_Client): orbsvcsexe, security, ssliop { + exename = MessengerClient + + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/README b/TAO/DevGuideExamples/Security/ParticipatingApp/README new file mode 100644 index 00000000000..5d001721f0b --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/README @@ -0,0 +1,47 @@ +TAO Security + +DevGuideExamples/Security/ParticipatingApp/README + +This directory contains an illustration of a security +aware application that accepts secured and unsecured +requests and provides access to certain operations +only for secured requests. + +This example uses a single set of service configuration +files and takes a single path through the application +code. + +For simplicity, the pass phrases have been stripped from the +private keys included with these examples in the 1.2a release. +This *should not* be construed as a recommended practice. Instead, +OCI strongly recommends that the security requirements of each +real-world application be evaluated carefully and that appropriate +procedures and practice be established accordingly. Private keys +without pass phrase protection are easily compromised and may +allow an unauthorized party to masquerade as an authorized system +user. + +Prior to running the server in these examples, the SSL_CERT_FILE +environment variable must be set, e.g., + # /bin/bash + export SSL_CERT_FILE=cacert.pem +or + rem Windows + set SSL_CERT_FILE=cacert.pem + +To run the server: + ./MessengerServer -ORBSvcConf server.conf + +To run the client: + ./MessengerClient -ORBSvcConf client.conf + + +----------------------------------------- +Files: DevGuideExamples/Security/ParticipatingApp + +Messenger.idl - Messenger interface definition. +Messenger_i.h - Messenger servant class definition. +Messenger_i.cpp - Messenger servant implementation. +MessengerServer.cpp - MessengerServer process main. +MessengerClient.cpp - MessengerClient process main. + diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/cacert.pem b/TAO/DevGuideExamples/Security/ParticipatingApp/cacert.pem new file mode 100644 index 00000000000..c493d28a523 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/cacert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDujCCAyOgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBoDELMAkGA1UEBhMCVVMx +ETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNVBAoT +Fk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMU +Q2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5j +b20wHhcNMDMwNzIzMjAyNDIwWhcNMTMwNzIwMjAyNDIwWjCBoDELMAkGA1UEBhMC +VVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNV +BAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UE +AxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdl +Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO4QS4bqrXVuBnHsOg1/ +gijXjiWhFTngG/sDLWAA52fHIobyFo5//7UaLedke0fkwqsmky8hjzSbXGJsGI5g +Yjp2Va7WeJhRQNr8VYWobCq00f//drHN2NF5M23Cx0JF9WfyfWpqq5TQRGtVZ+We ++q4S6wH1exZrVGHfkp5Xq5FvAgMBAAGjggEAMIH9MB0GA1UdDgQWBBQvTY0YWmHq +o2TMOKba/ECH9ayXZzCBzQYDVR0jBIHFMIHCgBQvTY0YWmHqo2TMOKba/ECH9ayX +Z6GBpqSBozCBoDELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYD +VQQHEwlTdC4gTG91aXMxHzAdBgNVBAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4x +DDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAa +BgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQBgjn97nbyyjFxyHC8vheAiDCQRblI4lZbZC6vSmxxqEGze +eAMiTYL2iK3vj2Ot3V2/o5VdLyEYV4RBP2iq1XuMYXjmL2ni+NVgepyXceynH8/b +72yciZZcDE5FVUaMUHAgZUpxsGSDyD70LnOFwBxuvxtlMtG5vXYNvwF/FJPs1g== +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/client.conf b/TAO/DevGuideExamples/Security/ParticipatingApp/client.conf new file mode 100644 index 00000000000..cffba696b54 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/client.conf @@ -0,0 +1,6 @@ +# $Id$ + +# client.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLNoProtection -SSLAuthenticate SERVER -SSLPrivateKey PEM:clientkey.pem -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/clientcert.pem b/TAO/DevGuideExamples/Security/ParticipatingApp/clientcert.pem new file mode 100644 index 00000000000..56616fcd469 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/clientcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQQwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjIwN1oXDTEzMDgwNTAwMjIwN1owgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBmNs +aWVudDEgMB4GCSqGSIb3DQEJARYRY2xpZW50QG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAMYaaQgEmp2zv0t+MAEGf5GIsKSIB1YFrkkVR6Qv +LP0t9FHDPGFawh/aK3Yq+l7RiNpK1H5SSOaIavm4xV/3tpHxzuRjd0H3fdhaoAgD +xvcYZ75l662PEa25MCJsp40tACO0hGNOQCJ8kWVmT4xEhKcFl3xm+1OvNbwDM/pA +t4WpAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEArs6S6qud6D9t6AcGJS91XWqbBY1G +rSgmv9yFbvUyrGAQuMpyNuYTGlZA+Nd3EAjYlwP4fWbzUMM0MEtd3Xl0Aep0O39W +Cgp9HxDaJi3b4h63cd/B0su+2CNd4P6+NOX+IxgrrioCgKSnu6Nxy14fb03RQhjl +a3vOY5Juf8ySB/M= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/clientkey.pem b/TAO/DevGuideExamples/Security/ParticipatingApp/clientkey.pem new file mode 100644 index 00000000000..2b4af2322ad --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/clientkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDGGmkIBJqds79LfjABBn+RiLCkiAdWBa5JFUekLyz9LfRRwzxh +WsIf2it2Kvpe0YjaStR+UkjmiGr5uMVf97aR8c7kY3dB933YWqAIA8b3GGe+Zeut +jxGtuTAibKeNLQAjtIRjTkAifJFlZk+MRISnBZd8ZvtTrzW8AzP6QLeFqQIDAQAB +AoGAJx1X16lxDepLvxAvUkSCM64Vkqb5K9b7TprRBm36KBNGxk4SQfa1laxyIGbk +AIzGxLM5uadtlXciCCSfdA9pEJbjtxSRJt2RbOWioT3sfIzXO7SCMHuuRjnPK3P8 +rgFmOOpo/ldVZ3mBJajxzWTEFXMUTAC4tB2j2B6of7MG5fECQQDu+uKzI2QjiTpW +5WFd/vzpS2SpDHks4sEu0F6zk1Zhbsc3KoJd3xxSLhKFLLoRDVZsDKE3opr7WRNT ++sjoGRY3AkEA1DZArJqLeWuB8L8GjC/AtMXsxlSe3Iy9X+4uffZ/y5A1JbYidLJl +3FlejMoQqp0EpbHO+mRCMSHyJqAFW1ZTHwJBANjv3oMHiYvIsrDXIQAWzLdqvUHI +FOfuH7fDZ3RUN4HS8fzeFeHo+uiO8jj6VR3NoboL7P14GoA4aBc//MjUnRkCQQCH +KZ770NtxFKaIvkLfWzL0cPQkRpWAiCu+RChclnpDH7CaOm2rwkzakhmEttbytFvX +ZW8dUGpQfPyM2XNP/6WlAkEAoOQ5UI1WREbjoJs5mTwTG1gTrQjShQwjC0dqt66s +bOS5os5EePGdctm//Xq7uR4/6hB6T7npPYqiyfWix1SINQ== +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/run_test.pl b/TAO/DevGuideExamples/Security/ParticipatingApp/run_test.pl new file mode 100644 index 00000000000..2d9f698a132 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/run_test.pl @@ -0,0 +1,38 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$ENV{'SSL_CERT_FILE'} = 'cacert.pem'; + +$file = PerlACE::LocalFile("Messenger.ior"); + +unlink $file; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", + "-ORBSvcConf server.conf"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($file, 15) == -1) { + print STDERR "ERROR: cannot find file <$file>\n"; + $S->Kill (); + exit 1; +} + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient", + "-ORBSvcConf client.conf"); + +if ($C->SpawnWaitKill(10) != 0) { + exit (1); +} + +if ($S->WaitKill(10) == -1) { + $S->Kill(); +} + +exit 0; + diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/server.conf b/TAO/DevGuideExamples/Security/ParticipatingApp/server.conf new file mode 100644 index 00000000000..380312b03fc --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/server.conf @@ -0,0 +1,5 @@ +# $Id$ + +# server.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLNoProtection -SSLAuthenticate SERVER_AND_CLIENT -SSLPrivateKey PEM:serverkey.pem -SSLCertificate PEM:servercert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/servercert.pem b/TAO/DevGuideExamples/Security/ParticipatingApp/servercert.pem new file mode 100644 index 00000000000..9659fb07334 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/servercert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQMwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjAyOVoXDTEzMDgwNTAwMjAyOVowgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBlNl +cnZlcjEgMB4GCSqGSIb3DQEJARYRc2VydmVyQG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAKw+tjwQz/stcesfm6WvnB6D/FTYu79tHzGUDlSV +N+kycFYcZfsRmIEo5afG+epOwlp1f9Wpij23AMY4BcdcSP9R4yhH46uMFThQhkn9 +fraZ8slcgVog5G6MwXmsWb5gThjgiT0KPSQHkEU0bryw+CiM4oV+9dSaFBLa3Uqc +iQZdAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAur+t7sIqGjqAPgFtFcgByAJTvNYb +UDZ43AGd22tCtT/usoy/x9qsQv8jwd8kA8yUNQUmjRxR4vEkZ06L6HF8Ii1QmU/E +fZ7YcjXjWxgnCEQGSXuHLhmlIMAlXNvX1XzNddu/NuRbSP3lYS/j32W8gTb6MdyL +8bOkIqRpVY0ek80= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/ParticipatingApp/serverkey.pem b/TAO/DevGuideExamples/Security/ParticipatingApp/serverkey.pem new file mode 100644 index 00000000000..c61b8152649 --- /dev/null +++ b/TAO/DevGuideExamples/Security/ParticipatingApp/serverkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCsPrY8EM/7LXHrH5ulr5weg/xU2Lu/bR8xlA5UlTfpMnBWHGX7 +EZiBKOWnxvnqTsJadX/VqYo9twDGOAXHXEj/UeMoR+OrjBU4UIZJ/X62mfLJXIFa +IORujMF5rFm+YE4Y4Ik9Cj0kB5BFNG68sPgojOKFfvXUmhQS2t1KnIkGXQIDAQAB +AoGBAKjg08wQr9qVtBvT4ceRZoCE5+JIncwSMYNqpqJHq4n46iuDrHl9xwjcEE9v +x5jzn5sRmUTj9aaMxzWRuBi/YtFVmgsl8lNiBOniIkFYqIyXfzNgX+2qyRzgOtAo +0ByWFsqkLmW9cUXWaICkM49b9Jz7SnmPs+9VWGiNrjgJSiABAkEA4eFIc82mP2KJ +wap8LJV7GLBA3iiVRmOgVb0TvRMitFWPGdGKFcsAVVkogQ/zIixKeZKc5enMhAI9 +i3Q2tmolZQJBAMM2hlSbJZncMjooKBlp2VZgUpEjbBPpD9XGgA5BO2RfKi3B29T9 +2v8I3m9WbCxbtFKlHcjNT3GToGCoi4S1qZkCQDcn7qwwZE8H/cFnoui0G5ncuApH +eKP2gdlN0TsTKB9G4SmZzBEkP9GXcteJEIKgtBLZpSxTGdiGP4cE+rMyWi0CQDam +TgbjhCxFq74CPe+XZWO8BYFiREByr58uOe1Dr8fSqHE040EGbEeXiQXsUM4+QgYc ++XCcoY/vPyewJ5bYcIkCQERqwlO9/JUiX2w01l82tMxVK8DmN3QwHWJxNexD5Ewf +QFG6FYFPNHCR2f+MUSMFp1djUSVpCrWbppmlr96uZ48= +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger.idl b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger.idl new file mode 100644 index 00000000000..05cf30bf5f9 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger.idl @@ -0,0 +1,11 @@ +/* -*- C++ -*- $Id$ */ + +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerClient.cpp b/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerClient.cpp new file mode 100644 index 00000000000..68fd1fec4db --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerClient.cpp @@ -0,0 +1,187 @@ +/* -*- C++ -*- $Id$ */ + +#include <ace/OS.h> +#include <ace/Get_Opt.h> + +#include "MessengerC.h" +#include "orbsvcs/SecurityC.h" + +// Policy Example 1 +// ================ +// +// Example of a client that downgrades +// from message protection to no message +// protection and upgrades from no +// peer authentication to authentication +// of targets, i.e., authentication of +// servers. +// +// The server's service configuration file +// for this example is +// +// # server.conf +// dynamic SSLIOP_Factory Service_Object * +// TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() +// "-SSLNoProtection +// -SSLAuthenticate SERVER_AND_CLIENT +// -SSLPrivateKey PEM:serverkey.pem +// -SSLCertificate PEM:servercert.pem" +// +// static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +// +// The clients service configuration file +// for this example is: +// +// # client.conf +// dynamic SSLIOP_Factory Service_Object * +// TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() +// "-SSLAuthenticate NONE +// -SSLPrivateKey PEM:clientkey.pem +// -SSLCertificate PEM:clientcert.pem" +// +// static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +// +// Policy Example 2 +// ================ +// +// Example of client upgrading from +// no message protection and no +// no authentication to message +// protection and authentication +// of targets, i.e., authentication +// of servers. +// +// The server's service configuration file for this example is +// +// # server.conf +// dynamic SSLIOP_Factory Service_Object * +// TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() +// "-SSLAuthenticate SERVER_AND_CLIENT +// -SSLPrivateKey PEM:serverkey.pem +// -SSLCertificate PEM:servercert.pem" +// +// static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +// +// The client's service configuration file +// for this example is: +// +// # client.conf +// dynamic SSLIOP_Factory Service_Object * +// TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() +// "-SSLNoProtection +// -SSLAuthenticate NONE +// -SSLPrivateKey PEM:clientkey.pem +// -SSLCertificate PEM:clientcert.pem" +// +// static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +// + + +int which = 0; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, "e:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'e': + which = ACE_OS::atoi(get_opts.optarg); + if(which < 1 || 2 < which) + ACE_ERROR_RETURN ((LM_ERROR, + "Usage: %s " + "-e [12]" + "\n", + argv [0]), + -1); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "Usage: %s " + "-e [12]" + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + + CORBA::ORB_var orb = + CORBA::ORB_init( argc, argv ); + + CORBA::Object_var obj = + orb->string_to_object( "file://Messenger.ior" ); + + if (parse_args (argc, argv) != 0) + return 1; + else if(which < 1 || 2 < which) + return 1; + + Security::QOP qop; + CORBA::Any protection; + Security::EstablishTrust establish_trust; + CORBA::Any trust; + CORBA::PolicyList policy_list (2); + + if (which == 1) + { + qop = Security::SecQOPNoProtection; + //qop = Security::SecQOPIntegrity; + + establish_trust.trust_in_client = 0; + establish_trust.trust_in_target = 1; + } + else + { + qop = Security::SecQOPIntegrityAndConfidentiality; + + establish_trust.trust_in_client = 0; + establish_trust.trust_in_target = 1; + } + + protection <<= qop; + trust <<= establish_trust; + + CORBA::Policy_var policy = + orb->create_policy (Security::SecQOPPolicy, protection); + + CORBA::Policy_var policy2 = + orb->create_policy (Security::SecEstablishTrustPolicy, trust); + + policy_list.length (1); + policy_list[0] = CORBA::Policy::_duplicate (policy.in ()); + policy_list.length (2); + policy_list[1] = CORBA::Policy::_duplicate (policy2.in ()); + + CORBA::Object_var object = + obj->_set_policy_overrides (policy_list, + CORBA::SET_OVERRIDE); + + Messenger_var messenger = + Messenger::_narrow( object.in() ); + + CORBA::String_var message = + CORBA::string_dup( "Implementing security policy now!" ); + + messenger->send_message( "Chief of Security", + "New Directive", + message.inout() ); + } + catch(const CORBA::Exception& ex) { + ex._tao_print_exception("Client: main block"); + return 1; + } + + return 0; +} + diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerServer.cpp b/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerServer.cpp new file mode 100644 index 00000000000..c6fdabeeb1e --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/MessengerServer.cpp @@ -0,0 +1,46 @@ +/* -*- C++ -*- $Id$ */ + +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) { + ex._tao_print_exception("Server Error: main block"); + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.cpp b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.cpp new file mode 100644 index 00000000000..a7164df866b --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.cpp @@ -0,0 +1,28 @@ +/* -*- C++ -*- $Id$ */ + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + + { + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.h b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.h new file mode 100644 index 00000000000..7fdf50bdb45 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/Messenger_i.h @@ -0,0 +1,32 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw (CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/PolicyControllingApp.mpc b/TAO/DevGuideExamples/Security/PolicyControllingApp/PolicyControllingApp.mpc new file mode 100644 index 00000000000..2a2b7c7c4a2 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/PolicyControllingApp.mpc @@ -0,0 +1,13 @@ +project(*Server): portableserver, orbsvcsexe, security, ssliop { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): orbsvcsexe, security, ssliop { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/README b/TAO/DevGuideExamples/Security/PolicyControllingApp/README new file mode 100644 index 00000000000..bf3b57390a4 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/README @@ -0,0 +1,144 @@ +TAO Security + +DevGuideExamples/Security/PolicyControllingApp/README + +This directory contains an illustration of a security aware +application that modifies security service policies. Similar +to the security unaware application example, these examples +vary the client and server's configurations. However, there +are also different paths through the client application that +demonstrate different policy settings. + +For readability, long text lines from the example's service +configuration files are split into multiple lines. A backslash +indicates the end of partial line except for the final fragment. +The backslashes should be removed and the fragments joined for +use with the example programs. + +For simplicity, the pass phrases have been stripped from the +private keys included with these examples in the 1.2a release. +This *should not* be construed as a recommended practice. Instead, +OCI strongly recommends that the security requirements of each +real-world application be evaluated carefully and that appropriate +procedures and practice be established accordingly. Private keys +without pass phrase protection are easily compromised and may +allow an unauthorized party to masquerade as an authorized system +user. + +Prior to running the server in these examples, the SSL_CERT_FILE +environment variable must be set, e.g., + # /bin/bash + export SSL_CERT_FILE=cacert.pem +or + rem Windows + set SSL_CERT_FILE=cacert.pem + +Example 1: Client sets Quality of Protection to NoProtection +------------------------------------------------------------ +The server is configured to accept both secured and unsecured +invocations (by setting -SSLNoProtection). The client is +configured to make secured invocations only. The client +application sets the quality of protection policy to +no protection to make an unsecured invocation to the server. + +The server's configuration is: + +# +# server.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLNoProtection \ + -SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of server.conf +# + +The client's configuration is: + +# +# client.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate NONE \ + -SSLPrivateKey PEM:clientkey.pem \ + -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of client.conf +# + +To run the server: + ./MessengerServer -ORBSvcConf server.conf + +To run the client: + ./MessengerClient -e 1 -ORBSvcConf client.conf + +Note: as presented in the 1.2a Developer's Guide, the client code +for this first example also manipulates the establish trust +policy. After the text went to print, changes in TAO have required +a change to this example such that the establish trust policy can't +be modified as shown in the text without causing an exception. This +example has been modified accordingly to execute without causing an +exception. + +Example 2: Client sets Quality of Protection to IntegrityAndConfidentiality +and EstablishTrust to authenticate the server +--------------------------------------------------------------------------- +The server is configured to accept secured invocations only. The client +is configured to issue unsecured invocations by default (-SSLNoProtection is +set). The client sets the quality of protection policy to integrity and +confidentiality and establish trust policy to authenticate the server. This +can only be achieved via a secured invocation. + +The server's configuration is: + +# +# server1.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of server1.conf +# + +The client's configuration is: + +# +# client1.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLNoProtection \ + -SSLAuthenticate NONE \ + -SSLPrivateKey PEM:clientkey.pem \ + -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of client1.conf +# + +To run the server: + ./MessengerServer -ORBSvcConf server1.conf + +To run the client: + ./MessengerClient -e 2 -ORBSvcConf client1.conf + + +-------------------------------------------------- +Files: DevGuideExamples/Security/PolicyControllingApp + +Messenger.idl - Messenger interface definition. +Messenger_i.h - Messenger servant class definition. +Messenger_i.cpp - Messenger servant implementation. +MessengerServer.cpp - MessengerServer process main. +MessengerClient.cpp - MessengerClient process main. + diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/cacert.pem b/TAO/DevGuideExamples/Security/PolicyControllingApp/cacert.pem new file mode 100644 index 00000000000..c493d28a523 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/cacert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDujCCAyOgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBoDELMAkGA1UEBhMCVVMx +ETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNVBAoT +Fk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMU +Q2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5j +b20wHhcNMDMwNzIzMjAyNDIwWhcNMTMwNzIwMjAyNDIwWjCBoDELMAkGA1UEBhMC +VVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNV +BAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UE +AxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdl +Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO4QS4bqrXVuBnHsOg1/ +gijXjiWhFTngG/sDLWAA52fHIobyFo5//7UaLedke0fkwqsmky8hjzSbXGJsGI5g +Yjp2Va7WeJhRQNr8VYWobCq00f//drHN2NF5M23Cx0JF9WfyfWpqq5TQRGtVZ+We ++q4S6wH1exZrVGHfkp5Xq5FvAgMBAAGjggEAMIH9MB0GA1UdDgQWBBQvTY0YWmHq +o2TMOKba/ECH9ayXZzCBzQYDVR0jBIHFMIHCgBQvTY0YWmHqo2TMOKba/ECH9ayX +Z6GBpqSBozCBoDELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYD +VQQHEwlTdC4gTG91aXMxHzAdBgNVBAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4x +DDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAa +BgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQBgjn97nbyyjFxyHC8vheAiDCQRblI4lZbZC6vSmxxqEGze +eAMiTYL2iK3vj2Ot3V2/o5VdLyEYV4RBP2iq1XuMYXjmL2ni+NVgepyXceynH8/b +72yciZZcDE5FVUaMUHAgZUpxsGSDyD70LnOFwBxuvxtlMtG5vXYNvwF/FJPs1g== +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/client.conf b/TAO/DevGuideExamples/Security/PolicyControllingApp/client.conf new file mode 100644 index 00000000000..1130e620d7b --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/client.conf @@ -0,0 +1,6 @@ +# $Id$ + +# client.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLAuthenticate NONE -SSLPrivateKey PEM:clientkey.pem -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/client1.conf b/TAO/DevGuideExamples/Security/PolicyControllingApp/client1.conf new file mode 100644 index 00000000000..23f4e0a5859 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/client1.conf @@ -0,0 +1,6 @@ +# $Id$ + +# client.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLNoProtection -SSLAuthenticate NONE -SSLPrivateKey PEM:clientkey.pem -SSLCertificate PEM:clientcert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/clientcert.pem b/TAO/DevGuideExamples/Security/PolicyControllingApp/clientcert.pem new file mode 100644 index 00000000000..56616fcd469 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/clientcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQQwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjIwN1oXDTEzMDgwNTAwMjIwN1owgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBmNs +aWVudDEgMB4GCSqGSIb3DQEJARYRY2xpZW50QG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAMYaaQgEmp2zv0t+MAEGf5GIsKSIB1YFrkkVR6Qv +LP0t9FHDPGFawh/aK3Yq+l7RiNpK1H5SSOaIavm4xV/3tpHxzuRjd0H3fdhaoAgD +xvcYZ75l662PEa25MCJsp40tACO0hGNOQCJ8kWVmT4xEhKcFl3xm+1OvNbwDM/pA +t4WpAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEArs6S6qud6D9t6AcGJS91XWqbBY1G +rSgmv9yFbvUyrGAQuMpyNuYTGlZA+Nd3EAjYlwP4fWbzUMM0MEtd3Xl0Aep0O39W +Cgp9HxDaJi3b4h63cd/B0su+2CNd4P6+NOX+IxgrrioCgKSnu6Nxy14fb03RQhjl +a3vOY5Juf8ySB/M= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/clientkey.pem b/TAO/DevGuideExamples/Security/PolicyControllingApp/clientkey.pem new file mode 100644 index 00000000000..2b4af2322ad --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/clientkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDGGmkIBJqds79LfjABBn+RiLCkiAdWBa5JFUekLyz9LfRRwzxh +WsIf2it2Kvpe0YjaStR+UkjmiGr5uMVf97aR8c7kY3dB933YWqAIA8b3GGe+Zeut +jxGtuTAibKeNLQAjtIRjTkAifJFlZk+MRISnBZd8ZvtTrzW8AzP6QLeFqQIDAQAB +AoGAJx1X16lxDepLvxAvUkSCM64Vkqb5K9b7TprRBm36KBNGxk4SQfa1laxyIGbk +AIzGxLM5uadtlXciCCSfdA9pEJbjtxSRJt2RbOWioT3sfIzXO7SCMHuuRjnPK3P8 +rgFmOOpo/ldVZ3mBJajxzWTEFXMUTAC4tB2j2B6of7MG5fECQQDu+uKzI2QjiTpW +5WFd/vzpS2SpDHks4sEu0F6zk1Zhbsc3KoJd3xxSLhKFLLoRDVZsDKE3opr7WRNT ++sjoGRY3AkEA1DZArJqLeWuB8L8GjC/AtMXsxlSe3Iy9X+4uffZ/y5A1JbYidLJl +3FlejMoQqp0EpbHO+mRCMSHyJqAFW1ZTHwJBANjv3oMHiYvIsrDXIQAWzLdqvUHI +FOfuH7fDZ3RUN4HS8fzeFeHo+uiO8jj6VR3NoboL7P14GoA4aBc//MjUnRkCQQCH +KZ770NtxFKaIvkLfWzL0cPQkRpWAiCu+RChclnpDH7CaOm2rwkzakhmEttbytFvX +ZW8dUGpQfPyM2XNP/6WlAkEAoOQ5UI1WREbjoJs5mTwTG1gTrQjShQwjC0dqt66s +bOS5os5EePGdctm//Xq7uR4/6hB6T7npPYqiyfWix1SINQ== +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/run_test.pl b/TAO/DevGuideExamples/Security/PolicyControllingApp/run_test.pl new file mode 100644 index 00000000000..16cd049b735 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/run_test.pl @@ -0,0 +1,67 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$file = PerlACE::LocalFile("Messenger.ior"); + +unlink $file; + +$ENV{'SSL_CERT_FILE'} = 'cacert.pem'; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", + "-ORBSvcConf server.conf"); + +$S1 = new PerlACE::Process("MessengerServer", + "-ORBSvcConf server1.conf"); + +$C = new PerlACE::Process("MessengerClient", + "-e 1 -ORBSvcConf client.conf"); + +$C1 = new PerlACE::Process("MessengerClient", + "-e 2 -ORBSvcConf client1.conf"); + + +print STDERR "\n\nSecurity Policy Controlling Application Examples\n"; +print STDERR "------------------------------------------------\n"; + +print STDERR "Starting Messenger Server, example 1...\n\n"; +$S->Spawn(); +if (PerlACE::waitforfile_timed ($file, 5) == -1) { + print STDERR "ERROR: cannot find file <$file>\n"; + $SV->Kill (); + exit 1; +} + +print STDERR "\nStarting MessengerClient, example 1...\n\n"; +if ($C->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +unlink $file; +$S->Kill(); + +print STDERR "\nStarting Messenger Server, example 2...\n\n"; +$S1->Spawn(); +if (PerlACE::waitforfile_timed ($file, 5) == -1) { + print STDERR "ERROR: cannot find file <$file>\n"; + $SV->Kill (); + exit 1; +} + +print STDERR "\nStarting MessengerClient, example 2...\n\n"; +if ($C1->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S1->Kill(); + +exit 0; + diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/server.conf b/TAO/DevGuideExamples/Security/PolicyControllingApp/server.conf new file mode 100644 index 00000000000..380312b03fc --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/server.conf @@ -0,0 +1,5 @@ +# $Id$ + +# server.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLNoProtection -SSLAuthenticate SERVER_AND_CLIENT -SSLPrivateKey PEM:serverkey.pem -SSLCertificate PEM:servercert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/server1.conf b/TAO/DevGuideExamples/Security/PolicyControllingApp/server1.conf new file mode 100644 index 00000000000..f975ec687f8 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/server1.conf @@ -0,0 +1,5 @@ +# $Id$ + +# server.conf +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLAuthenticate SERVER_AND_CLIENT -SSLPrivateKey PEM:serverkey.pem -SSLCertificate PEM:servercert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/servercert.pem b/TAO/DevGuideExamples/Security/PolicyControllingApp/servercert.pem new file mode 100644 index 00000000000..9659fb07334 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/servercert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQMwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjAyOVoXDTEzMDgwNTAwMjAyOVowgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBlNl +cnZlcjEgMB4GCSqGSIb3DQEJARYRc2VydmVyQG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAKw+tjwQz/stcesfm6WvnB6D/FTYu79tHzGUDlSV +N+kycFYcZfsRmIEo5afG+epOwlp1f9Wpij23AMY4BcdcSP9R4yhH46uMFThQhkn9 +fraZ8slcgVog5G6MwXmsWb5gThjgiT0KPSQHkEU0bryw+CiM4oV+9dSaFBLa3Uqc +iQZdAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAur+t7sIqGjqAPgFtFcgByAJTvNYb +UDZ43AGd22tCtT/usoy/x9qsQv8jwd8kA8yUNQUmjRxR4vEkZ06L6HF8Ii1QmU/E +fZ7YcjXjWxgnCEQGSXuHLhmlIMAlXNvX1XzNddu/NuRbSP3lYS/j32W8gTb6MdyL +8bOkIqRpVY0ek80= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/PolicyControllingApp/serverkey.pem b/TAO/DevGuideExamples/Security/PolicyControllingApp/serverkey.pem new file mode 100644 index 00000000000..c61b8152649 --- /dev/null +++ b/TAO/DevGuideExamples/Security/PolicyControllingApp/serverkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCsPrY8EM/7LXHrH5ulr5weg/xU2Lu/bR8xlA5UlTfpMnBWHGX7 +EZiBKOWnxvnqTsJadX/VqYo9twDGOAXHXEj/UeMoR+OrjBU4UIZJ/X62mfLJXIFa +IORujMF5rFm+YE4Y4Ik9Cj0kB5BFNG68sPgojOKFfvXUmhQS2t1KnIkGXQIDAQAB +AoGBAKjg08wQr9qVtBvT4ceRZoCE5+JIncwSMYNqpqJHq4n46iuDrHl9xwjcEE9v +x5jzn5sRmUTj9aaMxzWRuBi/YtFVmgsl8lNiBOniIkFYqIyXfzNgX+2qyRzgOtAo +0ByWFsqkLmW9cUXWaICkM49b9Jz7SnmPs+9VWGiNrjgJSiABAkEA4eFIc82mP2KJ +wap8LJV7GLBA3iiVRmOgVb0TvRMitFWPGdGKFcsAVVkogQ/zIixKeZKc5enMhAI9 +i3Q2tmolZQJBAMM2hlSbJZncMjooKBlp2VZgUpEjbBPpD9XGgA5BO2RfKi3B29T9 +2v8I3m9WbCxbtFKlHcjNT3GToGCoi4S1qZkCQDcn7qwwZE8H/cFnoui0G5ncuApH +eKP2gdlN0TsTKB9G4SmZzBEkP9GXcteJEIKgtBLZpSxTGdiGP4cE+rMyWi0CQDam +TgbjhCxFq74CPe+XZWO8BYFiREByr58uOe1Dr8fSqHE040EGbEeXiQXsUM4+QgYc ++XCcoY/vPyewJ5bYcIkCQERqwlO9/JUiX2w01l82tMxVK8DmN3QwHWJxNexD5Ewf +QFG6FYFPNHCR2f+MUSMFp1djUSVpCrWbppmlr96uZ48= +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger.idl b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger.idl new file mode 100644 index 00000000000..05cf30bf5f9 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger.idl @@ -0,0 +1,11 @@ +/* -*- C++ -*- $Id$ */ + +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerClient.cpp b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerClient.cpp new file mode 100644 index 00000000000..76f812e7cff --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerClient.cpp @@ -0,0 +1,39 @@ +/* -*- C++ -*- $Id$ */ + +#include "MessengerC.h" +#include <iostream> +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + // Destringify ior + CORBA::Object_var obj = orb->string_to_object( "file://Messenger.ior" ); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow + Messenger_var messenger = Messenger::_narrow( obj.in() ); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Argument is not a Messenger reference" << std::endl; + return 1; + } + + CORBA::String_var message = CORBA::string_dup( + "Implementing security policy now!" ); + messenger->send_message( "Chief of Security", + "New Directive", + message.inout() ); + std::cout << "message was sent" << std::endl; + } + + catch(const CORBA::Exception& ex) { + std::cerr << "Caught CORBA excepti.o.n: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerI.cpp b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerI.cpp new file mode 100644 index 00000000000..bcc73c50247 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerI.cpp @@ -0,0 +1,46 @@ +// -*- C++ -*- +// +// $Id$ + +// **** Code generated by the The ACE ORB (TAO) IDL Compiler **** +// TAO and the TAO IDL Compiler have been developed by: +// Center for Distributed Object Computing +// Washington University +// St. Louis, MO +// USA +// http://www.cs.wustl.edu/~schmidt/doc-center.html +// and +// Distributed Object Computing Laboratory +// University of California at Irvine +// Irvine, CA +// USA +// http://doc.ece.uci.edu/ +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "MessengerI.h" + +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )) + + { + //Add your implementation here + } + diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerServer.cpp b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerServer.cpp new file mode 100644 index 00000000000..8cdfce1b28e --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/MessengerServer.cpp @@ -0,0 +1,46 @@ +/* -*- C++ -*- $Id$ */ + +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Register the servant with the RootPOA, obtain its object + // reference, stringify it, and write it to a file. + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.cpp b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.cpp new file mode 100644 index 00000000000..0d8656c4c88 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.cpp @@ -0,0 +1,35 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException) + + { + std::cout << "Message from: " << user_name << std::endl; + std::cout << "Subject: " << subject << std::endl; + std::cout << "Message: " << message << std::endl; + return 1; + } + diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.h b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.h new file mode 100644 index 00000000000..b7ffc8a2fa5 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/Messenger_i.h @@ -0,0 +1,32 @@ +/* -*- C++ -*- $Id$ */ + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ) + throw(CORBA::SystemException); + +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/README b/TAO/DevGuideExamples/Security/SecurityUnawareApp/README new file mode 100644 index 00000000000..7eebb03ebfb --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/README @@ -0,0 +1,172 @@ +TAO Security + +DevGuideExamples/Security/SecurityUnawareApp/README + +This directory contains an illustration of a security unaware +application. The examples vary the client's configuration to +demonstrate different features. For each of these examples, +however, the client and server process code remains the same. + +For readability, long text lines from the example's service +configuration files are split into multiple lines. A backslash +indicates the end of partial line except for the final fragment. +The backslashes should be removed and the fragments joined for +use with the example programs. + +For simplicity, the pass phrases have been stripped from the +private keys included with these examples in the 1.2a release. +This *should not* be construed as a recommended practice. Instead, +OCI strongly recommends that the security requirements of each +real-world application be evaluated carefully and that appropriate +procedures and practice be established accordingly. Private keys +without pass phrase protection are easily compromised and may +allow an unauthorized party to masquerade as an authorized system +user. + +Prior to running the server in these examples, the SSL_CERT_FILE +environment variable must be set, e.g., + # /bin/bash + export SSL_CERT_FILE=cacert.pem +or + rem Windows + set SSL_CERT_FILE=cacert.pem + +For examples 1 and 2, the client's environment should also +define SSL_CERT_FILE appropriately. The final example +demonstrates how to establish a connection between a client +and server such that the client does not authenticate the +server and therefore does not need a value for SSL_CERT_FILE. + + + +Example 1: Secured server and unsecured client +---------------------------------------------- +The server is configured to accept requests only via secured +connections. No specific configurationi is provided for the +client so it has the default configuration. + +The server's configuration is: + +# +# server.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of server.conf +# + +To run the server: + ./MessengerServer -ORBSvcConf server.conf + +To run the client: + ./MessengerClient + + + +Example 2: Secured server and unsecured client +---------------------------------------------- +Both server and client are configured to issue and accept +requests via secured connections. + +The server's configuration is: + +# +# server.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of server.conf +# + +The client's configuration is: + +# +# client.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of client.conf +# + +To run the server: + ./MessengerServer -ORBSvcConf server.conf + +To run the client: + ./MessengerClient -ORBSvcConf client.conf + + + +Example 3: client doesn't authenticate server +--------------------------------------------- +The client is configured such that it doesn't authenticate +the server. It still employs an encrypted connection but, +since it doesn't need a CA certificate, no value for +SSL_CERT_FILE is required. + +The server's configuration is: + +# +# server.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate SERVER_AND_CLIENT \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of server.conf +# + +The client's configuration is: + +# +# client.conf +# +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() \ + "-SSLAuthenticate NONE \ + -SSLPrivateKey PEM:serverkey.pem \ + -SSLCertificate PEM:servercert.pem" + +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" +# +# end of client.conf +# + +To run the server: + ./MessengerServer -ORBSvcConf server.conf + +To run the client: + ./MessengerClient -ORBSvcConf client.conf + +If a value for SSL_CERT_FILE has already been placed in the +client's environment, the client may be executed as follows (on +Unix platforms): + SSL_CERT_FILE= ./MessengerClient -ORBSvcConf client.conf + + + +-------------------------------------------------- +Files: DevGuideExamples/Security/SecurityUnawareApp/ + +Messenger.idl - Messenger interface definition. +Messenger_i.h - Messenger servant class definition. +Messenger_i.cpp - Messenger servant implementation. +MessengerServer.cpp - MessengerServer process main. +MessengerClient.cpp - MessengerClient process main. + diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/SecurityUnawareApp.mpc b/TAO/DevGuideExamples/Security/SecurityUnawareApp/SecurityUnawareApp.mpc new file mode 100644 index 00000000000..7c31be7f066 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/SecurityUnawareApp.mpc @@ -0,0 +1,13 @@ +project(*Server): taoexe, portableserver, security, ssl { + Source_Files { + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, security, ssl { + Source_Files { + MessengerC.cpp + MessengerClient.cpp + } +} diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/cacert.pem b/TAO/DevGuideExamples/Security/SecurityUnawareApp/cacert.pem new file mode 100644 index 00000000000..c493d28a523 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/cacert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDujCCAyOgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBoDELMAkGA1UEBhMCVVMx +ETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNVBAoT +Fk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMU +Q2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5j +b20wHhcNMDMwNzIzMjAyNDIwWhcNMTMwNzIwMjAyNDIwWjCBoDELMAkGA1UEBhMC +VVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYDVQQHEwlTdC4gTG91aXMxHzAdBgNV +BAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4xDDAKBgNVBAsTA1RBTzEdMBsGA1UE +AxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAaBgkqhkiG9w0BCQEWDWNhQG9jaXdl +Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO4QS4bqrXVuBnHsOg1/ +gijXjiWhFTngG/sDLWAA52fHIobyFo5//7UaLedke0fkwqsmky8hjzSbXGJsGI5g +Yjp2Va7WeJhRQNr8VYWobCq00f//drHN2NF5M23Cx0JF9WfyfWpqq5TQRGtVZ+We ++q4S6wH1exZrVGHfkp5Xq5FvAgMBAAGjggEAMIH9MB0GA1UdDgQWBBQvTY0YWmHq +o2TMOKba/ECH9ayXZzCBzQYDVR0jBIHFMIHCgBQvTY0YWmHqo2TMOKba/ECH9ayX +Z6GBpqSBozCBoDELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1pc3NvdXJpMRIwEAYD +VQQHEwlTdC4gTG91aXMxHzAdBgNVBAoTFk9iamVjdCBDb21wdXRpbmcsIEluYy4x +DDAKBgNVBAsTA1RBTzEdMBsGA1UEAxMUQ2VydGlmeWluZyBBdXRob3JpdHkxHDAa +BgkqhkiG9w0BCQEWDWNhQG9jaXdlYi5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQBgjn97nbyyjFxyHC8vheAiDCQRblI4lZbZC6vSmxxqEGze +eAMiTYL2iK3vj2Ot3V2/o5VdLyEYV4RBP2iq1XuMYXjmL2ni+NVgepyXceynH8/b +72yciZZcDE5FVUaMUHAgZUpxsGSDyD70LnOFwBxuvxtlMtG5vXYNvwF/FJPs1g== +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/client.conf b/TAO/DevGuideExamples/Security/SecurityUnawareApp/client.conf new file mode 100644 index 00000000000..78e939b5c7e --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/client.conf @@ -0,0 +1,4 @@ +# $Id$ + +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLAuthenticate SERVER_AND_CLIENT -SSLPrivateKey PEM:clientkey.pem -SSLCertificate PEM:clientcert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/client1.conf b/TAO/DevGuideExamples/Security/SecurityUnawareApp/client1.conf new file mode 100644 index 00000000000..daafe5fdf58 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/client1.conf @@ -0,0 +1,4 @@ +# $Id$ + +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLAuthenticate NONE -SSLPrivateKey PEM:clientkey.pem -SSLCertificate PEM:clientcert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientcert.pem b/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientcert.pem new file mode 100644 index 00000000000..56616fcd469 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientcert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQQwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjIwN1oXDTEzMDgwNTAwMjIwN1owgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBmNs +aWVudDEgMB4GCSqGSIb3DQEJARYRY2xpZW50QG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAMYaaQgEmp2zv0t+MAEGf5GIsKSIB1YFrkkVR6Qv +LP0t9FHDPGFawh/aK3Yq+l7RiNpK1H5SSOaIavm4xV/3tpHxzuRjd0H3fdhaoAgD +xvcYZ75l662PEa25MCJsp40tACO0hGNOQCJ8kWVmT4xEhKcFl3xm+1OvNbwDM/pA +t4WpAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEArs6S6qud6D9t6AcGJS91XWqbBY1G +rSgmv9yFbvUyrGAQuMpyNuYTGlZA+Nd3EAjYlwP4fWbzUMM0MEtd3Xl0Aep0O39W +Cgp9HxDaJi3b4h63cd/B0su+2CNd4P6+NOX+IxgrrioCgKSnu6Nxy14fb03RQhjl +a3vOY5Juf8ySB/M= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientkey.pem b/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientkey.pem new file mode 100644 index 00000000000..2b4af2322ad --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/clientkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDGGmkIBJqds79LfjABBn+RiLCkiAdWBa5JFUekLyz9LfRRwzxh +WsIf2it2Kvpe0YjaStR+UkjmiGr5uMVf97aR8c7kY3dB933YWqAIA8b3GGe+Zeut +jxGtuTAibKeNLQAjtIRjTkAifJFlZk+MRISnBZd8ZvtTrzW8AzP6QLeFqQIDAQAB +AoGAJx1X16lxDepLvxAvUkSCM64Vkqb5K9b7TprRBm36KBNGxk4SQfa1laxyIGbk +AIzGxLM5uadtlXciCCSfdA9pEJbjtxSRJt2RbOWioT3sfIzXO7SCMHuuRjnPK3P8 +rgFmOOpo/ldVZ3mBJajxzWTEFXMUTAC4tB2j2B6of7MG5fECQQDu+uKzI2QjiTpW +5WFd/vzpS2SpDHks4sEu0F6zk1Zhbsc3KoJd3xxSLhKFLLoRDVZsDKE3opr7WRNT ++sjoGRY3AkEA1DZArJqLeWuB8L8GjC/AtMXsxlSe3Iy9X+4uffZ/y5A1JbYidLJl +3FlejMoQqp0EpbHO+mRCMSHyJqAFW1ZTHwJBANjv3oMHiYvIsrDXIQAWzLdqvUHI +FOfuH7fDZ3RUN4HS8fzeFeHo+uiO8jj6VR3NoboL7P14GoA4aBc//MjUnRkCQQCH +KZ770NtxFKaIvkLfWzL0cPQkRpWAiCu+RChclnpDH7CaOm2rwkzakhmEttbytFvX +ZW8dUGpQfPyM2XNP/6WlAkEAoOQ5UI1WREbjoJs5mTwTG1gTrQjShQwjC0dqt66s +bOS5os5EePGdctm//Xq7uR4/6hB6T7npPYqiyfWix1SINQ== +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/run_test.pl b/TAO/DevGuideExamples/Security/SecurityUnawareApp/run_test.pl new file mode 100644 index 00000000000..649bb7a1b04 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/run_test.pl @@ -0,0 +1,62 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +$file = PerlACE::LocalFile("Messenger.ior"); + +unlink $file; + +$ENV{'SSL_CERT_FILE'} = 'cacert.pem'; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer", + "-ORBSvcConf server.conf"); + +print STDERR "\n\nSecurity Unaware Application Examples\n"; +print STDERR "-------------------------------------\n"; +print STDERR "Starting Messenger Server...\n\n"; + +$S->Spawn(); +if (PerlACE::waitforfile_timed ($file, 5) == -1) { + print STDERR "ERROR: cannot find file <$file>\n"; + $SV->Kill (); + exit 1; +} + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient"); + +$C1 = new PerlACE::Process("MessengerClient", + "-ORBSvcConf client.conf"); + +$C2 = new PerlACE::Process("MessengerClient", + "-ORBSvcConf client1.conf"); + +print STDERR "\nStarting MessengerClient, example 1...\n\n"; +if ($C->SpawnWaitKill(10) == 0) { + $S->Kill(); + exit (1); +} + +print STDERR "\nStarting MessengerClient, example 2...\n\n"; +if ($C1->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +$ENV{'SSL_CERT_FILE'} = ''; + +print STDERR "\nStarting MessengerClient, example 3...\n\n"; +if ($C2->SpawnWaitKill(10) != 0) { + $S->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); + +exit 0; diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/server.conf b/TAO/DevGuideExamples/Security/SecurityUnawareApp/server.conf new file mode 100644 index 00000000000..200fbd6cb8b --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/server.conf @@ -0,0 +1,4 @@ +# $Id$ + +dynamic SSLIOP_Factory Service_Object * TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory() "-SSLAuthenticate SERVER_AND_CLIENT -SSLPrivateKey PEM:serverkey.pem -SSLCertificate PEM:servercert.pem" +static Resource_Factory "-ORBProtocolFactory SSLIOP_Factory" diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/servercert.pem b/TAO/DevGuideExamples/Security/SecurityUnawareApp/servercert.pem new file mode 100644 index 00000000000..9659fb07334 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/servercert.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpzCCAhACAQMwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlVTMREwDwYD +VQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZPYmpl +Y3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xHTAbBgNVBAMTFENlcnRp +ZnlpbmcgQXV0aG9yaXR5MRwwGgYJKoZIhvcNAQkBFg1jYUBvY2l3ZWIuY29tMB4X +DTAzMDgwODAwMjAyOVoXDTEzMDgwNTAwMjAyOVowgZYxCzAJBgNVBAYTAlVTMREw +DwYDVQQIEwhNaXNzb3VyaTESMBAGA1UEBxMJU3QuIExvdWlzMR8wHQYDVQQKExZP +YmplY3QgQ29tcHV0aW5nLCBJbmMuMQwwCgYDVQQLEwNUQU8xDzANBgNVBAMTBlNl +cnZlcjEgMB4GCSqGSIb3DQEJARYRc2VydmVyQG9jaXdlYi5jb20wgZ8wDQYJKoZI +hvcNAQEBBQADgY0AMIGJAoGBAKw+tjwQz/stcesfm6WvnB6D/FTYu79tHzGUDlSV +N+kycFYcZfsRmIEo5afG+epOwlp1f9Wpij23AMY4BcdcSP9R4yhH46uMFThQhkn9 +fraZ8slcgVog5G6MwXmsWb5gThjgiT0KPSQHkEU0bryw+CiM4oV+9dSaFBLa3Uqc +iQZdAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAur+t7sIqGjqAPgFtFcgByAJTvNYb +UDZ43AGd22tCtT/usoy/x9qsQv8jwd8kA8yUNQUmjRxR4vEkZ06L6HF8Ii1QmU/E +fZ7YcjXjWxgnCEQGSXuHLhmlIMAlXNvX1XzNddu/NuRbSP3lYS/j32W8gTb6MdyL +8bOkIqRpVY0ek80= +-----END CERTIFICATE----- diff --git a/TAO/DevGuideExamples/Security/SecurityUnawareApp/serverkey.pem b/TAO/DevGuideExamples/Security/SecurityUnawareApp/serverkey.pem new file mode 100644 index 00000000000..c61b8152649 --- /dev/null +++ b/TAO/DevGuideExamples/Security/SecurityUnawareApp/serverkey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCsPrY8EM/7LXHrH5ulr5weg/xU2Lu/bR8xlA5UlTfpMnBWHGX7 +EZiBKOWnxvnqTsJadX/VqYo9twDGOAXHXEj/UeMoR+OrjBU4UIZJ/X62mfLJXIFa +IORujMF5rFm+YE4Y4Ik9Cj0kB5BFNG68sPgojOKFfvXUmhQS2t1KnIkGXQIDAQAB +AoGBAKjg08wQr9qVtBvT4ceRZoCE5+JIncwSMYNqpqJHq4n46iuDrHl9xwjcEE9v +x5jzn5sRmUTj9aaMxzWRuBi/YtFVmgsl8lNiBOniIkFYqIyXfzNgX+2qyRzgOtAo +0ByWFsqkLmW9cUXWaICkM49b9Jz7SnmPs+9VWGiNrjgJSiABAkEA4eFIc82mP2KJ +wap8LJV7GLBA3iiVRmOgVb0TvRMitFWPGdGKFcsAVVkogQ/zIixKeZKc5enMhAI9 +i3Q2tmolZQJBAMM2hlSbJZncMjooKBlp2VZgUpEjbBPpD9XGgA5BO2RfKi3B29T9 +2v8I3m9WbCxbtFKlHcjNT3GToGCoi4S1qZkCQDcn7qwwZE8H/cFnoui0G5ncuApH +eKP2gdlN0TsTKB9G4SmZzBEkP9GXcteJEIKgtBLZpSxTGdiGP4cE+rMyWi0CQDam +TgbjhCxFq74CPe+XZWO8BYFiREByr58uOe1Dr8fSqHE040EGbEeXiQXsUM4+QgYc ++XCcoY/vPyewJ5bYcIkCQERqwlO9/JUiX2w01l82tMxVK8DmN3QwHWJxNexD5Ewf +QFG6FYFPNHCR2f+MUSMFp1djUSVpCrWbppmlr96uZ48= +-----END RSA PRIVATE KEY----- diff --git a/TAO/DevGuideExamples/SmartProxies/Logger.idl b/TAO/DevGuideExamples/SmartProxies/Logger.idl new file mode 100644 index 00000000000..e3e7c507324 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Logger.idl @@ -0,0 +1,6 @@ +// Logger.idl + +interface Logger +{ + boolean log_message(in string message); +}; diff --git a/TAO/DevGuideExamples/SmartProxies/LoggerServer.cpp b/TAO/DevGuideExamples/SmartProxies/LoggerServer.cpp new file mode 100644 index 00000000000..9c88b257bca --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/LoggerServer.cpp @@ -0,0 +1,45 @@ +// LoggerServer.cpp + +#include "Logger_i.h" +#include <iostream> +#include <fstream> +int +main(int argc, char * argv[]) +{ + try { + // Initialize the ORB. + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Get a reference to Root POA. + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + // Activate the POA manager. + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create a Logger_i servant. + Logger_i logger_servant; + + // Register the servant with the RootPOA, obtain its object reference, + // stringify it, and write it to a file. + PortableServer::ObjectId_var oid = poa->activate_object(&logger_servant); + CORBA::Object_var logger_obj = poa->id_to_reference(oid.in()); + CORBA::String_var str = orb->object_to_string(logger_obj.in()); + std::ofstream iorFile("Logger.ior"); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Logger.ior" << std::endl; + + // Accept requests from clients. + orb->run(); + + // Release resources. + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception:" << ex << std::endl; + return 1; + } + return 0; +} diff --git a/TAO/DevGuideExamples/SmartProxies/Logger_i.cpp b/TAO/DevGuideExamples/SmartProxies/Logger_i.cpp new file mode 100644 index 00000000000..6ccc4d8bf79 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Logger_i.cpp @@ -0,0 +1,25 @@ +#include "Logger_i.h" +#include <ace/OS_NS_time.h> +#include <iostream> + +Logger_i::Logger_i (void) +{ + log_file.open("Logger.txt"); +} + +Logger_i::~Logger_i (void) +{ + log_file.close(); +} + +CORBA::Boolean Logger_i::log_message (const char * message) +{ + ACE_OS::time(&log_time); + log_time_string = ACE_OS::ctime(&log_time); + // Replace carriage return with string delimiter. + log_time_string[24] = '\0'; + log_file << ACE_TEXT_ALWAYS_CHAR(log_time_string.c_str()) << " " + << message << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/SmartProxies/Logger_i.h b/TAO/DevGuideExamples/SmartProxies/Logger_i.h new file mode 100644 index 00000000000..566d3f03912 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Logger_i.h @@ -0,0 +1,25 @@ +#ifndef LOGGERI_H_ +#define LOGGERI_H_ + +#include "LoggerS.h" +#include <ace/String_Base.h> +#include <fstream> + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class Logger_i : public virtual POA_Logger +{ +public: + Logger_i (void); + virtual ~Logger_i (void); +private: + ofstream log_file; // Output file stream to which messages are logged. + time_t log_time; // Needed for creating a time stamp. + ACE_TString log_time_string; // The time stamp string. + +virtual CORBA::Boolean log_message (const char * message); +}; +#endif /* LOGGERI_H_ */ + diff --git a/TAO/DevGuideExamples/SmartProxies/Messenger.idl b/TAO/DevGuideExamples/SmartProxies/Messenger.idl new file mode 100644 index 00000000000..aaedd932648 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Messenger.idl @@ -0,0 +1,9 @@ +// messenger.idl + +interface Messenger + { + boolean send_message ( in string user_name, + in string subject, + inout string message ); + }; + diff --git a/TAO/DevGuideExamples/SmartProxies/MessengerClient.cpp b/TAO/DevGuideExamples/SmartProxies/MessengerClient.cpp new file mode 100644 index 00000000000..a2bbd89dfcb --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/MessengerClient.cpp @@ -0,0 +1,50 @@ + +#include "MessengerC.h" +#include "Smart_Messenger_Proxy.h" + +#include <iostream> +int ACE_TMAIN(int argc, ACE_TCHAR * argv[]) +{ + try { + // Initialize the ORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + // Create a smart proxy factory. It will register itself with the + // smart proxy factory adapter so it can be used to create + // Messenger proxies. It must be created on the heap, but is + // otherwise unused here. + new Smart_Messenger_Proxy_Factory(orb.in()); + + // Convert the contents of the Messenger.ior file to an object reference. + CORBA::Object_var obj = orb->string_to_object("file://Messenger.ior"); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Messenger reference" << std::endl; + return 1; + } + + // Narrow the object reference to a Messenger object reference. + Messenger_var messenger = Messenger::_narrow(obj.in()); + if (CORBA::is_nil(messenger.in())) { + std::cerr << "Not a Messenger object reference" << std::endl; + return 1; + } + + // Create a message and send it to the Messenger. + CORBA::String_var message = CORBA::string_dup("Hello!"); + messenger->send_message ("TAO User", "TAO Test", message.inout()); + std::cout << "Message was sent" << std::endl; + + // Release resources. + orb->destroy(); + } + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + catch(...) { + std::cerr << "Caught an unknown exception type" << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/SmartProxies/MessengerServer.cpp b/TAO/DevGuideExamples/SmartProxies/MessengerServer.cpp new file mode 100644 index 00000000000..04843cce4a0 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/MessengerServer.cpp @@ -0,0 +1,44 @@ + +#include "Messenger_i.h" +#include <iostream> +#include <fstream> +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try { + // Initialize orb + CORBA::ORB_var orb = CORBA::ORB_init( argc, argv ); + + //Get reference to Root POA + CORBA::Object_var obj = orb->resolve_initial_references( "RootPOA" ); + PortableServer::POA_var poa = PortableServer::POA::_narrow( obj.in() ); + + // Activate POA Manager + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + // Create an object + Messenger_i messenger_servant; + + // Write its strigified reference to a file + PortableServer::ObjectId_var oid = + poa->activate_object( &messenger_servant ); + CORBA::Object_var messenger_obj = poa->id_to_reference( oid.in() ); + CORBA::String_var str = orb->object_to_string( messenger_obj.in() ); + std::ofstream iorFile( "Messenger.ior" ); + iorFile << str.in() << std::endl; + iorFile.close(); + std::cout << "IOR written to file Messenger.ior" << std::endl; + + // Accept requests + orb->run(); + orb->destroy(); + } + + catch(const CORBA::Exception& ex) { + std::cerr << "Caught a CORBA exception: " << ex << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/SmartProxies/Messenger_i.cpp b/TAO/DevGuideExamples/SmartProxies/Messenger_i.cpp new file mode 100644 index 00000000000..08c2ad7fa96 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Messenger_i.cpp @@ -0,0 +1,34 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#include "Messenger_i.h" +#include <iostream> +// Implementation skeleton constructor +Messenger_i::Messenger_i (void) + { + } + +// Implementation skeleton destructor +Messenger_i::~Messenger_i (void) + { + } + +CORBA::Boolean Messenger_i::send_message ( + const char * user_name, + const char * subject, + char *& message + ) +{ + //Add your implementation here + std::cerr << "Message from: " << user_name << std::endl; + std::cerr << "Subject: " << subject << std::endl; + std::cerr << "Message: " << message << std::endl; + return 1; +} + diff --git a/TAO/DevGuideExamples/SmartProxies/Messenger_i.h b/TAO/DevGuideExamples/SmartProxies/Messenger_i.h new file mode 100644 index 00000000000..bab46846988 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Messenger_i.h @@ -0,0 +1,37 @@ +/* -*- C++ -*- $Id$ */ + +// ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* +// TAO and the TAO IDL Compiler have been developed by the Center for +// Distributed Object Computing at Washington University, St. Louis. +// +// Information about TAO is available at: +// http://www.cs.wustl.edu/~schmidt/TAO.html + +#ifndef MESSENGERI_H_ +#define MESSENGERI_H_ + +#include "MessengerS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +//Class Messenger_i +class Messenger_i : public virtual POA_Messenger +{ +public: + //Constructor + Messenger_i (void); + + //Destructor + virtual ~Messenger_i (void); + +virtual CORBA::Boolean send_message ( + const char * user_name, + const char * subject, + char *& message + ); +}; + + +#endif /* MESSENGERI_H_ */ diff --git a/TAO/DevGuideExamples/SmartProxies/README b/TAO/DevGuideExamples/SmartProxies/README new file mode 100644 index 00000000000..b3927a9fdfc --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/README @@ -0,0 +1,25 @@ + +DevGuideExamples/SmartProxies/README + +The example in this directory extends the Messenger example in +GettingStarted directory to use the Smart Proxy feature in TAO. + +A new Interface, Logger which supports an operation to log the messages +(log_message) is used to log the information about the use of the +Messenger. + +How to Run +---------- + +To start the logger server: +--------------------------- +./LoggerServer + +To start the messenger server: +----------------------------- +./MessengerServer + + +To start the messenger client: +----------------------------- +./MessengerClient diff --git a/TAO/DevGuideExamples/SmartProxies/SmartProxies.mpc b/TAO/DevGuideExamples/SmartProxies/SmartProxies.mpc new file mode 100644 index 00000000000..87c105c803a --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/SmartProxies.mpc @@ -0,0 +1,42 @@ +// The server doesn't use Smart Proxies, but since the client +// shares the idl generated source files, it needs to have the +// -Gsp option added to the tao_idl flags. +project(*Server): messaging, taoexe, portableserver, smart_proxies { + IDL_Files { + Messenger.idl + } + + Source_Files { + MessengerC.cpp + MessengerS.cpp + Messenger_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, messaging, smart_proxies { + after += *Server *Logger + + IDL_Files { + } + + Source_Files { + LoggerC.cpp + MessengerC.cpp + MessengerClient.cpp + Smart_Messenger_Proxy.cpp + } +} + +project(*Logger): taoexe, portableserver { + IDL_Files { + Logger.idl + } + + Source_Files { + LoggerC.cpp + LoggerS.cpp + Logger_i.cpp + LoggerServer.cpp + } +} diff --git a/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.cpp b/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.cpp new file mode 100644 index 00000000000..7d46c96947b --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.cpp @@ -0,0 +1,58 @@ +// Smart_Messenger_Proxy.cpp + +#include "Smart_Messenger_Proxy.h" +#include <iostream> + +Smart_Messenger_Proxy_Factory::Smart_Messenger_Proxy_Factory( + CORBA::ORB_ptr orb) +{ + std::cout << "Creating smart proxy factory" << std::endl; + // Convert the contents of the Logger.ior file to an object reference. + CORBA::Object_var obj = orb->string_to_object("file://Logger.ior"); + if (CORBA::is_nil(obj.in())) { + std::cerr << "Nil Logger reference" << std::endl; + throw 0; + } + + // Narrow the object reference to a Logger object reference. + logger_ = Logger::_narrow(obj.in()); + if (CORBA::is_nil(logger_.in ())) { + std::cerr << "Not a Logger object reference" << std::endl; + throw 0; + } +} + +Messenger_ptr +Smart_Messenger_Proxy_Factory::create_proxy ( + Messenger_ptr proxy) +{ + + Messenger_ptr smart_proxy = 0; + if (CORBA::is_nil(proxy) == 0) + smart_proxy = new Smart_Messenger_Proxy(proxy, logger_.in()); + return smart_proxy; +} + + +Smart_Messenger_Proxy::Smart_Messenger_Proxy( + Messenger_ptr proxy, Logger_ptr logger) + : TAO_Smart_Proxy_Base(proxy), + logger_(Logger::_duplicate(logger)) +{ + std::cout << "Creating smart proxy" << std::endl; +} + +CORBA::Boolean +Smart_Messenger_Proxy::send_message ( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException) +{ + logger_->log_message("Before send_message()"); + CORBA::Boolean ret_val = + TAO_Messenger_Smart_Proxy_Base::send_message(user_name, subject, message); + logger_->log_message("After send_message()"); + return ret_val; +} + diff --git a/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.h b/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.h new file mode 100644 index 00000000000..d75d682b9e6 --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.h @@ -0,0 +1,30 @@ +// Smart_Messenger_Proxy.h + + +#include "MessengerC.h" +#include "LoggerC.h" + +class Smart_Messenger_Proxy_Factory : public TAO_Messenger_Default_Proxy_Factory +{ + public: + Smart_Messenger_Proxy_Factory(CORBA::ORB_ptr orb); + virtual Messenger_ptr create_proxy ( + Messenger_ptr proxy); + private: + Logger_var logger_; +}; + + +class Smart_Messenger_Proxy : public TAO_Messenger_Smart_Proxy_Base +{ + public: + Smart_Messenger_Proxy(Messenger_ptr proxy, Logger_ptr logger); + virtual CORBA::Boolean send_message( + const char * user_name, + const char * subject, + char *& message) + throw (CORBA::SystemException); + private: + Logger_var logger_; +}; + diff --git a/TAO/DevGuideExamples/SmartProxies/run_test.pl b/TAO/DevGuideExamples/SmartProxies/run_test.pl new file mode 100644 index 00000000000..b8c8805859c --- /dev/null +++ b/TAO/DevGuideExamples/SmartProxies/run_test.pl @@ -0,0 +1,52 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + + +$M_ior = "Messenger.ior"; +$L_ior = "Logger.ior"; + +unlink $M_ior; +unlink $L_ior; + +# start MessengerServer +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); +if (PerlACE::waitforfile_timed ($M_ior, 5) == -1) { + print STDERR "ERROR: cannot find file $M_ior\n"; + $S->Kill(); + exit 1; +} + +# start LoggerServer +$L = new PerlACE::Process("LoggerServer"); +$L->Spawn(); +if (PerlACE::waitforfile_timed ($L_ior, 5) == -1) { + print STDERR "ERROR: cannot find file $L_ior\n"; + $L->Kill(); + $S->Kill(); + exit 1; +} + +# start MessengerClient +$C = new PerlACE::Process("MessengerClient"); +if ($C->SpawnWaitKill(20) != 0) { + $S->Kill(); + $L->Kill(); + exit (1); +} + +# clean-up +$S->Kill(); +$L->Kill(); +unlink $M_ior; +unlink $L_ior; + +exit 0; + + + diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/README b/TAO/DevGuideExamples/ValueTypes/Bank/README new file mode 100644 index 00000000000..da6620be9ed --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/README @@ -0,0 +1,35 @@ +A simple example using valuetypes. + + +How to Run +---------- + +Start the server : +------------------ +./server + + +Start the client: +------------------ +./client + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/_pch.cpp b/TAO/DevGuideExamples/ValueTypes/Bank/_pch.cpp new file mode 100644 index 00000000000..e7b3cbd31cc --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/_pch.cpp @@ -0,0 +1 @@ +#include "_pch.h" diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/_pch.h b/TAO/DevGuideExamples/ValueTypes/Bank/_pch.h new file mode 100644 index 00000000000..1b4e8d10348 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/_pch.h @@ -0,0 +1,10 @@ +#ifndef PCH_H +#define PCH_H + +#ifdef USING_PCH +#include <tao/corba.h> +#include <tao/ORB_Core.h> +#include <tao/Stub.h> +#endif + +#endif diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/bank.idl b/TAO/DevGuideExamples/ValueTypes/Bank/bank.idl new file mode 100644 index 00000000000..272243e953a --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/bank.idl @@ -0,0 +1,13 @@ +valuetype Person { + + public string name; + public long balance; + + factory create(in string name); + + void debit(in long amt); +}; + +interface Transaction { + long update(in Person p); +}; diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/bank.mpc b/TAO/DevGuideExamples/ValueTypes/Bank/bank.mpc new file mode 100644 index 00000000000..ddd7b27acb3 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/bank.mpc @@ -0,0 +1,17 @@ +project(*_Dev_Server): taoexe, portableserver, valuetype, avoids_minimum_corba { + idlflags += -Wb,pch_include=_pch.h + Source_Files { + server.cpp + } +} + +project(*_Dev_Client): taoexe, portableserver, valuetype, avoids_minimum_corba { + after += *_Dev_Server + + Source_Files { + client.cpp + bankC.cpp + } + IDL_Files { + } +} diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/client.cpp b/TAO/DevGuideExamples/ValueTypes/Bank/client.cpp new file mode 100644 index 00000000000..38f0a7192f7 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/client.cpp @@ -0,0 +1,67 @@ +#include "_pch.h" + +#include "bankC.h" + +#include <iostream> +#include <stdexcept> + + +// Note : We use a completely different implementation +// of the Person valuetype for the client side, just to +// show that this is possible. +class Person_i + : public virtual OBV_Person + , public virtual CORBA::DefaultValueRefCountBase +{ +public: + Person_i(const char* n, CORBA::Long bal) + { + name(n); + balance(bal); + } +private: + void debit(CORBA::Long) + { + throw std::runtime_error("Not supported."); + } +}; + +const char* server_ior = "file://server.ior"; + + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + try { + + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + CORBA::Object_var obj = orb->string_to_object(server_ior); + Transaction_var trans = Transaction::_narrow(obj.in()); + if (CORBA::is_nil(trans.in())) + throw std::runtime_error("failed to find a valid Transaction IOR"); + + Person_var p = new Person_i("TAOUser", 1000); + + const char* n = p->name(); + double bal = p->balance() / 100.0; + std::cout << "Client: Sending person:" << n + << " starting_balance:$" << bal + << std::endl; + + CORBA::Long b = trans->update(p.in()); + + while (orb->work_pending()) { + orb->perform_work(); + } + + std::cout << "Client: Ending balance: " << b/100.0 << std::endl; + + orb->destroy(); + + } catch(const CORBA::Exception& e) { + std::cerr << e << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/run_test.pl b/TAO/DevGuideExamples/ValueTypes/Bank/run_test.pl new file mode 100644 index 00000000000..7a13320b164 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; +$ior = "server.ior"; +$S = new PerlACE::Process("server"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 10) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +$C = new PerlACE::Process("client"); +$C->Spawn(); + +$CRET = $C->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/ValueTypes/Bank/server.cpp b/TAO/DevGuideExamples/ValueTypes/Bank/server.cpp new file mode 100644 index 00000000000..6c0d38c657c --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Bank/server.cpp @@ -0,0 +1,101 @@ +#include "_pch.h" + +#include "bankS.h" + +#include <tao/AnyTypeCode/TypeCode.h> +#include <ace/OS_NS_stdio.h> +#include <iostream> +#include <fstream> +#include <fstream> + +const char* server_ior_file = "server.ior"; + + +class Person_i + : public virtual OBV_Person + , public virtual CORBA::DefaultValueRefCountBase +{ +public: + void debit(CORBA::Long amt) + { + CORBA::Long tmp = balance(); + tmp -= amt; + balance(tmp); + } +}; + +class PersonFactory + : public virtual Person_init +{ + Person* create(const char* name) + ACE_THROW_SPEC((CORBA::SystemException)) + { + Person_i* p = new Person_i; + p->name(name); + return p; + } + + CORBA::ValueBase * create_for_unmarshal() + { + // It doesn't matter what values we construct it with + // because they will be overwritten with the demarshaled values. + return new Person_i; + } +}; + +class Transaction_i + : public virtual POA_Transaction +{ +public: + CORBA::Long update(Person* p) + ACE_THROW_SPEC((CORBA::SystemException)) + { + ACE_DEBUG((LM_DEBUG, + "Server: Subtracting $1.50 from person:%s starting balance:$%.2f\n", + p->name(), + p->balance() / 100.0)); + p->debit(150); + return p->balance(); + } +}; + +void write_ior(const char* ior) { + std::ofstream out(server_ior_file); + out << ior; +} + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + { + CORBA::ValueFactoryBase_var factory = new PersonFactory; + CORBA::String_var id = _tc_Person->id(); + orb->register_value_factory(id.in(), factory.in()); + } + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + PortableServer::POAManager_var poaman = poa->the_POAManager(); + + Transaction_i svt; + + { + PortableServer::ObjectId_var id = poa->activate_object(&svt); + obj = poa->id_to_reference(id.in()); + CORBA::String_var ior = orb->object_to_string(obj.in()); + write_ior(ior.in()); + } + + std::cout << "Server: Running..." << std::endl; + + poaman->activate(); + + orb->run(); + + poa->destroy(1, 1); + orb->destroy(); + + return 0; +} diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.cpp b/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.cpp new file mode 100644 index 00000000000..e1953612e12 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.cpp @@ -0,0 +1,96 @@ +#include "_pch.h" +#include "Message_i.h" +#include "MessengerC.h" + +#include <tao/AnyTypeCode/TypeCode.h> + +#include <iostream> + +MessageImpl::MessageImpl() +{ +} + +MessageImpl::~MessageImpl() +{ +} + +MessageImpl::MessageImpl +(const char* address, + const char* user, + const char* subject, + const char* txt + ) +{ + addAddress(address); + user_(user); + subject_(subject); + text_(txt); +} + +Message::AddrList* MessageImpl::getAddresses() { + return new AddrList(addrs_()); +} + +void MessageImpl::addAddress(const char* s) { + AddrList& al = addrs_(); + CORBA::ULong idx = al.length(); + al.length(idx + 1); + al[idx] = s; +} + +char* MessageImpl::user() { + return CORBA::string_dup(user_()); +} +void MessageImpl::user(const char* s) { + user_(s); +} + +char* MessageImpl::subject() { + return CORBA::string_dup(subject_()); +} +void MessageImpl::subject(const char* s) { + subject_(s); +} + +char* MessageImpl::text() { + return CORBA::string_dup(text_()); +} +void MessageImpl::text(const char* s) { + text_(s); +} + +void MessageImpl::print() { + + std::cout << "Message from : " << user_() << std::endl; + + AddrList& addrs = addrs_(); + if (addrs.length() > 0) { + std::cout << "\tTo : "; + for (CORBA::ULong i = 0; i < addrs.length(); ++i) { + CORBA::String_var s = CORBA::string_dup(addrs[i]); + std::cout << s.in() << ";"; + } + std::cout << std::endl; + } + + std::cout << "\tSubject : " << subject_() << std::endl; + std::cout << "\tText : " << text_() << std::endl; +} + +//////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// + +void +MessageFactory::register_new_factory(CORBA::ORB& orb) { + CORBA::ValueFactoryBase_var mf = new MessageFactory; + CORBA::String_var id = _tc_Message->id(); + orb.register_value_factory(id.in(), mf.in()); +} + +CORBA::ValueBase* +MessageFactory::create_for_unmarshal() +{ + return new MessageImpl; +} + + diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.h b/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.h new file mode 100644 index 00000000000..4fd1206af8c --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/Message_i.h @@ -0,0 +1,47 @@ +#ifndef MESSAGE_I_H +#define MESSAGE_I_H + +#include "MessengerC.h" + +#include <tao/Valuetype/ValueFactory.h> + +class MessageImpl : public virtual OBV_Message, + public virtual CORBA::DefaultValueRefCountBase +{ +public: + MessageImpl(); + + MessageImpl( + const char* address, + const char* user, + const char* subject, + const char* txt + ); + + virtual ::Message::AddrList* getAddresses(); + virtual void addAddress(const char*); + + virtual char* user(); + virtual void user(const char*); + + virtual char* subject(); + virtual void subject(const char*); + + virtual char* text(); + virtual void text(const char*); + + virtual void print(); +protected: + virtual ~MessageImpl(); +}; + +class MessageFactory + : public virtual CORBA::ValueFactoryBase +{ +public: + static void register_new_factory(CORBA::ORB& orb); +private: + virtual CORBA::ValueBase* create_for_unmarshal(); +}; + +#endif diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger.idl b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger.idl new file mode 100644 index 00000000000..e6a63fc9278 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger.idl @@ -0,0 +1,27 @@ +// Messenger.idl +// Modified to make use of ValueTypes + +// Demonstrates how ValueTypes can let you make wrapper classes +// that make sequences easier to work with, and can simplify +// IDL interfaces by reducing the number of parameters. + +valuetype Message { + typedef sequence<string> AddrList; + + private AddrList addrs_; + private string user_; + private string subject_; + private string text_; + + AddrList getAddresses(); + void addAddress(in string address); + attribute string user; + attribute string subject; + attribute string text; + void print(); +}; + +interface Messenger { + boolean send_message(inout Message msg); +}; + diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerClient.cpp b/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerClient.cpp new file mode 100644 index 00000000000..9b2838b5d64 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerClient.cpp @@ -0,0 +1,46 @@ +#include "_pch.h" +#include "Message_i.h" +#include <iostream> + +const char* server_ior = "file://server.ior"; + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + try { + + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + // Normally we wouldn't have to register the factory in the client, but + // in this case the valuetype will be returned as an inout parameter, and + // we'll need the factory to support this. + MessageFactory::register_new_factory(* orb.in()); + + CORBA::Object_var obj = orb->string_to_object(server_ior); + Messenger_var tst = Messenger::_narrow(obj.in()); + ACE_ASSERT(! CORBA::is_nil(tst.in())); + + Message_var msg = new MessageImpl("Son", "Mom", "Dinner's Ready.", "Hurry home."); + + if (tst->send_message(msg)) { + + std::cout << "Message sent successfully.\n"; + msg->print(); + std::cout << std::endl; + + } else { + std::cout << "Message refused." << std::endl; + } + + while (orb->work_pending()) { + orb->perform_work(); + } + + orb->destroy(); + + } catch(const CORBA::Exception& e) { + std::cerr << e << std::endl; + return 1; + } + + return 0; +} diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerServer.cpp b/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerServer.cpp new file mode 100644 index 00000000000..e7d35db3cbc --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/MessengerServer.cpp @@ -0,0 +1,46 @@ +#include "_pch.h" + +#include "Messenger_i.h" +#include "Message_i.h" + +#include <iostream> +#include <fstream> +#include <fstream> + +const char* server_ior_file = "server.ior"; + + +void write_ior(const char* ior) { + std::ofstream out(server_ior_file); + out << ior; +} + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + MessageFactory::register_new_factory(* orb.in()); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + + PortableServer::POAManager_var poaman = poa->the_POAManager(); + + Messenger_i svt; + + PortableServer::ObjectId_var id = poa->activate_object(&svt); + obj = poa->id_to_reference(id.in()); + CORBA::String_var ior = orb->object_to_string(obj.in()); + write_ior(ior.in()); + + std::cout << "Starting server." << std::endl; + + poaman->activate(); + + orb->run(); + + poa->destroy(1, 1); + orb->destroy(); + + return 0; +} diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.cpp b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.cpp new file mode 100644 index 00000000000..fa401a63c98 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.cpp @@ -0,0 +1,25 @@ +#include "_pch.h" + +#include "Messenger_i.h" + +#include <sstream> + + +CORBA::Boolean Messenger_i::send_message (Message*& msg) + throw (CORBA::SystemException) +{ + msg->print(); + + msg->user("Son"); + msg->addAddress("Mom"); + msg->addAddress("Dad"); + + std::ostringstream out; + CORBA::String_var sub = msg->subject(); + out << "RE: " << sub.in(); + msg->subject(out.str().c_str()); + msg->text("Ok. I'm on my way."); + + return 1; +} + diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.h b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.h new file mode 100644 index 00000000000..3e94ca527ce --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/Messenger_i.h @@ -0,0 +1,13 @@ +#ifndef MESSENGER_I_H_ +#define MESSENGER_I_H_ + +#include "MessengerS.h" + +class Messenger_i : public virtual POA_Messenger +{ +public: + virtual CORBA::Boolean send_message(Message*& msg) + throw (CORBA::SystemException); +}; + +#endif diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/README b/TAO/DevGuideExamples/ValueTypes/Messenger/README new file mode 100644 index 00000000000..77221f1a9b0 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/README @@ -0,0 +1,44 @@ +This directory contains a CORBA example illustrating a simple client and +a server with a Interface Messenger. The Messenger Interface has +an operation for sending a message (send_message). The MessengerClient +will send a message which is displayed by the MessengerServer when +received. The MessengerClient will then confirm that the message has +been sent successfully. + +This version of the example has been modified to use a new ValueType called +Message that encapsulates the message information. The send method on +Messenger has been modified to take a single Message inout parameter. + + +How to Run +---------- + +Start the server : +------------------ +./server + + +Start the client: +------------------ +./client + + + +Exeuction via Perl Script +------------------------- + +A Perl script has been created to automate the steps shown +above. This script can be run via the following command: + +./run_test.pl + + +NOTE: + + If you run on Windows platform, go to Debug or Release directory to run the + script via following command: + + perl ../run_test.pl + + + diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/ValueTypes.mpc b/TAO/DevGuideExamples/ValueTypes/Messenger/ValueTypes.mpc new file mode 100644 index 00000000000..4a4afb027d0 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/ValueTypes.mpc @@ -0,0 +1,20 @@ +project(*Server): taoexe, portableserver, valuetype, avoids_minimum_corba { + idlflags += -Wb,pch_include=_pch.h + Source_Files { + Messenger_i.cpp + Message_i.cpp + MessengerServer.cpp + } +} + +project(*Client): taoexe, valuetype, avoids_minimum_corba { + after += ValueTypes_Server + + Source_Files { + Message_i.cpp + MessengerC.cpp + MessengerClient.cpp + } + IDL_Files { + } +} diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.cpp b/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.cpp new file mode 100644 index 00000000000..e7b3cbd31cc --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.cpp @@ -0,0 +1 @@ +#include "_pch.h" diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.h b/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.h new file mode 100644 index 00000000000..1b4e8d10348 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/_pch.h @@ -0,0 +1,10 @@ +#ifndef PCH_H +#define PCH_H + +#ifdef USING_PCH +#include <tao/corba.h> +#include <tao/ORB_Core.h> +#include <tao/Stub.h> +#endif + +#endif diff --git a/TAO/DevGuideExamples/ValueTypes/Messenger/run_test.pl b/TAO/DevGuideExamples/ValueTypes/Messenger/run_test.pl new file mode 100644 index 00000000000..c2a973cf1a8 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Messenger/run_test.pl @@ -0,0 +1,37 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +use Env (ACE_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; +$ior = "server.ior"; +$S = new PerlACE::Process("MessengerServer"); +$S->Spawn(); + +if (PerlACE::waitforfile_timed ($ior, 10) == -1) { + print STDERR "ERROR: cannot find file <$ior>\n"; + $S->Kill(); + unlink $ior; + exit 1; +} + +$C = new PerlACE::Process("MessengerClient"); +$C->Spawn(); + +$CRET = $C->WaitKill(15); +$S->Kill(); + +# clean-up + +unlink $ior; + +if ($CRET != 0) { + print STDERR "ERROR: Client returned <$CRET>\n"; + exit 1 ; +} + +exit 0; + + + diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/Event.idl b/TAO/DevGuideExamples/ValueTypes/Notify/Event.idl new file mode 100644 index 00000000000..0d2c0122876 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/Event.idl @@ -0,0 +1,14 @@ + +#include <tao/LongSeq.pidl> + +valuetype MyEvent +{ + public string name; + public long kind; + private CORBA::LongSeq payload; + + void dump(); + long size(); + void add_long(in long n); +}; + diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/Event_i.h b/TAO/DevGuideExamples/ValueTypes/Notify/Event_i.h new file mode 100644 index 00000000000..1822b8381ab --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/Event_i.h @@ -0,0 +1,64 @@ +#ifndef EVENT_H_ +#define EVENT_H_ + +#include "EventS.h" + +#include <iostream> +#include <tao/Valuetype/ValueFactory.h> + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +class MyEvent_i + : public virtual OBV_MyEvent + , public virtual CORBA::DefaultValueRefCountBase +{ +public: + MyEvent_i(const char* n, CORBA::Long k) + { + name(n); + kind(k); + } + + virtual void dump () + { + CORBA::LongSeq& pl = payload(); + ACE_DEBUG((LM_DEBUG, "\nPayload contents.\n")); + for (CORBA::ULong i = 0; i < pl.length(); ++i) + { + ACE_DEBUG((LM_DEBUG, "%d = %d\n", i, pl[i])); + } + ACE_DEBUG((LM_DEBUG, "\n")); + } + + virtual CORBA::Long size () + { + return payload().length(); + } + + virtual void add_long (CORBA::Long n) + { + CORBA::LongSeq& pl = payload(); + CORBA::ULong idx = pl.length(); + pl.length(idx + 1); + pl[idx] = n; + } +}; + +class MyEventFactory + : public virtual CORBA::ValueFactoryBase +{ +public: + + virtual CORBA::ValueBase * create_for_unmarshal () + { + // It doesn't matter what values we construct it with + // because they will be overwritten with the demarshaled values. + return new MyEvent_i("", -1); + } +}; + + +#endif /* EVENT_H_ */ + diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/Notify.mpc b/TAO/DevGuideExamples/ValueTypes/Notify/Notify.mpc new file mode 100644 index 00000000000..329f3d5f8bb --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/Notify.mpc @@ -0,0 +1,20 @@ +project(*supplier) : taoexe, portableserver, valuetype, notify, portableserver, event_skel { + exename = supplier + source_files { + supplier.cpp + } + header_files { + Event_i.h + } +} + +project(*consumer) : taoexe, portableserver, valuetype, notify, portableserver, event_skel { + exename = consumer + source_files { + consumer.cpp + } + header_files { + Event_i.h + } +} + diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/consumer.cpp b/TAO/DevGuideExamples/ValueTypes/Notify/consumer.cpp new file mode 100644 index 00000000000..ec8b66df1e9 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/consumer.cpp @@ -0,0 +1,177 @@ +// This supplier requires that the Notify_Service is started with +// -IOROutput notify.ior -channel -nonamesvc +// at minimum. +const char* notify_ior = "corbaloc::localhost:8888/NotifyEventChannelFactory"; + +#include "Event_i.h" + +#include <orbsvcs/CosEventCommS.h> + +#include <orbsvcs/CosNotifyChannelAdminC.h> + +#include <tao/corba.h> +#include <tao/ORB_Core.h> + +#include <iostream> +#include <stdexcept> + +const char* ec_ior_output_file = "ec.ior"; + +class TestConsumer : public POA_CosEventComm::PushConsumer +{ + int num_events_; + + CosEventChannelAdmin::ConsumerAdmin_var admin_; + CosEventChannelAdmin::ProxyPushSupplier_var supplier_; + PortableServer::ObjectId_var id_; + int event_count_; + bool connected_; + PortableServer::POA_ptr poa_; + CORBA::ORB_ptr orb_; +public: + + TestConsumer(int evts, + CosNotifyChannelAdmin::EventChannelFactory_ptr ecf, + PortableServer::POA_ptr poa, + CORBA::ORB_ptr orb) + : num_events_(evts) + , event_count_(0) + , connected_(false) + , poa_(poa) + , orb_(orb) + { + if (CORBA::is_nil(ecf)) + throw std::invalid_argument("TestConsumer::CTOR: is_nil(ecf)"); + + CosNotifyChannelAdmin::ChannelID id; + CosNotification::QoSProperties initial_qos; + CosNotification::AdminProperties initial_admin; + + CosEventChannelAdmin::EventChannel_var ec + = ecf->create_channel (initial_qos, + initial_admin, + id); + + CORBA::String_var ior = orb_->object_to_string (ec.in()); + + // If the ec_ior_output_file exists, output the ior to it + if (ec_ior_output_file != 0) + { + FILE *output_file= ACE_OS::fopen (ec_ior_output_file, ACE_TEXT("w")); + if (output_file == 0) + throw std::invalid_argument("Cannot open channel ior output file"); + + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + } + + ACE_DEBUG((LM_DEBUG, "TestConsumer: write channel ior to file %s\n", ec_ior_output_file)); + + admin_ = ec->for_consumers(); + CORBA::Object_var obj = admin_->obtain_push_supplier(); + supplier_ = CosEventChannelAdmin::ProxyPushSupplier::_unchecked_narrow(obj.in()); + + id_ = poa->activate_object(this); + obj = poa->id_to_reference(id_.in()); + CosEventComm::PushConsumer_var consumer = CosEventComm::PushConsumer::_narrow(obj.in()); + + supplier_->connect_push_consumer(consumer.in()); + connected_ = true; + } + + virtual ~TestConsumer() { + } + + virtual void disconnect_push_consumer() + throw (CORBA::SystemException) + { + std::cout << "disconnect_push_consumer()." << std::endl; + } + + virtual void push(const CORBA::Any& a) + throw (CORBA::SystemException, CosEventComm::Disconnected) + { + MyEvent* vt; + a >>= vt; + + std::cout << std::endl + << "Received MyEvent name=" << vt->name() + << ", kind=" << vt->kind() + << ", size=" << vt->size() + << std::endl; + + vt->dump(); + + if ( ++ event_count_ >= num_events_ && num_events_ > 0) { + std::cout << "Consumer disconnecting after receiving " + << event_count_ << " events." << std::endl; + disconnect(); + } + } + + void disconnect() { + try { + if (connected_) { + connected_ = false; + poa_->deactivate_object(id_.in()); + supplier_->disconnect_push_supplier(); + orb_->shutdown(0); + std::cout << "Consumer disconnected." << std::endl; + } + } catch(const CORBA::Exception& e) { + std::cerr << "TestConsumer::disconnect() exception: " << e << std::endl; + } + } + + void disconnect_self() { + } + +}; + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + int num_events = 0; + + try { + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + CORBA::ValueFactoryBase_var factory = new MyEventFactory; + CORBA::String_var id = _tc_MyEvent->id(); + orb->register_value_factory(id.in(), factory.in()); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = + PortableServer::POA::_unchecked_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + + obj = orb->string_to_object(notify_ior); + CosNotifyChannelAdmin::EventChannelFactory_var ecf + = CosNotifyChannelAdmin::EventChannelFactory::_unchecked_narrow(obj.in()); + + if (ac > 1) { + num_events = ACE_OS::atoi(av[1]); + } + + mgr->activate(); + + { + TestConsumer consumer(num_events, ecf.in(), poa.in(), orb.in()); + ACE_Time_Value tvMaxRunTime(300); + orb->run(tvMaxRunTime); + } + + poa->destroy(1, 1); + orb->destroy(); + + return 0; + + } catch(const CORBA::Exception& e) { + std::cerr << "Consumer: main() exception: " << e << std::endl; + } catch(const std::invalid_argument& e) { + std::cerr << "Consumer: main() exception: " << e.what () << std::endl; + } catch(...) { + std::cerr << "Consumer: main() unknown exception: " << std::endl; + } + + return 1; +} diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/notify.conf b/TAO/DevGuideExamples/ValueTypes/Notify/notify.conf new file mode 100644 index 00000000000..3d7c070a962 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/notify.conf @@ -0,0 +1,2 @@ +static Notify_Default_Event_Manager_Objects_Factory "-DispatchingThreads 1 -SourceThreads 0 " + diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/readme.txt b/TAO/DevGuideExamples/ValueTypes/Notify/readme.txt new file mode 100644 index 00000000000..3a138e3a373 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/readme.txt @@ -0,0 +1,2 @@ +This test uses valuetypes within simple CosEC::Any events passed through the +notification service. diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/run_test.pl b/TAO/DevGuideExamples/ValueTypes/Notify/run_test.pl new file mode 100644 index 00000000000..daab0c80126 --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/run_test.pl @@ -0,0 +1,79 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- +use Env(ACE_ROOT); +use Env (TAO_ROOT); +use lib "$ACE_ROOT/bin"; +use PerlACE::Run_Test; + +my $ec_ior = PerlACE::LocalFile ("ec.ior"); +my $notifyior = PerlACE::LocalFile ("notify.ior"); +my $notify_conf = PerlACE::LocalFile ("notify$PerlACE::svcconf_ext"); + +my $TS = new PerlACE::Process ("$TAO_ROOT/orbsvcs/Notify_Service/Notify_Service", + "-boot -orbendpoint iiop://:8888 -NoNameSvc -IORoutput $notifyior -ORBSvcConf " . + "$notify_conf"); +my $SUP = new PerlACE::Process ("supplier"); +my $CONS = new PerlACE::Process ("consumer"); + +unlink $ec_ior; +unlink $notifyior; + +$TS->Spawn (); + +if (PerlACE::waitforfile_timed ($notifyior, 20) == -1) { + $TS->Kill (); + exit 1; +} + +print "****** Running consumer ******\n"; + +## The consumer takes one argument indicating +## how many events to receive before disconnecting. + +$CONS->Arguments("5"); +my $client = $CONS->Spawn(); +if ($client != 0) { + $TS->Kill (); + exit 1; +} + +## The supplier needs wait after the consumer creates the event channel. +if (PerlACE::waitforfile_timed ($ec_ior, 20) == -1) { + $TS->Kill (); + $client->Kill (); + exit 1; +} + +## The supplier takes two arguments. +## The first indicates how many events to push. +## The second indicates the payload size. (The payload is sequence<int>) + +print "****** Running supplier ******\n"; + +$SUP->Arguments("10 5"); +my $server = $SUP->Spawn(); +if ($server != 0) { + $TS->Kill(); + $CONS->Kill(); + exit 1; +} + +$CONS->WaitKill(30); + + +$server = $SUP->WaitKill(30); +if ($server != 0) { + $TS->Kill(); + $CONS->Kill(); + exit 1; +} + +$TS->Kill (); + +unlink $ec_ior; +unlink $notifyior; +exit 0; diff --git a/TAO/DevGuideExamples/ValueTypes/Notify/supplier.cpp b/TAO/DevGuideExamples/ValueTypes/Notify/supplier.cpp new file mode 100644 index 00000000000..cafeb451c2c --- /dev/null +++ b/TAO/DevGuideExamples/ValueTypes/Notify/supplier.cpp @@ -0,0 +1,214 @@ +// This supplier requires that the Notify_Service is started with +// -IOROutput notify.ior -channel -nonamesvc +// at minimum. +const char* notify_ior = "corbaloc::localhost:8888/NotifyEventChannelFactory"; + +#include "Event_i.h" + +#include <orbsvcs/CosEventCommS.h> + +#include <orbsvcs/CosNotifyChannelAdminC.h> + +#include <tao/corba.h> +#include <tao/ORB_Core.h> + +#include <ace/Reactor.h> +#include <ace/Event_Handler.h> +#include <iostream> +#include <stdexcept> + +const ACE_Time_Value EVENT_DELAY(0, 10 * 1000); + +static MyEvent_var event_; + +const char* ec_ior = "file://ec.ior"; + +class TestSupplier +: public POA_CosEventComm::PushSupplier +, public ACE_Event_Handler +{ + int num_events_; + + CosEventChannelAdmin::SupplierAdmin_var admin_; + CosEventChannelAdmin::ProxyPushConsumer_var consumer_; + PortableServer::ObjectId_var id_; + int event_count_; + bool connected_; + ACE_Reactor* reactor_; + PortableServer::POA_ptr poa_; + CORBA::ORB_ptr orb_; + +public: + + TestSupplier(int evts, CosNotifyChannelAdmin::EventChannelFactory_ptr ecf, + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa) + : num_events_(evts) + , event_count_(0) + , connected_(false) + , reactor_(orb->orb_core()->reactor()) + , poa_(poa) + , orb_(orb) + { + if (reactor_ == 0 || CORBA::is_nil (ecf)) + throw std::invalid_argument("TestSupplier::CTOR: reactor == 0 || CORBA::is_nil(ecf)"); + + CORBA::Object_var obj = + this->orb_->string_to_object (ec_ior); + + ACE_DEBUG((LM_DEBUG, "TestSupplier: string_to_object from %s\n", ec_ior)); + + CosNotifyChannelAdmin::EventChannel_var ec + = CosNotifyChannelAdmin::EventChannel::_unchecked_narrow (obj.in ()); + + admin_ = ec->for_suppliers(); + obj = admin_->obtain_push_consumer(); + consumer_ = CosEventChannelAdmin::ProxyPushConsumer::_unchecked_narrow(obj.in()); + id_ = poa->activate_object(this); + obj = poa->id_to_reference(id_.in()); + CosEventComm::PushSupplier_var supplier = + CosEventComm::PushSupplier::_unchecked_narrow(obj.in()); + + consumer_->connect_push_supplier(supplier.in()); + connected_ = true; + + schedule_next_event(ACE_Time_Value(0, 10 * 1000)); + + std::cout << "Supplier initialized." << std::endl; + } + + virtual ~TestSupplier() { + std::cout << "~TestSupplier()" << std::endl; + } + + void schedule_next_event(const ACE_Time_Value& tv) { + reactor_->schedule_timer(this, 0, tv, ACE_Time_Value::zero); + } + + virtual void disconnect_push_supplier() throw (CORBA::SystemException) { + // this should never be called. The notify service uses this to allow its + // clients to disconnect gracefully. + std::cout << "disconnect_push_supplier()." << std::endl; + //ACE_ASSERT(false); + } + + bool push_next_event() { + try { + if (! connected_) { + std::cout << "Trying to push when disconnected." << std::endl; + return false; + } + std::cout << "+" << std::flush; + + ++event_count_; + + CORBA::Any a; + a <<= event_; + consumer_->push(a); + + if (event_count_ >= num_events_ && num_events_ > 0) { + std::cout << "Supplier stopping after sending " + << event_count_ << " events." << std::endl; + disconnect(); + } else { + schedule_next_event(EVENT_DELAY); + } + return true; + } catch(const CORBA::Exception& e) { + std::cerr << "TestSupplier::push_next_event() exception: " << e << std::endl; + } + return false; + } + + void disconnect() { + try { + std::cout << "Supplier Disconnecting..." << std::endl; + consumer_->disconnect_push_consumer(); + disconnect_self(); + orb_->shutdown(0); + std::cout << "Supplier Disconnected." << std::endl; + } catch(const CORBA::Exception& e) { + std::cerr << "TestSupplier::disconnect() exception: " << e << std::endl; + } + } + + void disconnect_self() { + if (! connected_) + return; + connected_ = false; + reactor_->cancel_timer(this); + poa_->deactivate_object(id_.in()); + } + + virtual int handle_timeout (const ACE_Time_Value&, const void*) { + if (! push_next_event()) { + return -1; + } + return 0; + } +}; + +int ACE_TMAIN (int ac, ACE_TCHAR* av[]) { + + int num_events = 0; + int pay_size = 1; + + try { + + CORBA::ORB_var orb = CORBA::ORB_init(ac, av); + + CORBA::ValueFactoryBase_var vfb = new MyEventFactory; + CORBA::String_var id = _tc_MyEvent->id(); + orb->register_value_factory(id.in(), vfb); + + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in()); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + + obj = orb->string_to_object(notify_ior); + CosNotifyChannelAdmin::EventChannelFactory_var ecf + = CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in()); + if (CORBA::is_nil(ecf.in())) + throw std::runtime_error("no event channel factory"); + + if (ac > 1) { + num_events = ACE_OS::atoi(av[1]); + } + if (ac > 2) { + pay_size = ACE_OS::atoi(av[1]); + } + + event_ = new MyEvent_i("TestName", 42); + + for (int i = 0; i < pay_size; ++i) { + event_->add_long((i + 1) * 42); + } + + // Activate the manager in case the notify service wants to call us + // back when we register. + mgr->activate(); + + { + TestSupplier supplier(num_events, ecf.in(), orb.in(), poa.in()); + orb->run(); + } + + event_ = 0; + + poa->destroy(1, 1); + orb->destroy(); + + return 0; + + } catch(CORBA::Exception& e) { + std::cerr << "Supplier: main() exception: " << e << std::endl; + } catch(std::invalid_argument& e) { + std::cerr << "Supplier: main() exception: " << e.what () << std::endl; + } catch(std::runtime_error& e) { + std::cerr << "Supplier: main() exception: " << e.what () << std::endl; + } catch(...) { + std::cerr << "Supplier: main() unknown exception: " << std::endl; + } + return 1; +} diff --git a/TAO/DevGuideExamples/devguide_examples.lst b/TAO/DevGuideExamples/devguide_examples.lst new file mode 100644 index 00000000000..3611b201a57 --- /dev/null +++ b/TAO/DevGuideExamples/devguide_examples.lst @@ -0,0 +1,47 @@ +TAO/DevGuideExamples/BiDirectionalGIOP/run_test.pl: !MINIMUM !CORBA_E_MICRO +TAO/DevGuideExamples/EventServices/OMG_Basic/run_test.pl: !MINIMUM +TAO/DevGuideExamples/EventServices/OMG_SupplierSideEC/run_test.pl: !MINIMUM !NO_MESSAGING +TAO/DevGuideExamples/EventServices/OMG_TypedEC/run_test.pl: !MINIMUM +TAO/DevGuideExamples/EventServices/RTEC_Basic/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/EventServices/RTEC_Federated/run_test.pl: !ST !NO_MESSAGING +TAO/DevGuideExamples/EventServices/RTEC_Filter/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/EventServices/RTEC_MCast_Federated/run_test.pl: !NO_MCAST !NO_MESSAGING +TAO/DevGuideExamples/GettingStarted/run_test.pl: +TAO/DevGuideExamples/ImplRepo/run_test.pl: !MINIMUM !STATIC !CORBA_E_MICRO +TAO/DevGuideExamples/InterfaceRepo/run_test.pl: !MINIMUM !NO_IFR +TAO/DevGuideExamples/LocalObjects/Messenger/run_test.pl: +TAO/DevGuideExamples/LocalObjects/ServantLocator/run_test.pl: !MINIMUM +TAO/DevGuideExamples/Messaging/AMIcallback/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/Messaging/RelativeRoundtripTimeout/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/NamingService/Messenger/run_test.pl: +TAO/DevGuideExamples/NamingService/Naming_Client/run_test.pl: +TAO/DevGuideExamples/NamingService/Naming_Context_Ext/run_test.pl: +TAO/DevGuideExamples/NamingService/Naming_Server/run_test.pl: !ST !NO_MCAST !NO_MESSAGING +TAO/DevGuideExamples/NamingService/corbaloc_Messenger/run_test.pl: +TAO/DevGuideExamples/NamingService/corbaname_Messenger/run_test.pl: +TAO/DevGuideExamples/NotifyService/EventSequence/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/NotifyService/Filtering/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/NotifyService/Messenger/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/NotifyService/OfferSubscriptions/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/NotifyService/QoSProperties/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/NotifyService/SupplierSideNC/run_test.pl: !MINIMUM +TAO/DevGuideExamples/NotifyService/RTNotify/run_test.pl: !ST !MINIMUM !STATIC +TAO/DevGuideExamples/PortableInterceptors/Auth/run_test.pl: !MINIMUM !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/PortableInterceptors/IOR/run_test.pl: !MINIMUM !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/PortableInterceptors/PICurrent/run_test.pl: !MINIMUM !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/PortableInterceptors/PICurrent_NameService/run_test.pl: !MINIMUM !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/PortableInterceptors/SimpleCodec/run_test.pl: !MINIMUM !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/RTCORBA/run_test.pl: !MINIMUM !CORBA_E_COMPACT !CORBA_E_MICRO !ST !STATIC +TAO/DevGuideExamples/Security/ParticipatingApp/run_test.pl: SSL !STATIC !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/Security/PolicyControllingApp/run_test.pl: SSL !STATIC !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/Security/SecurityUnawareApp/run_test.pl: SSL !STATIC !DISABLE_INTERCEPTORS +TAO/DevGuideExamples/SmartProxies/run_test.pl: !NO_SMARTPROXIES !NO_MESSAGING +TAO/DevGuideExamples/Multithreading/Reactive/run_test.pl: !STATIC !MINIMUM +TAO/DevGuideExamples/Multithreading/ThreadPerConnection/run_test.pl: !ST +TAO/DevGuideExamples/Multithreading/ThreadPool/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/ValueTypes/Messenger/run_test.pl: !MINIMUM +TAO/DevGuideExamples/ValueTypes/Notify/run_test.pl: !ST !MINIMUM +TAO/DevGuideExamples/ValueTypes/Bank/run_test.pl: !MINIMUM +TAO/DevGuideExamples/AMH/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/AMH_AMI/run_test.pl: !NO_MESSAGING +TAO/DevGuideExamples/CIAO/Messenger/descriptors/run_test.pl: CIAO diff --git a/TAO/DevGuideExamples/readme.txt b/TAO/DevGuideExamples/readme.txt new file mode 100644 index 00000000000..9f6e9699e07 --- /dev/null +++ b/TAO/DevGuideExamples/readme.txt @@ -0,0 +1,34 @@ +"These examples were developed by and are included in this +distribution with the permission of Object Computing, Inc. (OCI) +for the purpose of illustrating the usage of certain features of +The ACE ORB (TAO) as described in OCI's TAO Developer's Guide. +They are provided as is with no warranty, expressed or implied. +Though the examples are believed to illustrate correct usage of +TAO, OCI does not actively maintain them in this distribution and +does not guarantee their accuracy or their suitability for any +particular use. OCI does provide additional distributions of TAO +and provides commercial support for TAO. Visit +http://www.theaceorb.com or contact sales@ociweb.com for more +information on OCI's business model with respect to TAO." + +--MPC-- + +Generate GNU Makefiles + +$ACE_ROOT/bin/mwc.pl -type gnuace DevGuideExamples.mwc + +Generate Visual C++ 7.1 Workspace and Projects +%ACE_ROOT%\bin\mwc.pl -type vc71 DevGuideExamples.mwc + +Generate Visual C++ 8 Workspace and Projects +%ACE_ROOT%\bin\mwc.pl -type vc8 DevGuideExamples.mwc + + +--Windows-- +* To run the release version of a test specify the following: + run_test.pl -ExeSubDir Release +* The BiDirectionalGIOP projects can be referenced as an example of how to use + Automatic Precompiled Headers +* The GettingStarted projects can be referenced as an example of how to use + Manual Precompiled Headers + |