📄 networkmessage_rw.cc
字号:
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003 ONERA//// This file is part of CERTI-libCERTI//// CERTI-libCERTI is free software ; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License// as published by the Free Software Foundation ; either version 2 of// the License, or (at your option) any later version.//// CERTI-libCERTI 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// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser 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: NetworkMessage_RW.cc,v 3.15 2004/01/09 16:13:49 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "NetworkMessage.hh"#include "PrettyDebug.hh"using std::vector ;namespace certi {static pdCDebug D("MESSAGER", "(messageR) - ");// You can comment this out if you don't want to optimize network messages.#define USE_HEADER_AND_BODY// ----------// -- Read --// ----------voidNetworkMessage::read(Socket *socket) throw (NetworkError, NetworkSignal){#ifdef USE_HEADER_AND_BODY // 1- Read Header bool result = readHeader(socket); // 2- if ReadHeader returned RTI_TRUE, Read Body. if (result) readBody(socket);#else Socket->receive(this, sizeof(NetworkMessage));#endif}// --------------// -- ReadBody --// --------------voidNetworkMessage::readBody(Socket *socket){ MessageBody Body ; unsigned short i ; if (Header.bodySize == 0) throw RTIinternalError("ReadBody should not have been called."); // 1. Read Body from socket. socket->receive((void *) Body.getBuffer(), Header.bodySize); // 3. Read informations from Message Body according to message type. if ((Header.type == UPDATE_ATTRIBUTE_VALUES) || (Header.type == REFLECT_ATTRIBUTE_VALUES)) { object = Body.readLongInt(); readLabel(&Body); Body.readBlock((char *) handleArray, handleArraySize * sizeof(AttributeHandle)); for (i = 0 ; i < handleArraySize ; i ++) { Body.readString(ValueArray[i], MAX_BYTES_PER_VALUE); } } else switch(Header.type) { // -- O_I Variable Part With Date(Body Not Empty) -- case SEND_INTERACTION: case RECEIVE_INTERACTION: readLabel(&Body); Body.readBlock((char *) handleArray, handleArraySize * sizeof(AttributeHandle)); for (i = 0 ; i < handleArraySize ; i ++) { Body.readString(ValueArray[i], MAX_BYTES_PER_VALUE); } break ; case CREATE_FEDERATION_EXECUTION: case DESTROY_FEDERATION_EXECUTION: readFederationName(&Body); break ; case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: case ANNOUNCE_SYNCHRONIZATION_POINT: readLabel(&Body); readTag(&Body); break ; case SYNCHRONIZATION_POINT_ACHIEVED: case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED: case FEDERATION_SYNCHRONIZED: case REQUEST_FEDERATION_SAVE: case INITIATE_FEDERATE_SAVE: case REQUEST_FEDERATION_RESTORE: case REQUEST_FEDERATION_RESTORE_SUCCEEDED: case INITIATE_FEDERATE_RESTORE: readLabel(&Body); break ; case REQUEST_FEDERATION_RESTORE_FAILED: readLabel(&Body); readTag(&Body); break ; case DELETE_OBJECT: case REMOVE_OBJECT: object = Body.readLongInt(); readLabel(&Body); break ; // -- No Variable Part -- case IS_ATTRIBUTE_OWNED_BY_FEDERATE: case INFORM_ATTRIBUTE_OWNERSHIP: case ATTRIBUTE_IS_NOT_OWNED: case QUERY_ATTRIBUTE_OWNERSHIP: object = Body.readLongInt(); handleArray[0] = Body.readShortInt(); readLabel(&Body); break ; case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION: case ATTRIBUTE_OWNERSHIP_ACQUISITION: case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE: object = Body.readLongInt(); handleArraySize = Body.readShortInt(); for (i = 0 ; i < handleArraySize ; i ++) handleArray[i] = Body.readShortInt(); readLabel(&Body); break ; case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE: case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION: case ATTRIBUTE_OWNERSHIP_UNAVAILABLE: case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION: case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE: case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION: case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION: object = Body.readLongInt(); handleArraySize = Body.readShortInt(); for (i = 0 ; i < handleArraySize ; i ++) handleArray[i] = Body.readShortInt(); break ; case DDM_CREATE_REGION: space = Body.readLongInt(); nbExtents = Body.readLongInt(); region = Body.readLongInt(); break ; // -- Join Variable Part -- case JOIN_FEDERATION_EXECUTION: readFederationName(&Body); readFederateName(&Body); break ; // -- O_I Variable Part(Body not empty) -- case PUBLISH_OBJECT_CLASS: case SUBSCRIBE_OBJECT_CLASS: for (i = 0 ; i < handleArraySize ; i ++) handleArray[i] = Body.readShortInt(); break ; case REGISTER_OBJECT: case DISCOVER_OBJECT: object = Body.readLongInt(); readLabel(&Body); break ; case DDM_MODIFY_REGION: readExtents(Body); break ; case DDM_ASSOCIATE_REGION: object = Body.readLongInt(); region = Body.readLongInt(); boolean = Boolean(Body.readShortInt()); handleArraySize = Body.readShortInt(); break ; case DDM_SUBSCRIBE_ATTRIBUTES: objectClass = Body.readLongInt(); region = Body.readLongInt(); boolean = Boolean(Body.readShortInt()); handleArraySize = Body.readShortInt(); for (i = 0 ; i < handleArraySize ; i ++) handleArray[i] = Body.readShortInt(); break ; case DDM_UNASSOCIATE_REGION: object = Body.readLongInt(); region = Body.readLongInt(); break ; case DDM_UNSUBSCRIBE_ATTRIBUTES: object = Body.readLongInt(); region = Body.readLongInt(); break ; case DDM_SUBSCRIBE_INTERACTION: case DDM_UNSUBSCRIBE_INTERACTION: interactionClass = Body.readLongInt(); region = Body.readLongInt(); boolean = Boolean(Body.readShortInt()); break ; // -- Default Handler -- default: D.Out(pdExcept, "Unknown type %d in ReadBody.", Header.type); throw RTIinternalError("Unknown/Unimplemented type for Body."); }}// ----------------// -- ReadHeader --// ----------------boolNetworkMessage::readHeader(Socket *socket){ // 1- Read Header from Socket socket->receive((void *) &Header, sizeof(HeaderStruct)); // 2- Parse Header(Static Part) type = Header.type ; exception = Header.exception ; federate = Header.federate ; federation = Header.federation ; // 2- Parse Header according to its type(Variable Part) // NULL, UAV and SendInteraction are the most common ones. if (type == MESSAGE_NULL) date = Header.VP.time.date ; else if ((type == UPDATE_ATTRIBUTE_VALUES) || (type == REFLECT_ATTRIBUTE_VALUES)) { objectClass = Header.VP.O_I.handle ; handleArraySize = Header.VP.O_I.size ; date = Header.VP.O_I.date ; } else switch (Header.type) { case SEND_INTERACTION: case RECEIVE_INTERACTION: interactionClass = Header.VP.O_I.handle ; handleArraySize = Header.VP.O_I.size ; date = Header.VP.O_I.date ; break ; case REQUEST_FEDERATION_SAVE: date = Header.VP.O_I.date ; break ; case INITIATE_FEDERATE_SAVE: case REQUEST_FEDERATION_RESTORE: case INITIATE_FEDERATE_RESTORE: case REQUEST_FEDERATION_RESTORE_SUCCEEDED: case REQUEST_FEDERATION_RESTORE_FAILED: break ; // -- No Variable Part -- case CREATE_FEDERATION_EXECUTION: case DESTROY_FEDERATION_EXECUTION: case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: case SYNCHRONIZATION_POINT_ACHIEVED: case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED: case FEDERATION_SYNCHRONIZED: case ANNOUNCE_SYNCHRONIZATION_POINT: case DELETE_OBJECT: case REMOVE_OBJECT: case CLOSE_CONNEXION: case RESIGN_FEDERATION_EXECUTION: case IS_ATTRIBUTE_OWNED_BY_FEDERATE: case INFORM_ATTRIBUTE_OWNERSHIP: case ATTRIBUTE_IS_NOT_OWNED: case QUERY_ATTRIBUTE_OWNERSHIP: case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE: case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION: case ATTRIBUTE_OWNERSHIP_UNAVAILABLE: case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION: case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case ATTRIBUTE_OWNERSHIP_ACQUISITION: case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE: case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION: case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE: case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE: case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION: case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION: case DDM_CREATE_REGION: case FEDERATE_RESTORE_COMPLETE: case FEDERATE_RESTORE_NOT_COMPLETE: case FEDERATION_RESTORE_BEGUN: case FEDERATION_RESTORED: case FEDERATION_NOT_RESTORED: case DDM_ASSOCIATE_REGION: case DDM_UNASSOCIATE_REGION: case DDM_SUBSCRIBE_ATTRIBUTES: case DDM_UNSUBSCRIBE_ATTRIBUTES: case DDM_SUBSCRIBE_INTERACTION: case DDM_UNSUBSCRIBE_INTERACTION: break ; // -- time Variable Part(No Body)[Continued]-- case SET_TIME_REGULATING: date = Header.VP.time.date ; regulator = Header.VP.time.R_or_C ; break ; case SET_TIME_CONSTRAINED: date = Header.VP.time.date ; constrained = Header.VP.time.R_or_C ; break ; // -- T_O Variable Part -- case CHANGE_ATTRIBUTE_TRANSPORT_TYPE: case CHANGE_ATTRIBUTE_ORDER_TYPE: case CHANGE_INTERACTION_TRANSPORT_TYPE: case CHANGE_INTERACTION_ORDER_TYPE: throw RTIinternalError("Read Message not implemented for T/O."); break ; // -- Join Variable Part(No Body) -- case JOIN_FEDERATION_EXECUTION: numberOfRegulators = Header.VP.Join.NbReg ; multicastAddress = Header.VP.Join.AdrMC ; bestEffortAddress = Header.VP.Join.Addr ; bestEffortPeer = Header.VP.Join.peer ; break ; // -- O_I Variable Part(No Body) -- case UNPUBLISH_OBJECT_CLASS: case UNSUBSCRIBE_OBJECT_CLASS: objectClass = Header.VP.O_I.handle ; break ; case PUBLISH_INTERACTION_CLASS: case UNPUBLISH_INTERACTION_CLASS: case SUBSCRIBE_INTERACTION_CLASS: case UNSUBSCRIBE_INTERACTION_CLASS: case TURN_INTERACTIONS_ON: case TURN_INTERACTIONS_OFF: interactionClass = Header.VP.O_I.handle ; break ; // DDM variable part case DDM_DELETE_REGION: region = Header.VP.ddm.region ; break ; // -- O_I Variable Part(Body not empty) -- case PUBLISH_OBJECT_CLASS: case SUBSCRIBE_OBJECT_CLASS: objectClass = Header.VP.O_I.handle ; handleArraySize = Header.VP.O_I.size ; break ; case REGISTER_OBJECT: case DISCOVER_OBJECT: objectClass = Header.VP.O_I.handle ; break ; case DDM_MODIFY_REGION: region = Header.VP.ddm.region ; break ; // -- Default Handler -- default: D.Out(pdExcept, "Unknown type %d in ReadHeader.", Header.type); throw RTIinternalError("Received unknown Header type."); } // 4- If Header.bodySize is not 0, return RTI_TRUE, else RTI_FALSE return Header.bodySize ;}// ---------------// -- ReadLabel --// ---------------voidNetworkMessage::readLabel(MessageBody *Body){ Body->readString(label, MAX_USER_TAG_LENGTH);}// ----------------------------------------------------------------------------//! Read the tag contained into the message.void NetworkMessage::readTag(MessageBody *Body){ Body->readString(tag, MAX_USER_TAG_LENGTH);}// ----------------------------------------------------------------------------//! Read the federation name.voidNetworkMessage::readFederationName(MessageBody *Body){ Body->readString(federationName, MAX_FEDERATION_NAME_LENGTH);}// -------------------// -- ReadNomFedere --// -------------------void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -