summaryrefslogtreecommitdiff
path: root/TAO/examples/Simple/chat/Client_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples/Simple/chat/Client_i.cpp')
-rw-r--r--TAO/examples/Simple/chat/Client_i.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/TAO/examples/Simple/chat/Client_i.cpp b/TAO/examples/Simple/chat/Client_i.cpp
new file mode 100644
index 00000000000..d84fe2d98c0
--- /dev/null
+++ b/TAO/examples/Simple/chat/Client_i.cpp
@@ -0,0 +1,237 @@
+// $Id$
+
+// ===========================================================
+//
+//
+// = LIBRARY
+// TAO/tests/Simple/chat
+//
+// = FILENAME
+// Client_i.cpp
+//
+// = DESCRIPTION
+// Implementation of the Client_i class.
+//
+// = AUTHOR
+// Pradeep Gore <pradeep@cs.wustl.edu>
+//
+// ===========================================================
+
+#include "Client_i.h"
+#include "tao/ORB.h"
+#include "tao/ORB_Core.h"
+#include "ace/Read_Buffer.h"
+#include "ace/Get_Opt.h"
+#include "ace/OS_NS_fcntl.h"
+#include "ace/OS_NS_unistd.h"
+
+Client_i::Client_i ()
+ : ior_file_name_ ("chat.ior"),
+ nickname_ ("noname")
+{
+}
+
+Client_i::~Client_i (void)
+{
+ // Make sure to cleanup the STDIN handler.
+ if (ACE_Event_Handler::remove_stdin_handler
+ (TAO_ORB_Core_instance ()->reactor (),
+ TAO_ORB_Core_instance ()->thr_mgr ()) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "%p\n",
+ "remove_stdin_handler"));
+}
+
+int
+Client_i::parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "n:f:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'n': // get the users nickname
+ this->nickname_ = get_opts.opt_arg ();
+ break;
+
+ case 'f': // get the file name to write to
+ this->ior_file_name_ = get_opts.opt_arg ();
+ break;
+
+ default: // display help for use of the serve
+ case '?': // display help for use of the server.
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s"
+ " [-n <your_nick_name>]"
+ " [-f <ior_input_file>]"
+ "\n",
+ argv [0]),
+ -1);
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\nusing nickname = %s, filename = %s\n",
+ this->nickname_,
+ this->ior_file_name_));
+ return 0;
+}
+
+int
+Client_i::init (int argc, char *argv[])
+{
+ // Check if the command line arguments are ok.
+ if (this->parse_args (argc, argv) == -1)
+ return -1;
+
+ try
+ {
+ // Retrieve the ORB.
+ this->orb_manager_.init (argc,
+ argv,
+ 0);
+
+ CORBA::ORB_var orb = this->orb_manager_.orb ();
+
+ // set the orb in the receiver_i_ object.
+ this->receiver_i_.orb (orb.in ());
+
+ // read the ior from file
+ if (this->read_ior (this->ior_file_name_) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "could not read the ior from the file: <%s>\n",
+ this->ior_file_name_),
+ -1);
+
+ CORBA::Object_var server_object =
+ orb->string_to_object (this->ior_);
+
+ if (CORBA::is_nil (server_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "invalid ior <%s>\n",
+ this->ior_),
+ -1);
+
+ this->server_ = Broadcaster::_narrow (server_object.in ());
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("client_i::init\n");
+ return -1;
+ }
+
+ // Register our <Input_Handler> to handle STDIN events, which will
+ // trigger the <handle_input> method to process these events.
+
+ if (ACE_Event_Handler::register_stdin_handler
+ (this,
+ TAO_ORB_Core_instance ()->reactor (),
+ TAO_ORB_Core_instance ()->thr_mgr ()) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n",
+ "register_stdin_handler"),
+ -1);
+ return 0;
+}
+
+int
+Client_i::run (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "\n============= Simple Chat =================\n"
+ "========== type 'quit' to exit ===========\n"));
+
+ try
+ {
+ PortableServer::POAManager_var poa_manager =
+ this->orb_manager_.poa_manager ();
+ poa_manager->activate ();
+
+ this->receiver_var_ =
+ this->receiver_i_._this ();
+
+ // Register ourselves with the server.
+ server_->add (this->receiver_var_.in (),
+ this->nickname_);
+
+ // Run the ORB.
+ this->orb_manager_.run ();
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Client_i::run ()");
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+Client_i::handle_input (ACE_HANDLE)
+{
+ char buf[BUFSIZ];
+
+ if (ACE_OS::fgets (buf, BUFSIZ, stdin) == 0)
+ return 0;
+
+ try
+ {
+ // Check if the user wants to quit.
+ if (ACE_OS::strncmp (buf,
+ QUIT_STRING,
+ ACE_OS::strlen (QUIT_STRING)) == 0)
+ {
+ // Remove ourselves from the server.
+ this->server_->remove (this->receiver_var_.in ());
+ this->receiver_i_.shutdown ();
+
+ return 0;
+ }
+
+ // Call the server function <say> to pass the string typed by
+ // the server.
+ this->server_->say (this->receiver_var_.in (),
+ buf);
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Input_Handler::init");
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+Client_i::read_ior (const char *filename)
+{
+ // Open the file for reading.
+ ACE_HANDLE f_handle = ACE_OS::open (filename, 0);
+
+ if (f_handle == ACE_INVALID_HANDLE)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open %s for writing: %p\n",
+ filename,
+ "invalid handle"),
+ -1);
+
+ ACE_Read_Buffer ior_buffer (f_handle);
+ char *data = ior_buffer.read ();
+
+ if (data == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to read ior: %p\n"),
+ -1);
+
+ this->ior_ = ACE_OS::strdup (data);
+ ior_buffer.alloc ()->free (data);
+
+ ACE_OS::close (f_handle);
+
+ if (this->ior_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "failed to read ior from file\n",
+ ""),
+ -1);
+ return 0;
+}