[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:36:39 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=79721d0

The following commit has been merged in the master branch:
commit 79721d04e0bee1370337a9c4815ca714fc67e4b6
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Wed Sep 29 13:48:55 2004 +0000

    Move ExifKey to component tags, moved IptcKey to component datasets
---
 doc/exiv2.dot            |  13 ++--
 doc/exiv2.gif            | Bin 25003 -> 24342 bytes
 doc/getting-started.html |   2 +-
 src/datasets.cpp         |  79 +++++++++++++++++++++--
 src/datasets.hpp         |  86 ++++++++++++++++++++++++-
 src/exif.cpp             | 156 +--------------------------------------------
 src/exif.hpp             |  97 +---------------------------
 src/iptc.cpp             |  75 +---------------------
 src/iptc.hpp             |  83 +-----------------------
 src/tags.cpp             | 161 +++++++++++++++++++++++++++++++++++++++++++++--
 src/tags.hpp             | 102 +++++++++++++++++++++++++++++-
 11 files changed, 428 insertions(+), 426 deletions(-)

diff --git a/doc/exiv2.dot b/doc/exiv2.dot
index fb509c7..6ba98d5 100644
--- a/doc/exiv2.dot
+++ b/doc/exiv2.dot
@@ -3,7 +3,7 @@
 # Brief   Dot file for a graph showing the component dependencies 
 #         of the Exiv2 library. Run the following command to get the image:
 #         $ dot -Tgif -oexiv2.gif exiv2.dot
-# Version $Name:  $ $Revision: 1.4 $
+# Version $Name:  $ $Revision: 1.5 $
 # Author  Andreas Huggel (ahu)
 #         <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
 # Date    18-Feb-04, ahu: created
@@ -15,8 +15,9 @@ L1 [shape=plaintext] ;
 L2 [shape=plaintext] ;
 L3 [shape=plaintext] ;
 L4 [shape=plaintext] ;
+L5 [shape=plaintext] ;
 
-"L4" -> "L3" -> "L2" -> "L1" [style=invis] ;
+"L5" -> "L4" -> "L3" -> "L2" -> "L1" [style=invis] ;
 
 "exif"      [shape=box] ;
 "iptc"      [shape=box] ;
@@ -30,11 +31,9 @@ L4 [shape=plaintext] ;
 "error"     [shape=box] ;
 "makernote" [shape=box] ;
 
-"exif" -> "metadatum" ;
 "exif" -> "tags" ;
 "exif" -> "makernote" ;
 "exif" -> "image" ;
-"iptc" -> "metadatum" ;
 "iptc" -> "datasets" ;
 "iptc" -> "image" ;
 "metadatum" -> "value" ;
@@ -44,10 +43,8 @@ L4 [shape=plaintext] ;
 "ifd" -> "error" ;  
 "ifd" -> "types" ;
 "image" -> "types" ;
-"tags" -> "error" ;
-"tags" -> "value" ;
-"datasets" -> "error" ;
-"datasets" -> "value" ;
+"tags" -> "metadatum";
+"datasets" -> "metadatum" ;
 "value" -> "types" ;
 
 { rank=same; L1 error types }
diff --git a/doc/exiv2.gif b/doc/exiv2.gif
index 7701ad4..3b604a1 100644
Binary files a/doc/exiv2.gif and b/doc/exiv2.gif differ
diff --git a/doc/getting-started.html b/doc/getting-started.html
index d1c8abd..dd59bc1 100644
--- a/doc/getting-started.html
+++ b/doc/getting-started.html
@@ -86,7 +86,7 @@ own header and source files.</p>
 
 <center>
 <h3><a class="anchor">Exiv2 Components Diagram</a></h3>
-<p><img src="exiv2.gif" width="620" height="369" alt="Exiv2 components diagram"></p>
+<p><img src="exiv2.gif" width="470" height="465" alt="Exiv2 components diagram"></p>
 </center>
 <p> </p>
 
diff --git a/src/datasets.cpp b/src/datasets.cpp
index f8d0e32..62f32a1 100644
--- a/src/datasets.cpp
+++ b/src/datasets.cpp
@@ -20,13 +20,13 @@
  */
 /*
   File:      datasets.cpp
-  Version:   $Name:  $ $Revision: 1.6 $
+  Version:   $Name:  $ $Revision: 1.7 $
   Author(s): Brad Schick (brad) <schick at robotbattle.com>
   History:   24-Jul-04, brad: created
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.6 $ $RCSfile: datasets.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.7 $ $RCSfile: datasets.cpp,v $");
 
 // *****************************************************************************
 // included header files
@@ -34,14 +34,12 @@ EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.6 $ $RCSfile: datasets.cpp,v $");
 #include "error.hpp"
 #include "types.hpp"
 #include "value.hpp"
+#include "metadatum.hpp"
 
 #include <iostream>
 #include <iomanip>
 #include <sstream>
 
-// Todo: remove circular dependency
-#include "iptc.hpp"                             // for DataSet operator<<
-
 // *****************************************************************************
 // class member definitions
 namespace Exiv2 {
@@ -291,6 +289,77 @@ namespace Exiv2 {
         }
     } // IptcDataSets::dataSetList
     
+    const char* IptcKey::familyName_ = "Iptc";
+
+    IptcKey::IptcKey(const std::string& key)
+        : key_(key)
+    {
+        decomposeKey();
+    }
+
+    IptcKey::IptcKey(uint16_t tag, uint16_t record)
+        : tag_(tag), record_(record)
+    {
+        makeKey();
+    }
+
+    IptcKey::IptcKey(const IptcKey& rhs)
+        : tag_(rhs.tag_), record_(rhs.record_), key_(rhs.key_)
+    {
+    }
+
+    IptcKey& IptcKey::operator=(const IptcKey& rhs)
+    {
+        if (this == &rhs) return *this;
+        Key::operator=(rhs);
+        tag_ = rhs.tag_;
+        record_ = rhs.record_;
+        key_ = rhs.key_;
+        return *this;
+    }
+
+    IptcKey* IptcKey::clone() const
+    {
+        return new IptcKey(*this);
+    }
+
+    void IptcKey::decomposeKey()
+    {
+        // Get the family name, record name and dataSet name parts of the key
+        std::string::size_type pos1 = key_.find('.');
+        if (pos1 == std::string::npos) throw Error("Invalid key");
+        std::string familyName = key_.substr(0, pos1);
+        if (familyName != std::string(familyName_)) {
+            throw Error("Invalid key");
+        }
+        std::string::size_type pos0 = pos1 + 1;
+        pos1 = key_.find('.', pos0);
+        if (pos1 == std::string::npos) throw Error("Invalid key");
+        std::string recordName = key_.substr(pos0, pos1 - pos0);
+        if (recordName == "") throw Error("Invalid key");
+        std::string dataSetName = key_.substr(pos1 + 1);
+        if (dataSetName == "") throw Error("Invalid key");
+
+        // Use the parts of the key to find dataSet and recordId
+        uint16_t recId = IptcDataSets::recordId(recordName);
+        uint16_t dataSet = IptcDataSets::dataSet(dataSetName, recId);
+
+        // Possibly translate hex name parts (0xabcd) to real names 
+        recordName = IptcDataSets::recordName(recId);
+        dataSetName = IptcDataSets::dataSetName(dataSet, recId);
+
+        tag_ = dataSet;
+        record_ = recId;
+        key_ = familyName + "." + recordName + "." + dataSetName;
+    } // IptcKey::decomposeKey
+
+    void IptcKey::makeKey()
+    {
+        key_ = std::string(familyName_)
+            + "." + IptcDataSets::recordName(record_)
+            + "." + IptcDataSets::dataSetName(tag_, record_);
+    }
+
     // *************************************************************************
     // free functions
 
diff --git a/src/datasets.hpp b/src/datasets.hpp
index 199b3e8..83b854e 100644
--- a/src/datasets.hpp
+++ b/src/datasets.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    datasets.hpp
   @brief   Iptc dataSet and type information
-  @version $Name:  $ $Revision: 1.5 $
+  @version $Name:  $ $Revision: 1.6 $
   @author  Brad Schick (brad) <schick at robotbattle.com>
   @date    24-Jul-04, brad: created
  */
@@ -31,6 +31,7 @@
 // *****************************************************************************
 // included header files
 #include "types.hpp"
+#include "metadatum.hpp"
 
 // + standard includes
 #include <string>
@@ -256,6 +257,89 @@ namespace Exiv2 {
 
     }; // class IptcDataSets
 
+    /*!
+      @brief Concrete keys for Iptc metadata.
+     */
+    class IptcKey : public Key {
+    public:
+        //! @name Creators
+        //@{
+        /*!
+          @brief Constructor to create an Iptc key from a key string. 
+
+          @param key The key string.
+          @throw Error ("Invalid key") if the first part of the key is not 
+                 'Iptc' or the remaining parts of the key cannot be parsed and
+                 converted to a record name and a dataset name.
+        */
+        explicit IptcKey(const std::string& key);
+        /*!
+          @brief Constructor to create an Iptc key from dataset and record ids.
+          @param tag Dataset id
+          @param record Record id
+         */
+        IptcKey(uint16_t tag, uint16_t record);
+        //! Copy constructor
+        IptcKey(const IptcKey& rhs);
+        //@}
+
+        //! @name Manipulators
+        //@{
+        /*!
+          @brief Assignment operator.
+         */
+        IptcKey& operator=(const IptcKey& rhs);
+        //@}
+
+        //! @name Accessors
+        //@{
+        virtual std::string key() const { return key_; }
+        virtual const char* familyName() const { return familyName_; }
+        /*!
+          @brief Return the name of the group (the second part of the key).
+                 For Iptc keys, the group name is the record name.
+        */
+        virtual std::string groupName() const { return recordName(); }
+        virtual std::string tagName() const
+            { return IptcDataSets::dataSetName(tag_, record_); }
+        virtual uint16_t tag() const { return tag_; }
+        virtual IptcKey* clone() const;
+
+        //! Return the name of the record
+        std::string recordName() const
+            { return IptcDataSets::recordName(record_); }
+        //! Return the record id
+        uint16_t record() const { return record_; }
+        //@}
+
+    protected:
+        //! @name Manipulators
+        //@{
+        /*!
+          @brief Set the key corresponding to the dataset and record id. 
+                 The key is of the form '<b>Iptc</b>.recordName.dataSetName'.
+         */
+        void makeKey();
+        /*!
+          @brief Parse and convert the key string into dataset and record id.
+                 Updates data members if the string can be decomposed, or throws
+                 Error ("Invalid key").
+
+          @throw Error ("Invalid key") if the key cannot be decomposed.
+         */
+        void decomposeKey();
+        //@}
+
+    private:
+        // DATA
+        static const char* familyName_;
+
+        uint16_t tag_;                 //!< Tag value
+        uint16_t record_;              //!< Record value 
+        std::string key_;              //!< Key
+
+    }; // class IptcKey
+
 // *****************************************************************************
 // free functions
 
diff --git a/src/exif.cpp b/src/exif.cpp
index 2c01c62..1e0f41e 100644
--- a/src/exif.cpp
+++ b/src/exif.cpp
@@ -20,14 +20,14 @@
  */
 /*
   File:      exif.cpp
-  Version:   $Name:  $ $Revision: 1.62 $
+  Version:   $Name:  $ $Revision: 1.63 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   26-Jan-04, ahu: created
              11-Feb-04, ahu: isolated as a component
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.62 $ $RCSfile: exif.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.63 $ $RCSfile: exif.cpp,v $");
 
 // Define DEBUG_MAKERNOTE to output debug information to std::cerr
 #undef DEBUG_MAKERNOTE
@@ -73,158 +73,6 @@ namespace {
 // class member definitions
 namespace Exiv2 {
 
-    const char* ExifKey::familyName_ = "Exif";
-
-    ExifKey::ExifKey(const std::string& key)
-        : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""),
-          idx_(0), pMakerNote_(0), key_(key)
-    {
-        decomposeKey();
-    }
-
-    ExifKey::ExifKey(uint16_t tag, const std::string& ifdItem)
-        : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""),
-          idx_(0), pMakerNote_(0), key_("")
-    {
-        IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem);
-        if (ifdId == makerIfdId) throw Error("Invalid key");
-        MakerNote* pMakerNote = 0; 
-        if (ifdId == ifdIdNotSet) {
-            pMakerNote = MakerNoteFactory::instance().create(ifdItem);
-            if (pMakerNote) ifdId = makerIfdId;
-            else throw Error("Invalid key");
-        }
-        tag_ = tag;
-        ifdId_ = ifdId;
-        ifdItem_ = ifdItem;
-        pMakerNote_ = pMakerNote;
-        makeKey();
-    }
-
-    ExifKey::ExifKey(const Entry& e)
-        : tag_(e.tag()), ifdId_(e.ifdId()), ifdItem_(""),
-          idx_(e.idx()), pMakerNote_(0), key_("")
-    {
-        if (ifdId_ == makerIfdId) {
-            if (e.makerNote()) {
-                ifdItem_ = e.makerNote()->ifdItem();
-                pMakerNote_ = e.makerNote()->clone();
-            }
-            else throw Error("Invalid Key");
-        }
-        else {
-            ifdItem_ = ExifTags::ifdItem(ifdId_);
-        }
-        makeKey();
-    }
-
-    ExifKey::ExifKey(const ExifKey& rhs)
-        : tag_(rhs.tag_), ifdId_(rhs.ifdId_), ifdItem_(rhs.ifdItem_),
-          idx_(rhs.idx_), 
-          pMakerNote_(rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0),
-          key_(rhs.key_)
-    {
-    }
-
-    ExifKey::~ExifKey()
-    {
-        delete pMakerNote_;
-    }
-
-    ExifKey& ExifKey::operator=(const ExifKey& rhs)
-    {
-        if (this == &rhs) return *this;
-        Key::operator=(rhs);
-        tag_ = rhs.tag_;
-        ifdId_ = rhs.ifdId_;
-        ifdItem_ = rhs.ifdItem_;
-        idx_ = rhs.idx_;
-        pMakerNote_ = rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0;
-        key_ = rhs.key_;
-        return *this;
-    }
-
-    std::string ExifKey::tagName() const
-    {
-        if (ifdId_ == makerIfdId) {
-            assert(pMakerNote_);
-            return pMakerNote_->tagName(tag_);
-        }
-        return ExifTags::tagName(tag_, ifdId_); 
-    }
-    
-    ExifKey* ExifKey::clone() const
-    {
-        return new ExifKey(*this);
-    }
-
-    std::string ExifKey::sectionName() const 
-    {
-        if (ifdId_ == makerIfdId) {
-            assert(pMakerNote_);
-            return pMakerNote_->ifdItem();
-        }
-        return ExifTags::sectionName(tag(), ifdId()); 
-    }
-
-    void ExifKey::decomposeKey()
-    {
-        // Get the family name, IFD name and tag name parts of the key
-        std::string::size_type pos1 = key_.find('.');
-        if (pos1 == std::string::npos) throw Error("Invalid key");
-        std::string familyName = key_.substr(0, pos1);
-        if (familyName != std::string(familyName_)) {
-            throw Error("Invalid key");
-        }
-        std::string::size_type pos0 = pos1 + 1;
-        pos1 = key_.find('.', pos0);
-        if (pos1 == std::string::npos) throw Error("Invalid key");
-        std::string ifdItem = key_.substr(pos0, pos1 - pos0);
-        if (ifdItem == "") throw Error("Invalid key");
-        std::string tagName = key_.substr(pos1 + 1);
-        if (tagName == "") throw Error("Invalid key");
-
-        // Find IfdId
-        IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem);
-        if (ifdId == makerIfdId) throw Error("Invalid key");
-        MakerNote* pMakerNote = 0; 
-        if (ifdId == ifdIdNotSet) {
-            pMakerNote = MakerNoteFactory::instance().create(ifdItem);
-            if (pMakerNote) ifdId = makerIfdId;
-            else throw Error("Invalid key");
-        }
-
-        // Convert tag
-        uint16_t tag = pMakerNote ? 
-            pMakerNote->tag(tagName) : ExifTags::tag(tagName, ifdId);
-        // Translate hex tag name (0xabcd) to a real tag name if there is one
-        tagName = pMakerNote ? 
-            pMakerNote->tagName(tag) : ExifTags::tagName(tag, ifdId);
-
-        tag_ = tag;
-        ifdId_ = ifdId;
-        ifdItem_ = ifdItem;
-        pMakerNote_ = pMakerNote;
-        key_ = familyName + "." + ifdItem + "." + tagName;
-    }
-
-    void ExifKey::makeKey()
-    {
-        key_ = std::string(familyName_) 
-            + "." + ifdItem_
-            + "." + (pMakerNote_ ?
-            pMakerNote_->tagName(tag_) : ExifTags::tagName(tag_, ifdId_));
-    }
-
-    std::ostream& ExifKey::printTag(std::ostream& os, const Value& value) const
-    {
-        if (ifdId_ == makerIfdId) {
-            assert(pMakerNote_);
-            return pMakerNote_->printTag(os, tag(), value);
-        }
-        return ExifTags::printTag(os, tag(), ifdId(), value);
-    }
-
     Exifdatum::Exifdatum(const Entry& e, ByteOrder byteOrder)
         : pKey_(new ExifKey(e)), pValue_(0)
     {
diff --git a/src/exif.hpp b/src/exif.hpp
index 265ab7e..7e8e30f 100644
--- a/src/exif.hpp
+++ b/src/exif.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    exif.hpp
   @brief   Encoding and decoding of Exif data
-  @version $Name:  $ $Revision: 1.54 $
+  @version $Name:  $ $Revision: 1.55 $
   @author  Andreas Huggel (ahu)
            <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
   @date    09-Jan-04, ahu: created
@@ -60,101 +60,6 @@ namespace Exiv2 {
 // *****************************************************************************
 // class definitions
 
-    //! Concrete keys for Exif metadata.
-    class ExifKey : public Key {
-    public:
-        //! @name Creators
-        //@{
-        /*!
-          @brief Constructor to create an Exif key from a key string.
-
-          @param key The key string.
-          @throw Error ("Invalid key") if the key cannot be parsed into three
-                 parts or the first part of the key is not '<b>Exif</b>'.
-        */
-        explicit ExifKey(const std::string& key);
-        /*!
-          @brief Constructor to create an Exif key from a tag and IFD item 
-                 string.
-          @param tag The tag value
-          @param ifdItem The IFD string. For MakerNote tags, this must be the 
-                 IFD item of the specific MakerNote. "MakerNote" is not allowed.
-          @throw Error ("Invalid key") if the key cannot be constructed from
-                 the tag and IFD item parameters.
-         */
-        ExifKey(uint16_t tag, const std::string& ifdItem);
-        //! Constructor to build an ExifKey from an IFD entry.
-        explicit ExifKey(const Entry& e);
-        //! Copy constructor
-        ExifKey(const ExifKey& rhs);
-        virtual ~ExifKey();
-        //@}
-
-        //! @name Manipulators
-        //@{
-        /*!
-          @brief Assignment operator.
-         */
-        ExifKey& operator=(const ExifKey& rhs);
-        //@}
-
-        //! @name Accessors
-        //@{
-        virtual std::string key() const { return key_; }
-        virtual const char* familyName() const { return familyName_; }
-        /*!
-          @brief Return the name of the group (the second part of the key).
-                 For Exif keys, the group name is the IFD item.
-        */ 
-        virtual std::string groupName() const { return ifdItem(); }
-        virtual std::string tagName() const;
-        virtual uint16_t tag() const { return tag_; }
-        virtual ExifKey* clone() const;
-
-        //! Interpret and print the value of an Exif tag
-        std::ostream& printTag(std::ostream& os, const Value& value) const;
-        //! Return the IFD id
-        IfdId ifdId() const { return ifdId_; }
-        //! Return the name of the IFD
-        const char* ifdName() const { return ExifTags::ifdName(ifdId()); }
-        //! Return the related image item
-        std::string ifdItem() const { return ifdItem_; }
-        //! Return the name of the Exif section (deprecated) 
-        std::string sectionName() const;
-        //! Return the index (unique id of this key within the original IFD)
-        int idx() const { return idx_; }
-        //@}
-
-    protected:
-        //! @name Manipulators
-        //@{
-        /*!
-          @brief Set the key corresponding to the tag and IFD id. 
-                 The key is of the form '<b>Exif</b>.ifdItem.tagName'.
-         */
-        void makeKey();
-        /*!
-          @brief Parse and convert the key string into tag and IFD Id. 
-                 Updates data members if the string can be decomposed,
-                 or throws Error ("Invalid key").
-
-          @throw Error ("Invalid key") if the key cannot be decomposed.
-         */
-        void decomposeKey();
-        //@}
-
-    private:
-        // DATA
-        static const char* familyName_;
-
-        uint16_t tag_;                  //!< Tag value
-        IfdId ifdId_;                   //!< The IFD associated with this tag
-        std::string ifdItem_;           //!< The IFD item 
-        int idx_;                       //!< Unique id of an entry within one IFD
-        MakerNote* pMakerNote_;         //!< Pointer to the associated MakerNote
-        std::string key_;               //!< Key
-    }; // class ExifKey
-
     /*!
       @brief Information related to one Exif tag.
      */
