This is Unofficial EPICS BASE Doxygen Site
pvac::detail::PutBuilder::Exec Struct Reference
+ Inheritance diagram for pvac::detail::PutBuilder::Exec:
+ Collaboration diagram for pvac::detail::PutBuilder::Exec:

Public Member Functions

 Exec (detail::PutBuilder &builder)
 
virtual ~Exec ()
 
virtual void putBuild (const epics::pvData::StructureConstPtr &build, Args &args) OVERRIDE FINAL
 
virtual void putDone (const PutEvent &evt) OVERRIDE FINAL
 Put operation is complete. More...
 
- Public Member Functions inherited from pvac::ClientChannel::PutCallback
virtual ~PutCallback ()
 

Public Attributes

detail::PutBuilderbuilder
 
pvac::PutEvent result
 

Detailed Description

Definition at line 141 of file clientSync.cpp.

Constructor & Destructor Documentation

pvac::detail::PutBuilder::Exec::Exec ( detail::PutBuilder builder)
inline

Definition at line 147 of file clientSync.cpp.

148  :builder(builder)
149  {}
detail::PutBuilder & builder
Definition: clientSync.cpp:144
virtual pvac::detail::PutBuilder::Exec::~Exec ( )
inlinevirtual

Definition at line 150 of file clientSync.cpp.

150 {}

Member Function Documentation

virtual void pvac::detail::PutBuilder::Exec::putBuild ( const epics::pvData::StructureConstPtr build,
Args args 
)
inlinevirtual

Server provides expected structure.

Implementation must instanciate (or re-use) a PVStructure into args.root, then initialize any necessary fields and set bits in args.tosend as approprate.

If this method throws, then putDone() is called with PutEvent::Fail

Implements pvac::ClientChannel::PutCallback.

Definition at line 152 of file clientSync.cpp.

153  {
155  pvd::PVStructurePtr root(create->createPVStructure(build));
156 
157  for(PutBuilder::scalars_t::const_iterator it = builder.scalars.begin(), end = builder.scalars.end();
158  it!=end; ++it)
159  {
160  if(it->value.empty())
161  continue;
162 
163  pvd::PVFieldPtr fld(root->getSubField(it->name));
164  if(!fld && it->required)
165  throw std::runtime_error(std::string("Server does not have required field ")+it->name);
166  else if(!fld)
167  continue; // !it->required
168 
169  const pvd::FieldConstPtr& ftype(fld->getField());
170  if(ftype->getType()==pvd::union_) {
171  const pvd::Union *utype = static_cast<const pvd::Union*>(ftype.get());
172  pvd::PVUnion *ufld = static_cast<pvd::PVUnion*>(fld.get());
173 
174  if(utype->isVariant()) {
175  pvd::PVScalarPtr scalar(create->createPVScalar(it->value.type()));
176 
177  scalar->putFrom(it->value);
178  ufld->set(scalar);
179 
180  } else {
181  // attempt automagic assignment to descriminating union
182  pvd::int32 idx = utype->guess(pvd::scalar, it->value.type());
183 
184  if(idx==-1)
185  throw std::runtime_error(std::string("Unable to descriminate union field ")+it->name);
186 
187  ufld->select<pvd::PVScalar>(idx)->putFrom(it->value);
188  }
189 
190  } else if(ftype->getType()==pvd::scalar) {
191  static_cast<pvd::PVScalar*>(fld.get())->putFrom(it->value);
192 
193  } else {
194  throw std::runtime_error(std::string("Type mis-match assigning scalar to field ")+it->name);
195 
196  }
197 
198  args.tosend.set(fld->getFieldOffset());
199  }
200 
201  for(PutBuilder::arrays_t::const_iterator it = builder.arrays.begin(), end = builder.arrays.end();
202  it!=end; ++it)
203  {
204  if(it->value.empty())
205  continue;
206 
207  pvd::PVFieldPtr fld(root->getSubField(it->name));
208  if(!fld && it->required)
209  throw std::runtime_error(std::string("Server does not have required field ")+it->name);
210  else if(!fld)
211  continue; // !it->required
212 
213  const pvd::FieldConstPtr& ftype(fld->getField());
214  if(ftype->getType()==pvd::union_) {
215  const pvd::Union *utype = static_cast<const pvd::Union*>(ftype.get());
216  pvd::PVUnion *ufld = static_cast<pvd::PVUnion*>(fld.get());
217 
218  if(utype->isVariant()) {
219  pvd::PVScalarArrayPtr scalar(create->createPVScalarArray(it->value.original_type()));
220 
221  scalar->putFrom(it->value);
222  ufld->set(scalar);
223 
224  } else {
225  // attempt automagic assignment to descriminating union
226  pvd::int32 idx = utype->guess(pvd::scalarArray, it->value.original_type());
227 
228  if(idx==-1)
229  throw std::runtime_error(std::string("Unable to descriminate union field ")+it->name);
230 
231  ufld->select<pvd::PVScalarArray>(idx)->putFrom(it->value);
232  }
233 
234  } else if(ftype->getType()==pvd::scalarArray) {
235  static_cast<pvd::PVScalarArray*>(fld.get())->putFrom(it->value);
236 
237  // TODO
238  } else {
239  throw std::runtime_error(std::string("Type mis-match assigning scalar to field ")+it->name);
240 
241  }
242 
243  args.tosend.set(fld->getFieldOffset());
244  }
245 
246  args.root = root;
247  }
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
This class implements introspection object for a union.
Definition: pvIntrospect.h:866
detail::PutBuilder & builder
Definition: clientSync.cpp:144
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
Base class for a scalarArray.
Definition: pvData.h:618
std::tr1::shared_ptr< PVScalar > PVScalarPtr
Definition: pvData.h:77
PVUnion has a single subfield.
Definition: pvData.h:940
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
void set(PVFieldPtr const &value)
Definition: pvData.h:1028
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
PVFieldPtr select(int32 index)
Definition: PVUnion.cpp:54
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
bool isVariant() const
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
Definition: pvData.h:82
int32 guess(Type t, ScalarType s) const
int32_t int32
Definition: pvType.h:83
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
virtual void pvac::detail::PutBuilder::Exec::putDone ( const PutEvent evt)
inlinevirtual

Put operation is complete.

Implements pvac::ClientChannel::PutCallback.

Definition at line 249 of file clientSync.cpp.

250  {
251  {
252  Guard G(mutex);
253  if(done) {
254  LOG(pva::logLevelWarn, "oops, double event to PutCallback");
255  } else {
256  result = evt;
257  done = true;
258  }
259  }
260  event.signal();
261  }
#define LOG(level, format,...)
Definition: logger.h:48
void done(int k)
Definition: antelope.c:77

Member Data Documentation

detail::PutBuilder& pvac::detail::PutBuilder::Exec::builder

Definition at line 144 of file clientSync.cpp.

pvac::PutEvent pvac::detail::PutBuilder::Exec::result

Definition at line 145 of file clientSync.cpp.


The documentation for this struct was generated from the following file: