Exiv2
tags.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 TAGS_HPP_
21 #define TAGS_HPP_
22 
23 // *****************************************************************************
24 #include "exiv2lib_export.h"
25 
26 // included header files
27 #include "metadatum.hpp"
28 
29 // + standard includes
30 #include <string>
31 #include <iosfwd>
32 #include <memory>
33 
34 // *****************************************************************************
35 // namespace extensions
36 namespace Exiv2 {
37 
38 // *****************************************************************************
39 // class declarations
40  class ExifData;
41  class ExifKey;
42  class Value;
43  struct TagInfo;
44 
45 // *****************************************************************************
46 // type definitions
47 
49  typedef std::ostream& (*PrintFct)(std::ostream&, const Value&, const ExifData* pExifData);
51  typedef const TagInfo* (*TagListFct)();
52 
53 // *****************************************************************************
54 // class definitions
55 
57  struct EXIV2API GroupInfo {
58  struct GroupName;
59  bool operator==(int ifdId) const;
60  bool operator==(const GroupName& groupName) const;
61  int ifdId_;
62  const char* ifdName_;
63  const char* groupName_;
65  };
66 
68  struct EXIV2API GroupInfo::GroupName {
69  explicit GroupName(const std::string& groupName);
70  std::string g_;
71  };
72 
74  struct EXIV2API TagInfo {
76  TagInfo(
77  uint16_t tag,
78  const char* name,
79  const char* title,
80  const char* desc,
81  int ifdId,
82  int sectionId,
83  TypeId typeId,
84  int16_t count,
85  PrintFct printFct
86  );
87  uint16_t tag_;
88  const char* name_;
89  const char* title_;
90  const char* desc_;
91  int ifdId_;
92  int sectionId_;
94  int16_t count_;
96  }; // struct TagInfo
97 
99  class EXIV2API ExifTags {
101  ExifTags();
103  ExifTags(const ExifTags& rhs);
105  ExifTags& operator=(const ExifTags& rhs);
106 
107  public:
109  static const GroupInfo* groupList();
111  static const TagInfo* tagList(const std::string& groupName);
113  static void taglist(std::ostream& os);
115  static void taglist(std::ostream& os, const std::string& groupName);
116 
118  static const char* sectionName(const ExifKey& key);
120  static uint16_t defaultCount(const ExifKey& key);
122  static const char* ifdName(const std::string& groupName);
123 
127  static bool isMakerGroup(const std::string& groupName);
133  static bool isExifGroup(const std::string& groupName);
134 
135  }; // class ExifTags
136 
140  class EXIV2API ExifKey : public Key {
141  public:
143  typedef std::auto_ptr<ExifKey> AutoPtr;
144 
146 
147 
155  explicit ExifKey(const std::string& key);
165  ExifKey(uint16_t tag, const std::string& groupName);
172  explicit ExifKey(const TagInfo& ti);
173 
175  ExifKey(const ExifKey& rhs);
177  virtual ~ExifKey();
179 
181 
182 
185  ExifKey& operator=(const ExifKey& rhs);
187  void setIdx(int idx);
189 
191 
192  virtual std::string key() const;
193  virtual const char* familyName() const;
194  virtual std::string groupName() const;
196  int ifdId() const;
197  virtual std::string tagName() const;
198  virtual uint16_t tag() const;
199  virtual std::string tagLabel() const;
201  std::string tagDesc() const; // Todo: should be in the base class
203  TypeId defaultTypeId() const; // Todo: should be in the base class
204 
205  AutoPtr clone() const;
207  int idx() const;
209 
210  private:
212  virtual ExifKey* clone_() const;
213 
214  private:
215  // Pimpl idiom
216  struct Impl;
217  std::auto_ptr<Impl> p_;
218 
219  }; // class ExifKey
220 
221 // *****************************************************************************
222 // free functions
223 
225  EXIV2API std::ostream& operator<<(std::ostream& os, const TagInfo& ti);
226 
227 } // namespace Exiv2
228 
229 #endif // #ifndef TAGS_HPP_
A container for Exif data. This is a top-level class of the Exiv2 library. The container holds Exifda...
Definition: exif.hpp:434
Concrete keys for Exif metadata and access to Exif tag reference data.
Definition: tags.hpp:140
std::auto_ptr< ExifKey > AutoPtr
Shortcut for an ExifKey auto pointer.
Definition: tags.hpp:143
Access to Exif group and tag lists and misc. tag reference methods, implemented as a static class.
Definition: tags.hpp:99
Abstract base class defining the Key of a metadatum. Keys are used to identify and group metadata.
Definition: metadatum.hpp:44
std::auto_ptr< Key > AutoPtr
Shortcut for a Key auto pointer.
Definition: metadatum.hpp:47
Common interface for all types of values used with metadata.
Definition: value.hpp:51
const char * groupName(IfdId ifdId)
Return the group name for a group id.
Definition: tags_int.cpp:2540
void taglist(std::ostream &os, IfdId ifdId)
Print the list of tags for ifdId to the output stream os.
Definition: tags_int.cpp:2483
const TagInfo * tagList(IfdId ifdId)
Return the tag list for ifdId.
Definition: tags_int.cpp:2493
const char * ifdName(IfdId ifdId)
Return the name of the IFD.
Definition: tags_int.cpp:2533
bool operator==(const TagDetails &td, const LensTypeAndFocalLengthAndMaxAperture &ltfl)
Compare tag details with a lens entry.
Definition: canonmn_int.cpp:2820
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 TagInfo *(* TagListFct)()
A function returning a tag list.
Definition: tags.hpp:51
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:119
std::ostream &(* PrintFct)(std::ostream &, const Value &, const ExifData *pExifData)
Type for a function pointer for functions interpreting the tag value.
Definition: tags.hpp:49
Internal Pimpl structure with private members and data of class ExifKey.
Definition: tags.cpp:210
The details of an Exif group. Groups include IFDs and binary arrays.
Definition: tags.hpp:57
int ifdId_
IFD id.
Definition: tags.hpp:61
std::string g_
Group name.
Definition: tags.hpp:70
TagListFct tagList_
Tag list.
Definition: tags.hpp:64
const char * ifdName_
IFD name.
Definition: tags.hpp:62
const char * groupName_
Group name, unique for each group.
Definition: tags.hpp:63
Tag information.
Definition: tags.hpp:74
uint16_t tag_
Tag.
Definition: tags.hpp:87
int sectionId_
Section id.
Definition: tags.hpp:92
int16_t count_
The number of values (not bytes!), 0=any, -1=count not known.
Definition: tags.hpp:94
TypeId typeId_
Type id.
Definition: tags.hpp:93
int ifdId_
Link to the (preferred) IFD.
Definition: tags.hpp:91
const char * desc_
Short tag description.
Definition: tags.hpp:90
const char * title_
Tag title.
Definition: tags.hpp:89
PrintFct printFct_
Pointer to tag print function.
Definition: tags.hpp:95
const char * name_
One word tag label.
Definition: tags.hpp:88