HDLC-Daemon
HdlcdSessionHeader.h
Go to the documentation of this file.
1 
39 #ifndef HDLCD_SESSION_HEADER_H
40 #define HDLCD_SESSION_HEADER_H
41 
42 #include "Frame.h"
43 #include <memory>
44 #include <string>
45 #include "HdlcdSessionDescriptor.h"
46 
53 class HdlcdSessionHeader: public Frame {
54 public:
62  static HdlcdSessionHeader Create(HdlcdSessionDescriptor a_HdlcdSessionDescriptor, const std::string& a_SerialPortName) {
63  // Called for transmission
64  HdlcdSessionHeader l_HdlcdSessionHeader;
65  l_HdlcdSessionHeader.m_ServiceAccessPointSpecifier = a_HdlcdSessionDescriptor;
66  l_HdlcdSessionHeader.m_SerialPortName = a_SerialPortName;
67  return l_HdlcdSessionHeader;
68  }
69 
74  static std::shared_ptr<HdlcdSessionHeader> CreateDeserializedFrame() {
75  // Called on reception
76  auto l_HdlcdSessionHeader(std::shared_ptr<HdlcdSessionHeader>(new HdlcdSessionHeader));
77  l_HdlcdSessionHeader->m_eDeserialize = DESERIALIZE_HEADER; // Next: read fixed-sized part of the session header
78  l_HdlcdSessionHeader->m_BytesRemaining = 3;
79  return l_HdlcdSessionHeader;
80  }
81 
87  assert(m_eDeserialize == DESERIALIZE_FULL);
88  return m_ServiceAccessPointSpecifier;
89  }
90 
95  const std::string& GetSerialPortName() const {
96  assert(m_eDeserialize == DESERIALIZE_FULL);
97  return m_SerialPortName;
98  }
99 
100 private:
105  HdlcdSessionHeader(): m_ServiceAccessPointSpecifier(0x00), m_eDeserialize(DESERIALIZE_FULL) {
106  }
107 
114  const std::vector<unsigned char> Serialize() const {
115  assert(m_eDeserialize == DESERIALIZE_FULL);
116  std::vector<unsigned char> l_Buffer;
117  l_Buffer.emplace_back(0x00); // Version
118  l_Buffer.emplace_back(m_ServiceAccessPointSpecifier);
119  l_Buffer.emplace_back(m_SerialPortName.size());
120  l_Buffer.insert(l_Buffer.end(), m_SerialPortName.data(), (m_SerialPortName.data() + m_SerialPortName.size()));
121  return l_Buffer;
122  }
123 
132  bool Deserialize() {
133  // All requested bytes are available
134  switch (m_eDeserialize) {
135  case DESERIALIZE_HEADER: {
136  // Deserialize the length field
137  assert(m_Buffer.size() == 3);
138 
139  // Deserialize the version field
140  if (m_Buffer[0] != 0) {
141  // Wrong version field
142  m_eDeserialize = DESERIALIZE_ERROR;
143  return false;
144  } // if
145 
146  // Deserialize the service access point identifier and the length field of the serial port name
147  m_ServiceAccessPointSpecifier = m_Buffer[1];
149  m_Buffer.clear();
150  if (m_BytesRemaining) {
151  m_eDeserialize = DESERIALIZE_BODY;
152  } else {
153  // An empty serial port specifier... may happen
154  m_eDeserialize = DESERIALIZE_FULL;
155  } // else
156 
157  break;
158  }
159  case DESERIALIZE_BODY: {
160  // Read of payload completed
161  m_SerialPortName.append(m_Buffer.begin(), m_Buffer.end());
162  m_eDeserialize = DESERIALIZE_FULL;
163  break;
164  }
165  case DESERIALIZE_ERROR:
166  case DESERIALIZE_FULL:
167  default:
168  assert(false);
169  } // switch
170 
171  // No error
172  return true;
173  }
174 
175  // Internal members
176  uint8_t m_ServiceAccessPointSpecifier;
177  std::string m_SerialPortName;
178 
182  typedef enum {
183  DESERIALIZE_ERROR = 0,
184  DESERIALIZE_HEADER = 1,
185  DESERIALIZE_BODY = 2,
186  DESERIALIZE_FULL = 3
187  } E_DESERIALIZE;
188  E_DESERIALIZE m_eDeserialize;
189 };
190 
191 #endif // HDLCD_SESSION_HEADER_H
const std::string & GetSerialPortName() const
Query the file name of the serial port.
This file contains the header declaration of class Frame.
static std::shared_ptr< HdlcdSessionHeader > CreateDeserializedFrame()
Static creator to create an object in the process of reception.
std::vector< unsigned char > m_Buffer
The buffer containing partly received frames or higher-layer payload.
Definition: Frame.h:154
This file contains the header declaration of class HdlcdSessionDescriptor.
static HdlcdSessionHeader Create(HdlcdSessionDescriptor a_HdlcdSessionDescriptor, const std::string &a_SerialPortName)
Static creator to create an object in the process of transmission.
size_t m_BytesRemaining
The amount of bytes required to finalize frame assembly during reception.
Definition: Frame.h:155
Class Frame.
Definition: Frame.h:59
uint8_t GetServiceAccessPointSpecifier() const
Query the service access point specifier octett.
Class HdlcdSessionHeader.
Class HdlcdSessionDescriptor.