diff --git a/pvDataApp/misc/serializeHelper.cpp b/pvDataApp/misc/serializeHelper.cpp index 88057cd..f765417 100644 --- a/pvDataApp/misc/serializeHelper.cpp +++ b/pvDataApp/misc/serializeHelper.cpp @@ -47,7 +47,7 @@ namespace epics { else if(b==-2) { control->ensureData(sizeof(int32)); int32 s = buffer->getInt(); - if(s<0) THROW_BASE_EXCEPTION("negative array size"); + if(s<0) THROW_BASE_EXCEPTION("negative size"); return s; } else @@ -94,30 +94,41 @@ namespace epics { static String emptyString; - // TODO consider by reference !!! String SerializeHelper::deserializeString(ByteBuffer* buffer, DeserializableControl* control) { int size = SerializeHelper::readSize(buffer, control); - if(size>=0) { - char* retBuffer = new char[size]; // get the return buffer - try { - int i = 0; - while(true) { - int toRead = min(size-i, buffer->getRemaining()); - buffer->get(retBuffer, i, toRead); - i += toRead; - if(iensureData(1); - else - break; + if(size>0) + { + if (buffer->getRemaining()>=size) + { + // entire string is in buffer, simply create a string out of it (copy) + int pos = buffer->getPosition(); + String str(buffer->getArray()+pos, size); + buffer->setPosition(pos+size); + return str; + } + else + { + String str; + str.reserve(size); + try { + int i = 0; + while(true) { + int toRead = min(size-i, buffer->getRemaining()); + int pos = buffer->getPosition(); + str.append(buffer->getArray()+pos, toRead); + buffer->setPosition(pos+toRead); + i += toRead; + if(iensureData(1); // at least one + else + break; + } + return str; + } catch(...) { + throw; } - String s = String(retBuffer, size); - delete[] retBuffer; - return s; - } catch(...) { - delete[] retBuffer; // remove the buffer - throw; } } else diff --git a/testApp/misc/testSerialization.cpp b/testApp/misc/testSerialization.cpp index 415a976..4fb254a 100644 --- a/testApp/misc/testSerialization.cpp +++ b/testApp/misc/testSerialization.cpp @@ -624,6 +624,13 @@ void testStructure(std::ostream& ofile) { } */ +void testStringCopy(std::ostream& ofile) { + String s1 = "abc"; + String s2 = s1; + if (s1.c_str() != s2.c_str()) + ofile << "\n!!! implementation of epics::pvData::String assigment operator does not share content !!!\n\n"; +} + int main(int argc, char *argv[]) { std::ofstream outfile; std::ostream *out=NULL; @@ -640,6 +647,7 @@ int main(int argc, char *argv[]) { control = new DeserializableControlImpl(); buffer = new ByteBuffer(1<<16); + testStringCopy(*out); testScalarEquals(*out); testScalar(*out); testArray(*out);