Exiv2
properties.hpp
Go to the documentation of this file.
1 // ***************************************************************** -*- C++ -*-
2 /*
3  * Copyright (C) 2004-2018 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  */
31 #ifndef PROPERTIES_HPP_
32 #define PROPERTIES_HPP_
33 
34 // *****************************************************************************
35 #include "exiv2lib_export.h"
36 
37 // included header files
38 #include "datasets.hpp"
39 #include "rwlock.hpp"
40 
41 // *****************************************************************************
42 // namespace extensions
43 namespace Exiv2 {
44 
45 // *****************************************************************************
46 // class declarations
47  class XmpKey;
48 
49 // *****************************************************************************
50 // class definitions
51 
53  enum XmpCategory { xmpInternal, xmpExternal };
54 
56  struct EXIV2API XmpPropertyInfo {
58  bool operator==(const std::string& name) const;
59 
60  const char* name_;
61  const char* title_;
62  const char* xmpValueType_;
65  const char* desc_;
66  };
67 
69  struct EXIV2API XmpNsInfo {
71  struct Prefix {
73  explicit Prefix(const std::string& prefix);
76  };
78  struct Ns {
80  explicit Ns(const std::string& ns);
83  };
85  bool operator==(const Ns& ns) const;
87  bool operator==(const Prefix& prefix) const;
88 
89  const char* ns_;
90  const char* prefix_;
92  const char* desc_;
93  };
94 
96  class EXIV2API XmpProperties {
98  XmpProperties();
100  XmpProperties(const XmpProperties& rhs);
102  XmpProperties& operator=(const XmpProperties& rhs);
103 
104  private:
105  static const XmpNsInfo* nsInfoUnsafe(const std::string& prefix);
106  static void unregisterNsUnsafe(const std::string& ns);
107  static const XmpNsInfo* lookupNsRegistryUnsafe(const XmpNsInfo::Prefix& prefix);
108 
109  public:
116  static const char* propertyTitle(const XmpKey& key);
123  static const char* propertyDesc(const XmpKey& key);
130  static TypeId propertyType(const XmpKey& key);
142  static const XmpPropertyInfo* propertyInfo(const XmpKey& key);
150  static std::string ns(const std::string& prefix);
158  static const char* nsDesc(const std::string& prefix);
166  static const XmpPropertyInfo* propertyList(const std::string& prefix);
174  static const XmpNsInfo* nsInfo(const std::string& prefix);
175 
182  static std::string prefix(const std::string& ns);
184  static void printProperties(std::ostream& os, const std::string& prefix);
185 
187  static std::ostream& printProperty(std::ostream& os,
188  const std::string& key,
189  const Value& value);
198  static void registerNs(const std::string& ns, const std::string& prefix);
207  static void unregisterNs(const std::string& ns);
208 
211 
220  static void unregisterNs();
222  typedef std::map<std::string, XmpNsInfo> NsRegistry;
226  static const XmpNsInfo* lookupNsRegistry(const XmpNsInfo::Prefix& prefix);
227 
228  // DATA
230 
235 
236  }; // class XmpProperties
237 
241  class EXIV2API XmpKey : public Key
242  {
243  public:
245  typedef std::auto_ptr<XmpKey> AutoPtr;
246 
248 
249 
257  explicit XmpKey(const std::string& key);
267  XmpKey(const std::string& prefix, const std::string& property);
269  XmpKey(const XmpKey& rhs);
271  virtual ~XmpKey();
273 
275 
276  XmpKey& operator=(const XmpKey& rhs);
279 
281 
282  virtual std::string key() const;
283  virtual const char* familyName() const;
288  virtual std::string groupName() const;
289  virtual std::string tagName() const;
290  virtual std::string tagLabel() const;
292  virtual uint16_t tag() const;
293 
294  AutoPtr clone() const;
295 
296  // Todo: Should this be removed? What about tagLabel then?
298  std::string ns() const;
300 
301  private:
303  virtual XmpKey* clone_() const;
304 
305  private:
306  // Pimpl idiom
307  struct Impl;
308  std::auto_ptr<Impl> p_;
309 
310  }; // class XmpKey
311 
312  // *****************************************************************************
313  // free functions
314 
316  EXIV2API std::ostream& operator<<(std::ostream& os, const XmpPropertyInfo& propertyInfo);
317 
318 } // namespace Exiv2
319 
320 #endif // #ifndef PROPERTIES_HPP_
Abstract base class defining the Key of a metadatum. Keys are used to identify and group metadata.
Definition: metadatum.hpp:55
std::auto_ptr< Key > AutoPtr
Shortcut for a Key auto pointer.
Definition: metadatum.hpp:58
Class to provide a Read-Write Lock.
Definition: rwlock.hpp:90
Common interface for all types of values used with metadata.
Definition: value.hpp:60
Concrete keys for XMP metadata.
Definition: properties.hpp:242
virtual const char * familyName() const
Return an identifier for the type of metadata (the first part of the key)
virtual std::string tagName() const
Return the name of the tag (which is also the third part of the key)
virtual ~XmpKey()
Virtual destructor.
XmpKey(const XmpKey &rhs)
Copy constructor.
virtual uint16_t tag() const
Properties don't have a tag number. Return 0.
std::string ns() const
Return the schema namespace for the prefix of the key.
std::auto_ptr< XmpKey > AutoPtr
Shortcut for an XmpKey auto pointer.
Definition: properties.hpp:245
virtual std::string groupName() const
Return the name of the group (the second part of the key). For XMP keys, the group name is the schema...
XmpKey(const std::string &key)
Constructor to create an XMP key from a key string.
virtual std::string key() const
Return the key of the metadatum as a string. The key is of the form 'familyName.groupName....
XmpKey(const std::string &prefix, const std::string &property)
Constructor to create an XMP key from a schema prefix and a property name.
virtual std::string tagLabel() const
Return a label for the tag.
XMP property reference, implemented as a static class.
Definition: properties.hpp:96
static TypeId propertyType(const XmpKey &key)
Return the type for property key. The default for unknown keys is xmpText.
static std::ostream & printProperty(std::ostream &os, const std::string &key, const Value &value)
Interpret and print the value of an XMP property.
static NsRegistry nsRegistry_
Namespace registry.
Definition: properties.hpp:229
static void unregisterNs()
Unregister all custom namespaces.
static std::string ns(const std::string &prefix)
Return the namespace name for the schema associated with prefix.
static void unregisterNs(const std::string &ns)
Unregister a custom namespace ns.
static const XmpNsInfo * nsInfo(const std::string &prefix)
Return information about a schema namespace for prefix. Always returns a valid pointer.
static const XmpNsInfo * lookupNsRegistry(const XmpNsInfo::Prefix &prefix)
Get the registered namespace for a specific prefix from the registry.
static Exiv2::RWLock rwLock_
lock to be used while modifying properties
Definition: properties.hpp:210
static std::string prefix(const std::string &ns)
Return the (preferred) prefix for schema namespace ns.
static const XmpPropertyInfo * propertyInfo(const XmpKey &key)
Return information for the property for key.
static const char * nsDesc(const std::string &prefix)
Return the namespace description for the schema associated with prefix.
static void printProperties(std::ostream &os, const std::string &prefix)
Print a list of properties of a schema namespace to output stream os.
static void registeredNamespaces(Exiv2::Dictionary &nsDict)
Get all registered namespaces (for both Exiv2 and XMPsdk)
static const char * propertyDesc(const XmpKey &key)
Return the description of the property.
std::map< std::string, XmpNsInfo > NsRegistry
Type for the namespace registry.
Definition: properties.hpp:222
static const char * propertyTitle(const XmpKey &key)
Return the title (label) of the property.
static const XmpPropertyInfo * propertyList(const std::string &prefix)
Return read-only list of built-in properties for prefix.
static void registerNs(const std::string &ns, const std::string &prefix)
Register namespace ns with preferred prefix prefix.
IPTC dataset and type information.
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
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:130
@ string
IPTC string type.
Definition: types.hpp:147
XmpCategory
Category of an XMP property.
Definition: properties.hpp:53
std::map< std::string, std::string > Dictionary
typedef for string:string map
Definition: datasets.hpp:364
For comparison with namespace.
Definition: properties.hpp:78
Ns(const std::string &ns)
Constructor.
std::string ns_
The namespace string.
Definition: properties.hpp:82
For comparison with prefix.
Definition: properties.hpp:71
std::string prefix_
The prefix string.
Definition: properties.hpp:75
Prefix(const std::string &prefix)
Constructor.
Structure mapping XMP namespaces and (preferred) prefixes.
Definition: properties.hpp:69
const XmpPropertyInfo * xmpPropertyInfo_
List of known properties.
Definition: properties.hpp:91
bool operator==(const Prefix &prefix) const
Comparison operator for prefix.
const char * desc_
Brief description of the namespace.
Definition: properties.hpp:92
const char * prefix_
(Preferred) prefix
Definition: properties.hpp:90
const char * ns_
Namespace.
Definition: properties.hpp:89
bool operator==(const Ns &ns) const
Comparison operator for namespace.
Information about one XMP property.
Definition: properties.hpp:56
const char * name_
Property name.
Definition: properties.hpp:60
const char * desc_
Property description.
Definition: properties.hpp:65
const char * title_
Property title or label.
Definition: properties.hpp:61
bool operator==(const std::string &name) const
Comparison operator for name.
XmpCategory xmpCategory_
Category (internal or external)
Definition: properties.hpp:64
const char * xmpValueType_
XMP value type (for info only)
Definition: properties.hpp:62
TypeId typeId_
Exiv2 default type for the property.
Definition: properties.hpp:63