📄 federationslist.cc
字号:
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003, 2004 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: FederationsList.cc,v 3.23 2004/01/09 16:29:50 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "FederationsList.hh"using std::list ;using std::endl ;namespace certi {namespace rtig {static pdCDebug D("FEDERATIONSLIST", "(ListFede) - ");// ----------------------------------------------------------------------------// ConstructorFederationsList::FederationsList(SocketServer *server, AuditFile *audit) : list<Federation *>(){ if (server == NULL) throw RTIinternalError("FederationsList: No SocketServer was given."); if (audit == NULL) throw RTIinternalError("FederationsList: No AuditServer was given."); socketServer = server ; auditFile = audit ; verbose = false ;}// ----------------------------------------------------------------------------// DestructorFederationsList::~FederationsList(){ if (!empty()) D.Out(pdError, "ListeFederation not empty at destruction time."); for (list<Federation *>::iterator i = begin(); i != end(); i++) { delete(*i); } clear();}// ----------------------------------------------------------------------------//! Adds a constrained federate to federation.voidFederationsList::addConstrained(Handle handle, FederateHandle federate) throw (FederationExecutionDoesNotExist, FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); // It may throw a bunch of exceptions. federation->addConstrained(federate);}// ----------------------------------------------------------------------------/*! Creates a new Federate if its name is unique, and returns its new Federate Handle. Also sends Null messages from all other federates to initialize its LBTS, and finally a RequestPause message if the Federation is already paused.*/FederateHandleFederationsList::addFederate(Handle handle, const char *name, SocketTCP *tcp_link) throw (FederationExecutionDoesNotExist, FederateAlreadyExecutionMember, MemoryExhausted, RTIinternalError){ // It may throw RTIinternalError checkHandle(handle); // It may throw FederationExecutionDoesNotExist Federation *federation = NULL ; searchFederation(handle, federation); // It may raise a bunch of exceptions FederateHandle federate = federation->add(name, tcp_link); return federate ;}// ----------------------------------------------------------------------------// searchFederationintFederationsList::searchFederation(Handle handle, Federation* &federation) throw (FederationExecutionDoesNotExist, RTIinternalError){ federation = NULL ; // It may raise RTIinternalError checkHandle(handle); list<Federation *>::const_iterator i = begin(); for (int j = 1 ; i != end(); i++, j++) { if ((*i)->getHandle() == handle) { federation = (*i); return j ; } } D.Out(pdExcept, "Unknown Federation Handle %d.", handle); throw FederationExecutionDoesNotExist("Bad Federation Handle.");}// ----------------------------------------------------------------------------// createFederation#ifdef FEDERATION_USES_MULTICASTvoid FederationsList::createFederation(const char *name, Handle handle, SocketMC *mc_link)#else void FederationsList::createFederation(const char *name, Handle handle)#endif throw (FederationExecutionAlreadyExists, CouldNotOpenRID, ErrorReadingRID, MemoryExhausted, SecurityError, RTIinternalError){ Federation *federation = NULL ; Handle unused ; // It may throw RTIinternalError checkHandle(handle); auditFile->addToLinef(", Handle : %hu", handle); if (name == NULL) throw RTIinternalError("Invalid Federation Name."); // It should throw FederationExecutionDoesNotExist. try { exists(name, unused); D.Out(pdExcept, "Federation %s already present.", name); throw FederationExecutionAlreadyExists(); } catch (FederationExecutionDoesNotExist &e) { D.Out(pdDebug, "CreerFederation catches FederationExecutionDoesNotExist."); } if (size() >= MAX_FEDERATION) throw RTIinternalError("Too many federation executions.");#ifdef FEDERATION_USES_MULTICAST federation = new Federation(name, handle, socketServer, auditFile, mc_link);#else federation = new Federation(name, handle, socketServer, auditFile);#endif if (federation == NULL) throw MemoryExhausted("No memory left for new Federation."); push_front(federation); D.Out(pdInit, "New Federation created with Handle %d.", handle);}// ----------------------------------------------------------------------------// createRegulatorvoidFederationsList::createRegulator(Handle handle, FederateHandle federate, FederationTime time) throw (FederationExecutionDoesNotExist, FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); // It may throw a bunch of exceptions. federation->addRegulator(federate, time);}// ----------------------------------------------------------------------------// destroyObjectvoidFederationsList::destroyObject(Handle handle, FederateHandle federate, ObjectHandle id, const char *tag) throw (FederateNotExecutionMember, FederationExecutionDoesNotExist, DeletePrivilegeNotHeld, ObjectNotKnown, SaveInProgress, RestoreInProgress, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); federation->deleteObject(federate, id, tag);}// ----------------------------------------------------------------------------/*! Return the Handle of the Federation named "name" if it is found in the FederationList, else throw FederationExecutionDoesNotExist.*/voidFederationsList::exists(const char *name, Handle &handle) throw (FederationExecutionDoesNotExist, RTIinternalError){ if (name == NULL) throw RTIinternalError("Null Federation Name."); for (list<Federation *>::iterator i = begin(); i != end(); i++) { if (!strcmp((*i)->getName(), name)) { handle = (*i)->getHandle(); return ; } } D.Out(pdDebug, "EstPresent throws FederationExecutionDoesNotExist."); throw FederationExecutionDoesNotExist();}// ----------------------------------------------------------------------------// info#ifdef FEDERATION_USES_MULTICASTvoid FederationsList::info(Handle handle, int &nb_federates, int &nb_regulators, bool &is_syncing, SocketMC* &comm_mc)#else void FederationsList::info(Handle handle, int &nb_federates, int &nb_regulators, bool &is_syncing)#endif throw (FederationExecutionDoesNotExist, RTIinternalError){ Federation *federation ; // It may raise RTIinternalError checkHandle(handle); // It may throw FederationExecutionNotFound searchFederation(handle, federation); nb_federates = federation->getNbFederates(); nb_regulators = federation->getNbRegulators(); is_syncing = federation->isSynchronizing();#ifdef FEDERATION_USES_MULTICAST comm_mc = federation->MCLink ;#endif}// ----------------------------------------------------------------------------// registerObjectObjectHandleFederationsList::registerObject(Handle handle, FederateHandle federate, ObjectClassHandle object_class, ObjectName name) throw (FederateNotExecutionMember, FederateNotPublishing, ObjectAlreadyRegistered, ObjectClassNotDefined, ObjectClassNotPublished, SaveInProgress, RestoreInProgress, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); D.Out(pdTrace, "handle = %d, federate = %d.", handle, federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); D.Out(pdTrace, "theObjectClass = %d, name = %s.", object_class, name); return(federation->registerObject(federate, object_class, name));}// ----------------------------------------------------------------------------// checkHandle/*! handle can be any type of handle, not only a Federation handle. Throw an exception if Handle is not correct(too low or too big)*/voidFederationsList::checkHandle(Handle handle) throw (RTIinternalError){ if (handle <= 0) { D.Out(pdExcept, "Illegal Handle %d.", handle); throw RTIinternalError("Negative or null Handle."); }}// ----------------------------------------------------------------------------// updateRegulatorvoidFederationsList::updateRegulator(Handle handle, FederateHandle federate, FederationTime time) throw (FederationExecutionDoesNotExist, FederateNotExecutionMember, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); federation->updateRegulator(federate, time);}// ----------------------------------------------------------------------------// updateAttributevoidFederationsList::updateAttribute(Handle handle, FederateHandle federate, ObjectHandle id, AttributeHandle *attributes, AttributeValue *values, UShort list_size, FederationTime time, const char *tag) throw (FederateNotExecutionMember, FederationExecutionDoesNotExist, ObjectNotKnown, AttributeNotDefined, AttributeNotOwned, SaveInProgress, RestoreInProgress, RTIinternalError){ Federation *federation = NULL ; // It may throw RTIinternalError. checkHandle(handle); checkHandle(federate); // It may throw FederationExecutionDoesNotExist. searchFederation(handle, federation); federation->updateAttributeValues(federate, id, attributes, values, list_size, time, tag);}// ----------------------------------------------------------------------------// updateParametervoidFederationsList::updateParameter(Handle handle, FederateHandle federate, InteractionClassHandle interaction, ParameterHandle *parameters, ParameterValue *values, UShort list_size, FederationTime time, const char *tag) throw (FederateNotExecutionMember, FederateNotPublishing, FederationExecutionDoesNotExist, InteractionClassNotDefined, InteractionParameterNotDefined, SaveInProgress, RestoreInProgress,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -