diff --git a/RTIG/Federation.cc b/RTIG/Federation.cc index d35f864..dd6973e 100644 --- a/RTIG/Federation.cc +++ b/RTIG/Federation.cc @@ -938,7 +938,7 @@ throw (FederateNotExecutionMember, D.Out(pdRequest, " Param %d Value %s", parameter_handles[i], - parameter_values[i].c_str()); + string(&(parameter_values[i][0]), parameter_values[i].size()).c_str()); G.Out(pdGendoc,"exit Federation::broadcastInteraction with time"); @@ -985,7 +985,7 @@ throw (FederateNotExecutionMember, D.Out(pdRequest, " Param %d Value %s", parameter_handles[i], - parameter_values[i].c_str()); + string(&(parameter_values[i][0]), parameter_values[i].size()).c_str()); G.Out(pdGendoc,"exit Federation::broadcastInteraction without time"); diff --git a/include/certi.hh b/include/certi.hh index 197b5b2..3cf4213 100644 --- a/include/certi.hh +++ b/include/certi.hh @@ -131,6 +131,7 @@ #define CERTI_DECODE_DOUBLE_FROM_UINT64BE(val) (CERTI_UINT64_FROM_BE (*(uint64_t*)(val))) #include +#include #include /** @@ -162,8 +163,8 @@ typedef Handle EventRetractionHandle; typedef double TickTime; typedef std::string ObjectName_t ; -typedef std::string AttributeValue_t; -typedef std::string ParameterValue_t; +typedef std::vector AttributeValue_t; +typedef std::vector ParameterValue_t; enum ResignAction { RELEASE_ATTRIBUTES = 1, diff --git a/libCERTI/M_Classes.cc b/libCERTI/M_Classes.cc index 5c53c72..8dac7f3 100644 --- a/libCERTI/M_Classes.cc +++ b/libCERTI/M_Classes.cc @@ -994,7 +994,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_bool(_hasEventRetraction); if (_hasEventRetraction) { @@ -1016,7 +1016,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } _hasEventRetraction = msgBuffer.read_bool(); if (_hasEventRetraction) { @@ -1037,7 +1037,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << "(opt) eventRetraction =" << eventRetraction.show(out) << std::endl; @@ -1124,7 +1124,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_bool(_hasEventRetraction); if (_hasEventRetraction) { @@ -1146,7 +1146,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } _hasEventRetraction = msgBuffer.read_bool(); if (_hasEventRetraction) { @@ -1167,7 +1167,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << "(opt) eventRetraction =" << eventRetraction.show(out) << std::endl; @@ -1202,7 +1202,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_uint32(region); msgBuffer.write_bool(_hasEventRetraction); @@ -1224,7 +1224,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } region = static_cast(msgBuffer.read_uint32()); _hasEventRetraction = msgBuffer.read_bool(); @@ -1245,7 +1245,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << " region = " << region << " " << std::endl; @@ -1281,7 +1281,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_uint32(region); msgBuffer.write_bool(_hasEventRetraction); @@ -1303,7 +1303,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } region = static_cast(msgBuffer.read_uint32()); _hasEventRetraction = msgBuffer.read_bool(); @@ -1324,7 +1324,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << " region = " << region << " " << std::endl; diff --git a/libCERTI/NM_Classes.cc b/libCERTI/NM_Classes.cc index 139dd0c..06872e8 100644 --- a/libCERTI/NM_Classes.cc +++ b/libCERTI/NM_Classes.cc @@ -1211,7 +1211,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_bool(_hasEvent); if (_hasEvent) { @@ -1233,7 +1233,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } _hasEvent = msgBuffer.read_bool(); if (_hasEvent) { @@ -1254,7 +1254,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << "(opt) event =" << " //FIXME FIXME don't know how to serialize native field of type " << std::endl; @@ -1288,7 +1288,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_bool(_hasEvent); if (_hasEvent) { @@ -1310,7 +1310,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } _hasEvent = msgBuffer.read_bool(); if (_hasEvent) { @@ -1331,7 +1331,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << "(opt) event =" << " //FIXME FIXME don't know how to serialize native field of type " << std::endl; @@ -1364,7 +1364,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_uint32(region); } @@ -1382,7 +1382,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } region = static_cast(msgBuffer.read_uint32()); } @@ -1399,7 +1399,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << " region = " << region << " " << std::endl; @@ -1433,7 +1433,7 @@ namespace certi { uint32_t valuesSize = values.size(); msgBuffer.write_uint32(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.write_string(values[i]); + msgBuffer.write_vector(values[i]); } msgBuffer.write_bool(_hasEvent); if (_hasEvent) { @@ -1455,7 +1455,7 @@ namespace certi { uint32_t valuesSize = msgBuffer.read_uint32(); values.resize(valuesSize); for (uint32_t i = 0; i < valuesSize; ++i) { - msgBuffer.read_string(values[i]); + msgBuffer.read_vector(values[i]); } _hasEvent = msgBuffer.read_bool(); if (_hasEvent) { @@ -1476,7 +1476,7 @@ namespace certi { out << std::endl; out << " values [] =" << std::endl; for (uint32_t i = 0; i < getValuesSize(); ++i) { - out << values[i] << " " ; + out << std::string(&(values[i][0]), values[i].size()) << " " ; } out << std::endl; out << "(opt) event =" << " //FIXME FIXME don't know how to serialize native field of type " << std::endl; diff --git a/libHLA/MessageBuffer.cc b/libHLA/MessageBuffer.cc index ec18ec2..c525553 100644 --- a/libHLA/MessageBuffer.cc +++ b/libHLA/MessageBuffer.cc @@ -425,6 +425,13 @@ MessageBuffer::write_string(const std::string& str) { return write_chars(str.data(),str.length()); } /* end of write_string */ +int32_t +MessageBuffer::write_vector(const std::vector& str) { + write_int32(str.size()); + return write_chars(&(str[0]),str.size()); +} /* end of write_vector */ + + std::string MessageBuffer::read_string() { std::string retval; @@ -449,6 +456,25 @@ MessageBuffer::read_string(std::string& s) readOffset += len; } /* end of read_string */ +void +MessageBuffer::read_vector(std::vector& s) +{ + int32_t len = read_int32(); + + if (len + readOffset > writeOffset) { + throw MessageBufferError(stringize() + << "read_string::invalid read of size <" << len + << "> inside a buffer of readable size <" + << (int32_t)writeOffset-readOffset << "> (writeOffset=" + << writeOffset << ",readOffset="<(buffer + readOffset), len); + readOffset += len; +} /* end of read_vector */ + + void MessageBuffer::updateReservedBytes() { /* set up buffer endianess */ if ((HostIsBigEndian() && bufferHasMyEndianness) || diff --git a/libHLA/MessageBuffer.hh b/libHLA/MessageBuffer.hh index 1f1e2dc..a1019d9 100644 --- a/libHLA/MessageBuffer.hh +++ b/libHLA/MessageBuffer.hh @@ -23,6 +23,7 @@ #include "libhla.hh" #include +#include #define DEFAULT_MESSAGE_BUFFER_SIZE 255 @@ -267,11 +268,17 @@ datatype read_##type() {\ int32_t write_string(const std::string& str); + int32_t + write_vector(const std::vector& str); + std::string read_string(); void read_string(std::string&); + + void + read_vector(std::vector&); int32_t write_bool(const bool toggle) { diff --git a/libRTI/RTI1516ambPrivateRefs.cpp b/libRTI/RTI1516ambPrivateRefs.cpp index b472e0b..7fd5610 100644 --- a/libRTI/RTI1516ambPrivateRefs.cpp +++ b/libRTI/RTI1516ambPrivateRefs.cpp @@ -85,7 +85,7 @@ getAHVMFromRequest(T* request) for (uint32_t i = 0 ; i < size ; ++i) { rti1516::AttributeHandle attribute = rti1516::AttributeHandleFriend::createRTI1516Handle(request->getAttributes(i)); - rti1516::VariableLengthData varData(request->getValues(i).data(), request->getValues(i).length()); + rti1516::VariableLengthData varData(&(request->getValues(i)[0]), request->getValues(i).size()); result->insert(std::pair(attribute, varData)); } @@ -101,7 +101,7 @@ getPHVMFromRequest(T* request) for (uint32_t i = 0 ; i < size ; ++i) { rti1516::ParameterHandle parameter = rti1516::ParameterHandleFriend::createRTI1516Handle(request->getParameters(i)); - rti1516::VariableLengthData varData(request->getValues(i).data(), request->getValues(i).length()); + rti1516::VariableLengthData varData(&(request->getValues(i)[0]), request->getValues(i).size()); result->insert(std::pair(parameter, varData)); } diff --git a/libRTI/RTI1516ambassador.cpp b/libRTI/RTI1516ambassador.cpp index a45b37d..0c880c8 100644 --- a/libRTI/RTI1516ambassador.cpp +++ b/libRTI/RTI1516ambassador.cpp @@ -41,7 +41,10 @@ namespace rti1516 for ( rti1516::ParameterHandleValueMap::const_iterator it = PHVM.begin(); it != PHVM.end(); it++, ++i) { req.setParameters(ParameterHandleFriend::toCertiHandle(it->first),i); - req.setValues(certi::ParameterValue_t( (char*)it->second.data(), it->second.size() ), i); + certi::ParameterValue_t paramValue; + paramValue.resize(it->second.size()); + memcpy(&(paramValue[0]), it->second.data(), it->second.size()); + req.setValues(paramValue, i); } privateRefs->executeService(&req, &rep); } @@ -56,7 +59,10 @@ namespace rti1516 for ( rti1516::AttributeHandleValueMap::const_iterator it = AHVM.begin(); it != AHVM.end(); it++, ++i) { req.setAttributes(AttributeHandleFriend::toCertiHandle(it->first),i); - req.setValues(certi::AttributeValue_t( (char*)it->second.data(),it->second.size() ), i); + certi::AttributeValue_t attrValue; + attrValue.resize(it->second.size()); + memcpy(&(attrValue[0]), it->second.data(), it->second.size()); + req.setValues(attrValue, i); } privateRefs->executeService(&req, &rep); } diff --git a/libRTI/RTIambPrivateRefs.cc b/libRTI/RTIambPrivateRefs.cc index c9fac67..f6f77b2 100644 --- a/libRTI/RTIambPrivateRefs.cc +++ b/libRTI/RTIambPrivateRefs.cc @@ -45,7 +45,8 @@ getAHVPSFromRequest(T* request) for (uint32_t i = 0 ; i < size ; ++i) { result[i].first = request->getAttributes(i); - result[i].second.assign(request->getValues(i).data(), request->getValues(i).length()); + result[i].second.resize(request->getValues(i).size()); + memcpy(&(result[i].second[0]), &(request->getValues(i)[0]), request->getValues(i).size()); } return result; @@ -62,7 +63,8 @@ getPHVPSFromRequest(T* request) for (uint32_t i = 0 ; i < size ; ++i) { result[i].first = request->getParameters(i); - result[i].second.assign(request->getValues(i).data(), request->getValues(i).length()); + result[i].second.resize(request->getValues(i).size()); + memcpy(&(result[i].second[0]), &(request->getValues(i)[0]), request->getValues(i).size()); } return result; diff --git a/libRTI/RTItypesImp.cc b/libRTI/RTItypesImp.cc index a84a4ac..8f0c007 100644 --- a/libRTI/RTItypesImp.cc +++ b/libRTI/RTItypesImp.cc @@ -80,7 +80,7 @@ void AttributeHandleValuePairSetImp::getValue(RTI::ULong i, char *buff, RTI::ULo if (i < size()) { const AttributeHandleValuePair_t& item = _set[i]; len = item.second.size(); - memcpy(buff, item.second.data(), len); + memcpy(buff, &(item.second[0]), len); } else throw RTI::ArrayIndexOutOfBounds(""); @@ -92,7 +92,7 @@ char *AttributeHandleValuePairSetImp::getValuePointer(RTI::ULong i, RTI::ULong & if (i < size()) { const AttributeHandleValuePair_t& item = _set[i]; len = item.second.size(); - return (char *)item.second.data(); + return (char *)&(item.second[0]); } else throw RTI::ArrayIndexOutOfBounds(""); @@ -119,7 +119,10 @@ RTI::Region *AttributeHandleValuePairSetImp::getRegion(RTI::ULong) const void AttributeHandleValuePairSetImp::add(RTI::Handle h, const char *str, RTI::ULong len) throw (RTI::ValueLengthExceeded, RTI::ValueCountExceeded) { - _set.push_back(AttributeHandleValuePair_t(h, std::string(str, len))); + std::vector v; + v.resize(len); + memcpy(&(v[0]), str, len); + _set.push_back(AttributeHandleValuePair_t(h, v)); } void AttributeHandleValuePairSetImp::remove(RTI::Handle h) @@ -342,7 +345,7 @@ void ParameterHandleValuePairSetImp::getValue(RTI::ULong i, char *buff, RTI::ULo if (i < size()) { const ParameterHandleValuePair_t& item = _set[i]; len = item.second.size(); - memcpy(buff, item.second.data(), len); + memcpy(buff, &(item.second[0]), len); } else throw RTI::ArrayIndexOutOfBounds(""); @@ -354,7 +357,7 @@ char *ParameterHandleValuePairSetImp::getValuePointer(RTI::ULong i, RTI::ULong & if (i < size()) { const ParameterHandleValuePair_t& item = _set[i]; len = item.second.size(); - return (char *)item.second.data(); + return (char *)&(item.second[0]); } else throw RTI::ArrayIndexOutOfBounds(""); @@ -381,7 +384,10 @@ RTI::Region *ParameterHandleValuePairSetImp::getRegion() const void ParameterHandleValuePairSetImp::add(RTI::Handle h, const char *str, RTI::ULong len) throw (RTI::ValueLengthExceeded, RTI::ValueCountExceeded) { - _set.push_back(ParameterHandleValuePair_t(h, std::string(str, len))); + std::vector v; + v.resize(len); + memcpy(&(v[0]), str, len); + _set.push_back(ParameterHandleValuePair_t(h, v)); } void ParameterHandleValuePairSetImp::remove(RTI::Handle h)