PcapPlusPlus  Next
DnsResourceData.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "DnsResource.h"
4 #include "IpAddress.h"
5 #include <memory>
6 #include <string>
7 #include <stdint.h>
8 
10 
13 namespace pcpp
14 {
15  // forward declarations
16  class IDnsResource;
17 
24  {
25  protected:
26  // unimplemented private copy c'tor
27  IDnsResourceData(const IDnsResourceData& other);
29  {}
30 
31  size_t decodeName(const char* encodedName, char* result, IDnsResource* dnsResource) const;
32  void encodeName(const std::string& decodedName, char* result, size_t& resultLen,
33  IDnsResource* dnsResource) const;
34 
35  public:
37  virtual ~IDnsResourceData() = default;
38 
42  template <class IDnsResourceDataType> bool isTypeOf() const
43  {
44  return dynamic_cast<const IDnsResourceDataType*>(this) != nullptr;
45  }
46 
51  template <class IDnsResourceDataType> IDnsResourceDataType* castAs()
52  {
53  return dynamic_cast<IDnsResourceDataType*>(this);
54  }
55 
57  virtual std::string toString() const = 0;
58 
65  virtual bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const = 0;
66  };
67 
70  class DnsResourceDataPtr : public std::unique_ptr<IDnsResourceData>
71  {
72  public:
75  explicit DnsResourceDataPtr(IDnsResourceData* ptr) : std::unique_ptr<IDnsResourceData>(ptr)
76  {}
77 
81  template <class IDnsResourceDataType> bool isTypeOf() const
82  {
83  return get()->isTypeOf<IDnsResourceDataType>();
84  }
85 
89  template <class IDnsResourceDataType> IDnsResourceDataType* castAs()
90  {
91  return get()->castAs<IDnsResourceDataType>();
92  }
93  };
94 
99  {
100  private:
101  std::string m_Data;
102 
103  public:
113  explicit StringDnsResourceData(const std::string& data) : m_Data(data)
114  {}
115 
116  StringDnsResourceData(const uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource);
117 
118  ~StringDnsResourceData() override = default;
119 
123  bool operator==(const StringDnsResourceData& other) const
124  {
125  return m_Data == other.m_Data;
126  }
127 
128  // implement abstract methods
129 
130  std::string toString() const override
131  {
132  return m_Data;
133  }
134  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const override;
135  };
136 
140  {
141  private:
142  IPv4Address m_Data;
143 
144  public:
148  IPv4DnsResourceData(const uint8_t* dataPtr, size_t dataLen);
149 
152  explicit IPv4DnsResourceData(const IPv4Address& addr) : m_Data(addr)
153  {}
154 
157  explicit IPv4DnsResourceData(const std::string& addrAsString) : m_Data(addrAsString)
158  {}
159 
163  bool operator==(const IPv4DnsResourceData& other) const
164  {
165  return m_Data == other.m_Data;
166  }
167 
170  {
171  return m_Data;
172  }
173 
174  // implement abstract methods
175 
176  std::string toString() const override
177  {
178  return m_Data.toString();
179  }
180  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const override;
181  };
182 
186  {
187  private:
188  IPv6Address m_Data;
189 
190  public:
194  IPv6DnsResourceData(const uint8_t* dataPtr, size_t dataLen);
195 
198  explicit IPv6DnsResourceData(const IPv6Address& addr) : m_Data(addr)
199  {}
200 
203  explicit IPv6DnsResourceData(const std::string& addrAsString) : m_Data(addrAsString)
204  {}
205 
209  bool operator==(const IPv6DnsResourceData& other) const
210  {
211  return m_Data == other.m_Data;
212  }
213 
216  {
217  return m_Data;
218  }
219 
220  // implement abstract methods
221 
222  std::string toString() const override
223  {
224  return m_Data.toString();
225  }
226  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const override;
227  };
228 
232  {
233  public:
235  struct MxData
236  {
238  uint16_t preference;
240  std::string mailExchange;
241  };
242 
247  MxDnsResourceData(uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource);
248 
258  MxDnsResourceData(const uint16_t& preference, const std::string& mailExchange);
259 
260  ~MxDnsResourceData() override = default;
261 
266  bool operator==(const MxDnsResourceData& other) const;
267 
270  {
271  return m_Data;
272  }
273 
277  void setMxData(uint16_t preference, std::string mailExchange);
278 
279  // implement abstract methods
280 
283  std::string toString() const override;
284 
285  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const override;
286 
287  private:
288  MxData m_Data;
289  };
290 
295  {
296  private:
297  uint8_t* m_Data;
298  size_t m_DataLen;
299 
300  public:
305  GenericDnsResourceData(const uint8_t* dataPtr, size_t dataLen);
306 
309  explicit GenericDnsResourceData(const std::string& dataAsHexString);
310 
314 
315  ~GenericDnsResourceData() override
316  {
317  if (m_Data != nullptr)
318  delete[] m_Data;
319  }
320 
321  GenericDnsResourceData& operator=(const GenericDnsResourceData& other);
322 
326  bool operator==(const GenericDnsResourceData& other) const;
327 
328  // implement abstract methods
329 
330  std::string toString() const override;
331  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const override;
332  };
333 
334 } // namespace pcpp
Definition: DnsResourceData.h:71
IDnsResourceDataType * castAs()
Definition: DnsResourceData.h:89
DnsResourceDataPtr(IDnsResourceData *ptr)
Definition: DnsResourceData.h:75
bool isTypeOf() const
Definition: DnsResourceData.h:81
Definition: DnsResourceData.h:295
bool operator==(const GenericDnsResourceData &other) const
GenericDnsResourceData(const std::string &dataAsHexString)
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const override
std::string toString() const override
GenericDnsResourceData(const uint8_t *dataPtr, size_t dataLen)
GenericDnsResourceData(const GenericDnsResourceData &other)
Definition: DnsResourceData.h:24
virtual bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const =0
IDnsResourceDataType * castAs()
Definition: DnsResourceData.h:51
bool isTypeOf() const
Definition: DnsResourceData.h:42
virtual std::string toString() const =0
virtual ~IDnsResourceData()=default
A virtual d'tor, does nothing.
Definition: DnsResource.h:26
Definition: IpAddress.h:28
std::string toString() const
Definition: DnsResourceData.h:140
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const override
IPv4DnsResourceData(const std::string &addrAsString)
Definition: DnsResourceData.h:157
bool operator==(const IPv4DnsResourceData &other) const
Definition: DnsResourceData.h:163
IPv4DnsResourceData(const IPv4Address &addr)
Definition: DnsResourceData.h:152
IPv4DnsResourceData(const uint8_t *dataPtr, size_t dataLen)
std::string toString() const override
Definition: DnsResourceData.h:176
IPv4Address getIpAddress() const
Definition: DnsResourceData.h:169
Definition: IpAddress.h:156
std::string toString() const
Definition: DnsResourceData.h:186
IPv6DnsResourceData(const IPv6Address &addr)
Definition: DnsResourceData.h:198
std::string toString() const override
Definition: DnsResourceData.h:222
bool operator==(const IPv6DnsResourceData &other) const
Definition: DnsResourceData.h:209
IPv6DnsResourceData(const uint8_t *dataPtr, size_t dataLen)
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const override
IPv6Address getIpAddress() const
Definition: DnsResourceData.h:215
IPv6DnsResourceData(const std::string &addrAsString)
Definition: DnsResourceData.h:203
Definition: DnsResourceData.h:232
std::string toString() const override
MxDnsResourceData(uint8_t *dataPtr, size_t dataLen, IDnsResource *dnsResource)
bool operator==(const MxDnsResourceData &other) const
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const override
MxData getMxData() const
Definition: DnsResourceData.h:269
MxDnsResourceData(const uint16_t &preference, const std::string &mailExchange)
void setMxData(uint16_t preference, std::string mailExchange)
Definition: DnsResourceData.h:99
std::string toString() const override
Definition: DnsResourceData.h:130
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const override
StringDnsResourceData(const std::string &data)
Definition: DnsResourceData.h:113
bool operator==(const StringDnsResourceData &other) const
Definition: DnsResourceData.h:123
The main namespace for the PcapPlusPlus lib.
A struct that represents mail exchange (MX) data.
Definition: DnsResourceData.h:236
std::string mailExchange
Mail exchange hostname.
Definition: DnsResourceData.h:240
uint16_t preference
Preference value.
Definition: DnsResourceData.h:238