Exiv2
properties.hpp
1 // ***************************************************************** -*- C++ -*-
2 /*
3  * Copyright (C) 2004-2021 Exiv2 authors
4  * This program is part of the Exiv2 distribution.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
19  */
20 #ifndef PROPERTIES_HPP_
21 #define PROPERTIES_HPP_
22 
23 // *****************************************************************************
24 #include "exiv2lib_export.h"
25 
26 // included header files
27 #include "datasets.hpp"
28 #include "rwlock.hpp"
29 
30 // *****************************************************************************
31 // namespace extensions
32 namespace Exiv2 {
33 
34 // *****************************************************************************
35 // class declarations
36  class XmpKey;
37 
38 // *****************************************************************************
39 // class definitions
40 
42  enum XmpCategory { xmpInternal, xmpExternal };
43 
45  struct EXIV2API XmpPropertyInfo {
47  bool operator==(const std::string& name) const;
48 
49  const char* name_;
50  const char* title_;
51  const char* xmpValueType_;
54  const char* desc_;
55  };
56 
58  struct EXIV2API XmpNsInfo {
60  struct Prefix {
62  explicit Prefix(const std::string& prefix);
64  std::string prefix_;
65  };
67  struct Ns {
69  explicit Ns(const std::string& ns);
71  std::string ns_;
72  };
74  bool operator==(const Ns& ns) const;
76  bool operator==(const Prefix& prefix) const;
77 
78  const char* ns_;
79  const char* prefix_;
81  const char* desc_;
82  };
83 
85  class EXIV2API XmpProperties {
87  XmpProperties();
89  XmpProperties(const XmpProperties& rhs);
91  XmpProperties& operator=(const XmpProperties& rhs);
92 
93  private:
94  static const XmpNsInfo* nsInfoUnsafe(const std::string& prefix);
95  static void unregisterNsUnsafe(const std::string& ns);
96  static const XmpNsInfo* lookupNsRegistryUnsafe(const XmpNsInfo::Prefix& prefix);
97 
98  public:
105  static const char* propertyTitle(const XmpKey& key);
112  static const char* propertyDesc(const XmpKey& key);
119  static TypeId propertyType(const XmpKey& key);
131  static const XmpPropertyInfo* propertyInfo(const XmpKey& key);
139  static std::string ns(const std::string& prefix);
147  static const char* nsDesc(const std::string& prefix);
155  static const XmpPropertyInfo* propertyList(const std::string& prefix);
163  static const XmpNsInfo* nsInfo(const std::string& prefix);
164 
171  static std::string prefix(const std::string& ns);
173  static void printProperties(std::ostream& os, const std::string& prefix);
174 
176  static std::ostream& printProperty(std::ostream& os,
177  const std::string& key,
178  const Value& value);
187  static void registerNs(const std::string& ns, const std::string& prefix);
196  static void unregisterNs(const std::string& ns);
197 
200 
209  static void unregisterNs();
211  typedef std::map<std::string, XmpNsInfo> NsRegistry;
215  static const XmpNsInfo* lookupNsRegistry(const XmpNsInfo::Prefix& prefix);
216 
217  // DATA
219 
223  static void registeredNamespaces(Exiv2::Dictionary& nsDict);
224 
225  }; // class XmpProperties
226 
230  class EXIV2API XmpKey : public Key
231  {
232  public:
234  typedef std::auto_ptr<XmpKey> AutoPtr;
235 
237 
238 
246  explicit XmpKey(const std::string& key);
256  XmpKey(const std::string& prefix, const std::string& property);
258  XmpKey(const XmpKey& rhs);
260  virtual ~XmpKey();
262 
264 
265  XmpKey& operator=(const XmpKey& rhs);
268 
270 
271  virtual std::string key() const;
272  virtual const char* familyName() const;
277  virtual std::string groupName() const;
278  virtual std::string tagName() const;
279  virtual std::string tagLabel() const;
281  virtual uint16_t tag() const;
282 
283  AutoPtr clone() const;
284 
285  // Todo: Should this be removed? What about tagLabel then?
287  std::string ns() const;
289 
290  private:
292  virtual XmpKey* clone_() const;
293 
294  private:
295  // Pimpl idiom
296  struct Impl;
297  std::auto_ptr<Impl> p_;
298 
299  }; // class XmpKey
300 
301  // *****************************************************************************
302  // free functions
303 
305  EXIV2API std::ostream& operator<<(std::ostream& os, const XmpPropertyInfo& propertyInfo);
306 
307 } // namespace Exiv2
308 
309 #endif // #ifndef PROPERTIES_HPP_
bool operator==(const TagDetails &td, const LensTypeAndFocalLengthAndMaxAperture &ltfl)
Compare tag details with a lens entry.
Definition: canonmn_int.cpp:2820
const char * name_
Property name.
Definition: properties.hpp:49
std::string prefix_
The prefix string.
Definition: properties.hpp:64
std::map< std::string, std::string > Dictionary
typedef for string:string map
Definition: datasets.hpp:364
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:119
const char * ns_
Namespace.
Definition: properties.hpp:78
std::auto_ptr< XmpKey > AutoPtr
Shortcut for an XmpKey auto pointer.
Definition: properties.hpp:234
For comparison with prefix.
Definition: properties.hpp:60
const char * xmpValueType_
XMP value type (for info only)
Definition: properties.hpp:51
const char * title_
Property title or label.
Definition: properties.hpp:50
Abstract base class defining the Key of a metadatum. Keys are used to identify and group metadata...
Definition: metadatum.hpp:44
static Exiv2::RWLock rwLock_
lock to be used while modifying properties
Definition: properties.hpp:199
std::string ns_
The namespace string.
Definition: properties.hpp:71
Structure mapping XMP namespaces and (preferred) prefixes.
Definition: properties.hpp:58
static NsRegistry nsRegistry_
Namespace registry.
Definition: properties.hpp:218
XMP property reference, implemented as a static class.
Definition: properties.hpp:85
std::map< std::string, XmpNsInfo > NsRegistry
Type for the namespace registry.
Definition: properties.hpp:211
IPTC dataset and type information.
Concrete keys for XMP metadata.
Definition: properties.hpp:230
const XmpPropertyInfo * xmpPropertyInfo_
List of known properties.
Definition: properties.hpp:80
XmpCategory
Category of an XMP property.
Definition: properties.hpp:42
Class to provide a Read-Write Lock.
Definition: rwlock.hpp:89
const char * groupName(IfdId ifdId)
Return the group name for a group id.
Definition: tags_int.cpp:2535
XmpCategory xmpCategory_
Category (internal or external)
Definition: properties.hpp:53
Information about one XMP property.
Definition: properties.hpp:45
Common interface for all types of values used with metadata.
Definition: value.hpp:51
Provides classes and functions to encode and decode Exif and Iptc data. The libexiv2 API consists of ...
Definition: asfvideo.hpp:36
EXIV2API std::ostream & operator<<(std::ostream &os, const DataSet &dataSet)
Output operator for dataSet.
Definition: datasets.cpp:709
const char * prefix_
(Preferred) prefix
Definition: properties.hpp:79
const char * desc_
Brief description of the namespace.
Definition: properties.hpp:81
TypeId typeId_
Exiv2 default type for the property.
Definition: properties.hpp:52
const char * desc_
Property description.
Definition: properties.hpp:54
std::auto_ptr< Key > AutoPtr
Shortcut for a Key auto pointer.
Definition: metadatum.hpp:47
For comparison with namespace.
Definition: properties.hpp:67