20 #ifndef ZEROC_ICE_EMBEDDED
22 #include <IceUtil/Mutex.h>
24 #include <IceE/IceE.h>
25 #include <IceE/Mutex.h>
38 #define ORB_DEFAULT_BASEPORT 10000
73 template <
class ZEROCICETYPE>
93 void init(
int basePortDifferent) {
94 basePort=basePortDifferent;
102 init(basePortDifferent);
111 if (offsetList.size()>0) {
114 std::list<int>::iterator offset=offsetList.begin();
115 while (*(offset++)==++i) ;
118 offsetList.push_back(i);
129 offsetList.remove(whichOffset);
138 return basePort+2*portOffset;
147 return getTCPUDPPort(portOffset)+1;
164 string generateEndPoint(
const string& transportName, std::string& ipAddress,
int& portOffset) {
165 string tn=transportName, ia=ipAddress;
167 return generateEndPoint(tn, ia, po);
177 stringstream endPoint;
178 if (ipAddress.size()>0) {
179 ipAddress=string(
" -h ")+ipAddress+
' ';
180 endPoint<<transportName<<
":";
182 endPoint<<
"tcp " <<ipAddress<<
"-p "<<getTCPUDPPort(portOffset);
183 #ifndef ZEROC_ICE_EMBEDDED
184 endPoint<<
" : udp "<<ipAddress<<
"-p "<<getTCPUDPPort(portOffset);
186 cout<<
"endpoint :"<<endl;
187 cout<<endPoint.str()<<endl;
190 return endPoint.str();
222 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress) {
223 initialise(argc, argv, transportNameIn, ipAddress, vector<pair<string,string> >());
233 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
const vector<pair<string,string> > extraProperties) {
234 initialise(argc, argv, transportNameIn, ipAddress, extraProperties);
244 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
int basePortDifferent):
ORBBase(basePortDifferent) {
245 initialise(argc, argv, transportNameIn, ipAddress, vector<pair<string,string> >());
256 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
const vector<pair<string,string> > extraProperties,
int basePortDifferent):
ORBBase(basePortDifferent) {
257 initialise(argc, argv, transportNameIn, ipAddress, extraProperties);
268 void initialise(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
const vector<pair<string,string> > extraProperties) {
270 hostAddress=ipAddress;
271 portOffset=getPortOffset();
272 transportName=transportNameIn;
273 Ice::InitializationData initData;
274 initData.properties = Ice::createProperties();
275 initData.properties->setProperty(
"Ice.Warn.Connections",
"2");
276 initData.properties->setProperty(
"Ice.Warn.UnusedProperties",
"1");
278 for (vector<pair<string,string> >::const_iterator pss=extraProperties.begin(); pss!=extraProperties.end(); ++pss)
279 initData.properties->setProperty(pss->first, pss->second);
281 communicator = Ice::initialize(argc, argv, initData);
288 adapterPtr=communicator->createObjectAdapterWithEndpoints(transportName+
".Control",generateEndPoint(transportName, hostAddress, portOffset).c_str());
289 adapterPtr->add((ORB::ORBICE*)
this, communicator->stringToIdentity(transportName));
290 adapterPtr->activate();
296 void getObjectPointer(
const string &name, Ice::ObjectPtr &objectPointer,
const Ice::Current& cur) {
297 Ice::Identity identity;
299 objectPointer=adapterPtr->find(identity);
312 initialise(argc, argv, transportNameIn,
string(), vector<pair<string,string> >());
324 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
int basePortDifferent):
ORBBase(basePortDifferent) {
325 initialise(argc, argv, transportNameIn,
string(), vector<pair<string,string> >());
337 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
const vector<pair<string,string> > extraProperties) {
338 initialise(argc, argv, transportNameIn,
string(), extraProperties);
351 ORBOriginator(
int argc,
char *argv[],
string transportNameIn,
const vector<pair<string,string> > extraProperties,
int basePortDifferent):
ORBBase(basePortDifferent) {
352 initialise(argc, argv, transportNameIn,
string(), extraProperties);
358 removePortOffset(portOffset);
360 communicator->shutdown();
367 cur.adapter->getCommunicator()->shutdown();
374 void addClass(Ice::ObjectPtr objectToORB,
const string &name) {
375 Ice::Identity identity;
377 if (adapterPtr->find(identity))
378 cerr<<
"ORBOriginator::addClass : WARNING : that class is already serlialised on the adapter"<<endl;
379 adapterPtr->add(objectToORB, identity);
385 communicator->waitForShutdown();
409 oRBOriginatorPrx = ORB::ORBICEPrx::checkedCast(communicator->stringToProxy(generateEndPoint(transportName, hostAddress, portOffset).c_str())->ice_twoway()->ice_timeout(-1)->ice_secure(
false));
410 if (!oRBOriginatorPrx) {
411 cerr<<
"ORBReplicator::initialise : couldn't get the ORBOriginator proxy, can't continue \n\n\tPlease check that the intended application on the other side of the netowrk is up and running!"<<endl;
438 ORBReplicator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
int basePortDifferent) :
ORBOriginator(argc, argv, transportNameIn, ipAddress, basePortDifferent) {
451 ORBReplicator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
const vector<pair<string,string> > extraProperties) :
ORBOriginator(argc, argv, transportNameIn, ipAddress, extraProperties) {
465 ORBReplicator(
int argc,
char *argv[],
string transportNameIn,
string ipAddress,
const vector<pair<string,string> > extraProperties,
int basePortDifferent) :
ORBOriginator(argc, argv, transportNameIn, ipAddress, extraProperties, basePortDifferent) {
472 virtual Ice::ObjectPtr create(
const std::string&)=0;
486 void addClass(Ice::ObjectPtr objectToORB,
const string &name) {
487 cerr<<
"ORBReplicator::addClass : Only ORBOriginators can add classes to the ORB application layer\n\t You need an originator on this side to add your classes to the ORB application layer"<<endl;
493 oRBOriginatorPrx->shutdown();
502 template<
typename PRXTYPE>
504 return PRXTYPE::checkedCast(communicator->stringToProxy(generateEndPoint(nameIn, hostAddress, portOffset).c_str()));
517 template<
typename CLASSTYPE>
519 if (!communicator->findObjectFactory(CLASSTYPE::ice_staticId()))
520 communicator->addObjectFactory(static_cast<Ice::ObjectFactory*>(
this), CLASSTYPE::ice_staticId());
523 Ice::ObjectPtr objectPtr;
524 oRBOriginatorPrx->getObjectPointer(nameIn, objectPtr);
525 objectPtr->__setNoDelete(
true);
527 return dynamic_cast<CLASSTYPE *
>(objectPtr.get());