//
// Derived from the Hello example of OmniBroker 1.0
//

#include <OB/CORBA.h>
#include <OB/Util.h>
#include <OB/CosNaming.h>

#include "viciface.h"

#include <stdio.h>
#include <stdlib.h>

#ifdef HAVE_FSTREAM
#   include <fstream>
#else
#   include <fstream.h>
#endif


int main(int argc, char* argv[], char*[])
{

#if 0
    if (argc != 2)
    {
        cout << "Usage: ./client [atm-addr]" << endl;
	exit(1);
    }
#endif

    try
    {
        // Create ORB
	//
	CORBA_ORB_var orb = CORBA_ORB_init(argc, argv);
	
        CORBA_Object_var obj;
        try
        {
            obj = orb -> resolve_initial_references("NameService");
        }
        catch(const CORBA_ORB::InvalidName &ex)
        {
            cerr << argv[0] << ": can't resolve `NameService'" << endl;
            return 1;
        }
        
        if(CORBA_is_nil(obj))
        {
            cerr << argv[0] << ": `NameService' is a nil object reference"
                 << endl;
            return 1;
        }
        
        CosNaming_NamingContext_var nc = CosNaming_NamingContext::_narrow(obj);
        
        if(CORBA_is_nil(nc))
        {
            cerr << argv[0]
                 << ": `NameService' is not a NamingContext object reference";
            return 1;
        }

        CORBA_Object_var objN;

        // the naming tree is as follows:
        //
        // naming context
        // vics ----------  object
        //                  v1
        CosNaming_Name name;
        name.length(2);
        name[0].id = CORBA_string_dup("vics");
        name[0].kind = CORBA_string_dup("");
        name[1].id = CORBA_string_dup("v1");
        name[1].kind = CORBA_string_dup("");
        
        objN = nc->resolve(name);

        vic_control_var adapter = vic_control::_narrow(objN);

        assert(!CORBA_is_nil(adapter));

	// Main loop
	//
        cout << "Enter 's' for start or 'x' for stop:\n";
        char c;
        do
        {
            cout << "> ";
            cin >> c;
            if(c == 's')
                adapter->start(argv[3]);
            if(c == 'x') {
                adapter->stop();
                break;
            }
        }
        while( 1 );
    }
    catch(const CosNaming_NamingContext::NotFound& ex)
    {
        cerr << argv[0] << ": Got a `NotFound' exception (";
        switch(ex.why)
        {
            case CosNaming_NamingContext::missing_node:
                cerr << "missing node";
                break;
                
            case CosNaming_NamingContext::not_context:
                cerr << "not context";
                break;
                
            case CosNaming_NamingContext::not_object:
                cerr << "not object";
                break;
        }
        cerr << ")" << endl;
        return 1;
    }
#ifdef __GNUG__
    catch(CORBA_COMM_FAILURE& ex)
#else
    catch(CORBA_SystemException& ex)
#endif
    {
	OBPrintException(ex);
	return 1;
    }
    catch(vic_control::error &ex)
    {
        cout << ex.reason << endl;
        return 1;
    }
    
    return 0;
}
