#include "corba.h"
#include "CosNaming_c.hh"
#include <fstream.h>

int main(int argc, char* const* argv) 
{
    try {

	//
	// The following is not application specific
	//

	// Initialize the ORB.
	CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

	// Get a reference to the Naming Service root_context
	CosNaming::NamingContext_var rootContext = 
	    CosNaming::NamingContext::_narrow(
                orb->resolve_initial_references("NameService"));

	//
	// Get access to object
	//

	// Locate an math object through the Naming Service
	CosNaming::Name name;
	name.length(1);
	name[0].id = (const char *) "Math";
	name[0].kind = (const char *) "";
	CORBA::Object_var obj = rootContext->resolve(name);

	//
	// Use the object
	//

	// Arguments to add and sub
	CORBA::Any x; x <<= 2.3;
	CORBA::Any y; y <<= 8.4;
	CORBA::Double z;

	// Create request object (for DII add)
	CORBA::Request_ptr add_req = obj->_request("add");
	CORBA::NVList_ptr add_args = add_req->arguments();
	add_args->add_value("double", x, CORBA::ARG_IN);
	add_args->add_value("double", y, CORBA::ARG_IN);
	CORBA::NamedValue_ptr add_res = add_req->result();
	CORBA::Any_ptr add_res_any = add_res->value();
	add_res_any->replace(CORBA::_tc_double, &add_res);

	// Add
	add_req->invoke();
	z = *(CORBA::Double *) add_res_any->value();
	cout << "2.4 + 8.4 = " << z << endl;

	// Create request object (for DII sub)
	CORBA::Request_ptr sub_req = obj->_request("sub");
	CORBA::NVList_ptr sub_args = sub_req->arguments();
	sub_args->add_value("double", x, CORBA::ARG_IN);
	sub_args->add_value("double", y, CORBA::ARG_IN);
	CORBA::NamedValue_ptr sub_res = sub_req->result();
	CORBA::Any_ptr sub_res_any = sub_res->value();
	sub_res_any->replace(CORBA::_tc_double, &sub_res);

	// Sub
	sub_req->invoke();
	z = *(CORBA::Double *) sub_res_any->value();
	cout << "2.4 - 8.4 = " << z << endl;

    } catch(const CORBA::Exception& e) {
	cerr << e << endl;
	return 1;
    }

    return 0;
}