diff --git a/src/iptc.cpp b/src/iptc.cpp
index 78ce451..e68a0c9 100644
--- a/src/iptc.cpp
+++ b/src/iptc.cpp
@@ -20,13 +20,13 @@
  */
 /*
   File:      iptc.cpp
-  Version:   $Name:  $ $Revision: 1.5 $
+  Version:   $Name:  $ $Revision: 1.6 $
   Author(s): Brad Schick (brad) <schick at robotbattle.com>
   History:   31-July-04, brad: created
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.5 $ $RCSfile: iptc.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.6 $ $RCSfile: iptc.cpp,v $");
 
 // Define DEBUG_MAKERNOTE to output debug information to std::cerr
 #undef DEBUG_MAKERNOTE
@@ -48,77 +48,6 @@ EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.5 $ $RCSfile: iptc.cpp,v $");
 // class member definitions
 namespace Exiv2 {
 
-    const char* IptcKey::familyName_ = "Iptc";
-
-    IptcKey::IptcKey(const std::string& key)
-        : key_(key)
-    {
-        decomposeKey();
-    }
-
-    IptcKey::IptcKey(uint16_t tag, uint16_t record)
-        : tag_(tag), record_(record)
-    {
-        makeKey();
-    }
-
-    IptcKey::IptcKey(const IptcKey& rhs)
-        : tag_(rhs.tag_), record_(rhs.record_), key_(rhs.key_)
-    {
-    }
-
-    IptcKey& IptcKey::operator=(const IptcKey& rhs)
-    {
-        if (this == &rhs) return *this;
-        Key::operator=(rhs);
-        tag_ = rhs.tag_;
-        record_ = rhs.record_;
-        key_ = rhs.key_;
-        return *this;
-    }
-
-    IptcKey* IptcKey::clone() const
-    {
-        return new IptcKey(*this);
-    }
-
-    void IptcKey::decomposeKey()
-    {
-        // Get the family name, record name and dataSet name parts of the key
-        std::string::size_type pos1 = key_.find('.');
-        if (pos1 == std::string::npos) throw Error("Invalid key");
-        std::string familyName = key_.substr(0, pos1);
-        if (familyName != std::string(familyName_)) {
-            throw Error("Invalid key");
-        }
-        std::string::size_type pos0 = pos1 + 1;
-        pos1 = key_.find('.', pos0);
-        if (pos1 == std::string::npos) throw Error("Invalid key");
-        std::string recordName = key_.substr(pos0, pos1 - pos0);
-        if (recordName == "") throw Error("Invalid key");
-        std::string dataSetName = key_.substr(pos1 + 1);
-        if (dataSetName == "") throw Error("Invalid key");
-
-        // Use the parts of the key to find dataSet and recordId
-        uint16_t recId = IptcDataSets::recordId(recordName);
-        uint16_t dataSet = IptcDataSets::dataSet(dataSetName, recId);
-
-        // Possibly translate hex name parts (0xabcd) to real names 
-        recordName = IptcDataSets::recordName(recId);
-        dataSetName = IptcDataSets::dataSetName(dataSet, recId);
-
-        tag_ = dataSet;
-        record_ = recId;
-        key_ = familyName + "." + recordName + "." + dataSetName;
-    } // IptcKey::decomposeKey
-
-    void IptcKey::makeKey()
-    {
-        key_ = std::string(familyName_)
-            + "." + IptcDataSets::recordName(record_)
-            + "." + IptcDataSets::dataSetName(tag_, record_);
-    }
-
     Iptcdatum::Iptcdatum(const IptcKey& key, 
                          const Value* value)
         : pKey_(key.clone()), pValue_(0), modified_(false)
diff --git a/src/iptc.hpp b/src/iptc.hpp
index d613c1a..5249e7c 100644
--- a/src/iptc.hpp
+++ b/src/iptc.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    iptc.hpp
   @brief   Encoding and decoding of Iptc data
-  @version $Name:  $ $Revision: 1.6 $
+  @version $Name:  $ $Revision: 1.7 $
   @author  Brad Schick (brad) 
            <a href="mailto:schick at robotbattle.com">schick at robotbattle.com</a>
   @date    31-Jul-04, brad: created
@@ -48,87 +48,6 @@ namespace Exiv2 {
 // *****************************************************************************
 // class definitions
 
-    //! Concrete keys for Iptc metadata.
-    class IptcKey : public Key {
-    public:
-        //! @name Creators
-        //@{
-        /*!
-          @brief Constructor to create an Iptc key from a key string. 
-
-          @param key The key string.
-          @throw Error ("Invalid key") if the first part of the key is not 
-                 'Iptc' or the remaining parts of the key cannot be parsed and
-                 converted to a record name and a dataset name.
-        */
-        explicit IptcKey(const std::string& key);
-        /*!
-          @brief Constructor to create an Iptc key from dataset and record ids.
-          @param tag Dataset id
-          @param record Record id
-         */
-        IptcKey(uint16_t tag, uint16_t record);
-        //! Copy constructor
-        IptcKey(const IptcKey& rhs);
-        //@}
-
-        //! @name Manipulators
-        //@{
-        /*!
-          @brief Assignment operator.
-         */
-        IptcKey& operator=(const IptcKey& rhs);
-        //@}
-
-        //! @name Accessors
-        //@{
-        virtual std::string key() const { return key_; }
-        virtual const char* familyName() const { return familyName_; }
-        /*!
-          @brief Return the name of the group (the second part of the key).
-                 For Iptc keys, the group name is the record name.
-        */
-        virtual std::string groupName() const { return recordName(); }
-        virtual std::string tagName() const
-            { return IptcDataSets::dataSetName(tag_, record_); }
-        virtual uint16_t tag() const { return tag_; }
-        virtual IptcKey* clone() const;
-
-        //! Return the name of the record
-        std::string recordName() const
-            { return IptcDataSets::recordName(record_); }
-        //! Return the record id
-        uint16_t record() const { return record_; }
-        //@}
-
-    protected:
-        //! @name Manipulators
-        //@{
-        /*!
-          @brief Set the key corresponding to the dataset and record id. 
-                 The key is of the form '<b>Iptc</b>.recordName.dataSetName'.
-         */
-        void makeKey();
-        /*!
-          @brief Parse and convert the key string into dataset and record id.
-                 Updates data members if the string can be decomposed, or throws
-                 Error ("Invalid key").
-
-          @throw Error ("Invalid key") if the key cannot be decomposed.
-         */
-        void decomposeKey();
-        //@}
-
-    private:
-        // DATA
-        static const char* familyName_;
-
-        uint16_t tag_;                 //!< Tag value
-        uint16_t record_;              //!< Record value 
-        std::string key_;              //!< Key
-
-    }; // class IptcKey
-
     /*!
       @brief Information related to one Iptc dataset.
      */
