📄 #rtig_processing.cc#
字号:
// -*- mode:C++ ; tab-width:4 ; c-basic-offset:4 ; indent-tabs-mode:nil -*-// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003 ONERA//// This file is part of CERTI//// CERTI is free software ; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation ; either version 2 of the License, or// (at your option) any later version.//// CERTI is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY ; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program ; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//// $Id: RTIG_processing.cc,v 3.7 2003/03/21 15:06:46 breholee Exp $// ----------------------------------------------------------------------------#include "RTIG.hh"namespace certi {namespace rtig {static pdCDebug D("RTIG", "(RTIG)- ");// ----------------------------------------------------------------------------//! Creates a new federation.voidRTIG::processCreateFederation(Socket *link, NetworkMessage *req){ char *federation = req->federationName ; if (federation == NULL) throw RTIinternalError("Invalid Federation Name."); auditServer->addToLinef("Federation Name : %s", federation);#ifdef FEDERATION_USES_MULTICAST // multicast base address unsigned long base_adr_mc = inet_addr(ADRESSE_MULTICAST); SocketMC *com_mc = NULL ; // creer la communication multicast com_mc = new SocketMC(); if (com_mc == NULL) { D.Out(pdExcept, "Unable to allocate Multicast socket."); throw RTIinternalError("Unable to allocate Multicast socket."); } com_mc->CreerSocketMC(base_adr_mc + nextFederationHandle, MC_PORT); // inserer la nouvelle federation dans la liste des federations federations->createFederation(federation, nextFederationHandle, com_mc); // inserer descripteur fichier pour le prochain appel a un select ClientSockets.push_front(com_mc);#else federations->createFederation(federation, nextFederationHandle);#endif nextFederationHandle++ ; // Prepare answer for RTIA NetworkMessage rep ; rep.type = m_CREATE_FEDERATION_EXECUTION ; rep.exception = e_NO_EXCEPTION ; rep.federation = nextFederationHandle ; rep.write(link); // Send answer to RTIA D.Out(pdInit, "Federation \"%s\" created with Handle %d.", federation, rep.federation);}// ----------------------------------------------------------------------------//! Add a new federate to federation.voidRTIG::processJoinFederation(Socket *link, NetworkMessage *req){ char *federation = req->federationName ; char *federate = req->federateName ; unsigned int peer = req->bestEffortPeer ; unsigned long address = req->bestEffortAddress ; FederationHandle num_federation ; FederateHandle num_federe ; int nb_regulateurs ; int nb_federes ; bool pause ; if ((federation == NULL) || (federate == NULL)) throw RTIinternalError("Invalid Federation/Federate Name."); auditServer->addToLinef("Federate \"%s\" joins Federation \"%s\"", federate, federation); federations->exists(federation, num_federation); num_federe = federations->addFederate(num_federation, federate, (SecureTCPSocket *) link);#ifdef FEDERATION_USES_MULTICAST SocketMC *com_mc = NULL ; federations->info(num_federation, nb_federes, nb_regulateurs, pause, com_mc); assert(com_mc != NULL);#else federations->info(num_federation, nb_federes, nb_regulateurs, pause);#endif // Store Federate <->Socket reference. socketServer->setReferences(link->returnSocket(), num_federation, num_federe, address, peer); auditServer->addToLinef("(%d)with handle %d. Socket %d", num_federation, num_federe, link->returnSocket()); // Prepare answer NetworkMessage rep ; rep.type = m_JOIN_FEDERATION_EXECUTION ; rep.exception = e_NO_EXCEPTION ; rep.federate = num_federe ; rep.federation = num_federation ; rep.numberOfRegulators = nb_regulateurs ; rep.bestEffortPeer = peer ; rep.bestEffortAddress = address ;#ifdef FEDERATION_USES_MULTICAST rep.AdresseMulticast = com_mc->returnAdress();#endif D.Out(pdInit, "Federate \"%s\" has joined Federation %u under handle %u.", federate, num_federation, num_federe); // Send answer rep.write(link);}// ----------------------------------------------------------------------------//! Removes a federate from federation.voidRTIG::processResignFederation(FederationHandle federation, FederateHandle federe){ federations->remove(federation, federe); D.Out(pdInit, "Federate %u is resigning from federation %u.", federe, federation);}// ----------------------------------------------------------------------------//! Removes a federation.voidRTIG::processDestroyFederation(Socket *link, NetworkMessage *req){ FederationHandle num_federation ; char *federation = req->federationName ; if (federation == NULL) throw RTIinternalError("Invalid Federation Name."); auditServer->addToLinef("Name \"%s\"", federation); federations->exists(federation, num_federation); federations->destroyFederation(num_federation); D.Out(pdInit, "Federation \"%s\" has been destroyed.", federation); NetworkMessage rep ; rep.type = m_DESTROY_FEDERATION_EXECUTION ; rep.exception = e_NO_EXCEPTION ; rep.federate = req->federate ; rep.write(link);}// ----------------------------------------------------------------------------//! Put federate as time regulating.voidRTIG::processSetTimeRegulating(NetworkMessage *msg){ if (msg->regulator) { auditServer->addToLinef("ON at time %f", msg->date); federations->createRegulator(msg->federation, msg->federate, msg->date); D.Out(pdTerm, "Federate %u of Federation %u sets TimeRegulation ON.", msg->federate, msg->federation); } else { auditServer->addToLine("OFF"); federations->removeRegulator(msg->federation, msg->federate); D.Out(pdTerm, "Federate %u of Federation %u sets TimeRegulation OFF.", msg->federate, msg->federation); }}// ----------------------------------------------------------------------------//! Put federate as time constrainedvoidRTIG::processSetTimeConstrained(NetworkMessage *msg){ if (msg->constrained) { auditServer->addToLinef("ON at time %f", msg->date); federations->addConstrained(msg->federation, msg->federate); D.Out(pdTerm, "Federate %u of Federation %u is now constrained.", msg->federate, msg->federation); } else { auditServer->addToLine("OFF"); federations->removeConstrained(msg->federation, msg->federate); D.Out(pdTerm, "Federate %u of Federation %u is no more constrained.", msg->federate, msg->federation); }}// ----------------------------------------------------------------------------//! processMessageNull.voidRTIG::processMessageNull(NetworkMessage *msg){ auditServer->addToLinef("Date %f", msg->date); // Catch all exceptions because RTIA does not expect an answer anyway. try { federations->updateRegulator(msg->federation, msg->federate, msg->date); } catch (Exception &e) {}}// ----------------------------------------------------------------------------//! processRegisterSynchronization.void RTIG::processRegisterSynchronization(Socket *link, NetworkMessage *req){ D.Out(pdTrace,"Call addToLinef"); auditServer->addToLinef("Label \"%s\" registered. Tag is \"%s\"", req->label, req->tag); D.Out(pdTrace,"Call manageSynchronization"); federations->manageSynchronization(req->federation, req->federate, true, req->label, req->tag); D.Out(pdTrace,"End of manageSynchronization"); D.Out(pdTerm, "Federation %u is now synchronizing.", req->federation); // send synchronizationPointRegistrationSucceeded() to federate. NetworkMessage rep; rep.type = m_SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED; rep.federate = req->federate ; rep.federation = req->federation ; rep.setLabel(req->label); rep.write(link); federations->broadcastSynchronization(req->federation, req->federate, req->label, req->tag);}// ----------------------------------------------------------------------------//! processSynchronizationAchieved.void RTIG::processSynchronizationAchieved(Socket *link, NetworkMessage *req){ auditServer->addToLinef("Label \"%s\" ended.", req->label); federations->manageSynchronization(req->federation, req->federate, false, req->label, ""); D.Out(pdTerm, "Federate %u has synchronized.", req->federate);}// ----------------------------------------------------------------------------// processPublishObjectClassvoidRTIG::processPublishObjectClass(Socket *link, NetworkMessage *req){ bool pub = (req->type == m_PUBLISH_OBJECT_CLASS); auditServer->addToLinef("Class = %u, # of att. = %u", req->objectClass, req->handleArraySize); federations->publishObject(req->federation, req->federate, req->objectClass, req->handleArray, req->handleArraySize, pub); D.Out(pdRegister, "Federate %u of Federation %u published object class %d.", req->federate, req->federation, req->objectClass); NetworkMessage rep ; rep.type = req->type ; rep.exception = e_NO_EXCEPTION ; rep.federate = req->federate ; rep.objectClass = req->objectClass ; rep.handleArraySize = 0 ; rep.write(link); // send answer to RTIA}// ----------------------------------------------------------------------------// processSubscribeObjectClassvoidRTIG::processSubscribeObjectClass(Socket *link, NetworkMessage *req){ bool sub = (req->type == m_SUBSCRIBE_OBJECT_CLASS); auditServer->addToLinef("Class = %u, # of att. = %u", req->objectClass, req->handleArraySize); federations->subscribeObject(req->federation, req->federate, req->objectClass, req->handleArray, req->handleArraySize, sub); D.Out(pdRegister, "Federate %u of Federation %u subscribed to object class %d.", req->federate, req->federation, req->objectClass); NetworkMessage rep ; rep.type = req->type ; rep.exception = e_NO_EXCEPTION ; rep.federate = req->federate ; rep.objectClass = req->objectClass ; rep.handleArraySize = 0 ; rep.write(link); // send answer to RTIA}// ----------------------------------------------------------------------------// processPublishInteractionClassvoidRTIG::processPublishInteractionClass(Socket *link, NetworkMessage *req){ assert(link != NULL && req != NULL); bool pub = (req->type == m_PUBLISH_INTERACTION_CLASS); auditServer->addToLinef("Class = %u", req->interactionClass); federations->publishInteraction(req->federation, req->federate, req->interactionClass, pub); D.Out(pdRequest, "Federate %u of Federation %u publishes Interaction %d.", req->federate, req->federation, req->interactionClass); NetworkMessage rep ; rep.type = req->type ; rep.exception = e_NO_EXCEPTION ; rep.federate = req->federate ; rep.interactionClass = req->interactionClass ; rep.write(link); // send answer to RTIA}// ----------------------------------------------------------------------------// processSubscribeInteractionClassvoidRTIG::processSubscribeInteractionClass(Socket *link, NetworkMessage *req){ bool sub = (req->type == m_SUBSCRIBE_INTERACTION_CLASS); auditServer->addToLinef("Class = %u", req->interactionClass); federations->subscribeInteraction(req->federation, req->federate, req->interactionClass, sub); D.Out(pdRequest, "Federate %u of Federation %u subscribed to Interaction %d.", req->federate, req->federation, req->interactionClass); NetworkMessage rep ; rep.type = req->type ; rep.exception = e_NO_EXCEPTION ; rep.federate = req->federate ; rep.interactionClass = req->interactionClass ; rep.write(link); // send answer to RTIA}// ----------------------------------------------------------------------------// processRequestIdvoid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -