Exiv2
properties.hpp
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #ifndef PROPERTIES_HPP_
4 #define PROPERTIES_HPP_
5 
6 // *****************************************************************************
7 #include "exiv2lib_export.h"
8 
9 // included header files
10 #include <mutex>
11 
12 #include "datasets.hpp"
13 
14 // *****************************************************************************
15 // namespace extensions
16 namespace Exiv2 {
17 // *****************************************************************************
18 // class declarations
19 class XmpKey;
20 
21 // *****************************************************************************
22 // class definitions
23 
25 enum XmpCategory { xmpInternal, xmpExternal };
26 
28 struct EXIV2API XmpPropertyInfo {
30  bool operator==(const std::string& name) const;
31 
32  const char* name_;
33  const char* title_;
34  const char* xmpValueType_;
37  const char* desc_;
38 };
39 
41 struct EXIV2API XmpNsInfo {
43  struct Prefix {
45  std::string prefix_;
46  };
48  struct Ns {
50  std::string ns_;
51  };
53  bool operator==(const Ns& ns) const;
55  bool operator==(const Prefix& prefix) const;
56 
57  const char* ns_;
58  const char* prefix_;
60  const char* desc_;
61 };
62 
64 class EXIV2API XmpProperties {
65  private:
66  static const XmpNsInfo* nsInfoUnsafe(const std::string& prefix);
67  static void unregisterNsUnsafe(const std::string& ns);
68  static const XmpNsInfo* lookupNsRegistryUnsafe(const XmpNsInfo::Prefix& prefix);
69 
70  public:
77  static const char* propertyTitle(const XmpKey& key);
84  static const char* propertyDesc(const XmpKey& key);
91  static TypeId propertyType(const XmpKey& key);
103  static const XmpPropertyInfo* propertyInfo(const XmpKey& key);
111  static std::string ns(const std::string& prefix);
119  static const char* nsDesc(const std::string& prefix);
127  static const XmpPropertyInfo* propertyList(const std::string& prefix);
135  static const XmpNsInfo* nsInfo(const std::string& prefix);
136 
143  static std::string prefix(const std::string& ns);
145  static void printProperties(std::ostream& os, const std::string& prefix);
146 
148  static std::ostream& printProperty(std::ostream& os, const std::string& key, const Value& value);
157  static void registerNs(const std::string& ns, const std::string& prefix);
166  static void unregisterNs(const std::string& ns);
167 
176  static std::mutex mutex_;
177 
186  static void unregisterNs();
188  using NsRegistry = std::map<std::string, XmpNsInfo>;
192  static const XmpNsInfo* lookupNsRegistry(const XmpNsInfo::Prefix& prefix);
193 
194  // DATA
196 
200  static void registeredNamespaces(Exiv2::Dictionary& nsDict);
201 
202 }; // class XmpProperties
203 
207 class EXIV2API XmpKey : public Key {
208  public:
210  using UniquePtr = std::unique_ptr<XmpKey>;
211 
213 
214 
222  explicit XmpKey(const std::string& key);
232  XmpKey(const std::string& prefix, const std::string& property);
234  XmpKey(const XmpKey& rhs);
236  ~XmpKey() override;
238 
240 
241  XmpKey& operator=(const XmpKey& rhs);
244 
246 
247  [[nodiscard]] std::string key() const override;
248  [[nodiscard]] const char* familyName() const override;
253  [[nodiscard]] std::string groupName() const override;
254  [[nodiscard]] std::string tagName() const override;
255  [[nodiscard]] std::string tagLabel() const override;
256  [[nodiscard]] std::string tagDesc() const override;
258  [[nodiscard]] uint16_t tag() const override;
259 
260  [[nodiscard]] UniquePtr clone() const;
261 
262  // Todo: Should this be removed? What about tagLabel then?
264  [[nodiscard]] std::string ns() const;
266 
267  private:
269  [[nodiscard]] XmpKey* clone_() const override;
270 
271  // Pimpl idiom
272  struct Impl;
273  std::unique_ptr<Impl> p_;
274 
275 }; // class XmpKey
276 
277 // *****************************************************************************
278 // free functions
279 
281 EXIV2API std::ostream& operator<<(std::ostream& os, const XmpPropertyInfo& propertyInfo);
282 
283 } // namespace Exiv2
284 
285 #endif // #ifndef PROPERTIES_HPP_
static std::mutex mutex_
Lock to be used while modifying properties.
Definition: properties.hpp:176
const char * name_
Property name.
Definition: properties.hpp:32
std::map< std::string, XmpNsInfo > NsRegistry
Type for the namespace registry.
Definition: properties.hpp:188
std::string prefix_
The prefix string.
Definition: properties.hpp:45
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:70
const char * ns_
Namespace.
Definition: properties.hpp:57
For comparison with prefix.
Definition: properties.hpp:43
const char * xmpValueType_
XMP value type (for info only)
Definition: properties.hpp:34
std::map< std::string, std::string > Dictionary
typedef for string:string map
Definition: datasets.hpp:312
const char * title_
Property title or label.
Definition: properties.hpp:33
Abstract base class defining the Key of a metadatum. Keys are used to identify and group metadata...
Definition: metadatum.hpp:26
std::string ns_
The namespace string.
Definition: properties.hpp:50
Structure mapping XMP namespaces and (preferred) prefixes.
Definition: properties.hpp:41
static NsRegistry nsRegistry_
Namespace registry.
Definition: properties.hpp:195
XMP property reference, implemented as a static class.
Definition: properties.hpp:64
Concrete keys for XMP metadata.
Definition: properties.hpp:207
const XmpPropertyInfo * xmpPropertyInfo_
List of known properties.
Definition: properties.hpp:59
XmpCategory
Category of an XMP property.
Definition: properties.hpp:25
const char * groupName(IfdId ifdId)
Return the group name for a group id.
Definition: tags_int.cpp:2406
XmpCategory xmpCategory_
Category (internal or external)
Definition: properties.hpp:36
Information about one XMP property.
Definition: properties.hpp:28
Common interface for all types of values used with metadata.
Definition: value.hpp:33
std::unique_ptr< Key > UniquePtr
Shortcut for a Key auto pointer.
Definition: metadatum.hpp:29
Class CrwImage to access Canon CRW images. References: The Canon RAW (CRW) File Format by Phil Harv...
Definition: asfvideo.hpp:15
EXIV2API std::ostream & operator<<(std::ostream &os, const DataSet &dataSet)
Output operator for dataSet.
Definition: datasets.cpp:592
const char * prefix_
(Preferred) prefix
Definition: properties.hpp:58
const char * desc_
Brief description of the namespace.
Definition: properties.hpp:60
TypeId typeId_
Exiv2 default type for the property.
Definition: properties.hpp:35
const char * desc_
Property description.
Definition: properties.hpp:37
For comparison with namespace.
Definition: properties.hpp:48