📄 message_rw.cc
字号:
// 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 + -