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

📄 message_rw.cc

📁 分布式仿真 开放源码
💻 CC
📖 第 1 页 / 共 3 页
字号:
            // B.c. object, Tag, handleArray[], ValueArray[] and resignAction.            Body.writeLongInt(object);            Body.writeString(tag);            writeHandleArray(&Body);            writeValueArray(&Body);            writeResignAction(&Body);            break ;          case DISCOVER_OBJECT_INSTANCE:          case DELETE_OBJECT_INSTANCE:          case REMOVE_OBJECT_INSTANCE:            // B.c. object, Tag, label, resignAction            Body.writeLongInt(object);            Body.writeString(tag);            Body.writeString(name);            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_TRANSPORTATION_TYPE:          case CHANGE_ATTRIBUTE_ORDER_TYPE:            // B.c. object, HandleArray            Body.writeLongInt(object);            writeHandleArray(&Body);            break ;	  case DDM_MODIFY_REGION:	    writeExtents(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:      case GET_ATTRIBUTE_SPACE_HANDLE:      case GET_INTERACTION_SPACE_HANDLE:      case DDM_CREATE_REGION:      case DDM_ASSOCIATE_REGION:      case DDM_UNASSOCIATE_REGION:      case DDM_SUBSCRIBE_ATTRIBUTES:      case DDM_UNSUBSCRIBE_ATTRIBUTES:      case DDM_SUBSCRIBE_INTERACTION:      case DDM_UNSUBSCRIBE_INTERACTION:        header.bodySize = 1 ;        break ;      case REQUEST_FEDERATION_SAVE: // Body contains Label        header.VP.O_I.date = date ;        header.bodySize = 1 ;        break ;      case FEDERATE_SAVE_BEGUN:      case FEDERATE_SAVE_COMPLETE:      case FEDERATE_SAVE_NOT_COMPLETE:      case FEDERATION_SAVED:      case FEDERATION_NOT_SAVED:      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:        header.bodySize = 0 ;        break ;        // --- MessageJ_R_Struct --      case RESIGN_FEDERATION_EXECUTION: // No Body        header.VP.J_R.action = resignAction ;        header.bodySize = 0 ;        break ;      case INITIATE_FEDERATE_RESTORE:      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:        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_ATTRIBUTES: // Body contains handleArray      case REGISTER_OBJECT_INSTANCE: // Body contains object      case UPDATE_ATTRIBUTE_VALUES: // B.c. object, Tag, handleArray[]        // ValueArray[] and resignAction.      case DISCOVER_OBJECT_INSTANCE: // B.c. object, Tag and resignAction      case REFLECT_ATTRIBUTE_VALUES: // B.c. object, Tag, handleArray[]        // and ValueArray[]      case DELETE_OBJECT_INSTANCE: // Body contains object, Tag.      case REMOVE_OBJECT_INSTANCE: // 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 ;        // --- MessageT_O_Struct, No Body ---      case CHANGE_INTERACTION_TRANSPORTATION_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 ;        // Message_DDM, no body      case DDM_DELETE_REGION:        header.VP.ddm.region = region ;        header.bodySize = 0 ;        break ;	// Message_DDM, Body      case DDM_MODIFY_REGION:	header.VP.ddm.region = region ;	header.bodySize = 1 ;	break ;        // --- MessageT_O_Struct, Body not empty ---      case CHANGE_ATTRIBUTE_TRANSPORTATION_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 QUERY_LBTS:      case QUERY_FEDERATE_TIME:      case TIME_ADVANCE_REQUEST:      case NEXT_EVENT_REQUEST:      case TIME_ADVANCE_GRANT:        header.VP.time.date = date ;        header.bodySize = 0 ;        break ;      case MODIFY_LOOKAHEAD:      case QUERY_LOOKAHEAD:        header.VP.time.date = lookahead ;        header.bodySize = 0 ;        break ;      case ENABLE_TIME_REGULATION:      case DISABLE_TIME_REGULATION:      case ENABLE_TIME_CONSTRAINED:      case DISABLE_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 header.bodySize != 0 ;}// ---------------------// -- 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.18 2004/01/09 16:09:55 breholee Exp $

⌨️ 快捷键说明

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