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

📄 message_rw.cc

📁 certi-SHM-3.0.tar 不错的开源的分布式方针软件 大家多多支持 他是linux
💻 CC
📖 第 1 页 / 共 2 页
字号:
    // BUG: Should do something.}// -------------// -- ReadTag --// -------------voidMessage::readTag(MessageBody *Body){    Body->readString(tag, MAX_USER_TAG_LENGTH);}// --------------------// -- ReadValueArray --// --------------------voidMessage::readValueArray(MessageBody *Body){    for (int i = 0 ; i < handleArraySize ; i ++) {        Body->readString(valueArray[i], MAX_BYTES_PER_VALUE);    }}// ---------------------------------------------------------------------------//! Write NetworkMessage Objects to Socket objects.voidMessage::write(SocketUN *socket)    throw (NetworkError, NetworkSignal){#ifdef USE_HEADER_AND_BODY    bool result ;    result = writeHeader(socket);    if (result)        writeBody(socket);#else    socket->send((void *) this, sizeof(Message));#endif}// ---------------------------------------------------------------------------/*! Prepare and write a Body to a socket, should be called after WriteHeader.    The message is written onto the socket by WriteHeader if no body is    required, or by WriteBody is a body has been required by WriteHeader.*/voidMessage::writeBody(SocketUN *socket){    MessageBody Body ;    // 0- Copy the Header at the beginning of the Body, in order to    // make a single Socket->Emettre call while sending both.    // WARNING: As the Body size is not known yet, we will have to    // change it in the copy also!    Body.writeBlock((char *) &header, sizeof(MessageHeader));    // If the message carry an exception, the Body will only contain the    // exception reason.    if (header.exception != e_NO_EXCEPTION) {        Body.writeString(exceptionReason);    }    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:            Body.writeString(federationName);            break ;        case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:        case ANNOUNCE_SYNCHRONIZATION_POINT:            Body.writeString(label);            Body.writeString(tag);            break ;        case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:        case SYNCHRONIZATION_POINT_ACHIEVED:        case FEDERATION_SYNCHRONIZED:            Body.writeString(label);            break ;        case IS_ATTRIBUTE_OWNED_BY_FEDERATE:        case QUERY_ATTRIBUTE_OWNERSHIP:            // B.c. object, attribute, Tag            Body.writeLongInt(object);            Body.writeShortInt(attribute);            Body.writeString(tag);            break ;        case ATTRIBUTE_IS_NOT_OWNED:        case INFORM_ATTRIBUTE_OWNERSHIP:            Body.writeLongInt(object);            Body.writeShortInt(attribute);            Body.writeShortInt(federate);            break ;        case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:        case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:        case ATTRIBUTE_OWNERSHIP_ACQUISITION:        case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:            Body.writeLongInt(object);            Body.writeShortInt(handleArraySize);            writeHandleArray(&Body);            Body.writeString(tag);            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:            Body.writeLongInt(object);            Body.writeShortInt(handleArraySize);            writeHandleArray(&Body);            break ;            // --- MessageJ_R_Struct --        case JOIN_FEDERATION_EXECUTION:            Body.writeString(federationName);            Body.writeString(federateName);            break ;            // --- MessageO_I_Struct ---        case PUBLISH_OBJECT_CLASS:        case SUBSCRIBE_OBJECT_CLASS_ATTRIBUTE:            writeHandleArray(&Body);            break ;        case REGISTER_OBJECT:            Body.writeLongInt(object);            Body.writeString(name);            break ;        case UPDATE_ATTRIBUTE_VALUES:        case REFLECT_ATTRIBUTE_VALUES:            // B.c. object, Tag, handleArray[], ValueArray[] and resignAction.            Body.writeLongInt(object);            Body.writeString(tag);            writeHandleArray(&Body);            writeValueArray(&Body);            writeResignAction(&Body);            break ;        case DISCOVER_OBJECT:        case DELETE_OBJECT:        case REMOVE_OBJECT:            // B.c. object, Tag, label, resignAction            Body.writeLongInt(object);            Body.writeString(tag);            Body.writeString(name); /*FAYET 25.07.01*/            Body.writeString(label);            writeResignAction(&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)            Body.writeString(name);            Body.writeShortInt(attribute);            break ;        case GET_SPACE_HANDLE:        case GET_SPACE_NAME:            Body.writeString(name);            Body.writeLongInt(space);            break ;        case GET_DIMENSION_HANDLE:        case GET_DIMENSION_NAME:            Body.writeString(name);            Body.writeLongInt(dimension);            Body.writeLongInt(space);            break ;        case SEND_INTERACTION:        case RECEIVE_INTERACTION:            // B.c. Tag, HandleArray[], ValueArray[], resignAction            Body.writeString(tag);            writeHandleArray(&Body);            writeValueArray(&Body);            writeResignAction(&Body);            break ;        case GET_INTERACTION_CLASS_HANDLE:        case GET_INTERACTION_CLASS_NAME:        case GET_PARAMETER_HANDLE:        case GET_PARAMETER_NAME:            // Body contains name and parameter            Body.writeString(name);            Body.writeShortInt(parameter);            break ;            // --- MessageT_O_Struct, Body not empty ---        case CHANGE_ATTRIBUTE_TRANSPORT_TYPE:        case CHANGE_ATTRIBUTE_ORDER_TYPE:            // B.c. object, HandleArray            Body.writeLongInt(object);            writeHandleArray(&Body);            break ;            // -- Default Handler --        default:            D.Out(pdExcept, "Unknown type %d in WriteBody.", header.type);            throw RTIinternalError("Message: Unknown type for Body.");        }    }    // 2- Set Header.bodySize    // Body Size does not include the copy of the Header!    header.bodySize = Body.getLength() - sizeof(MessageHeader);    // Put the real Body Size in the copy of the Header.    ((MessageHeader *) Body.getBuffer())->bodySize = header.bodySize ;    // 3- Write Header to socket, then write Body to socket.    // socket->send((void *) &Header, sizeof(MessageHeader));    socket->send((void *) Body.getBuffer(), Body.getLength());}// ----------------------// -- WriteHandleArray --// ----------------------void Message::writeHandleArray(MessageBody *Body){    Body->writeBlock((char *) handleArray,                     handleArraySize * sizeof(AttributeHandle));}// ---------------------------------------------------------------------------/*! Prepare and Write a Header to a Socket, and return RTI_TRUE if the    WriteBody method has to be called.    The message is written onto the socket by WriteHeader if no body is    required, or by WriteBody is a body has been required by WriteHeader.*/boolMessage::writeHeader(SocketUN *socket){    // 1- Clear Header    memset((void *) &header, '\0', sizeof(MessageHeader));    // 2- Fill Header(Static Part)    header.type = this->type ;    header.exception = this->exception ;    // If the message carry an exception, the Body will only contain the    // exception reason.    if (exception != e_NO_EXCEPTION) {        header.bodySize = 1 ;        return true ;    }    // 3- Fill Header(Variable Part)[Sorted by Variable part type]    // Note: Header.bodySize is not set to the actual Body size, but    // to zero to indicate there is no Body, or 1 if a Body is needed.    switch(this->type) {        // --- No Variable Part, Body not empty ---    case CREATE_FEDERATION_EXECUTION: // Body contains federationName    case DESTROY_FEDERATION_EXECUTION: // Body contains federationName    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:        header.bodySize = 1 ;        break ;        // --- MessageJ_R_Struct --    case RESIGN_FEDERATION_EXECUTION: // No Body        header.VP.J_R.action = resignAction ;        header.bodySize = 0 ;        break ;    case JOIN_FEDERATION_EXECUTION: // Body contains federationName&federateName        header.VP.J_R.federate = federate ;        header.bodySize = 1 ;        break ;        // --- MessageO_I_Struct, No Body ---    case UNPUBLISH_OBJECT_CLASS:    case UNSUBSCRIBE_OBJECT_CLASS_ATTRIBUTE:        header.VP.O_I.handle = this->objectClass ;        header.bodySize = 0 ;        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:        header.VP.O_I.handle = this->interactionClass ;        header.bodySize = 0 ;        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.        header.VP.O_I.handle = objectClass ;        header.VP.O_I.size = handleArraySize ;        header.VP.O_I.date = date ;        header.bodySize = 1 ;        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        header.VP.O_I.handle = interactionClass ;        header.VP.O_I.size = handleArraySize ;        header.VP.O_I.date = date ;        header.bodySize = 1 ;        break ;    case GET_SPACE_HANDLE:    case GET_SPACE_NAME:    case GET_DIMENSION_HANDLE:    case GET_DIMENSION_NAME:        header.VP.O_I.handle = space ;        header.VP.O_I.size = handleArraySize ;        header.VP.O_I.date = date ;        header.bodySize = 1 ;        break ;        // --- ReqIDStruct, No Body ---    case REQUEST_ID:        header.VP.ReqID.count = idCount ;        header.VP.ReqID.first = firstId ;        header.VP.ReqID.last = lastId ;        header.bodySize = 0 ;        break ;        // --- MessageT_O_Struct, No Body ---    case CHANGE_INTERACTION_TRANSPORT_TYPE:    case CHANGE_INTERACTION_ORDER_TYPE:        header.VP.T_O.handle = interactionClass ;        header.VP.T_O.transport = transport ;        header.VP.T_O.order = order ;        header.bodySize = 0 ;        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.        header.VP.T_O.size = handleArraySize ;        header.VP.T_O.transport = transport ;        header.VP.T_O.order = order ;        header.bodySize = 1 ;        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:        header.VP.time.date = date ;        header.bodySize = 0 ;        break ;    case SET_LOOKAHEAD:    case REQUEST_LOOKAHEAD:        header.VP.time.date = lookahead ;        header.bodySize = 0 ;        break ;    case SET_TIME_REGULATING:    case SET_TIME_CONSTRAINED:    case TICK_REQUEST:        header.VP.time.mode = boolean ;        header.bodySize = 0 ;        break ;        // -- Default Handler --    default:        D.Out(pdExcept, "Unknown type %d in WriteHeader.", header.type);        throw RTIinternalError("Message: Unknown type for Header.");    }    // 4- If Header.bodySize = 0, send message and return RTI_FALSE,    // Else send nothing(will be done by WriteBody), and return RTI_TRUE.    if (header.bodySize == 0) {        socket->send((void *) &header, sizeof(MessageHeader));        return false ;    }    else        return true ;}// ---------------------// -- WriteresignAction --// ---------------------voidMessage::writeResignAction(MessageBody*){    // BUG: Should do something.}// ---------------------// -- WriteValueArray --// ---------------------voidMessage::writeValueArray(MessageBody *Body){    for (int i = 0 ; i < handleArraySize ; i ++) {        Body->writeString(valueArray[i]);    }}} // namespace certi// $Id: Message_RW.cc,v 3.7 2003/03/21 15:06:46 breholee Exp $

⌨️ 快捷键说明

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