summaryrefslogtreecommitdiff
path: root/TAO/DevGuideExamples/SmartProxies
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/DevGuideExamples/SmartProxies')
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Logger.idl6
-rw-r--r--TAO/DevGuideExamples/SmartProxies/LoggerServer.cpp45
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Logger_i.cpp25
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Logger_i.h25
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Messenger.idl9
-rw-r--r--TAO/DevGuideExamples/SmartProxies/MessengerClient.cpp50
-rw-r--r--TAO/DevGuideExamples/SmartProxies/MessengerServer.cpp44
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Messenger_i.cpp34
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Messenger_i.h37
-rw-r--r--TAO/DevGuideExamples/SmartProxies/README25
-rw-r--r--TAO/DevGuideExamples/SmartProxies/SmartProxies.mpc42
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.cpp58
-rw-r--r--TAO/DevGuideExamples/SmartProxies/Smart_Messenger_Proxy.h30
-rw-r--r--TAO/DevGuideExamples/SmartProxies/run_test.pl52
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;
+
+
+