Create the source file for the sample C++ client, arith.cpp. You can find a copy of arith.cpp in the samples/tutorial/cpp-corba/client subdirectory of your EAServer installation. Here is the source for arith.cpp:
/*
** arith.cpp -- Example C++ client for the EAServer C++
** tutorial.
**
** This program connects to EAServer,
** creates an instance of the Tutorial/CPPArithmetic
** component, and invokes the multiply method.
**
** Usage:
** arith iiop://<host>:<port>
**
** Where:
**
** <host> is the host name or IP address of the server machine.
**
** <iiop-port> is the server's IIOP port (9000 in the
** default configuration).
**
*/
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <Jaguar.hpp>
#include <SessionManager.hpp>
#include <Tutorial.hpp> // Stubs for interfaces in Tutorial IDL
// module.
int main(int argc, char** argv)
{
const char *usage =
"Usage:\n\tarith iiop://<host>:<iiop-port>\n";
const char *tutorial_help =
"Verify that the"
"cpptut/CPPArithmetic component exists "
"and that it implements the "
"Tutorial::CPPArithmetic IDL interface.";
const char *component_name = "cpptut/CPPArithmetic";
try {
if (argc < 2)
{
cout << usage;
return -1;
}
char* manager_url = argv[1];
cout << "**** Creating session\n";
// Initialize the ORB
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, 0);
// Create a SessionManager::Manager instance
CORBA::Object_var obj =
orb->string_to_object(manager_url);
SessionManager::Manager_var manager =
SessionManager::Manager::_narrow(obj);
if (CORBA::is_nil(manager))
{
cout << "Error: Null SessionManager::Manager instance. Exiting. "
<< usage ;
return -1;
}
// Create an authenticated session for user Guest
// using password GuestPassword2
SessionManager::Session_var session =
manager->createSession("Guest", "GuestPassword2");
if (CORBA::is_nil(session))
{
cout << "Error: Null session. Exiting. " << usage;
return -1;
}
// Obtain a factory for component instances by
// resolving the component name
cout << "**** Creating component instance for "
<< component_name << "\n" ;
obj = session->lookup(component_name);
SessionManager::Factory_var arithFactory =
SessionManager::Factory::_narrow(obj);
if (CORBA::is_nil(arithFactory))
{
cout << "ERROR: Null component factory for component "
<< component_name
<< tutorial_help ;
return -1;
}
// Use the factory to create an instance.
Tutorial::CPPArithmetic_var arith =
Tutorial::CPPArithmetic::_narrow(arithFactory->create());
// Verify that we really have an instance.
if (CORBA::is_nil(arith)) {
cout << "ERROR: Null component instance. "
<< tutorial_help ;
return -1;
}
// Call the multiply method.
cout << "**** Multiplying ...\n\n";
CORBA::Double m1 = (CORBA::Double)3.1;
CORBA::Double m2 = (CORBA::Double)2.5;
CORBA::Double result = arith->multiply(m1, m2);
cout << (double)m1 << " * " << (double)m2
<< " = " << (double)result
<< "\n\n";
}
// Explicitly catch exceptions that can occur due to user error,
// and print a generic error message for any other CORBA system
// exception.
// Requested object (component) does not exist.
catch ( CORBA::OBJECT_NOT_EXIST cone )
{
cout << "Error: CORBA OBJECT_NOT_EXIST exception. Check the "
<< "server log file for more information. Also verify "
<< "that the " << component_name
<< " component has been created properly." << tutorial_help ;
}
// Authentication or authorization failure.
catch ( CORBA::NO_PERMISSION npe )
{
cout << "Error: CORBA:: NO_PERMISSION exception. Check whether "
<< "login authentication is enabled for your server and "
<< "whether the component has restricted access. If so "
<< "edit the source file to use a valid user name and "
<< "password.\n";
}
// Invalid object reference.
catch ( CORBA::INV_OBJREF cio )
{
cout << "Error: CORBA INV_OBJREF exception.";
}
// Communication failure. Server could be down or URL's port value
// could be wrong.
catch ( CORBA::COMM_FAILURE ccf )
{
cout << "Error: CORBA COMM_FAILURE exception. Check that the "
<< "specified host and IIOP port number are "
<< "correct and that the server is running. "
<< usage;
}
// Anything else.
catch ( CORBA::OBJ_ADAPTER )
{
cout << "Error: CORBA::OBJ_ADAPTER \n";
}
catch ( CORBA::SystemException cse )
{
cout << "Error: CORBA System Exception. Check that the server "
<< "hostname and IIOP port are specified correctly, and "
<< "check the server's error log for more information.\n"
<< usage;
}
return 0;
}