s-net-Tools
HdlcdSessionHeader.h
Go to the documentation of this file.
1 
37 #ifndef HDLCD_SESSION_HEADER_H
38 #define HDLCD_SESSION_HEADER_H
39 
40 #include "Frame.h"
41 #include <memory>
42 #include <string>
43 #include "HdlcdSessionDescriptor.h"
44 
45 class HdlcdSessionHeader: public Frame {
46 public:
47  static HdlcdSessionHeader Create(HdlcdSessionDescriptor a_HdlcdSessionDescriptor, const std::string& a_SerialPortName) {
48  // Called for transmission
49  HdlcdSessionHeader l_HdlcdSessionHeader;
50  l_HdlcdSessionHeader.m_ServiceAccessPointSpecifier = a_HdlcdSessionDescriptor;
51  l_HdlcdSessionHeader.m_SerialPortName = a_SerialPortName;
52  return l_HdlcdSessionHeader;
53  }
54 
55  static std::shared_ptr<HdlcdSessionHeader> CreateDeserializedFrame() {
56  // Called on reception
57  auto l_HdlcdSessionHeader(std::shared_ptr<HdlcdSessionHeader>(new HdlcdSessionHeader));
58  l_HdlcdSessionHeader->m_eDeserialize = DESERIALIZE_HEADER; // Next: read fixed-sized part of the session header
59  l_HdlcdSessionHeader->m_BytesRemaining = 3;
60  return l_HdlcdSessionHeader;
61  }
62 
63  // Getter
65  assert(m_eDeserialize == DESERIALIZE_FULL);
66  return m_ServiceAccessPointSpecifier;
67  }
68 
69  const std::string& GetSerialPortName() const {
70  assert(m_eDeserialize == DESERIALIZE_FULL);
71  return m_SerialPortName;
72  }
73 
74 private:
75  // Private CTOR
76  HdlcdSessionHeader(): m_ServiceAccessPointSpecifier(0x00), m_eDeserialize(DESERIALIZE_FULL) {
77  }
78 
79  // Serializer
80  const std::vector<unsigned char> Serialize() const {
81  assert(m_eDeserialize == DESERIALIZE_FULL);
82  std::vector<unsigned char> l_Buffer;
83  l_Buffer.emplace_back(0x00); // Version
84  l_Buffer.emplace_back(m_ServiceAccessPointSpecifier);
85  l_Buffer.emplace_back(m_SerialPortName.size());
86  l_Buffer.insert(l_Buffer.end(), m_SerialPortName.data(), (m_SerialPortName.data() + m_SerialPortName.size()));
87  return l_Buffer;
88  }
89 
90  // Deserializer
91  bool Deserialize() {
92  // All requested bytes are available
93  switch (m_eDeserialize) {
94  case DESERIALIZE_HEADER: {
95  // Deserialize the length field
96  assert(m_Buffer.size() == 3);
97 
98  // Deserialize the version field
99  if (m_Buffer[0] != 0) {
100  // Wrong version field
101  m_eDeserialize = DESERIALIZE_ERROR;
102  return false;
103  } // if
104 
105  // Deserialize the service access point identifier and the length field of the serial port name
106  m_ServiceAccessPointSpecifier = m_Buffer[1];
108  m_Buffer.clear();
109  if (m_BytesRemaining) {
110  m_eDeserialize = DESERIALIZE_BODY;
111  } else {
112  // An empty serial port specifier... may happen
113  m_eDeserialize = DESERIALIZE_FULL;
114  } // else
115 
116  break;
117  }
118  case DESERIALIZE_BODY: {
119  // Read of payload completed
120  m_SerialPortName.append(m_Buffer.begin(), m_Buffer.end());
121  m_eDeserialize = DESERIALIZE_FULL;
122  break;
123  }
124  case DESERIALIZE_ERROR:
125  case DESERIALIZE_FULL:
126  default:
127  assert(false);
128  } // switch
129 
130  // No error
131  return true;
132  }
133 
134  // Members
135  uint8_t m_ServiceAccessPointSpecifier;
136  std::string m_SerialPortName;
137  typedef enum {
138  DESERIALIZE_ERROR = 0,
139  DESERIALIZE_HEADER = 1,
140  DESERIALIZE_BODY = 2,
141  DESERIALIZE_FULL = 3
142  } E_DESERIALIZE;
143  E_DESERIALIZE m_eDeserialize;
144 };
145 
146 #endif // HDLCD_SESSION_HEADER_H
const std::string & GetSerialPortName() const
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
static std::shared_ptr< HdlcdSessionHeader > CreateDeserializedFrame()
std::vector< unsigned char > m_Buffer
Definition: Frame.h:93
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
static HdlcdSessionHeader Create(HdlcdSessionDescriptor a_HdlcdSessionDescriptor, const std::string &a_SerialPortName)
size_t m_BytesRemaining
Definition: Frame.h:94
Definition: Frame.h:44
uint8_t GetServiceAccessPointSpecifier() const