#include <CORBA.h>
#include <mico/CosNaming.h>
#include "../header/IPBook_impl.h"
#include <fstream>
#include <pthread.h>
#include <string>
#include <unistd.h>


using namespace std;

pthread_mutex_t mmutex;

void* exe3(void* arguments){
  pthread_mutex_lock(&mmutex);


  int* tid =(int*)arguments;
 	
	int rc = 0;
	int argc;
	char** argv;
	try{
	  argc = 3;
	  argv= new char*[3];
	  argv[0] = "cabsrv_ca";
	  argv[1] = "-ORBNamingAddr";
	  argv[2] = "inet:railsite_104:12010";

	  CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
	  CORBA::Object_var poaobj = orb->resolve_initial_references("RootPOA");
	  PortableServer::POA_var poa = PortableServer::POA::_narrow( poaobj);
	  PortableServer::POAManager_var mgr = poa->the_POAManager();
	  
	  //PortableServer::POA_ptr npoa;
	  /*
	  if(*tid == 2){
	    CORBA::PolicyList policies(1);
	    policies.length(1);
	    policies[0] = poa->create_thread_policy(PortableServer::ORB_CTRL_MODEL);
	    npoa = poa->create_POA("AddrBook2",mgr,policies);
	  }
	  */  
	  IPBook_impl *impl = new IPBook_impl;
	  PortableServer::ObjectId_var oid;
	  CORBA::Object_var ref;
	  //	  if(*tid == 1){
	    oid = poa->activate_object(impl);
	    ref = poa->id_to_reference(oid.in());
	    //	  }else{
	    //oid = npoa->activate_object(impl);
	    //ref = npoa->id_to_reference(oid.in());
	    //}
	  CORBA::Object_var nsobj = orb->resolve_initial_references("NameService");
	  
	  CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow(nsobj);
	  if(CORBA::is_nil(nc)){
	    cerr<<"oops, cant connect the name service\n";
	    exit(1);
	  }
	  
	  CosNaming::Name name;
	  name.length(1);
	  if(*tid == 1){
	  	name[0].id = CORBA::string_dup("AddrBook1");
	  }else{
	  	name[0].id = CORBA::string_dup("AddrBook2");
	  }
	  name[0].kind = CORBA::string_dup("");
	 

	  nc->rebind(name,ref);
	  cout<<"Binding in nameserver\n";

	  mgr->activate();
	
	  pthread_mutex_unlock(&mmutex);

	  orb->run();
	  poa->destroy(TRUE,TRUE);
	  delete impl;
	 
	}
	catch(CORBA::SystemException_catch& ex){
	  ex->_print(cerr);
	  cerr << endl;
	  rc = -1;
	}
	catch(CORBA::ORB::InvalidName_catch& ex){
	  ex->_print(cerr);
	  cerr << endl;
	  cerr << "possible cause: can't locate Naming Service\n";
	  rc = 1;
	}
	return NULL;
}

int main(){
	
  pthread_mutex_init(&mmutex,NULL);
  pthread_t t1,t2;
	
  int thread1 = 1;
  int thread2 = 2;
	
  int error = pthread_create(&t1,NULL,exe3,&thread1);
  error = pthread_create(&t2,NULL,exe3,&thread2);
  
  pause();	
	
	
  return 0;	
}
