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

📄 message_rw.cc

📁 certi-SHM-3.0.tar 不错的开源的分布式方针软件 大家多多支持 他是linux
💻 CC
📖 第 1 页 / 共 2 页
字号:
// -*- 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-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.7 2003/03/21 15:06:46 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "Message.hh"namespace certi {static pdCDebug D("MESSAGE", "(Message_RW) ");// 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    Boolean Result ;    // 1- Read Header    Result = readHeader(socket);          // 2- if ReadHeader returned RTI_TRUE, Read Body.    if (Result == RTI_TRUE)        readBody(socket);#else    socket->receive((void *) this, sizeof(Message));#endif}// ---------------------------------------------------------------------------//! Read a Message Body from a Socket, should be called after ReadHeader.voidMessage::readBody(SocketUN *socket){    MessageBody Body ;    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.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:            readLabel(&Body);            readTag(&Body);            break ;        case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:        case SYNCHRONIZATION_POINT_ACHIEVED:        case FEDERATION_SYNCHRONIZED:            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:            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 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();            readHandleArray(&Body);            break ;            // --- MessageJ_R_Struct --        case JOIN_FEDERATION_EXECUTION:            readFederationName(&Body);            readFederateName(&Body);            break ;            // --- MessageO_I_Struct ---        case PUBLISH_OBJECT_CLASS:        case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTE:            readHandleArray(&Body);            break ;        case REGISTER_OBJECT:            object = Body.readLongInt();            readName(&Body); /*FAYET 25.07.01*/            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:        case DELETE_OBJECT:        case REMOVE_OBJECT:            // 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_TRANSPORT_TYPE:        case CHANGE_ATTRIBUTE_ORDER_TYPE:            // B.c. object, HandleArray            object = Body.readLongInt();            readHandleArray(&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.*/BooleanMessage::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 RTI_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 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:        break ;        // --- MessageJ_R_Struct --    case RESIGN_FEDERATION_EXECUTION: // No Body        resignAction = header.VP.J_R.action ;        break ;    case JOIN_FEDERATION_EXECUTION: // Body contains NomFederation&NomFedere        federate = header.VP.J_R.federate ;        break ;        // --- MessageO_I_Struct, No Body ---    case UNPUBLISH_OBJECT_CLASS:    case UNSUBSCRIBE_OBJECT_CLASS_ATTRIBUTE:        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 ;        // --- MessageO_I_Struct, Body not Empty ---    case PUBLISH_OBJECT_CLASS: // Body contains HandleArray    case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTE: // Body contains HandleArray    case REGISTER_OBJECT: // Body contains object    case UPDATE_ATTRIBUTE_VALUES: // B.c. object, Tag, HandleArray[]        // ValueArray[] and resignAction.    case DISCOVER_OBJECT: // B.c. object, Tag and resignAction    case REFLECT_ATTRIBUTE_VALUES: // B.c. object, Tag, HandleArray[]        // and ValueArray[]    case DELETE_OBJECT: // Body contains object, Tag.    case REMOVE_OBJECT: // B.c. object, Tag, Label&resignAction    case GET_OBJECT_CLASS_HANDLE: // Body contains Name    case GET_OBJECT_CLASS_NAME: // Body contains Name    case GET_ATTRIBUTE_HANDLE: // B.c. Name and attribute.    case GET_ATTRIBUTE_NAME: // B.c. Name and attribute.        objectClass = header.VP.O_I.handle ;        handleArraySize = header.VP.O_I.size ;        date = header.VP.O_I.date ;        break ;    case SEND_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[]    case RECEIVE_INTERACTION: // B.c. Tag, HandleArray[], ValueArray[], resignAction    case GET_INTERACTION_CLASS_HANDLE: // Body contains Name    case GET_INTERACTION_CLASS_NAME: // Body contains Name    case GET_PARAMETER_HANDLE: // Body contains Name and parameter    case GET_PARAMETER_NAME: // Body contains Name and parameter        interactionClass = header.VP.O_I.handle ;        handleArraySize = header.VP.O_I.size ;        date = header.VP.O_I.date ;        break ;    case GET_SPACE_HANDLE:    case GET_SPACE_NAME:    case GET_DIMENSION_NAME:    case GET_DIMENSION_HANDLE:        this->space = header.VP.O_I.handle ;        handleArraySize = header.VP.O_I.size ;        date = header.VP.O_I.date ;        break ;        // --- ReqIDStruct, No Body ---    case REQUEST_ID:        idCount = header.VP.ReqID.count ;        firstId = header.VP.ReqID.first ;        lastId = header.VP.ReqID.last ;        break ;        // --- MessageT_O_Struct, No Body ---    case CHANGE_INTERACTION_TRANSPORT_TYPE:    case CHANGE_INTERACTION_ORDER_TYPE:        interactionClass = header.VP.T_O.handle ;        transport = header.VP.T_O.transport ;        order = header.VP.T_O.order ;        break ;        // --- MessageT_O_Struct, Body not empty ---    case CHANGE_ATTRIBUTE_TRANSPORT_TYPE: // B.c. object, HandleArray.    case CHANGE_ATTRIBUTE_ORDER_TYPE: // B.c. object, HandleArray.        handleArraySize = header.VP.T_O.size ;        transport = header.VP.T_O.transport ;        order = header.VP.T_O.order ;        break ;        // --- TimeStruct, No Body ---    case REQUEST_FEDERATION_TIME:    case REQUEST_LBTS:    case REQUEST_FEDERATE_TIME:    case TIME_ADVANCE_REQUEST:    case NEXT_EVENT_REQUEST:    case TIME_ADVANCE_GRANT:        date = header.VP.time.date ;        break ;    case SET_LOOKAHEAD:    case REQUEST_LOOKAHEAD:        lookahead = header.VP.time.date ;        break ;    case SET_TIME_REGULATING:    case SET_TIME_CONSTRAINED:    case TICK_REQUEST:        boolean = header.VP.time.mode ;        break ;        // -- Default Handler --    default:        D.Out(pdExcept, "Unknown type %d in ReadHeader.", header.type);        throw RTIinternalError("Message: Received unknown Header type.");    }    // 4- If Header.bodySize is not 0, return RTI_TRUE, else RTI_FALSE    if (header.bodySize == 0)        return RTI_FALSE ;    else        return RTI_TRUE ;}// ---------------// -- ReadLabel --// ---------------voidMessage::readHandleArray(MessageBody *Body){    Body->readBlock((char *) handleArray,                    handleArraySize * sizeof(AttributeHandle));}// ---------------// -- ReadLabel --// ---------------voidMessage::readLabel(MessageBody *Body){    Body->readString(label, MAX_USER_TAG_LENGTH);}// --------------// -- ReadName --// --------------voidMessage::readName(MessageBody *Body){    Body->readString(name, MAX_USER_TAG_LENGTH);}// -----------------------// -- ReadNomFederation --// -----------------------voidMessage::readFederationName(MessageBody *Body){    Body->readString(federationName, MAX_FEDERATION_NAME_LENGTH);}// -------------------// -- ReadNomFedere --// -------------------voidMessage::readFederateName(MessageBody *Body){    Body->readString(federateName, MAX_FEDERATE_NAME_LENGTH);}// ---------------------// -- ReadresignAction --// ---------------------voidMessage::readResignAction(MessageBody*){

⌨️ 快捷键说明

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