/* -*- Mode: C++; c-basic-offset: 4 -*- */

#include "test-cpp-stubs.h"
#include <iostream>
#include <fstream>
#include <string>
	
namespace {
    void print_un (const ::Test::UTst &un)
    {
		std::cerr << "\t_d:\t\t" << un._d () << std::endl;
		switch (un._d ())
		{
		case 0:
			std::cerr << "\tnum_value:\t" << un.num_value () << std::endl;
			break;
		case 1:
			std::cerr << "\tstr_value:\t" << un.str_value () << std::endl;
			break;
		default:
			std::cerr << "\tstruct_value:\tstring\t"
					  << un.struct_value ().str_value << std::endl;
			std::cerr << "\tstruct_value:\tnum\t"
					  << un.struct_value ().num_value << std::endl;
			break;
		}
    }
}

void test_un (Test::ITst_ptr &test_ptr)
{
	///////////////////////////////////
	// -> IN
	Test::UTst un_in;
	un_in.num_value (5);
	std::cerr << "Client::un_in" << std::endl;	
	test_ptr->un_in (un_in);

	///////////////////////////////////
	// <-> INOUT
	std::cerr << "Client::un_inout" << std::endl;
	test_ptr->un_inout (un_in);
	print_un (un_in);

	///////////////////////////////////
	// <- OUT
	Test::UTst_var un_out;
	std::cerr << "Client::un_out" << std::endl;
	test_ptr->un_out (un_out);
	print_un (un_out);
	
	///////////////////////////////////
	// <- RET
	std::cerr << "Client::un_ret" << std::endl;
	Test::UTst_var un_ret = test_ptr->un_ret ();
	print_un (un_ret);
}

int main(int argc, char *argv[])
{
	CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
	
	std::ifstream ior_stream ("test.ior");
	std::string ior;
	ior_stream >> ior;
	
	CORBA::Object_var obj = orb->string_to_object (ior);
	Test::ITst_ptr test_ptr = Test::ITst::_narrow (obj);

	test_un (test_ptr);
	
	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1