diff --git a/src/tags.cpp b/src/tags.cpp
index 4d75067..7d79ca5 100644
--- a/src/tags.cpp
+++ b/src/tags.cpp
@@ -20,23 +20,22 @@
  */
 /*
   File:      tags.cpp
-  Version:   $Name:  $ $Revision: 1.36 $
+  Version:   $Name:  $ $Revision: 1.37 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   15-Jan-04, ahu: created
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.36 $ $RCSfile: tags.cpp,v $");
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.37 $ $RCSfile: tags.cpp,v $");
 
 // *****************************************************************************
 // included header files
 #include "tags.hpp"
 #include "error.hpp"
 #include "types.hpp"
+#include "ifd.hpp"
 #include "value.hpp"
-
-// Todo: remove circular dependency
-#include "exif.hpp"                             // for TagInfo operator<<
+#include "makernote.hpp"
 
 #include <iostream>
 #include <iomanip>
@@ -392,6 +391,158 @@ namespace Exiv2 {
             os << gpsTagInfo[i] << "
";
         }
     } // ExifTags::taglist
+
+    const char* ExifKey::familyName_ = "Exif";
+
+    ExifKey::ExifKey(const std::string& key)
+        : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""),
+          idx_(0), pMakerNote_(0), key_(key)
+    {
+        decomposeKey();
+    }
+
+    ExifKey::ExifKey(uint16_t tag, const std::string& ifdItem)
+        : tag_(0), ifdId_(ifdIdNotSet), ifdItem_(""),
+          idx_(0), pMakerNote_(0), key_("")
+    {
+        IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem);
+        if (ifdId == makerIfdId) throw Error("Invalid key");
+        MakerNote* pMakerNote = 0; 
+        if (ifdId == ifdIdNotSet) {
+            pMakerNote = MakerNoteFactory::instance().create(ifdItem);
+            if (pMakerNote) ifdId = makerIfdId;
+            else throw Error("Invalid key");
+        }
+        tag_ = tag;
+        ifdId_ = ifdId;
+        ifdItem_ = ifdItem;
+        pMakerNote_ = pMakerNote;
+        makeKey();
+    }
+
+    ExifKey::ExifKey(const Entry& e)
+        : tag_(e.tag()), ifdId_(e.ifdId()), ifdItem_(""),
+          idx_(e.idx()), pMakerNote_(0), key_("")
+    {
+        if (ifdId_ == makerIfdId) {
+            if (e.makerNote()) {
+                ifdItem_ = e.makerNote()->ifdItem();
+                pMakerNote_ = e.makerNote()->clone();
+            }
+            else throw Error("Invalid Key");
+        }
+        else {
+            ifdItem_ = ExifTags::ifdItem(ifdId_);
+        }
+        makeKey();
+    }
+
+    ExifKey::ExifKey(const ExifKey& rhs)
+        : tag_(rhs.tag_), ifdId_(rhs.ifdId_), ifdItem_(rhs.ifdItem_),
+          idx_(rhs.idx_), 
+          pMakerNote_(rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0),
+          key_(rhs.key_)
+    {
+    }
+
+    ExifKey::~ExifKey()
+    {
+        delete pMakerNote_;
+    }
+
+    ExifKey& ExifKey::operator=(const ExifKey& rhs)
+    {
+        if (this == &rhs) return *this;
+        Key::operator=(rhs);
+        tag_ = rhs.tag_;
+        ifdId_ = rhs.ifdId_;
+        ifdItem_ = rhs.ifdItem_;
+        idx_ = rhs.idx_;
+        pMakerNote_ = rhs.pMakerNote_ ? rhs.pMakerNote_->clone() : 0;
+        key_ = rhs.key_;
+        return *this;
+    }
+
+    std::string ExifKey::tagName() const
+    {
+        if (ifdId_ == makerIfdId) {
+            assert(pMakerNote_);
+            return pMakerNote_->tagName(tag_);
+        }
+        return ExifTags::tagName(tag_, ifdId_); 
+    }
+    
+    ExifKey* ExifKey::clone() const
+    {
+        return new ExifKey(*this);
+    }
+
+    std::string ExifKey::sectionName() const 
+    {
+        if (ifdId_ == makerIfdId) {
+            assert(pMakerNote_);
+            return pMakerNote_->ifdItem();
+        }
+        return ExifTags::sectionName(tag(), ifdId()); 
+    }
+
+    void ExifKey::decomposeKey()
+    {
+        // Get the family name, IFD name and tag name parts of the key
+        std::string::size_type pos1 = key_.find('.');
+        if (pos1 == std::string::npos) throw Error("Invalid key");
+        std::string familyName = key_.substr(0, pos1);
+        if (familyName != std::string(familyName_)) {
+            throw Error("Invalid key");
+        }
+        std::string::size_type pos0 = pos1 + 1;
+        pos1 = key_.find('.', pos0);
+        if (pos1 == std::string::npos) throw Error("Invalid key");
+        std::string ifdItem = key_.substr(pos0, pos1 - pos0);
+        if (ifdItem == "") throw Error("Invalid key");
+        std::string tagName = key_.substr(pos1 + 1);
+        if (tagName == "") throw Error("Invalid key");
+
+        // Find IfdId
+        IfdId ifdId = ExifTags::ifdIdByIfdItem(ifdItem);
+        if (ifdId == makerIfdId) throw Error("Invalid key");
+        MakerNote* pMakerNote = 0; 
+        if (ifdId == ifdIdNotSet) {
+            pMakerNote = MakerNoteFactory::instance().create(ifdItem);
+            if (pMakerNote) ifdId = makerIfdId;
+            else throw Error("Invalid key");
+        }
+
+        // Convert tag
+        uint16_t tag = pMakerNote ? 
+            pMakerNote->tag(tagName) : ExifTags::tag(tagName, ifdId);
+        // Translate hex tag name (0xabcd) to a real tag name if there is one
+        tagName = pMakerNote ? 
+            pMakerNote->tagName(tag) : ExifTags::tagName(tag, ifdId);
+
+        tag_ = tag;
+        ifdId_ = ifdId;
+        ifdItem_ = ifdItem;
+        pMakerNote_ = pMakerNote;
+        key_ = familyName + "." + ifdItem + "." + tagName;
+    }
+
+    void ExifKey::makeKey()
+    {
+        key_ = std::string(familyName_) 
+            + "." + ifdItem_
+            + "." + (pMakerNote_ ?
+            pMakerNote_->tagName(tag_) : ExifTags::tagName(tag_, ifdId_));
+    }
+
+    std::ostream& ExifKey::printTag(std::ostream& os, const Value& value) const
+    {
+        if (ifdId_ == makerIfdId) {
+            assert(pMakerNote_);
+            return pMakerNote_->printTag(os, tag(), value);
+        }
+        return ExifTags::printTag(os, tag(), ifdId(), value);
+    }
     
     // *************************************************************************
     // free functions
diff --git a/src/tags.hpp b/src/tags.hpp
index 400f10b..ca6fb2a 100644
--- a/src/tags.hpp
+++ b/src/tags.hpp
@@ -21,7 +21,7 @@
 /*!
   @file    tags.hpp
   @brief   Exif tag and type information
-  @version $Name:  $ $Revision: 1.27 $
+  @version $Name:  $ $Revision: 1.28 $
   @author  Andreas Huggel (ahu)
            <a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
   @date    15-Jan-04, ahu: created<BR>
@@ -32,6 +32,7 @@
 
 // *****************************************************************************
 // included header files
+#include "metadatum.hpp"
 #include "types.hpp"
 
 // + standard includes
@@ -46,6 +47,8 @@ namespace Exiv2 {
 // *****************************************************************************
 // class declarations
     class Value;
+    class Entry;
+    class MakerNote;
 
 // *****************************************************************************
 // type definitions
@@ -192,6 +195,103 @@ namespace Exiv2 {
 
     }; // class ExifTags
 
+    /*!
+      @brief Concrete keys for Exif metadata.
+     */
+    class ExifKey : public Key {
+    public:
+        //! @name Creators
+        //@{
+        /*!
+          @brief Constructor to create an Exif key from a key string.
+
+          @param key The key string.
+          @throw Error ("Invalid key") if the key cannot be parsed into three
+                 parts or the first part of the key is not '<b>Exif</b>'.
+        */
+        explicit ExifKey(const std::string& key);
+        /*!
+          @brief Constructor to create an Exif key from a tag and IFD item 
+                 string.
+          @param tag The tag value
+          @param ifdItem The IFD string. For MakerNote tags, this must be the 
+                 IFD item of the specific MakerNote. "MakerNote" is not allowed.
+          @throw Error ("Invalid key") if the key cannot be constructed from
+                 the tag and IFD item parameters.
+         */
+        ExifKey(uint16_t tag, const std::string& ifdItem);
+        //! Constructor to build an ExifKey from an IFD entry.
+        explicit ExifKey(const Entry& e);
+        //! Copy constructor
+        ExifKey(const ExifKey& rhs);
+        virtual ~ExifKey();
+        //@}
+
+        //! @name Manipulators
+        //@{
+        /*!
+          @brief Assignment operator.
+         */
+        ExifKey& operator=(const ExifKey& rhs);
+        //@}
+
+        //! @name Accessors
+        //@{
+        virtual std::string key() const { return key_; }
+        virtual const char* familyName() const { return familyName_; }
+        /*!
+          @brief Return the name of the group (the second part of the key).
+                 For Exif keys, the group name is the IFD item.
+        */ 
+        virtual std::string groupName() const { return ifdItem(); }
+        virtual std::string tagName() const;
+        virtual uint16_t tag() const { return tag_; }
+        virtual ExifKey* clone() const;
+
+        //! Interpret and print the value of an Exif tag
+        std::ostream& printTag(std::ostream& os, const Value& value) const;
+        //! Return the IFD id
+        IfdId ifdId() const { return ifdId_; }
+        //! Return the name of the IFD
+        const char* ifdName() const { return ExifTags::ifdName(ifdId()); }
+        //! Return the related image item
+        std::string ifdItem() const { return ifdItem_; }
+        //! Return the name of the Exif section (deprecated) 
+        std::string sectionName() const;
+        //! Return the index (unique id of this key within the original IFD)
+        int idx() const { return idx_; }
+        //@}
+
+    protected:
+        //! @name Manipulators
+        //@{
+        /*!
+          @brief Set the key corresponding to the tag and IFD id. 
+                 The key is of the form '<b>Exif</b>.ifdItem.tagName'.
+         */
+        void makeKey();
+        /*!
+          @brief Parse and convert the key string into tag and IFD Id. 
+                 Updates data members if the string can be decomposed,
+                 or throws Error ("Invalid key").
+
+          @throw Error ("Invalid key") if the key cannot be decomposed.
+         */
+        void decomposeKey();
+        //@}
+
+    private:
+        // DATA
+        static const char* familyName_;
+
+        uint16_t tag_;                  //!< Tag value
+        IfdId ifdId_;                   //!< The IFD associated with this tag
+        std::string ifdItem_;           //!< The IFD item 
+        int idx_;                       //!< Unique id of an entry within one IFD
+        MakerNote* pMakerNote_;         //!< Pointer to the associated MakerNote
+        std::string key_;               //!< Key
+    }; // class ExifKey
+
 // *****************************************************************************
 // free functions
 

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list