// //////////////////////////////////////////////////////// // Lecture on the CORBA Component Model, summer term 2003 // Assignment 3, Stephan Brumme, 702544 // // CORBA server that provides an operation to reverse // a string, can be reached via the Naming Service // #include using namespace std; #include "Helper.h" // IDL compiler generated a skeleton #include "Aufgabe2.h" using namespace POA_Aufgabe2; // CORBA's naming service #include // the server class Server_Impl : public virtual Server { public: // IDL: string reverse(in string message); char* reverse(const char* message); }; // reverse a given message char* Server_Impl::reverse(const char* message) { // some nice info cout << "Invoked by client, incoming: '" << message << "'"; // create new string const unsigned int length = strlen(message); char* result = CORBA::string_alloc(length); if (result == NULL) return result; // zero-terminated ! result[length] = 0; // reverse the message for (unsigned int i = 0; i < length; i++) result[i] = message[length-i-1]; // again some info cout << " - returning: '" << result << "'" << endl; // done ! return result; } // here we go ... int main(int argc, char* argv[]) { try { // initialize CORBA CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); ////////////////////////////////////// // POA related stuff cout << "Initialize POA ..." << endl; // first, locate the RootPOA CORBA::Object_var poaObject = orb->resolve_initial_references("RootPOA"); // gain access to the POA server and its manager PortableServer::POA_var poa = PortableServer::POA::_narrow(poaObject); CorbaAssert(poa, "Failed to obtain POA server."); PortableServer::POAManager_var poaManager = poa->the_POAManager(); CorbaAssert(poaManager, "Failed to obtain POA manager."); ////////////////////////////////////// // Setup server cout << "Initialize server ..." << endl; // new server object Server_Impl* server = new Server_Impl; // generate unique server ID PortableServer::ObjectId_var objectId = poa->activate_object(server); // extract reference CORBA::Object_var objectReference = poa->id_to_reference(objectId.in()); // for debug use: print IOR cout << orb->object_to_string(objectReference.in()) << endl; ////////////////////////////////////// // Connect to Naming Service cout << "Resolve Naming Service ..." << endl; // resolve naming service CORBA::Object_var namingService = orb->resolve_initial_references("NameService"); // not found ? CorbaAssert(namingService, "Couldn't locate the Naming Service."); // get the naming context CosNaming::NamingContext_var namingContext = CosNaming::NamingContext::_narrow(namingService); // not found ? CorbaAssert(namingContext, "Couldn't locate the Naming Service."); // my Windows(R)(TM)(C) login name: "Stephan.Brumme" CosNaming::Name newName; newName.length(1); newName[0].id = CORBA::string_dup("Stephan.Brumme"); newName[0].kind = CORBA::string_dup("CCM"); // register server at the naming service try { //namingContext->bind(newName, objectReference); namingContext->rebind(newName, objectReference); } catch (CosNaming::NamingContext::NotFound& e) { CorbaError("Naming context not found."); } catch (CosNaming::NamingContext::InvalidName& e) { CorbaError("Invalid name."); } cout << "Server is ready." << endl; poaManager->activate(); orb->run(); // game over poa->destroy(true, true); delete server; return 0; } catch (CORBA::Exception& e) { CorbaError("Corba failed to run properly."); } }