This is Unofficial EPICS BASE Doxygen Site
serializationHelper.cpp
Go to the documentation of this file.
1 
7 #include <epicsAssert.h>
8 
9 #include <pv/serialize.h>
10 #include <pv/pvData.h>
11 #include <pv/noDefaultMethods.h>
12 #include <pv/pvIntrospect.h>
13 #include <pv/byteBuffer.h>
14 
15 #define epicsExportSharedSymbols
16 #include <pv/serializationHelper.h>
18 
19 using namespace epics::pvData;
20 
21 namespace epics {
22 namespace pvAccess {
23 
24 PVDataCreatePtr SerializationHelper::_pvDataCreate(getPVDataCreate());
25 
26 PVStructure::shared_pointer SerializationHelper::deserializePVRequest(ByteBuffer* buffer, DeserializableControl* control)
27 {
28  // for now ordinary structure, later can be changed
29  return deserializeStructureFull(buffer, control);
30 }
31 
32 PVStructure::shared_pointer SerializationHelper::deserializeStructureAndCreatePVStructure(ByteBuffer* buffer, DeserializableControl* control, PVStructure::shared_pointer const & existingStructure)
33 {
34  FieldConstPtr field = control->cachedDeserialize(buffer);
35  if (!field)
36  return PVStructure::shared_pointer();
37 
38  if (existingStructure && *field == *existingStructure->getField())
39  return existingStructure;
40  else if(field->getType()==structure)
41  return _pvDataCreate->createPVStructure(std::tr1::static_pointer_cast<const Structure>(field));
42  else
43  throw std::runtime_error("deserializeStructureAndCreatePVStructure expects a Structure");
44 }
45 
46 PVStructure::shared_pointer SerializationHelper::deserializeStructureFull(ByteBuffer* buffer, DeserializableControl* control)
47 {
48  PVField::shared_pointer ret(deserializeFull(buffer, control));
49  if(!ret) return PVStructure::shared_pointer();
50  else if(ret->getField()->getType()!=structure)
51  throw std::runtime_error("deserializeStructureFull expects a Structure");
53 }
54 
55 PVField::shared_pointer SerializationHelper::deserializeFull(ByteBuffer* buffer, DeserializableControl* control)
56 {
57  PVField::shared_pointer pvField;
58  FieldConstPtr field = control->cachedDeserialize(buffer);
59  if (field)
60  {
61  pvField = _pvDataCreate->createPVField(field);
62  pvField->deserialize(buffer, control);
63  }
64  return pvField;
65 }
66 
67 void SerializationHelper::serializeNullField(ByteBuffer* buffer, SerializableControl* control)
68 {
69  control->ensureBuffer(1);
70  buffer->putByte(IntrospectionRegistry::NULL_TYPE_CODE);
71 }
72 
73 void SerializationHelper::serializePVRequest(ByteBuffer* buffer, SerializableControl* control, PVStructure::shared_pointer const & pvRequest)
74 {
75  // for now ordinary structure, later can be changed
76  serializeStructureFull(buffer, control, pvRequest);
77 }
78 
79 void SerializationHelper::serializeStructureFull(ByteBuffer* buffer, SerializableControl* control, PVStructure::shared_pointer const & pvStructure)
80 {
81  serializeFull(buffer, control, pvStructure);
82 }
83 
84 void SerializationHelper::serializeFull(ByteBuffer* buffer, SerializableControl* control, PVField::const_shared_pointer const & pvField)
85 {
86  if (!pvField)
87  {
88  serializeNullField(buffer, control);
89  }
90  else
91  {
92  control->cachedSerialize(pvField->getField(), buffer);
93  pvField->serialize(buffer, control);
94  }
95 }
96 
97 }
98 }
An EPICS-specific replacement for ANSI C&#39;s assert.
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
Callback class for deserialization.
Definition: serialize.h:89
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
virtual std::tr1::shared_ptr< const Field > cachedDeserialize(ByteBuffer *buffer)=0
pvData
Definition: monitor.h:428
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Definition: byteBuffer.h:233
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
virtual void cachedSerialize(std::tr1::shared_ptr< const Field > const &field, ByteBuffer *buffer)=0
virtual void ensureBuffer(std::size_t size)=0
Callback class for serialization.
Definition: serialize.h:34
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648