/**
   dPhaseClientUtils.cc
   Victor Kress, Seattle 2004
   $Id: dPhaseClientUtils.cc,v 1.6 2006/04/25 22:33:20 kress Exp $
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include "phases.hh"
#include "rock.hh"

using namespace std;

CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb,CosNaming::Name name) {
  CosNaming::NamingContext_var rootContext;
  
  try {
    // Obtain a reference to the root context of the Name service:
    CORBA::Object_var obj;
    obj = orb->resolve_initial_references("NameService");

    // Narrow the reference returned.
    rootContext = CosNaming::NamingContext::_narrow(obj);
    if( CORBA::is_nil(rootContext) ) {
      cerr << "Failed to narrow the root naming context." << endl;
      return CORBA::Object::_nil();
    }
  }
  catch(CORBA::ORB::InvalidName& ex) {
    // This should not happen!
    cerr << "Service required is invalid [does not exist]." << endl;
    return CORBA::Object::_nil();
  }

  try {
    // Resolve the name to an object reference.
    return rootContext->resolve(name);
  }
  catch(CosNaming::NamingContext::NotFound& ex) {
    // This exception is thrown if any of the components of the
    // path aren't found:
    cerr << "Context not found." << endl;
  }
  catch(CORBA::COMM_FAILURE& ex) {
    cerr << "Caught system exception COMM_FAILURE -- unable to contact the "
         << "naming service." << endl;
  }
  catch(CORBA::SystemException&) {
    cerr << "Caught a CORBA::SystemException while using the naming service."
	 << endl;
  }

  return CORBA::Object::_nil();
}

phases::PhaseFactory_var getdPhaseFactory(CORBA::ORB_ptr orb) {
  CORBA::Object_ptr obj;
  phases::PhaseFactory_var pFact;
  CosNaming::Name name;
  name.length(2);

  name[0].id   = (const char*) "phases";  // string copied
  name[0].kind = (const char*) "context"; // string copied
  name[1].id   = (const char*) "PhaseFactory";
  name[1].kind = (const char*) "object";

  obj = getObjectReference(orb,name);
  return phases::PhaseFactory::_narrow(obj);
}

phases::PhaseManager_var getdPhaseManager(CORBA::ORB_ptr orb) {
  CORBA::Object_ptr obj;
  CosNaming::Name name;
  name.length(2);

  name[0].id   = (const char*) "phases";  // string copied
  name[0].kind = (const char*) "context"; // string copied
  name[1].id   = (const char*) "PhaseManager";
  name[1].kind = (const char*) "object";

  obj = getObjectReference(orb,name);
  return phases::PhaseManager::_narrow(obj);
}

rock::RockFactory_var getdRockFactory(CORBA::ORB_ptr orb) {
  CORBA::Object_ptr obj;
  CosNaming::Name name;
  name.length(2);

  name[0].id   = (const char*) "rock";  // string copied
  name[0].kind = (const char*) "context"; // string copied
  name[1].id   = (const char*) "RockFactory";
  name[1].kind = (const char*) "object";

  obj = getObjectReference(orb,name);
  return rock::RockFactory::_narrow(obj);
}

phases::ClientData_var getClientData() {
  phases::ClientData_var cd;
  char buffer[200];
  hostent *host;

  cd->language = (const char*) "C++";

#if defined (__GNUC__) 
  cd->lang_vendor = (const char*) "Gnu";
  sprintf(buffer,"%d.%d",__GNUC__,__GNUC_MINOR__);
  cd->lang_version = (const char*) buffer;
#elif defined (__xlC__) 
  cd->lang_vendor = (const char*) "IBM XL";
  sprintf(buffer,"%o",__xlC__);
  cd->lang_version = (const char*) buffer;
#elif defined (_MSC_VER) 
  cd->lang_vendor = (const char*) "Microsoft";
  sprintf(buffer,"%d",_MSC_VER);
  cd->lang_version = (const char*) buffer;
#else
  cd->lang_vendor = (const char*) "unknown";
  cd->lang_version = (const char*) "unknown";
#endif 
 
  cd->corba_vendor = (const char*) "omniORB";
  cd->corba_version = (const char*) "4.0.6";
  cd->corba_spec = (const char*) "2.6";
  cd->os_name = "gnu-linux";
  cd->os_arch = "i386";
  cd->os_version = (const char*) "2.6.15";
  cd->user_name = (const char*) getenv("LOGNAME");
  cd->locale = (const char*) getenv("LANG");
  cd->time_zone = (const char*) getenv("TZ");
  gethostname(buffer,199);
  cd->canonical_hostname = (const char*) buffer;
  host = gethostbyname(cd->canonical_hostname);
  cd->host_address = (const char*) host->h_name;
  cd->host_name = (const char*) getenv("HOSTNAME");

  return cd;
}


  

