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

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:41:09 UTC 2017


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

The following commit has been merged in the master branch:
commit f01c919e14669e82849ae463736a91b1dde7fd03
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Sun Feb 7 13:53:00 2010 +0000

    Added -g option to exiv2 utility to 'grep' info for individual tags.
---
 src/actions.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 src/actions.hpp | 10 ++++---
 src/exiv2.cpp   | 15 ++++++++++
 src/exiv2.hpp   |  6 +++-
 4 files changed, 103 insertions(+), 16 deletions(-)

diff --git a/src/actions.cpp b/src/actions.cpp
index 741a20d..849003c 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -496,7 +496,6 @@ namespace Action {
         Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path_);
         assert(image.get() != 0);
         image->readMetadata();
-        bool const manyFiles = Params::instance().files_.size() > 1;
         // Set defaults for metadata types and data columns
         if (Params::instance().printTags_ == Exiv2::mdNone) {
             Params::instance().printTags_ = Exiv2::mdExif | Exiv2::mdIptc | Exiv2::mdXmp;
@@ -504,11 +503,79 @@ namespace Action {
         if (Params::instance().printItems_ == 0) {
             Params::instance().printItems_ = Params::prKey | Params::prType | Params::prCount | Params::prTrans;
         }
+        if (!Params::instance().keys_.empty()) {
+            for (Params::Keys::const_iterator key = Params::instance().keys_.begin();
+                 key != Params::instance().keys_.end(); ++key) {
+                rc |= grepTag(*key, image.get());
+            }
+        }
+        else {
+            rc = printMetadata(image.get());
+        }
+        return rc;
+    } // Print::printList
+
+    int Print::grepTag(const std::string& key, const Exiv2::Image* image)
+    {
+        int rc = 0;
+        if (key.empty()) return rc;
+        switch (key[0]) {
+        case 'E':
+            if (Params::instance().printTags_ & Exiv2::mdExif) {
+                Exiv2::ExifKey ek(key);
+                const Exiv2::ExifData& exifData = image->exifData();
+                Exiv2::ExifData::const_iterator md = exifData.findKey(ek);
+                if (md != exifData.end()) printMetadatum(*md, image);
+                if (exifData.empty()) {
+                    if (Params::instance().verbose_) {
+                        std::cerr << path_ << ": " << _("No Exif data found in the file
");
+                    }
+                    rc = -3;
+                }
+            }
+            break;
+        case 'I':
+            if (Params::instance().printTags_ & Exiv2::mdIptc) {
+                Exiv2::IptcKey ik(key);
+                const Exiv2::IptcData& iptcData = image->iptcData();
+                Exiv2::IptcData::const_iterator md = iptcData.findKey(ik);
+                if (md != iptcData.end()) printMetadatum(*md, image);
+                if (iptcData.empty()) {
+                    if (Params::instance().verbose_) {
+                        std::cerr << path_ << ": " << _("No IPTC data found in the file
");
+                    }
+                    rc = -3;
+                }
+            }
+            break;
+        case 'X':
+            if (Params::instance().printTags_ & Exiv2::mdXmp) {
+                Exiv2::XmpKey xk(key);
+                const Exiv2::XmpData& xmpData = image->xmpData();
+                Exiv2::XmpData::const_iterator md = xmpData.findKey(xk);
+                if (md != xmpData.end()) printMetadatum(*md, image);
+                if (xmpData.empty()) {
+                    if (Params::instance().verbose_) {
+                        std::cerr << path_ << ": " << _("No XMP data found in the file
");
+                    }
+                    rc = -3;
+                }
+            }
+            break;
+        default:
+            throw Exiv2::Error(1, std::string(_("Invalid key")) + " `" + key + "'");
+        }
+        return rc;
+    } // Print::grepTag
+
+    int Print::printMetadata(const Exiv2::Image* image)
+    {
+        int rc = 0;
         if (Params::instance().printTags_ & Exiv2::mdExif) {
-            Exiv2::ExifData& exifData = image->exifData();
+            const Exiv2::ExifData& exifData = image->exifData();
             for (Exiv2::ExifData::const_iterator md = exifData.begin();
                  md != exifData.end(); ++md) {
-                printMetadatum(*md, image.get(), manyFiles);
+                printMetadatum(*md, image);
             }
             if (exifData.empty()) {
                 if (Params::instance().verbose_) {
@@ -518,10 +585,10 @@ namespace Action {
             }
         }
         if (Params::instance().printTags_ & Exiv2::mdIptc) {
-            Exiv2::IptcData& iptcData = image->iptcData();
+            const Exiv2::IptcData& iptcData = image->iptcData();
             for (Exiv2::IptcData::const_iterator md = iptcData.begin();
                  md != iptcData.end(); ++md) {
-                printMetadatum(*md, image.get(), manyFiles);
+                printMetadatum(*md, image);
             }
             if (iptcData.empty()) {
                 if (Params::instance().verbose_) {
@@ -531,10 +598,10 @@ namespace Action {
             }
         }
         if (Params::instance().printTags_ & Exiv2::mdXmp) {
-            Exiv2::XmpData& xmpData = image->xmpData();
+            const Exiv2::XmpData& xmpData = image->xmpData();
             for (Exiv2::XmpData::const_iterator md = xmpData.begin();
                  md != xmpData.end(); ++md) {
-                printMetadatum(*md, image.get(), manyFiles);
+                printMetadatum(*md, image);
             }
             if (xmpData.empty()) {
                 if (Params::instance().verbose_) {
@@ -544,16 +611,15 @@ namespace Action {
             }
         }
         return rc;
-    } // Print::printList
+    } // Print::printMetadata
 
-    void Print::printMetadatum(const Exiv2::Metadatum& md,
-                               const Exiv2::Image* pImage,
-                               bool const manyFiles)
+    void Print::printMetadatum(const Exiv2::Metadatum& md, const Exiv2::Image* pImage)
     {
         if (   Params::instance().unknown_
             && md.tagName().substr(0, 2) == "0x") {
             return;
         }
+        bool const manyFiles = Params::instance().files_.size() > 1;
         if (manyFiles) {
             std::cout << std::setfill(' ') << std::left << std::setw(20)
                       << path_ << "  ";
diff --git a/src/actions.hpp b/src/actions.hpp
index 0b0042b..08fa057 100644
--- a/src/actions.hpp
+++ b/src/actions.hpp
@@ -61,7 +61,7 @@ namespace Action {
 
     //! Enumerates all tasks
     enum TaskType { none, adjust, print, rename, erase, extract, insert,
-                    modify, fixiso };
+                    modify, fixiso, fixcom };
 
 // *****************************************************************************
 // class definitions
@@ -170,10 +170,12 @@ namespace Action {
         int printSummary();
         //! Print Exif, IPTC and XMP metadata in user defined format
         int printList();
+        //! Print info for an individual tag specified by its key in a user defined format
+        int grepTag(const std::string& key, const Exiv2::Image* image);
+        //! Print all metadata in a user defined format
+        int printMetadata(const Exiv2::Image* image);
         //! Print a metadatum in a user defined format
-        void printMetadatum(const Exiv2::Metadatum& md,
-                            const Exiv2::Image* pImage,
-                            bool const manyFiles);
+        void printMetadatum(const Exiv2::Metadatum& md, const Exiv2::Image* image);
         //! Print the label for a summary line
         void printLabel(const std::string& label) const;
         /*!
diff --git a/src/exiv2.cpp b/src/exiv2.cpp
index 0203ed9..30df50a 100644
--- a/src/exiv2.cpp
+++ b/src/exiv2.cpp
@@ -250,12 +250,16 @@ void Params::help(std::ostream& os) const
             "                Requires option -c, -m or -M.
")
        << _("  fi | fixiso   Copy ISO setting from the Nikon Makernote to the regular
"
             "                Exif tag.
")
+       << _("  fc | fixcom   Convert the UNICODE Exif user comment to UCS-2. Its current
"
+            "                character encoding can be specified with the -n option.
")
        << _("
Options:
")
        << _("   -h      Display this help and exit.
")
        << _("   -V      Show the program version and exit.
")
        << _("   -v      Be verbose during the program run.
")
        << _("   -b      Show large binary values.
")
        << _("   -u      Show unknown tags.
")
+       << _("   -g key  Only output info for this key (grep).
")
+       << _("   -n enc  Charset to use to decode UNICODE Exif user comments.
")
        << _("   -k      Preserve file timestamps (keep).
")
        << _("   -t      Also set the file timestamp in 'rename' action (overrides -k).
")
        << _("   -T      Only set the file timestamp in 'rename' action, do not rename
"
@@ -337,6 +341,8 @@ int Params::option(int opt, const std::string& optarg, int optopt)
     case 'u': unknown_ = false; break;
     case 'f': force_ = true; fileExistsPolicy_ = overwritePolicy; break;
     case 'F': force_ = true; fileExistsPolicy_ = renamePolicy; break;
+    case 'g': keys_.push_back(optarg); printMode_ = pmList; break;
+    case 'n': charset_ = optarg; break;
     case 'r': rc = evalRename(opt, optarg); break;
     case 't': rc = evalRename(opt, optarg); break;
     case 'T': rc = evalRename(opt, optarg); break;
@@ -738,6 +744,15 @@ int Params::nonoption(const std::string& argv)
             action = true;
             action_ = Action::fixiso;
         }
+        if (argv == "fc" || argv == "fixcom") {
+            if (action_ != Action::none && action_ != Action::fixcom) {
+                std::cerr << progname() << ": "
+                          << _("Action fixcom is not compatible with the given options
");
+                rc = 1;
+            }
+            action = true;
+            action_ = Action::fixcom;
+        }
         if (action_ == Action::none) {
             // if everything else fails, assume print as the default action
             action_ = Action::print;
diff --git a/src/exiv2.hpp b/src/exiv2.hpp
index 951147e..b7745db 100644
--- a/src/exiv2.hpp
+++ b/src/exiv2.hpp
@@ -116,6 +116,8 @@ public:
     typedef std::vector<std::string> Files;
     //! Container for preview image numbers
     typedef std::set<int> PreviewNumbers;
+    //! Container for keys
+    typedef std::vector<std::string> Keys;
 
     /*!
       @brief Controls all access to the global Params instance.
@@ -202,6 +204,8 @@ public:
     std::string suffix_;                //!< File extension of the file to insert
     Files files_;                       //!< List of non-option arguments.
     PreviewNumbers previewNumbers_;     //!< List of preview numbers
+    Keys keys_;                         //!< List of keys to 'grep' from the metadata
+    std::string charset_;               //!< Charset to use for UNICODE Exif user comment
 
 private:
     //! Pointer to the global Params object.
@@ -216,7 +220,7 @@ private:
       @brief Default constructor. Note that optstring_ is initialized here.
              The c'tor is private to force instantiation through instance().
      */
-    Params() : optstring_(":hVvfbuktTFa:Y:O:D:r:p:P:d:e:i:c:m:M:l:S:"),
+    Params() : optstring_(":hVvfbuktTFa:Y:O:D:r:p:P:d:e:i:c:m:M:l:S:g:n:"),
                help_(false),
                version_(false),
                verbose_(false),

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list