KItinerary

berelement.h
1 /*
2  SPDX-FileCopyrightText: 2020 Volker Krause <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include "kitinerary_export.h"
10 
11 #include <QByteArray>
12 
13 #include <cstdint>
14 
15 class QIODevice;
16 
17 namespace KItinerary {
18 
19 /** BER/DER/X.690 encoding classes and functions. */
20 namespace BER {
21 
22 /**
23  * An element in BER/DER/X.690 encoding.
24  * Implicitly this is also kinda implementing a QByteArrayRef, as this works without copying
25  * the underlying data.
26  */
27 class KITINERARY_EXPORT Element
28 {
29 public:
30  Element();
31  explicit Element(const QByteArray &data, int offset = 0, int size = -1);
32  ~Element();
33 
34  /** Returns @c true if this element has a valid structure and can be read from. */
35  bool isValid() const;
36 
37  /** Type, "right-aligned" in the returned 32bit value. */
38  uint32_t type() const;
39 
40  /** Size of the entire element (type, size and content). */
41  int size() const;
42  /** Raw data of this element.
43  * Typically only needed when copying/writing this element somewhere.
44  */
45  const char* rawData() const;
46 
47  /** Size of the value part of this element.
48  * This is excluding a possible variable length end marker.
49  */
50  int contentSize() const;
51  /** Raw content data. */
52  const uint8_t* contentData() const;
53 
54  /** Convenience method to access typed content. */
55  template <typename T>
56  inline const T* contentAt(int offset = 0) const
57  {
58  if (offset < 0 || (int)sizeof(T) > contentSize() - offset) {
59  return nullptr;
60  }
61  return reinterpret_cast<const T*>(contentData() + offset);
62  }
63 
64  /** First child element, for nested types. */
65  Element first() const;
66  /** Next child element, for nested types. */
67  Element next() const;
68  /** Returns the first child element of the given @p type. */
69  Element find(uint32_t type) const;
70 
71  /** Writes the given size in BER encoding to @p out. */
72  static void writeSize(QIODevice *out, int size);
73 
74 private:
75  int typeSize() const;
76  int lengthSize() const;
77  int contentOffset() const;
78 
79  QByteArray m_data;
80  int m_offset = -1;
81  int m_dataSize = -1;
82 };
83 
84 template <uint32_t TagValue>
85 class TypedElement : public Element
86 {
87 public:
88  using Element::Element;
89  inline bool isValid() const
90  {
91  return Element::isValid() && type() == TagValue;
92  }
93 };
94 
95 }
96 }
97 
bool isValid() const
Returns true if this element has a valid structure and can be read from.
Definition: berelement.cpp:39
const T * contentAt(int offset=0) const
Convenience method to access typed content.
Definition: berelement.h:56
An element in BER/DER/X.690 encoding.
Definition: berelement.h:27
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Feb 5 2023 04:08:30 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.