1) file CamCoStr.idl: ===================== interface CamCoStr { string cacoStr(in string inStr); }; 2) file CamCoStr.h: =================== #include <omnithread.h> #include "CamCoStr.hh" // *.hh files are generated by the idl compiler. class CamCoStr_i : public _sk_CamCoStr //_sk_CamCoStr is the skeleton { private: char outStr[2048]; omni_mutex mutex; public: CamCoStr_i(const char * theName); virtual ~CamCoStr_i(); virtual char * cacoStr(const char * inStr) throw(CORBA::SystemException); }; 3) file CamCoStr.c: (This is the CORBA object's implementation.) =================== #include "CamCoStr.cc" #include "docamac.h" // define the constructor CamCoStr_i::CamCoStr_i(const char *port) { IniCamac((char *)port); } // define the destructor CamCoStr_i::~CamCoStr_i() { } // Here is the actual implementation of cacoStr. char *CamCoStr_i::cacoStr(const char *inStr) throw(CORBA::SystemException) { mutex.lock(); DoCamac((char *)inStr,(char *)outStr); mutex.unlock(); return(outStr); } 4) file client.cc: ================== /* client program for testing CORBA camac server. compiled by Urs Rohrer (PSI), May 1999 used CORBA implementation: omniORB2 (for C++) (see http://www.uk.research.att.com/omniORB/omniORB.html) */ #ifdef WIN32 #include <windows.h> #else // Redhat Linux Version 6.0 #include <stdio.h> #include <stdlib.h> #endif #include <iostream.h> #include <string.h> #include "CamCoStr.hh" static CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb, char *myname); static int InitializeCORBA(char *, CamCoStr_var *); static int CORBAsend(CamCoStr_var, char *, char *); void Help(void); int main(int argc, char **argv) { if (argc != 2) { cout << "Usage: Client Server_Name" << endl; // e.g: client pcxyz return 0; } CamCoStr_var cacostrVar; //////////// if (InitializeCORBA(argv[1],&cacostrVar)) //////////// { char command[100], answer[2000]; int ok = 1; while (ok > 0) { cout << "Enter command [ ? for help, EXIT for quit ] : " << flush; cin.getline(command,100); if (strlen(command) != 0) { if (strcmp(command,"?") == 0) Help(); else if (strcmp(command,"EXIT") == 0) ok = 0; else { if (CORBAsend(cacostrVar, command, answer) == 1) //////////// { cerr << "server returned: "; cerr << answer << endl; } else { cerr << "error" << endl; cin.ignore(80,'\n'); ok = 0; } } } } } return 0; } static int CORBAsend(CamCoStr_var cacostrVar, char *sendbuf, char *recbuf) { int retval; // Call the remote object try { #ifdef WIN32 strcpy(recbuf,(char *)cacostrVar->cacoStr((CORBA::String_var)sendbuf)); #else // Redhat Linux Version 6.0 strcpy(recbuf,(char *)cacostrVar->cacoStr(sendbuf)); #endif retval = 1; } catch( CORBA::COMM_FAILURE & ex) { cerr << "Caught system exception COMM_FAILURE" << endl; cerr << "We seem to be missing a server object" << endl; cerr << "Make sure that (1) the server is running and" << endl; cerr << "(2) that the ior.out file that server writes" << endl; cerr << "out is accessible from this client's" << endl; cerr << "present working directory" << endl; retval = 0; } catch( omniORB::fatalException & ex) { cerr << "Caught omniORB2 fatalException. This is a bug in omniORB" << endl; retval = 0; } return retval; } static int InitializeCORBA(char *p1, CamCoStr_var *var) { char key[100], name[20], port[20]; int argc = 3; // dummy char *argv[] = {"","",""}; // dummy // initialize CORBA object: CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB2"); CORBA::BOA_ptr boa = orb->BOA_init(argc,argv,"omniORB2_BOA"); CORBA::Object_var obj = getObjectReference(orb,p1); if (obj == CORBA::Object::_nil()) return 0; CamCoStr_var cacostrVar = CamCoStr::_narrow(obj); *var = cacostrVar; return 1; } static CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb, char *myname) { CosNaming::NamingContext_var rootContext; try { // Obtain a reference to the root context of the Name service: CORBA::Object_var initServ; initServ = orb->resolve_initial_references("NameService"); // Narrow the object returned by resolve_initial_references() // to a CosNaming::NamingContext object: rootContext = CosNaming::NamingContext::_narrow(initServ); if (CORBA::is_nil(rootContext)) { cerr << "Failed to narrow naming context." << endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } } catch(CORBA::ORB::InvalidName& ex) { cerr << "Service required is invalid [does not exist]." << endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } catch(...) { cerr << "COS Naming Service failed [not up ?]." << endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } // Create a name object, containing the name "myname": CosNaming::Name name; name.length(2); name[0].id = (const char*) myname; name[0].kind = (const char*) ""; name[1].id = (const char*) myname; name[1].kind = (const char*) "Object"; CORBA::Object_ptr obj; try { // Resolve the name to an object reference, and assign the reference // returned to a CORBA::Object: obj = rootContext->resolve(name); } catch(CosNaming::NamingContext::NotFound& ex) { // This exception is thrown if any of the components of the // path [contexts or the object] aren't found: cerr << "Context not found." << endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } catch (CORBA::COMM_FAILURE& ex) { cerr << "Caught system exception COMM_FAILURE, unable to contact the " << "naming service." << endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } catch(omniORB::fatalException& ex) { throw; } catch (...) { cerr << "Caught a system exception while using the naming service."<< endl; cin.ignore(80,'\n'); return CORBA::Object::_nil(); } return obj; } void Help(void) { cout << "Sample Server Version 1.00: Legal commands are:\n\ -------------------------------------------------------------------------\n\ | desired Action | Input | Receive (ok) | or Error |\n\ -------------------+-----------------+-------------------+---------------\n\ | ReadAllDevices | RALL | *RALL* <list> | *RALL* 0 |\n\ | ReadAllDevices | RAL2 | *RAL2* <list> | *RAL2* 0 |\n\ | ReadAllDacs | ALLD | *ALLD* <list> | *ALLD* 0 |\n\ | WriteDAC | WDAC XYZ nnn | *WDAC* XYZ= nnn | *WDAC* error |\n\ | WriteDAC&Wait | WDAW XYZ nnn | *WDAW* XYZ= nnn | *WDAW* error |\n\ | ReadDAC | RDAC XYZ | *RDAC* XYZ= nnn | *RDAC* error |\n\ | ReadADC | RADC XYZ | *RADC* XYZ= nnn | *RADC* error |\n\ | ReadCamacDac | RCAD XYZ f | *RCAD* nnn | *RCAD* error |\n\ | WriteCamacDac | WCAD XYZ f nnn | *WCAD* nnn | *WCAD* error |\n\ | DoReadCamac | RCAM N A F | *RCAM* sta nnn | *RCAM* error |\n\ | DoWriteCamac | WCAM N A F nnn | *WCAM* sta | *WCAM* error |\n\ | DoControlCamac | CCAM N A F | *CCAM* sta | *CCAM* error |\n\ | GetDeviceName | DEVN nnn | *DEVN* nnn= XYZ | *DEVN* error |\n\ | DeviceParameter | DEVP nnn | *DEVP* <3par> | *DEVP* error |\n\ | DeviceParameter2 | DEPA nnn | *DEPA* <17par> | *DEPA* error |\n\ | DeviceParameter3 | DEPB nnn | *DEPB* <4par> | *DEPB* error |\n\ -------------------+-----------------+-------------------+---------------\n\ --- press <Enter> key for more ---" << flush; cin.ignore(80,'\n'); cout << "\ -------------------------------------------------------------------------\n\ | desired Action | Input | Receive (ok) | or Error |\n\ -------------------+-----------------+-------------------+---------------\n\ | ReserveCrate | RESC | *RESC* 1 | *RESC* 0 |\n\ | FreeCrate | FREE | *FREE* 1 | |\n\ | NewDeviceList | NEWL | *NEWL* 1 | *NEWL* 0 |\n\ | GetPageIndex | PIND nnn | *PIND* nnn | *PIND* error |\n\ | GetNumberOfPages | NPAG | *NPAG* nnn | |\n\ | ReadOnePage | RPAG nnn | *RPAG* nnn <list> | *RPAG* 0 |\n\ | SwitchOnCombis | SWON | *SWON* nnn | |\n\ | SwitchOnCombi | SWCO XYZ | *SWCO* XYZ 1 | *SWCO* XYZ 0 |\n\ | SwitchOffCombi | SWOF XYZ | *SWOF* XYZ 1 | *SWOF* XYZ 0 |\n\ | ClearScalers | CLSC sn s1 s2 | *CLSC* | *CLSC* error |\n\ | ReadScalers | RDSC sn s1 s2 | *RDSC* nnn mmm | *RDSC* error |\n\ | ReadClAllScalers | RCAS n | *RCAS* <6rates> | *RCAS* error |\n\ | Shutdown | EXIT | | |\n\ | Help info | ? | these help frames | |\n\ -------------------------------------------------------------------------\n" << flush; }
|