From bc484215cee47026a65bbf1241276a32590edf77 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 26 Aug 2014 21:32:00 +0200 Subject: [PATCH] ca: string array --- src/ca/caChannel.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index 75ac2c9..5708432 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -1065,13 +1065,30 @@ int doPut_pvStructure(CAChannel::shar std::tr1::shared_ptr value = std::tr1::static_pointer_cast(pvStructure->getScalarArrayField("value", pvString)); - //const string* val = value->get(); - int result = ECA_NOSUPPORT; // TODO - /* - int result = ca_array_put_callback(channel->getNativeType(), value->getLength(), - channel->getChannelID(), val, + PVStringArray::const_svector stringArray(value->view()); + + size_t arraySize = stringArray.size(); + size_t ca_stringBufferSize = arraySize * MAX_STRING_SIZE; + char* ca_stringBuffer = new char[ca_stringBufferSize]; + memset(ca_stringBuffer, 0, ca_stringBufferSize); + + char *p = ca_stringBuffer; + for(size_t i = 0; i < arraySize; i++) + { + string value = stringArray[i]; + size_t len = value.length(); + if (len >= MAX_STRING_SIZE) + len = MAX_STRING_SIZE - 1; + memcpy(p, value.c_str(), len); + p += MAX_STRING_SIZE; + } + + + int result = ca_array_put_callback(channel->getNativeType(), arraySize, + channel->getChannelID(), ca_stringBuffer, ca_put_handler, usrArg); -*/ + delete[] ca_stringBuffer; + if (result == ECA_NORMAL) { ca_flush_io();