Exiv2
iptc.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
7 #ifndef IPTC_HPP_
8 #define IPTC_HPP_
9 
10 // *****************************************************************************
11 #include "exiv2lib_export.h"
12 
13 // included header files
14 #include "datasets.hpp"
15 #include "metadatum.hpp"
16 
17 // *****************************************************************************
18 // namespace extensions
19 namespace Exiv2 {
20 // *****************************************************************************
21 // class declarations
22 class ExifData;
23 
24 // *****************************************************************************
25 // class definitions
26 
33 class EXIV2API Iptcdatum : public Metadatum {
34  public:
36 
37 
49  explicit Iptcdatum(const IptcKey& key, const Value* pValue = nullptr);
51  Iptcdatum(const Iptcdatum& rhs);
53  ~Iptcdatum() override = default;
55 
57 
58  Iptcdatum& operator=(const Iptcdatum& rhs);
64  Iptcdatum& operator=(const uint16_t& value);
69  Iptcdatum& operator=(const std::string& value);
74  Iptcdatum& operator=(const Value& value);
75  void setValue(const Value* pValue) override;
84  int setValue(const std::string& value) override;
86 
88 
89  size_t copy(byte* buf, ByteOrder byteOrder) const override;
90  std::ostream& write(std::ostream& os, const ExifData* pMetadata = nullptr) const override;
97  [[nodiscard]] std::string key() const override;
102  [[nodiscard]] std::string recordName() const;
107  [[nodiscard]] uint16_t record() const;
108  [[nodiscard]] const char* familyName() const override;
109  [[nodiscard]] std::string groupName() const override;
114  [[nodiscard]] std::string tagName() const override;
115  [[nodiscard]] std::string tagLabel() const override;
116  [[nodiscard]] std::string tagDesc() const override;
118  [[nodiscard]] uint16_t tag() const override;
119  [[nodiscard]] TypeId typeId() const override;
120  [[nodiscard]] const char* typeName() const override;
121  [[nodiscard]] size_t typeSize() const override;
122  [[nodiscard]] size_t count() const override;
123  [[nodiscard]] size_t size() const override;
124  [[nodiscard]] std::string toString() const override;
125  [[nodiscard]] std::string toString(size_t n) const override;
126  [[nodiscard]] int64_t toInt64(size_t n = 0) const override;
127  [[nodiscard]] float toFloat(size_t n = 0) const override;
128  [[nodiscard]] Rational toRational(size_t n = 0) const override;
129  [[nodiscard]] Value::UniquePtr getValue() const override;
130  [[nodiscard]] const Value& value() const override;
132 
133  private:
134  // DATA
135  IptcKey::UniquePtr key_;
136  Value::UniquePtr value_;
137 
138 }; // class Iptcdatum
139 
141 using IptcMetadata = std::vector<Iptcdatum>;
142 
153 class EXIV2API IptcData {
154  public:
156  using iterator = IptcMetadata::iterator;
158  using const_iterator = IptcMetadata::const_iterator;
159 
160  // Use the compiler generated constructors and assignment operator
161 
163 
164 
172  Iptcdatum& operator[](const std::string& key);
180  int add(const IptcKey& key, const Value* value);
187  int add(const Iptcdatum& iptcdatum);
194  iterator erase(iterator pos);
198  void clear() {
199  iptcMetadata_.clear();
200  }
202  void sortByKey();
204  void sortByTag();
207  return iptcMetadata_.begin();
208  }
211  return iptcMetadata_.end();
212  }
217  iterator findKey(const IptcKey& key);
222  iterator findId(uint16_t dataset, uint16_t record = IptcDataSets::application2);
224 
226 
227  [[nodiscard]] const_iterator begin() const {
229  return iptcMetadata_.begin();
230  }
232  [[nodiscard]] const_iterator end() const {
233  return iptcMetadata_.end();
234  }
239  [[nodiscard]] const_iterator findKey(const IptcKey& key) const;
244  [[nodiscard]] const_iterator findId(uint16_t dataset, uint16_t record = IptcDataSets::application2) const;
246  [[nodiscard]] bool empty() const {
247  return iptcMetadata_.empty();
248  }
249 
251  [[nodiscard]] size_t count() const {
252  return iptcMetadata_.size();
253  }
254 
256  [[nodiscard]] size_t size() const;
257 
259  [[nodiscard]] const char* detectCharset() const;
260 
262  static void printStructure(std::ostream& out, const Slice<byte*>& bytes, size_t depth);
264 
265  private:
266  // DATA
267  IptcMetadata iptcMetadata_;
268 }; // class IptcData
269 
274 class EXIV2API IptcParser {
275  public:
287  static int decode(IptcData& iptcData, const byte* pData, size_t size);
288 
297  static DataBuf encode(const IptcData& iptcData);
298 
299  private:
300  // Constant data
301  static constexpr byte marker_ = 0x1C; // Dataset marker
302 
303 }; // class IptcParser
304 
305 } // namespace Exiv2
306 
307 #endif // #ifndef IPTC_HPP_
Slice (= view) for STL containers.
Definition: slice.hpp:421
A container for Exif data. This is a top-level class of the Exiv2 library. The container holds Exifda...
Definition: exif.hpp:373
ByteOrder
Type to express the byte order (little or big endian)
Definition: types.hpp:34
T getValue(const byte *buf, ByteOrder byteOrder)
Read a value of type T from the data buffer.
Definition: value.hpp:1332
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:70
const_iterator end() const
End of the metadata.
Definition: iptc.hpp:232
iterator begin()
Begin of the metadata.
Definition: iptc.hpp:206
uint8_t byte
1 byte unsigned integer type.
Definition: types.hpp:26
An IPTC metadatum ("dataset"), consisting of an IptcKey and a Value and methods to manipulate these...
Definition: iptc.hpp:33
void clear()
Delete all Iptcdatum instances resulting in an empty container.
Definition: iptc.hpp:198
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
A container for IPTC data. This is a top-level class of the Exiv2 library.
Definition: iptc.hpp:153
iterator end()
End of the metadata.
Definition: iptc.hpp:210
Concrete keys for IPTC metadata.
Definition: datasets.hpp:237
std::pair< int32_t, int32_t > Rational
8 byte signed rational type.
Definition: types.hpp:31
Stateless parser class for IPTC data. Images use this class to decode and encode binary IPTC data...
Definition: iptc.hpp:274
IptcMetadata::const_iterator const_iterator
IptcMetadata const iterator type.
Definition: iptc.hpp:158
std::vector< Iptcdatum > IptcMetadata
Container type to hold all metadata.
Definition: iptc.hpp:141
Exiv2::Exifdatum & setValue(Exiv2::Exifdatum &exifDatum, const T &value)
Set the value of exifDatum to value. If the object already has a value, it is replaced. Otherwise a new ValueType value is created and set to value.
Definition: exif.cpp:147
const char * groupName(IfdId ifdId)
Return the group name for a group id.
Definition: tags_int.cpp:2477
bool empty() const
Return true if there is no IPTC metadata.
Definition: iptc.hpp:246
Common interface for all types of values used with metadata.
Definition: value.hpp:33
size_t count() const
Get the number of metadata entries.
Definition: iptc.hpp:251
IptcMetadata::iterator iterator
IptcMetadata iterator type.
Definition: iptc.hpp:156
Class CrwImage to access Canon CRW images. References: The Canon RAW (CRW) File Format by Phil Harv...
Definition: asfvideo.hpp:15
std::unique_ptr< IptcKey > UniquePtr
Shortcut for an IptcKey auto pointer.
Definition: datasets.hpp:240
Abstract base class defining the interface to access information related to one metadata tag...
Definition: metadatum.hpp:103
std::unique_ptr< Value > UniquePtr
Shortcut for a Value auto pointer.
Definition: value.hpp:36