00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <config.h>
00025 #include "RTIG.hh"
00026
00027 #include "PrettyDebug.hh"
00028 #include "NM_Classes.hh"
00029
00030 #ifdef _WIN32
00031 #include <signal.h>
00032 #else
00033 #include <unistd.h>
00034 #include <iostream>
00035 #endif
00036 #include <cerrno>
00037 #include <csignal>
00038 #include <memory>
00039
00040 using std::cout ;
00041 using std::endl ;
00042 using std::cerr ;
00043
00044 namespace certi {
00045 namespace rtig {
00046
00047 static PrettyDebug D("RTIG", __FILE__);
00048 static PrettyDebug G("GENDOC",__FILE__);
00049
00050 bool RTIG::terminate = false;
00051
00052
00053
00054
00055 RTIG::RTIG()
00056 : federationHandles(1),
00057 socketServer(&tcpSocketServer, &udpSocketServer, udpPort),
00058 auditServer(RTIG_AUDIT_FILENAME),
00059 federations(socketServer, auditServer)
00060 {
00061
00062 const char *tcp_port_s = getenv("CERTI_TCP_PORT");
00063 const char *udp_port_s = getenv("CERTI_UDP_PORT");
00064 if (tcp_port_s==NULL) tcp_port_s = PORT_TCP_RTIG ;
00065 if (udp_port_s==NULL) udp_port_s = PORT_UDP_RTIG ;
00066 tcpPort = atoi(tcp_port_s);
00067 udpPort = atoi(udp_port_s);
00068
00069 federations.setVerboseLevel(verboseLevel);
00070 }
00071
00072
00073
00074
00075 RTIG::~RTIG()
00076 {
00077 tcpSocketServer.close();
00078 udpSocketServer.close();
00079
00080 cout << endl << "Stopping RTIG" << endl ;
00081 }
00082
00083
00085
00088 Socket*
00089 RTIG::chooseProcessingMethod(Socket *link, NetworkMessage *msg)
00090 {
00091 G.Out(pdGendoc,"enter RTIG::chooseProcessingMethod type (%s)",msg->getName().c_str());
00092
00093 if ( msg->getType() != NetworkMessage::DESTROY_FEDERATION_EXECUTION)
00094 socketServer.checkMessage(link->returnSocket(), msg);
00095
00096 switch(msg->getType()) {
00097 case NetworkMessage::MESSAGE_NULL:
00098 D.Out(pdDebug, "Message Null.");
00099 auditServer.setLevel(0);
00100 processMessageNull(msg);
00101 break ;
00102
00103 case NetworkMessage::UPDATE_ATTRIBUTE_VALUES:
00104 D.Out(pdDebug, "UpdateAttributeValue.");
00105 auditServer.setLevel(1);
00106 processUpdateAttributeValues(link, msg);
00107 break ;
00108
00109 case NetworkMessage::SEND_INTERACTION:
00110 D.Out(pdTrace, "send interaction.");
00111 auditServer.setLevel(2);
00112 processSendInteraction(link, msg);
00113 break ;
00114
00115 case NetworkMessage::CLOSE_CONNEXION:
00116 D.Out(pdTrace, "Close connection %ld.", link->returnSocket());
00117 auditServer.setLevel(9);
00118 auditServer << "Socket " << link->returnSocket();
00119 closeConnection(link, false);
00120 link = NULL ;
00121 break ;
00122
00123 case NetworkMessage::CREATE_FEDERATION_EXECUTION:
00124 D.Out(pdTrace, "Create federation \"%s\".", msg->federationName.c_str());
00125 auditServer.setLevel(9);
00126 processCreateFederation(link, msg);
00127 break ;
00128
00129 case NetworkMessage::DESTROY_FEDERATION_EXECUTION:
00130 D.Out(pdTrace, "Destroy federation \"%s\".", msg->federationName.c_str());
00131 auditServer.setLevel(9);
00132 processDestroyFederation(link, msg);
00133 break ;
00134
00135 case NetworkMessage::JOIN_FEDERATION_EXECUTION:
00136 D.Out(pdTrace, "federate \"%s\" joins federation \"%s\".",
00137 msg->federateName.c_str(), msg->federationName.c_str());
00138 auditServer.setLevel(9);
00139 processJoinFederation(link, msg);
00140 break ;
00141
00142 case NetworkMessage::RESIGN_FEDERATION_EXECUTION:
00143 D.Out(pdTrace, "Federate no %u leaves federation no %u .",
00144 msg->federate, msg->federation);
00145 auditServer.setLevel(9);
00146 processResignFederation(link,msg->federation, msg->federate);
00147 break ;
00148
00149 case NetworkMessage::REGISTER_FEDERATION_SYNCHRONIZATION_POINT:
00150 D.Out(pdTrace,
00151 "Federation %u: registerFedSyncPoint from federate %u.",
00152 msg->federation, msg->federate);
00153 auditServer.setLevel(8);
00154 processRegisterSynchronization(link, static_cast<NM_Register_Federation_Synchronization_Point*>(msg));
00155 break ;
00156
00157 case NetworkMessage::SYNCHRONIZATION_POINT_ACHIEVED:
00158 D.Out(pdTrace,
00159 "Federation %u: synchronizationPointAchieved from federate %u.",
00160 msg->federation, msg->federate);
00161 auditServer.setLevel(8);
00162 processSynchronizationAchieved(link, msg);
00163 break ;
00164
00165 case NetworkMessage::REQUEST_FEDERATION_SAVE:
00166 D.Out(pdTrace, "Request federation save from federate %u.",
00167 msg->federate);
00168 auditServer.setLevel(8);
00169 processRequestFederationSave(link, msg);
00170 break ;
00171
00172 case NetworkMessage::FEDERATE_SAVE_BEGUN:
00173 D.Out(pdTrace, "Federate %u begun save.", msg->federate);
00174 auditServer.setLevel(8);
00175 processFederateSaveBegun(link, msg);
00176 break ;
00177
00178 case NetworkMessage::FEDERATE_SAVE_COMPLETE:
00179 case NetworkMessage::FEDERATE_SAVE_NOT_COMPLETE:
00180 D.Out(pdTrace, "Federate %u save complete/not complete.",
00181 msg->federate);
00182 auditServer.setLevel(8);
00183 processFederateSaveStatus(link, msg);
00184 break ;
00185
00186 case NetworkMessage::REQUEST_FEDERATION_RESTORE:
00187 D.Out(pdTrace, "Federate %u request a restoration.", msg->federate);
00188 auditServer.setLevel(8);
00189 processRequestFederationRestore(link, msg);
00190 break ;
00191
00192 case NetworkMessage::FEDERATE_RESTORE_COMPLETE:
00193 case NetworkMessage::FEDERATE_RESTORE_NOT_COMPLETE:
00194 D.Out(pdTrace, "Federate %u restore complete/not complete.",
00195 msg->federate);
00196 auditServer.setLevel(8);
00197 processFederateRestoreStatus(link, msg);
00198 break ;
00199
00200 case NetworkMessage::REQUEST_OBJECT_ATTRIBUTE_VALUE_UPDATE:
00201 D[pdTrace] << "requestAttributeValueUpdate" << endl ;
00202 auditServer.setLevel(6);
00203 processRequestObjectAttributeValueUpdate(link, msg);
00204 break ;
00205
00206 case NetworkMessage::SET_TIME_REGULATING:
00207 D.Out(pdTrace, "SetTimeRegulating du federe %u(date=%f).",
00208 msg->federate, msg->getDate().getTime());
00209 auditServer.setLevel(8);
00210 processSetTimeRegulating(link, static_cast<NM_Set_Time_Regulating*>(msg));
00211 break ;
00212
00213 case NetworkMessage::SET_TIME_CONSTRAINED:
00214 D.Out(pdTrace, "SetTimeConstrained du federe %u.", msg->federate);
00215 auditServer.setLevel(8);
00216
00217 processSetTimeConstrained(link, static_cast<NM_Set_Time_Constrained*>(msg));
00218 break ;
00219
00220 case NetworkMessage::PUBLISH_OBJECT_CLASS:
00221 case NetworkMessage::UNPUBLISH_OBJECT_CLASS:
00222 D.Out(pdTrace, "un/publishObjectClass.");
00223 auditServer.setLevel(7);
00224 processPublishObjectClass(link, msg);
00225 break ;
00226
00227 case NetworkMessage::PUBLISH_INTERACTION_CLASS:
00228 case NetworkMessage::UNPUBLISH_INTERACTION_CLASS:
00229 D.Out(pdTrace, "un/publishInteractionClass.");
00230 auditServer.setLevel(7);
00231 processPublishInteractionClass(link, msg);
00232 break ;
00233
00234 case NetworkMessage::SUBSCRIBE_OBJECT_CLASS:
00235 case NetworkMessage::UNSUBSCRIBE_OBJECT_CLASS:
00236 D.Out(pdTrace, "un/subscribeObjectClass.");
00237 auditServer.setLevel(7);
00238 processSubscribeObjectClass(link, msg);
00239 break ;
00240
00241 case NetworkMessage::SUBSCRIBE_INTERACTION_CLASS:
00242 case NetworkMessage::UNSUBSCRIBE_INTERACTION_CLASS:
00243 D.Out(pdTrace, "un/subscribeInteractionClass.");
00244 auditServer.setLevel(7);
00245 processSubscribeInteractionClass(link, msg);
00246 break ;
00247
00248 case NetworkMessage::SET_CLASS_RELEVANCE_ADVISORY_SWITCH:
00249 D.Out(pdTrace, "setClassRelevanceAdvisorySwitch.");
00250 auditServer.setLevel(6);
00251 processSetClassRelevanceAdvisorySwitch(link,
00252 static_cast<NM_Set_Class_Relevance_Advisory_Switch*>(msg));
00253 break;
00254
00255 case NetworkMessage::SET_INTERACTION_RELEVANCE_ADVISORY_SWITCH:
00256 D.Out(pdTrace, "setInteractionRelevanceAdvisorySwitch.");
00257 auditServer.setLevel(6);
00258 processSetInteractionRelevanceAdvisorySwitch(link,
00259 static_cast<NM_Set_Interaction_Relevance_Advisory_Switch*>(msg));
00260 break;
00261
00262 case NetworkMessage::SET_ATTRIBUTE_RELEVANCE_ADVISORY_SWITCH:
00263 D.Out(pdTrace, "setAttributeRelevanceAdvisorySwitch.");
00264 auditServer.setLevel(6);
00265 processSetAttributeRelevanceAdvisorySwitch(link,
00266 static_cast<NM_Set_Attribute_Relevance_Advisory_Switch*>(msg));
00267 break;
00268
00269 case NetworkMessage::SET_ATTRIBUTE_SCOPE_ADVISORY_SWITCH:
00270 D.Out(pdTrace, "setAttributeScopeAdvisorySwitch.");
00271 auditServer.setLevel(6);
00272 processSetAttributeScopeAdvisorySwitch(link,
00273 static_cast<NM_Set_Attribute_Scope_Advisory_Switch*>(msg));
00274 break;
00275
00276 case NetworkMessage::REGISTER_OBJECT:
00277 D.Out(pdTrace, "registerObject.");
00278 auditServer.setLevel(6);
00279 processRegisterObject(link, msg);
00280 break ;
00281
00282 case NetworkMessage::DELETE_OBJECT:
00283 D.Out(pdTrace, "DeleteObject..");
00284 auditServer.setLevel(6);
00285 processDeleteObject(link, msg);
00286 break ;
00287
00288 case NetworkMessage::IS_ATTRIBUTE_OWNED_BY_FEDERATE:
00289 D.Out(pdTrace, "isAttributeOwnedByFederate..");
00290 auditServer.setLevel(2);
00291 processAttributeOwnedByFederate(link, msg);
00292 break ;
00293
00294 case NetworkMessage::QUERY_ATTRIBUTE_OWNERSHIP:
00295 D.Out(pdTrace, "queryAttributeOwnership..");
00296 auditServer.setLevel(2);
00297 processQueryAttributeOwnership(link, msg);
00298 break ;
00299
00300 case NetworkMessage::NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
00301 D.Out(pdTrace, "negotiatedAttributeOwnershipDivestiture..");
00302 auditServer.setLevel(6);
00303 processNegotiatedOwnershipDivestiture(link, msg);
00304 break ;
00305
00306 case NetworkMessage::ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:
00307 D.Out(pdTrace, "attributeOwnershipAcquisitionIfAvailable..");
00308 auditServer.setLevel(6);
00309 processAcquisitionIfAvailable(link, msg);
00310 break ;
00311
00312 case NetworkMessage::UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
00313 D.Out(pdTrace, "unconditionalAttributeOwnershipDivestiture..");
00314 auditServer.setLevel(6);
00315 processUnconditionalDivestiture(link, msg);
00316 break ;
00317
00318 case NetworkMessage::ATTRIBUTE_OWNERSHIP_ACQUISITION:
00319 D.Out(pdTrace, "attributeOwnershipAcquisition..");
00320 auditServer.setLevel(6);
00321 processOwnershipAcquisition(link, msg);
00322 break ;
00323
00324 case NetworkMessage::CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:
00325 D.Out(pdTrace, "cancelNegociatedAttributeOwnershipDivestiture..");
00326 auditServer.setLevel(6);
00327 processCancelNegotiatedDivestiture(link, msg);
00328 break ;
00329
00330 case NetworkMessage::ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:
00331 D.Out(pdTrace, "attributeOwnershipReleaseResponse..");
00332 auditServer.setLevel(6);
00333 processReleaseResponse(link, msg);
00334 break ;
00335
00336 case NetworkMessage::CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:
00337 D.Out(pdTrace, "cancelAttributeOwnershipAcquisition..");
00338 auditServer.setLevel(6);
00339 processCancelAcquisition(link, msg);
00340 break ;
00341
00342 case NetworkMessage::DDM_CREATE_REGION:
00343 D[pdTrace] << "createRegion" << endl ;
00344 auditServer.setLevel(6);
00345 processCreateRegion(link, msg);
00346 break ;
00347
00348 case NetworkMessage::DDM_MODIFY_REGION:
00349 D[pdTrace] << "modifyRegion" << endl ;
00350 auditServer.setLevel(6);
00351 processModifyRegion(link, msg);
00352 break ;
00353
00354 case NetworkMessage::DDM_DELETE_REGION:
00355 D[pdTrace] << "deleteRegion" << endl ;
00356 auditServer.setLevel(6);
00357 processDeleteRegion(link, msg);
00358 break ;
00359
00360 case NetworkMessage::DDM_REGISTER_OBJECT:
00361 D[pdTrace] << "registerObjectWithRegion" << endl ;
00362 auditServer.setLevel(6);
00363 processRegisterObjectWithRegion(link, msg);
00364 break ;
00365
00366 case NetworkMessage::DDM_ASSOCIATE_REGION:
00367 D[pdTrace] << "associateRegionForUpdates" << endl ;
00368 auditServer.setLevel(6);
00369 processAssociateRegion(link, msg);
00370 break ;
00371
00372 case NetworkMessage::DDM_UNASSOCIATE_REGION:
00373 D[pdTrace] << "unassociateRegionForUpdates" << endl ;
00374 auditServer.setLevel(6);
00375 processUnassociateRegion(link, msg);
00376 break ;
00377
00378 case NetworkMessage::DDM_SUBSCRIBE_ATTRIBUTES:
00379 D[pdTrace] << "subscribeObjectClassAttributes (DDM)" << endl ;
00380 auditServer.setLevel(6);
00381 processSubscribeAttributesWR(link, msg);
00382 break ;
00383
00384 case NetworkMessage::DDM_UNSUBSCRIBE_ATTRIBUTES:
00385 D[pdTrace] << "unsubscribeObjectClassAttributes (DDM)" << endl ;
00386 auditServer.setLevel(6);
00387 processUnsubscribeAttributesWR(link, msg);
00388 break ;
00389
00390 case NetworkMessage::DDM_SUBSCRIBE_INTERACTION:
00391 D[pdTrace] << "subscribeInteraction (DDM)" << endl ;
00392 auditServer.setLevel(6);
00393 processSubscribeInteractionWR(link, msg);
00394 break ;
00395
00396 case NetworkMessage::DDM_UNSUBSCRIBE_INTERACTION:
00397 D[pdTrace] << "unsubscribeInteraction (DDM)" << endl ;
00398 auditServer.setLevel(6);
00399 processUnsubscribeInteractionWR(link, msg);
00400 break ;
00401
00402 default:
00403
00404 D.Out(pdError, "processMessageRecu: unknown type %u.", msg->getType());
00405 throw RTIinternalError("Unknown Message Type");
00406 }
00407 G.Out(pdGendoc,"exit RTIG::chooseProcessingMethod");
00408 return link ;
00409 }
00410
00411
00413
00416 void
00417 RTIG::closeConnection(Socket *link, bool emergency)
00418 {
00419 Handle federation ;
00420 FederateHandle federate ;
00421
00422 G.Out(pdGendoc,"enter RTIG::closeConnection");
00423 try {
00424 socketServer.close(link->returnSocket(), federation, federate);
00425 }
00426 catch (RTIinternalError &e) {
00427 D.Out(pdError, "Connection not found while trying to close it.");
00428 }
00429
00430 if (emergency) {
00431 D.Out(pdExcept, "Killing Federate(%u, %u)...", federation, federate);
00432 federations.killFederate(federation, federate);
00433 D.Out(pdExcept, "Federate(%u, %u)Killed... ", federation, federate);
00434 }
00435
00436 G.Out(pdGendoc,"exit RTIG::closeConnection");
00437 }
00438
00439
00440
00441
00442 void
00443 RTIG::execute()
00444 {
00445 int result ;
00446 fd_set fd ;
00447 Socket *link ;
00448
00449
00450 udpSocketServer.createUDPServer(udpPort);
00451 tcpSocketServer.createTCPServer(tcpPort);
00452
00453
00454 if (verboseLevel>0) {
00455 cout << "CERTI RTIG up and running ..." << endl ;
00456 }
00457 terminate = false ;
00458
00459 while (!terminate) {
00460
00461 #if _WIN32
00462
00463 result = 0;
00464 while (!result)
00465 {
00466 int test;
00467
00468 FD_ZERO(&fd);
00469 FD_SET(tcpSocketServer.returnSocket(), &fd);
00470
00471 int highest_fd = socketServer.addToFDSet(&fd);
00472 int server_socket = tcpSocketServer.returnSocket();
00473
00474
00475 timeval watchDog;
00476 watchDog.tv_sec= 0;
00477 watchDog.tv_usec= 50000L;
00478
00479 highest_fd = server_socket>highest_fd ? server_socket : highest_fd;
00480
00481 result = select(highest_fd+1, &fd, NULL, NULL, &watchDog);
00482 if (result < 0) test= WSAGetLastError();
00483 if (terminate) break;
00484 }
00485 if (terminate) break;
00486
00487 if((result == -1)&&(WSAGetLastError() == WSAEINTR)) break;
00488 #else
00489 FD_ZERO(&fd);
00490 FD_SET(tcpSocketServer.returnSocket(), &fd);
00491
00492 int fd_max = socketServer.addToFDSet(&fd);
00493 fd_max = std::max(tcpSocketServer.returnSocket(), fd_max);
00494
00495 result = 0 ;
00496 result = select(fd_max + 1, &fd, NULL, NULL, NULL);
00497
00498 if((result == -1)&&(errno == EINTR)) break;
00499 #endif
00500
00501
00502 link = socketServer.getActiveSocket(&fd);
00503 if (link != NULL) {
00504 D.Out(pdCom, "Incoming message on socket %ld.",
00505 link->returnSocket());
00506 try {
00507 do {
00508 link = processIncomingMessage(link);
00509 if (link == NULL)break ;
00510 } while (link->isDataReady());
00511 }
00512 catch (NetworkError &e) {
00513 if (!e._reason.empty())
00514 D.Out(pdExcept, "Catching Network Error, reason : %s", e._reason.c_str());
00515 else
00516 D.Out(pdExcept, "Catching Network Error, no reason string.");
00517 cout << "RTIG dropping client connection " << link->returnSocket()
00518 << '.' << endl ;
00519 closeConnection(link, true);
00520 link = NULL ;
00521 }
00522 }
00523
00524
00525 if (FD_ISSET(tcpSocketServer.returnSocket(), &fd)) {
00526 D.Out(pdCom, "Demande de connexion.");
00527 openConnection();
00528 }
00529 }
00530 }
00531
00532
00533
00534
00535 void
00536 RTIG::openConnection()
00537 {
00538 try {
00539 socketServer.open();
00540 }
00541 catch (RTIinternalError &e) {
00542 D.Out(pdExcept, "Error while accepting new connection : %s.", e._reason.c_str());
00543 }
00544
00545 D.Out(pdInit, "Accepting new connection.");
00546 }
00547
00548
00550
00558 Socket*
00559 RTIG::processIncomingMessage(Socket *link) throw (NetworkError)
00560 {
00561 NetworkMessage* msg ;
00562
00563 char buffer[BUFFER_EXCEPTION_REASON_SIZE] ;
00564 G.Out(pdGendoc,"enter RTIG::processIncomingMessage");
00565 if (link == NULL) {
00566 D.Out(pdError, "NULL socket in processMessageRecu.");
00567 return NULL ;
00568 }
00569
00570
00571 msg = NM_Factory::receive(link);
00572
00573
00574 std::auto_ptr<NetworkMessage> rep(NM_Factory::create(msg->getType()));
00575 rep->federate = msg->federate ;
00576
00577 auditServer.startLine(msg->federation, msg->federate, msg->getType());
00578
00579
00580
00581
00582 #define CPY_NOT_NULL(A) { if (!A._reason.empty())strcpy(buffer, A._reason.c_str()); }
00583
00584 buffer[0] = 0 ;
00585
00586 try {
00587 link = chooseProcessingMethod(link, msg);
00588 }
00589 catch (ArrayIndexOutOfBounds &e) {
00590 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00591 CPY_NOT_NULL(e);
00592 rep->exception = e_ArrayIndexOutOfBounds ;
00593 }
00594 catch (AttributeAlreadyOwned &e) {
00595 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00596 CPY_NOT_NULL(e);
00597 rep->exception = e_AttributeAlreadyOwned ;
00598 }
00599 catch (AttributeAlreadyBeingAcquired &e) {
00600 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00601 CPY_NOT_NULL(e);
00602 rep->exception = e_AttributeAlreadyBeingAcquired ;
00603 }
00604 catch (AttributeAlreadyBeingDivested &e) {
00605 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00606 CPY_NOT_NULL(e);
00607 rep->exception = e_AttributeAlreadyBeingDivested ;
00608 }
00609 catch (AttributeDivestitureWasNotRequested &e) {
00610 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00611 CPY_NOT_NULL(e);
00612 rep->exception = e_AttributeDivestitureWasNotRequested ;
00613 }
00614 catch (AttributeAcquisitionWasNotRequested &e) {
00615 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00616 CPY_NOT_NULL(e);
00617 rep->exception = e_AttributeAcquisitionWasNotRequested ;
00618 }
00619 catch (AttributeNotDefined &e) {
00620 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00621 CPY_NOT_NULL(e);
00622 rep->exception = e_AttributeNotDefined ;
00623 }
00624 catch (AttributeNotKnown &e) {
00625 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00626 CPY_NOT_NULL(e);
00627 rep->exception = e_AttributeNotKnown ;
00628 }
00629 catch (AttributeNotOwned &e) {
00630 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00631 CPY_NOT_NULL(e);
00632 rep->exception = e_AttributeNotOwned ;
00633 }
00634 catch (AttributeNotPublished &e) {
00635 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00636 CPY_NOT_NULL(e);
00637 rep->exception = e_AttributeNotPublished ;
00638 }
00639 catch (AttributeNotSubscribed &e) {
00640 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00641 CPY_NOT_NULL(e);
00642 rep->exception = e_AttributeNotSubscribed ;
00643 }
00644 catch (ConcurrentAccessAttempted &e) {
00645 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00646 CPY_NOT_NULL(e);
00647 rep->exception = e_ConcurrentAccessAttempted ;
00648 }
00649 catch (CouldNotDiscover &e) {
00650 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00651 CPY_NOT_NULL(e);
00652 rep->exception = e_CouldNotDiscover ;
00653 }
00654 catch (CouldNotOpenRID &e) {
00655 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00656 CPY_NOT_NULL(e);
00657 rep->exception = e_CouldNotOpenRID ;
00658 }
00659 catch (CouldNotOpenFED &e) {
00660 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00661 CPY_NOT_NULL(e);
00662 rep->exception = e_CouldNotOpenFED ;
00663 }
00664 catch (CouldNotRestore &e) {
00665 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00666 CPY_NOT_NULL(e);
00667 rep->exception = e_CouldNotRestore ;
00668 }
00669 catch (DeletePrivilegeNotHeld &e) {
00670 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00671 CPY_NOT_NULL(e);
00672 rep->exception = e_DeletePrivilegeNotHeld ;
00673 }
00674 catch (ErrorReadingRID &e) {
00675 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00676 CPY_NOT_NULL(e);
00677 rep->exception = e_ErrorReadingRID ;
00678 }
00679 catch (EventNotKnown &e) {
00680 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00681 CPY_NOT_NULL(e);
00682 rep->exception = e_EventNotKnown ;
00683 }
00684 catch (FederateAlreadyPaused &e) {
00685 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00686 CPY_NOT_NULL(e);
00687 rep->exception = e_FederateAlreadyPaused ;
00688 }
00689 catch (FederateAlreadyExecutionMember &e) {
00690 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00691 CPY_NOT_NULL(e);
00692 rep->exception = e_FederateAlreadyExecutionMember ;
00693 }
00694 catch (FederateDoesNotExist &e) {
00695 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00696 CPY_NOT_NULL(e);
00697 rep->exception = e_FederateDoesNotExist ;
00698 }
00699 catch (FederateInternalError &e) {
00700 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00701 CPY_NOT_NULL(e);
00702 rep->exception = e_FederateInternalError ;
00703 }
00704 catch (FederateNameAlreadyInUse &e) {
00705 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00706 CPY_NOT_NULL(e);
00707 rep->exception = e_FederateNameAlreadyInUse ;
00708 }
00709 catch (FederateNotExecutionMember &e) {
00710 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00711 CPY_NOT_NULL(e);
00712 rep->exception = e_FederateNotExecutionMember ;
00713 }
00714 catch (FederateNotPaused &e) {
00715 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00716 CPY_NOT_NULL(e);
00717 rep->exception = e_FederateNotPaused ;
00718 }
00719 catch (FederateNotPublishing &e) {
00720 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00721 CPY_NOT_NULL(e);
00722 rep->exception = e_FederateNotPublishing ;
00723 }
00724 catch (FederateNotSubscribing &e) {
00725 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00726 CPY_NOT_NULL(e);
00727 rep->exception = e_FederateNotSubscribing ;
00728 }
00729 catch (FederateOwnsAttributes &e) {
00730 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00731 CPY_NOT_NULL(e);
00732 rep->exception = e_FederateOwnsAttributes ;
00733 }
00734 catch (FederatesCurrentlyJoined &e) {
00735 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00736 CPY_NOT_NULL(e);
00737 rep->exception = e_FederatesCurrentlyJoined ;
00738 }
00739 catch (FederateWasNotAskedToReleaseAttribute &e) {
00740 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00741 CPY_NOT_NULL(e);
00742 rep->exception = e_FederateWasNotAskedToReleaseAttribute ;
00743 }
00744 catch (FederationAlreadyPaused &e) {
00745 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00746 CPY_NOT_NULL(e);
00747 rep->exception = e_FederationAlreadyPaused ;
00748 }
00749 catch (FederationExecutionAlreadyExists &e) {
00750 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00751 CPY_NOT_NULL(e);
00752 rep->exception = e_FederationExecutionAlreadyExists ;
00753 }
00754 catch (FederationExecutionDoesNotExist &e) {
00755 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00756 CPY_NOT_NULL(e);
00757 rep->exception = e_FederationExecutionDoesNotExist ;
00758 }
00759 catch (FederationNotPaused &e) {
00760 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00761 CPY_NOT_NULL(e);
00762 rep->exception = e_FederationNotPaused ;
00763 }
00764 catch (FederationTimeAlreadyPassed &e) {
00765 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00766 CPY_NOT_NULL(e);
00767 rep->exception = e_FederationTimeAlreadyPassed ;
00768 }
00769 catch (IDsupplyExhausted &e) {
00770 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00771 CPY_NOT_NULL(e);
00772 rep->exception = e_IDsupplyExhausted ;
00773 }
00774 catch (InteractionClassNotDefined &e) {
00775 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00776 CPY_NOT_NULL(e);
00777 rep->exception = e_InteractionClassNotDefined ;
00778 }
00779 catch (InteractionClassNotKnown &e) {
00780 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00781 CPY_NOT_NULL(e);
00782 rep->exception = e_InteractionClassNotKnown ;
00783 }
00784 catch (InteractionClassNotPublished &e) {
00785 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00786 CPY_NOT_NULL(e);
00787 rep->exception = e_InteractionClassNotPublished ;
00788 }
00789 catch (InteractionParameterNotDefined &e) {
00790 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00791 CPY_NOT_NULL(e);
00792 rep->exception = e_InteractionParameterNotDefined ;
00793 }
00794 catch (InteractionParameterNotKnown &e) {
00795 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00796 CPY_NOT_NULL(e);
00797 rep->exception = e_InteractionParameterNotKnown ;
00798 }
00799 catch (InvalidDivestitureCondition &e) {
00800 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00801 CPY_NOT_NULL(e);
00802 rep->exception = e_InvalidDivestitureCondition ;
00803 }
00804 catch (InvalidExtents &e) {
00805 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00806 CPY_NOT_NULL(e);
00807 rep->exception = e_InvalidExtents ;
00808 }
00809 catch (InvalidFederationTime &e) {
00810 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00811 CPY_NOT_NULL(e);
00812 rep->exception = e_InvalidFederationTime ;
00813 }
00814 catch (InvalidFederationTimeDelta &e) {
00815 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00816 CPY_NOT_NULL(e);
00817 rep->exception = e_InvalidFederationTimeDelta ;
00818 }
00819 catch (InvalidObjectHandle &e) {
00820 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00821 CPY_NOT_NULL(e);
00822 rep->exception = e_InvalidObjectHandle ;
00823 }
00824 catch (InvalidOrderingHandle &e) {
00825 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00826 CPY_NOT_NULL(e);
00827 rep->exception = e_InvalidOrderingHandle ;
00828 }
00829 catch (InvalidResignAction &e) {
00830 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00831 CPY_NOT_NULL(e);
00832 rep->exception = e_InvalidResignAction ;
00833 }
00834 catch (InvalidRetractionHandle &e) {
00835 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00836 CPY_NOT_NULL(e);
00837 rep->exception = e_InvalidRetractionHandle ;
00838 }
00839 catch (InvalidRoutingSpace &e) {
00840 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00841 CPY_NOT_NULL(e);
00842 rep->exception = e_InvalidRoutingSpace ;
00843 }
00844 catch (InvalidTransportationHandle &e) {
00845 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00846 CPY_NOT_NULL(e);
00847 rep->exception = e_InvalidTransportationHandle ;
00848 }
00849 catch (MemoryExhausted &e) {
00850 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00851 CPY_NOT_NULL(e);
00852 rep->exception = e_MemoryExhausted ;
00853 }
00854 catch (NameNotFound &e) {
00855 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00856 CPY_NOT_NULL(e);
00857 rep->exception = e_NameNotFound ;
00858 }
00859 catch (NoPauseRequested &e) {
00860 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00861 CPY_NOT_NULL(e);
00862 rep->exception = e_NoPauseRequested ;
00863 }
00864 catch (NoResumeRequested &e) {
00865 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00866 CPY_NOT_NULL(e);
00867 rep->exception = e_NoResumeRequested ;
00868 }
00869 catch (ObjectClassNotDefined &e) {
00870 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00871 CPY_NOT_NULL(e);
00872 rep->exception = e_ObjectClassNotDefined ;
00873 }
00874 catch (ObjectClassNotKnown &e) {
00875 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00876 CPY_NOT_NULL(e);
00877 rep->exception = e_ObjectClassNotKnown ;
00878 }
00879 catch (ObjectClassNotPublished &e) {
00880 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00881 CPY_NOT_NULL(e);
00882 rep->exception = e_ObjectClassNotPublished ;
00883 }
00884 catch (ObjectClassNotSubscribed &e) {
00885 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00886 CPY_NOT_NULL(e);
00887 rep->exception = e_ObjectClassNotSubscribed ;
00888 }
00889 catch (ObjectNotKnown &e) {
00890 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00891 CPY_NOT_NULL(e);
00892 rep->exception = e_ObjectNotKnown ;
00893 }
00894 catch (ObjectAlreadyRegistered &e) {
00895 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00896 CPY_NOT_NULL(e);
00897 rep->exception = e_ObjectAlreadyRegistered ;
00898 }
00899 catch (RegionNotKnown &e) {
00900 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00901 CPY_NOT_NULL(e);
00902 rep->exception = e_RegionNotKnown ;
00903 }
00904 catch (RestoreInProgress &e) {
00905 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00906 CPY_NOT_NULL(e);
00907 rep->exception = e_RestoreInProgress ;
00908 }
00909 catch (RestoreNotRequested &e) {
00910 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00911 CPY_NOT_NULL(e);
00912 rep->exception = e_RestoreNotRequested ;
00913 }
00914 catch (RTIinternalError &e) {
00915 if (e._reason.empty())
00916 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00917 else
00918 D.Out(pdExcept, "Catching \"%s\" exception: %s.", e._name, e._reason.c_str());
00919 CPY_NOT_NULL(e);
00920 rep->exception = e_RTIinternalError ;
00921 }
00922 catch (SaveInProgress &e) {
00923 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00924 CPY_NOT_NULL(e);
00925 rep->exception = e_SaveInProgress ;
00926 }
00927 catch (SaveNotInitiated &e) {
00928 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00929 CPY_NOT_NULL(e);
00930 rep->exception = e_SaveNotInitiated ;
00931 }
00932 catch (SecurityError &e) {
00933 cout << endl << "Security Error : " << e._reason << endl ;
00934 CPY_NOT_NULL(e);
00935 rep->exception = e_SecurityError ;
00936 }
00937 catch (SpaceNotDefined &e) {
00938 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00939 CPY_NOT_NULL(e);
00940 rep->exception = e_SpaceNotDefined ;
00941 }
00942 catch (SpecifiedSaveLabelDoesNotExist &e) {
00943 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00944 CPY_NOT_NULL(e);
00945 rep->exception = e_SpecifiedSaveLabelDoesNotExist ;
00946 }
00947 catch (TimeAdvanceAlreadyInProgress &e) {
00948 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00949 CPY_NOT_NULL(e);
00950 rep->exception = e_TimeAdvanceAlreadyInProgress ;
00951 }
00952 catch (TimeAdvanceWasNotInProgress &e) {
00953 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00954 CPY_NOT_NULL(e);
00955 rep->exception = e_TimeAdvanceWasNotInProgress ;
00956 }
00957 catch (TooManyIDsRequested &e) {
00958 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00959 CPY_NOT_NULL(e);
00960 rep->exception = e_TooManyIDsRequested ;
00961 }
00962 catch (UnableToPerformSave &e) {
00963 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00964 CPY_NOT_NULL(e);
00965 rep->exception = e_UnableToPerformSave ;
00966 }
00967 catch (UnimplementedService &e) {
00968 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00969 CPY_NOT_NULL(e);
00970 rep->exception = e_UnimplementedService ;
00971 }
00972 catch (UnknownLabel &e) {
00973 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00974 CPY_NOT_NULL(e);
00975 rep->exception = e_UnknownLabel ;
00976 }
00977 catch (ValueCountExceeded &e) {
00978 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00979 CPY_NOT_NULL(e);
00980 rep->exception = e_ValueCountExceeded ;
00981 }
00982 catch (ValueLengthExceeded &e) {
00983 D.Out(pdExcept, "Catching \"%s\" exception.", e._name);
00984 CPY_NOT_NULL(e);
00985 rep->exception = e_ValueLengthExceeded ;
00986 }
00987
00988
00989 catch (NetworkError &e) {
00990 strcpy(buffer, " - NetworkError");
00991 auditServer.endLine(rep->exception, buffer);
00992 delete msg;
00993 throw e ;
00994 }
00995
00996 catch (Exception &e) {
00997 D.Out(pdExcept, "Unknown Exception : %s.", e._name);
00998 CPY_NOT_NULL(e);
00999 rep->exception = e_RTIinternalError ;
01000 }
01001
01002
01003
01004 if (strlen(buffer)== 0) {
01005 if (rep->exception == e_NO_EXCEPTION)
01006 strcpy(buffer, " - OK");
01007 else
01008 strcpy(buffer, " - Exception");
01009 }
01010
01011 auditServer.endLine(rep->exception, buffer);
01012 delete msg;
01013 if (link == NULL) return link ;
01014
01015
01016 if (rep->exception != e_NO_EXCEPTION) {
01017 G.Out(pdGendoc," processIncomingMessage ===> write on exception to RTIA");
01018 rep->send(link,NM_msgBufSend);
01019 D.Out(pdExcept,
01020 "RTIG catched exception %d and sent it back to federate %d.",
01021 rep->exception, rep->federate);
01022 }
01023 G.Out(pdGendoc,"exit RTIG::processIncomingMessage");
01024 return link ;
01025 }
01026
01027
01029 void
01030 RTIG::signalHandler(int sig)
01031 {
01032 D.Out(pdError, "Received Signal %d.", sig);
01033
01034 if (sig == SIGINT) terminate = true ;
01035 #ifndef _WIN32
01036 if (sig == SIGPIPE) cout << "Ignoring 'Broken pipe' signal." << endl ;
01037 #endif
01038 }
01039
01040 }}
01041
01042