diff options
Diffstat (limited to 'TAO/DevGuideExamples/SmartProxies')
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Logger.idl | 6 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/LoggerServer.cpp | 45 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Logger_i.cpp | 25 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Logger_i.h | 25 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Messenger.idl | 9 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/MessengerClient.cpp | 50 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/MessengerServer.cpp | 44 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Messenger_i.cpp | 34 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Messenger_i.h | 37 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/README | 25 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/SmartProxies.mpc | 42 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.cpp | 58 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.h | 30 | ||||
-rw-r--r-- | TAO/DevGuideExamples/SmartProxies/run_test.pl | 52 |
14 files changed, 482 insertions, 0 deletions
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; + + + |