15 #include <pv/createRequest.h> 16 #include <pv/convert.h> 18 #define epicsExportSharedSymbols 22 using std::tr1::static_pointer_cast;
27 namespace epics {
namespace pvaClient {
28 static ConvertPtr convert = getConvert();
29 static string notCompatibleScalar(
"value is not a compatible scalar");
30 static string notDoubleArray(
"value is not a doubleArray");
31 static string notStringArray(
"value is not a stringArray");
33 class PvaClientPostHandlerPvt:
public PostHandler
35 PvaClientPutData * putData;
38 PvaClientPostHandlerPvt(PvaClientPutData *putData,
size_t fieldNumber)
39 : putData(putData),fieldNumber(fieldNumber){}
40 void postPut() { putData->postPut(fieldNumber);}
46 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::create\n";
51 PvaClientPutData::PvaClientPutData(StructureConstPtr
const & structure)
54 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::PvaClientPutData\n";
55 PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(structure));
56 BitSetPtr bitSet(BitSetPtr(
new BitSet(pvStructure->getNumberFields())));
57 setData(pvStructure,bitSet);
58 size_t nfields = pvStructure->getNumberFields();
59 postHandler.resize(nfields);
61 for(
size_t i =0; i<nfields; ++i)
63 postHandler[i] = PostHandlerPtr(
new PvaClientPostHandlerPvt(
this, i));
65 pvField = pvStructure;
67 pvField = pvStructure->getSubField(i);
69 pvField->setPostHandler(postHandler[i]);
74 void PvaClientPutData::putDouble(
double value)
76 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::putDouble\n";
77 PVFieldPtr pvField = getSinglePVField();
78 Type type = pvField->getField()->getType();
80 throw std::logic_error(
"PvaClientData::putDouble() did not find a scalar field");
82 PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
83 ScalarType scalarType = pvScalar->getScalar()->getScalarType();
84 if(scalarType==pvDouble) {
85 PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(pvScalar);
89 if(!ScalarTypeFunc::isNumeric(scalarType)) {
90 throw std::logic_error(
91 "PvaClientData::putDouble() did not find a numeric scalar field");
93 convert->fromDouble(pvScalar,value);
96 void PvaClientPutData::putString(std::string
const & value)
98 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::putString\n";
99 PVFieldPtr pvField = getSinglePVField();
100 Type type = pvField->getField()->getType();
102 throw std::logic_error(
"PvaClientData::putString() did not find a scalar field");
104 PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(pvField);
105 convert->fromString(pvScalar,value);
108 void PvaClientPutData::putDoubleArray(shared_vector<const double>
const & value)
110 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::putDoubleArray\n";
111 PVFieldPtr pvField = getSinglePVField();
112 Type type = pvField->getField()->getType();
113 if(type!=scalarArray) {
114 throw std::logic_error(
"PvaClientData::putDoubleArray() did not find a scalarArray field");
116 PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
117 ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType();
118 if(!ScalarTypeFunc::isNumeric(scalarType)) {
119 throw std::logic_error(
120 "PvaClientData::putDoubleArray() did not find a numeric scalarArray field");
122 pvScalarArray->putFrom<
const double>(value);
125 void PvaClientPutData::putStringArray(shared_vector<const std::string>
const & value)
127 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::putStringArray\n";
128 PVFieldPtr pvField = getSinglePVField();
129 Type type = pvField->getField()->getType();
130 if(type!=scalarArray) {
131 throw std::logic_error(
"PvaClientData::putStringArray() did not find a scalarArray field");
133 PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
134 pvScalarArray->putFrom<
const string>(value);
138 void PvaClientPutData::putStringArray(std::vector<string>
const & value)
140 size_t length = value.size();
141 shared_vector<string> val(length);
142 for(
size_t i=0; i < length; ++i) val[i] = value[i];
143 putStringArray(freeze(val));
147 void PvaClientPutData::postPut(
size_t fieldNumber)
149 if(PvaClient::getDebug()) cout <<
"PvaClientPutData::postPut\n";
150 getChangedBitSet()->set(fieldNumber);
A class that holds data given to by PvaClientPut or PvaClientPutGet.
A base class for PvaClientGetData, PvaClientPutData, and PvaClientMonitorData.
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr