#include "CipresCommlib/CipresFacilitator.h" #include #include #include #include #if defined(_WIN32) || defined(_WIN64) #include #elif defined(__unix) || defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #include #include #endif using namespace std; CipresFacilitator::CipresFacilitator() : m_iorFile(NULL), m_nsRegister(true), m_nsLookup(true), m_implName(NULL) { #if (CIPRES_DEBUG) cout << "In CipresFacilitator ctor" << endl; #endif } //@@TEMPORARY! need to look into a better singleton implementation (Loki?) // or assure that clean up doesn't occur in the dtor CipresFacilitator * CipresFacilitator::getSingletonPtr() { static CipresFacilitator theFaciliTatorTot; return &theFaciliTatorTot; } CipresFacilitator::~CipresFacilitator() { // these were alloc'd with strdup. free(m_iorFile); free(m_implName); // TAO specific issue: need to use printf, not iostreams in the dtor here. Iostream stuff // doesn't show up, maybe because it's already been destroyed by the time // we get here? //printf("In CipresFacilitator dtor\n"); cleanup(); //printf("Finished CipresFacilitator dtor\n"); } CORBA::ORB_ptr CipresFacilitator::getORB() { return m_orb.in(); } void CipresFacilitator::initialize(int &argc, char **argv) { #if (CIPRES_DEBUG) cout << "CipresFacilitator - calling ORB_init" << endl; #endif m_orb = CORBA::ORB_init(argc, argv, ""); for (int i = 0; i < argc; i++) { if (strcmp(argv[i], "-CipresIOR") == 0) { if (++i < argc) { m_iorFile = strdup(argv[i]); } continue; } else if (strcmp(argv[i], "-CipresNoNsReg") == 0) { m_nsRegister= false; } else if (strcmp(argv[i], "-CipresNoNsLookup") == 0) { m_nsLookup = false; } else if (strcmp(argv[i], "-CipresNoNs") == 0) { m_nsLookup = false; m_nsRegister= false; } else if ((strcmp(argv[i], "-ns") == 0) || (strcmp(argv[i], "-CipresImpl") == 0)) { if (++i < argc) { m_implName = strdup(argv[i]); } continue; } else if (i > 0) { #if (CIPRES_DEBUG) cout << "CipresFacilitator doesn't recognize argument " << argv[i] << endl; #endif ; } } #if (CIPRES_DEBUG) cout << "CipresFacilitator - finished" << endl; #endif } void CipresFacilitator::run() { if (!CORBA::is_nil(m_orb.in())) { m_orb->run(); } else { cerr << "CipresFacilitator::run() called, but orb is not initialized" << endl; } } void CipresFacilitator::cleanup() { try { if (!CORBA::is_nil(m_orb.in())) { //printf("CipresFacilitator::cleanup - calling ORB shutdown\n"); m_orb->shutdown(0); //printf("CipresFacilitator::cleanup - back from ORB shutdown\n"); } } // TAO throws BAD_INV_ORDER if orb->shutdown is called multiple times. catch (CORBA::SystemException & /*se*/) { //printf("CipresFacilitator::cleanup - caught system exception %s\n", se._rep_id()); } } void CipresFacilitator::publishIOR(CORBA::Object *objectRef, const char *objectName) { if (m_nsRegister) { cout << "Publishing " << objectName << " to nameservice. " << endl; publishIORToNameService(objectRef, objectName); } if (m_iorFile) { cout << "Publishing " << objectName << " to " << m_iorFile << "." << endl; publishIORToFile(objectRef, objectName, m_iorFile); } } void CipresFacilitator::publishIORToNameService (CORBA::Object *objectRef, const char *objectName) { m_cipresNameService.initialize(); m_cipresNameService.nsRegister(objectName, objectRef); } void CipresFacilitator::publishIORToFile(CORBA::Object *objectRef, const char *objectName, const char *filename) const { try { fstream f(filename, ios::out); CORBA::String_var ior = CipresFacilitator::getSingletonPtr()->getORB()->object_to_string(objectRef); f << ior.in() << endl; f << ::getpid() << endl; } catch (...) { cerr << "Caught exception trying to write ior to " << filename << endl; } } /* Caller is supposed to call release on object returned from string_to_object. CORBA::Object_var obj = getObjectFromFile(); will do the trick. No need to call duplicate on the obj ptr returned by this method. */ CORBA::Object_ptr CipresFacilitator::getObjectFromFile(const char *filename) { try { # if ! defined(READ_IOR_DIRECTLY_INTO_VAR) std::string iorStringAsSTLSTring; std::ifstream f(filename); f >> iorStringAsSTLSTring; f.close(); CORBA::String_var iorstring(iorStringAsSTLSTring.c_str()); CORBA::Object_var obj; # else // this code was causing problems (with omniORB and gcc4.0 // the compiler wasn't finding an appropriate >> operator) CORBA::String_var iorstring; CORBA::Object_var obj; { fstream f(filename, ios::in); f >> iorstring; } # endif obj = CipresFacilitator::getSingletonPtr()->getORB()->string_to_object(iorstring); cout << "read ior from " << filename << ". Ior is: " << iorstring << endl; return obj._retn(); } catch (...) { cerr << "Caught exception trying to read ior and make objref from " << filename << endl; } return CORBA::Object::_nil(); } CipresNameService & CipresFacilitator::getCipresNameService() { m_cipresNameService.initialize(); return m_cipresNameService; }