⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message_rw.cc

📁 分布式仿真 开放源码
💻 CC
📖 第 1 页 / 共 3 页
字号:
// ----------------------------------------------------------------------------// 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: Message_RW.cc,v 3.18 2004/01/09 16:09:55 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "Message.hh"#include <cassert>using std::vector ;namespace certi {static pdCDebug D("MESSAGE", __FILE__);// You can comment this out if you don't want to optimize network messages.#define USE_HEADER_AND_BODY// ----------------------------------------------------------------------------//! Read NetworkMessage Objects from Socket objects.voidMessage::read(SocketUN *socket)    throw (NetworkError, NetworkSignal){#ifdef USE_HEADER_AND_BODY    bool has_body = readHeader(socket);    if (has_body) readBody(socket);#else#error        socket->receive((void *) this, sizeof(Message));#endif}// ----------------------------------------------------------------------------//! Read a Message Body from a Socket, should be called after ReadHeader.voidMessage::readBody(SocketUN *socket){    assert(header.bodySize > 0);    MessageBody Body(header.bodySize);    // 1. Read Body from socket.    socket->receive((void *) Body.getBuffer(), header.bodySize);    // 3. Read informations from Message Body according to message type.    if (header.exception != e_NO_EXCEPTION) {        Body.readString(exceptionReason, MAX_EXCEPTION_REASON_LENGTH);    }    else {        // 1- Prepare Body Structure according to Message Type        switch(header.type) {            // --- No Variable Part, Body not empty ---          case CREATE_FEDERATION_EXECUTION:          case DESTROY_FEDERATION_EXECUTION:            readFederationName(&Body);            break ;          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:          case ANNOUNCE_SYNCHRONIZATION_POINT:          case REQUEST_FEDERATION_RESTORE_FAILED:            readLabel(&Body);            readTag(&Body);            break ;          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:          case SYNCHRONIZATION_POINT_ACHIEVED:          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 IS_ATTRIBUTE_OWNED_BY_FEDERATE:          case QUERY_ATTRIBUTE_OWNERSHIP:            // B.c. Objectid, AttribHandle and Tag.            object = Body.readLongInt();            attribute = Body.readShortInt();            readTag(&Body);            break ;          case ATTRIBUTE_IS_NOT_OWNED:          case INFORM_ATTRIBUTE_OWNERSHIP:            object = Body.readLongInt();            attribute = Body.readShortInt();            federate = Body.readShortInt();            break ;          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:          case ATTRIBUTE_OWNERSHIP_ACQUISITION:          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:            object = Body.readLongInt();            handleArraySize = Body.readShortInt();            readHandleArray(&Body);            readTag(&Body);            break ;          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          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();            readHandleArray(&Body);            break ;	  case DDM_ASSOCIATE_REGION:	    object = Body.readLongInt();	    region = Body.readLongInt();	    boolean = Boolean(Body.readShortInt());	    handleArraySize = Body.readShortInt();            readHandleArray(&Body);	    break ;	  case DDM_SUBSCRIBE_ATTRIBUTES:	    objectClass = Body.readLongInt();	    region = Body.readLongInt();	    boolean = Boolean(Body.readShortInt());	    handleArraySize = Body.readShortInt();            readHandleArray(&Body);	    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 ;	              case GET_ATTRIBUTE_SPACE_HANDLE:            objectClass = Body.readLongInt();            attribute = Body.readLongInt();            space = Body.readLongInt();            break ;          case DDM_CREATE_REGION:            space = Body.readLongInt();            number = Body.readLongInt();            region = Body.readLongInt();            break ;          case GET_INTERACTION_SPACE_HANDLE:            interactionClass = Body.readLongInt();            space = Body.readLongInt();            break ;            // --- MessageJ_R_Struct --          case JOIN_FEDERATION_EXECUTION:            readFederationName(&Body);            readFederateName(&Body);            break ;            // --- MessageO_I_Struct ---          case PUBLISH_OBJECT_CLASS:          case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTES:            readHandleArray(&Body);            break ;          case REGISTER_OBJECT_INSTANCE:            object = Body.readLongInt();            readName(&Body);            break ;          case UPDATE_ATTRIBUTE_VALUES:          case REFLECT_ATTRIBUTE_VALUES:            // B.c. object, Tag, HandleArray[], ValueArray[] and RAction.            object = Body.readLongInt();            readTag(&Body);            readHandleArray(&Body);            readValueArray(&Body);            readResignAction(&Body);            break ;          case DISCOVER_OBJECT_INSTANCE:          case DELETE_OBJECT_INSTANCE:          case REMOVE_OBJECT_INSTANCE:            // B.c. object, Tag, Label, RAction            object = Body.readLongInt();            readTag(&Body);            readName(&Body); /*FAYET 25.07.01*/            readLabel(&Body);            readResignAction(&Body);            break ;          case GET_OBJECT_CLASS_HANDLE:          case GET_OBJECT_CLASS_NAME:          case GET_ATTRIBUTE_HANDLE:          case GET_ATTRIBUTE_NAME:            // B.c. Name(and attribute)            readName(&Body);            attribute = Body.readShortInt();            break ;          case GET_SPACE_HANDLE:          case GET_SPACE_NAME:            this->readName(&Body);            this->space = Body.readLongInt();            break ;          case GET_DIMENSION_HANDLE:          case GET_DIMENSION_NAME:            this->readName(&Body);            this->dimension = Body.readLongInt();            this->space = Body.readLongInt();            break ;          case SEND_INTERACTION:          case RECEIVE_INTERACTION:            // B.c. Tag, HandleArray[], ValueArray[], RAction            readTag(&Body);            readHandleArray(&Body);            readValueArray(&Body);            readResignAction(&Body);            break ;          case GET_INTERACTION_CLASS_HANDLE:          case GET_INTERACTION_CLASS_NAME:          case GET_PARAMETER_HANDLE:          case GET_PARAMETER_NAME:            // Body contains Name and ParamHandle            readName(&Body);            parameter = Body.readShortInt();            break ;            // --- MessageT_O_Struct, Body not empty ---          case CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:          case CHANGE_ATTRIBUTE_ORDER_TYPE:            // B.c. object, HandleArray            object = Body.readLongInt();            readHandleArray(&Body);            break ;	  case DDM_MODIFY_REGION:	    readExtents(Body);	    break ;	                // -- Default Handler --          default:            D.Out(pdExcept, "Unknown Type %d in ReadBody.", header.type);            throw RTIinternalError("Message: Unknown Type for Body(Read).");        }    }}// ----------------------------------------------------------------------------/*! Read a Header from a socket, and process it to read its content. Return  RTI_TRUE if the ReadBody Method has to be called.*/boolMessage::readHeader(SocketUN *socket){    // 1- Read Header from Socket    socket->receive((void *) &header, sizeof(MessageHeader));    // 2- Parse Header(Static Part)    type = header.type ;    exception = header.exception ;    // If the message carry an exception, the Body will only contain the    // exception reason.    if (exception != e_NO_EXCEPTION)        return true ;    // 2- Parse Header according to its type(Variable Part)    // NULL, UAV and SendInteraction are the most common ones.    switch(type) {        // --- No Variable Part, Body not empty ---      case CREATE_FEDERATION_EXECUTION: // Body contains NomFederation      case DESTROY_FEDERATION_EXECUTION: // Body contains NomFedere      case REGISTER_FEDERATION_SYNCHRONIZATION_POINT: // Body contains Label      case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:      case ANNOUNCE_SYNCHRONIZATION_POINT:      case SYNCHRONIZATION_POINT_ACHIEVED: // Body contains Label      case FEDERATION_SYNCHRONIZED:      case INITIATE_FEDERATE_SAVE:      case IS_ATTRIBUTE_OWNED_BY_FEDERATE:// B.c. object, attribute and Tag.      case QUERY_ATTRIBUTE_OWNERSHIP: // B.c. object and attribute.      case ATTRIBUTE_IS_NOT_OWNED:      case INFORM_ATTRIBUTE_OWNERSHIP:      case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:      case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:      case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:      case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:      case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:      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 GET_ATTRIBUTE_SPACE_HANDLE:      case GET_INTERACTION_SPACE_HANDLE:      case DDM_CREATE_REGION:      case REQUEST_FEDERATION_RESTORE:      case REQUEST_FEDERATION_RESTORE_SUCCEEDED:      case REQUEST_FEDERATION_RESTORE_FAILED:      case FEDERATE_RESTORE_COMPLETE:      case FEDERATE_RESTORE_NOT_COMPLETE:      case FEDERATION_RESTORED:      case FEDERATION_NOT_RESTORED:      case FEDERATION_RESTORE_BEGUN:      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 ;        // --- MessageJ_R_Struct --      case RESIGN_FEDERATION_EXECUTION: // No Body        resignAction = header.VP.J_R.action ;        break ;      case INITIATE_FEDERATE_RESTORE:      case JOIN_FEDERATION_EXECUTION: // Body contains NomFederation&NomFedere        federate = header.VP.J_R.federate ;        break ;        // --- MessageO_I_Struct, No Body ---      case UNPUBLISH_OBJECT_CLASS:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -