PcapPlusPlus  Next
TextBasedProtocol.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <map>
4 #include "Layer.h"
5 
7 
8 namespace pcpp
9 {
10 
12 #define PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER ""
13 
14  class TextBasedProtocolMessage;
15 
16  // -------- Class HeaderField -----------------
17 
28  {
29  friend class TextBasedProtocolMessage;
30 
31  public:
32  ~HeaderField();
33 
37  HeaderField(const HeaderField& other);
38 
44 
48  size_t getFieldSize() const
49  {
50  return m_FieldSize;
51  }
52 
55  std::string getFieldName() const;
56 
59  std::string getFieldValue() const;
60 
64  bool setFieldValue(const std::string& newValue);
65 
69  bool isEndOfHeader() const
70  {
71  return m_IsEndOfHeaderField;
72  }
73 
74  private:
75  HeaderField(const std::string& name, const std::string& value, char nameValueSeparator,
76  bool spacesAllowedBetweenNameAndValue);
77  HeaderField(TextBasedProtocolMessage* TextBasedProtocolMessage, int offsetInMessage, char nameValueSeparator,
78  bool spacesAllowedBetweenNameAndValue);
79 
80  char* getData() const;
81  void setNextField(HeaderField* nextField);
82  HeaderField* getNextField() const;
83  void initNewField(const std::string& name, const std::string& value);
84  void attachToTextBasedProtocolMessage(TextBasedProtocolMessage* message, int fieldOffsetInMessage);
85 
86  uint8_t* m_NewFieldData;
87  TextBasedProtocolMessage* m_TextBasedProtocolMessage;
88  int m_NameOffsetInMessage;
89  size_t m_FieldNameSize;
90  int m_ValueOffsetInMessage;
91  size_t m_FieldValueSize;
92  size_t m_FieldSize;
93  HeaderField* m_NextField;
94  bool m_IsEndOfHeaderField;
95  char m_NameValueSeparator;
96  bool m_SpacesAllowedBetweenNameAndValue;
97  };
98 
99  // -------- Class TextBasedProtocolMessage -----------------
100 
105  {
106  friend class HeaderField;
107 
108  public:
109  ~TextBasedProtocolMessage() override;
110 
119  HeaderField* getFieldByName(std::string fieldName, int index = 0) const;
120 
123  {
124  return m_FieldList;
125  }
126 
132  {
133  if (prevField != nullptr)
134  return prevField->getNextField();
135  else
136  return nullptr;
137  }
138 
140  int getFieldCount() const;
141 
146  virtual HeaderField* addField(const std::string& fieldName, const std::string& fieldValue);
147 
151  virtual HeaderField* addField(const HeaderField& newField);
152 
156 
163  virtual HeaderField* insertField(HeaderField* prevField, const std::string& fieldName,
164  const std::string& fieldValue);
165 
172  virtual HeaderField* insertField(std::string prevFieldName, const std::string& fieldName,
173  const std::string& fieldValue);
174 
179  virtual HeaderField* insertField(HeaderField* prevField, const HeaderField& newField);
180 
185  bool removeField(HeaderField* fieldToRemove);
186 
194  bool removeField(std::string fieldName, int index = 0);
195 
199  bool isHeaderComplete() const;
200 
201  // implement Layer's abstract methods
202 
204  void parseNextLayer() override;
205 
207  size_t getHeaderLen() const override;
208 
210  void computeCalculateFields() override;
211 
212  protected:
213  TextBasedProtocolMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet,
214  ProtocolType protocol);
215  TextBasedProtocolMessage() : m_FieldList(nullptr), m_LastField(nullptr), m_FieldsOffset(0)
216  {}
217 
218  // copy c'tor
220  TextBasedProtocolMessage& operator=(const TextBasedProtocolMessage& other);
221 
222  void copyDataFrom(const TextBasedProtocolMessage& other);
223 
224  void parseFields();
225  void shiftFieldsOffset(HeaderField* fromField, int numOfBytesToShift);
226 
227  // abstract methods
228  virtual char getHeaderFieldNameValueSeparator() const = 0;
229  virtual bool spacesAllowedBetweenHeaderFieldNameAndValue() const = 0;
230 
231  HeaderField* m_FieldList;
232  HeaderField* m_LastField;
233  int m_FieldsOffset;
234  std::multimap<std::string, HeaderField*> m_FieldNameToFieldMap;
235  };
236 } // namespace pcpp
Definition: TextBasedProtocol.h:28
size_t getFieldSize() const
Definition: TextBasedProtocol.h:48
std::string getFieldValue() const
bool setFieldValue(const std::string &newValue)
HeaderField & operator=(const HeaderField &other)
HeaderField(const HeaderField &other)
std::string getFieldName() const
bool isEndOfHeader() const
Definition: TextBasedProtocol.h:69
Definition: Layer.h:60
Definition: Packet.h:22
Definition: TextBasedProtocol.h:105
size_t getHeaderLen() const override
HeaderField * getFieldByName(std::string fieldName, int index=0) const
bool removeField(HeaderField *fieldToRemove)
void parseNextLayer() override
Currently set only PayloadLayer for the rest of the data.
HeaderField * getFirstField() const
Definition: TextBasedProtocol.h:122
virtual HeaderField * insertField(std::string prevFieldName, const std::string &fieldName, const std::string &fieldValue)
HeaderField * getNextField(HeaderField *prevField) const
Definition: TextBasedProtocol.h:131
bool removeField(std::string fieldName, int index=0)
void computeCalculateFields() override
Does nothing for this class.
virtual HeaderField * insertField(HeaderField *prevField, const std::string &fieldName, const std::string &fieldValue)
virtual HeaderField * insertField(HeaderField *prevField, const HeaderField &newField)
virtual HeaderField * addField(const std::string &fieldName, const std::string &fieldValue)
virtual HeaderField * addField(const HeaderField &newField)
The main namespace for the PcapPlusPlus lib.
uint8_t ProtocolType
Definition: ProtocolType.h:13