PcapPlusPlus  Next
DnsResourceData.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "DeprecationUtils.h"
4 #include "DnsResource.h"
5 #include "IpAddress.h"
6 #include <memory>
7 #include <string>
8 #include <vector>
9 #include <stdint.h>
10 
12 
15 namespace pcpp
16 {
17  // forward declarations
18  class IDnsResource;
19 
26  {
27  protected:
28  // unimplemented private copy c'tor
29  IDnsResourceData(const IDnsResourceData& other);
31  {}
32 
33  size_t decodeName(const char* encodedName, char* result, IDnsResource* dnsResource) const;
34  void encodeName(const std::string& decodedName, char* result, size_t& resultLen,
35  IDnsResource* dnsResource) const;
36 
37  public:
39  virtual ~IDnsResourceData() = default;
40 
44  template <class IDnsResourceDataType> bool isTypeOf() const
45  {
46  return dynamic_cast<const IDnsResourceDataType*>(this) != nullptr;
47  }
48 
53  template <class IDnsResourceDataType> IDnsResourceDataType* castAs()
54  {
55  return dynamic_cast<IDnsResourceDataType*>(this);
56  }
57 
59  virtual std::string toString() const = 0;
60 
66  virtual std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const = 0;
67 
75  PCPP_DEPRECATED("Use toBytes() instead")
76  bool toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const;
77  };
78 
81  class DnsResourceDataPtr : public std::unique_ptr<IDnsResourceData>
82  {
83  public:
86  explicit DnsResourceDataPtr(IDnsResourceData* ptr) : std::unique_ptr<IDnsResourceData>(ptr)
87  {}
88 
92  template <class IDnsResourceDataType> bool isTypeOf() const
93  {
94  return get()->isTypeOf<IDnsResourceDataType>();
95  }
96 
100  template <class IDnsResourceDataType> IDnsResourceDataType* castAs()
101  {
102  return get()->castAs<IDnsResourceDataType>();
103  }
104  };
105 
110  {
111  private:
112  std::string m_Data;
113 
114  public:
124  explicit StringDnsResourceData(const std::string& data) : m_Data(data)
125  {}
126 
127  StringDnsResourceData(const uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource);
128 
129  ~StringDnsResourceData() override = default;
130 
134  bool operator==(const StringDnsResourceData& other) const
135  {
136  return m_Data == other.m_Data;
137  }
138 
139  // implement abstract methods
140 
141  std::string toString() const override
142  {
143  return m_Data;
144  }
145  std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const override;
146  };
147 
151  {
152  private:
153  IPv4Address m_Data;
154 
155  public:
159  IPv4DnsResourceData(const uint8_t* dataPtr, size_t dataLen);
160 
163  explicit IPv4DnsResourceData(const IPv4Address& addr) : m_Data(addr)
164  {}
165 
168  explicit IPv4DnsResourceData(const std::string& addrAsString) : m_Data(addrAsString)
169  {}
170 
174  bool operator==(const IPv4DnsResourceData& other) const
175  {
176  return m_Data == other.m_Data;
177  }
178 
181  {
182  return m_Data;
183  }
184 
185  // implement abstract methods
186 
187  std::string toString() const override
188  {
189  return m_Data.toString();
190  }
191  std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const override;
192  };
193 
197  {
198  private:
199  IPv6Address m_Data;
200 
201  public:
205  IPv6DnsResourceData(const uint8_t* dataPtr, size_t dataLen);
206 
209  explicit IPv6DnsResourceData(const IPv6Address& addr) : m_Data(addr)
210  {}
211 
214  explicit IPv6DnsResourceData(const std::string& addrAsString) : m_Data(addrAsString)
215  {}
216 
220  bool operator==(const IPv6DnsResourceData& other) const
221  {
222  return m_Data == other.m_Data;
223  }
224 
227  {
228  return m_Data;
229  }
230 
231  // implement abstract methods
232 
233  std::string toString() const override
234  {
235  return m_Data.toString();
236  }
237  std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const override;
238  };
239 
243  {
244  public:
246  struct MxData
247  {
249  uint16_t preference = 0;
251  std::string mailExchange;
252  };
253 
258  MxDnsResourceData(uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource);
259 
269  MxDnsResourceData(uint16_t preference, const std::string& mailExchange);
270 
271  ~MxDnsResourceData() override = default;
272 
277  bool operator==(const MxDnsResourceData& other) const;
278 
281  {
282  return m_Data;
283  }
284 
288  void setMxData(uint16_t preference, std::string mailExchange);
289 
290  // implement abstract methods
291 
294  std::string toString() const override;
295 
296  std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const override;
297 
298  private:
299  MxData m_Data;
300  };
301 
306  {
307  private:
308  uint8_t* m_Data;
309  size_t m_DataLen;
310 
311  public:
316  GenericDnsResourceData(const uint8_t* dataPtr, size_t dataLen);
317 
320  explicit GenericDnsResourceData(const std::string& dataAsHexString);
321 
325 
326  ~GenericDnsResourceData() override
327  {
328  if (m_Data != nullptr)
329  delete[] m_Data;
330  }
331 
332  GenericDnsResourceData& operator=(const GenericDnsResourceData& other);
333 
337  bool operator==(const GenericDnsResourceData& other) const;
338 
339  // implement abstract methods
340 
341  std::string toString() const override;
342  std::vector<uint8_t> toBytes(IDnsResource* dnsResource) const override;
343  };
344 
345 } // namespace pcpp
Definition: DnsResourceData.h:82
IDnsResourceDataType * castAs()
Definition: DnsResourceData.h:100
DnsResourceDataPtr(IDnsResourceData *ptr)
Definition: DnsResourceData.h:86
bool isTypeOf() const
Definition: DnsResourceData.h:92
Definition: DnsResourceData.h:306
bool operator==(const GenericDnsResourceData &other) const
GenericDnsResourceData(const std::string &dataAsHexString)
std::string toString() const override
std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const override
GenericDnsResourceData(const uint8_t *dataPtr, size_t dataLen)
GenericDnsResourceData(const GenericDnsResourceData &other)
Definition: DnsResourceData.h:26
virtual std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const =0
bool toByteArr(uint8_t *arr, size_t &arrLength, IDnsResource *dnsResource) const
IDnsResourceDataType * castAs()
Definition: DnsResourceData.h:53
bool isTypeOf() const
Definition: DnsResourceData.h:44
virtual std::string toString() const =0
virtual ~IDnsResourceData()=default
A virtual d'tor, does nothing.
Definition: DnsResource.h:26
Definition: IpAddress.h:30
std::string toString() const
Definition: DnsResourceData.h:151
IPv4DnsResourceData(const std::string &addrAsString)
Definition: DnsResourceData.h:168
bool operator==(const IPv4DnsResourceData &other) const
Definition: DnsResourceData.h:174
IPv4DnsResourceData(const IPv4Address &addr)
Definition: DnsResourceData.h:163
std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const override
IPv4DnsResourceData(const uint8_t *dataPtr, size_t dataLen)
std::string toString() const override
Definition: DnsResourceData.h:187
IPv4Address getIpAddress() const
Definition: DnsResourceData.h:180
Definition: IpAddress.h:165
std::string toString() const
Definition: DnsResourceData.h:197
IPv6DnsResourceData(const IPv6Address &addr)
Definition: DnsResourceData.h:209
std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const override
std::string toString() const override
Definition: DnsResourceData.h:233
bool operator==(const IPv6DnsResourceData &other) const
Definition: DnsResourceData.h:220
IPv6DnsResourceData(const uint8_t *dataPtr, size_t dataLen)
IPv6Address getIpAddress() const
Definition: DnsResourceData.h:226
IPv6DnsResourceData(const std::string &addrAsString)
Definition: DnsResourceData.h:214
Definition: DnsResourceData.h:243
std::string toString() const override
MxDnsResourceData(uint16_t preference, const std::string &mailExchange)
std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const override
MxDnsResourceData(uint8_t *dataPtr, size_t dataLen, IDnsResource *dnsResource)
bool operator==(const MxDnsResourceData &other) const
MxData getMxData() const
Definition: DnsResourceData.h:280
void setMxData(uint16_t preference, std::string mailExchange)
Definition: DnsResourceData.h:110
std::string toString() const override
Definition: DnsResourceData.h:141
std::vector< uint8_t > toBytes(IDnsResource *dnsResource) const override
StringDnsResourceData(const std::string &data)
Definition: DnsResourceData.h:124
bool operator==(const StringDnsResourceData &other) const
Definition: DnsResourceData.h:134
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
@ PCPP_DEPRECATED
Deprecated typo, use OsiModelSessionLayer instead.
Definition: ProtocolType.h:437
A struct that represents mail exchange (MX) data.
Definition: DnsResourceData.h:247
std::string mailExchange
Mail exchange hostname.
Definition: DnsResourceData.h:251