Blame samples/metacopy.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
/*
Packit 01d647
 * This program is part of the Exiv2 distribution.
Packit 01d647
 *
Packit 01d647
 * This program is free software; you can redistribute it and/or
Packit 01d647
 * modify it under the terms of the GNU General Public License
Packit 01d647
 * as published by the Free Software Foundation; either version 2
Packit 01d647
 * of the License, or (at your option) any later version.
Packit 01d647
 *
Packit 01d647
 * This program is distributed in the hope that it will be useful,
Packit 01d647
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 01d647
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 01d647
 * GNU General Public License for more details.
Packit 01d647
 *
Packit 01d647
 * You should have received a copy of the GNU General Public License
Packit 01d647
 * along with this program; if not, write to the Free Software
Packit 01d647
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit 01d647
 */
Packit 01d647
/*
Packit 01d647
  Abstract : Tester application for image file handling
Packit 01d647
Packit 01d647
  File     : metacopy.cpp
Packit 01d647
  Author(s): Brad Schick (brad) <brad@robotbattle.com>
Packit 01d647
  History  : 13-Jul-04, brad: created
Packit 01d647
 */
Packit 01d647
// *****************************************************************************
Packit 01d647
// included header files
Packit 01d647
#include <exiv2/exiv2.hpp>
Packit 01d647
Packit 01d647
#include <iostream>
Packit 01d647
#include <fstream>
Packit 01d647
#include <cassert>
Packit 01d647
Packit 01d647
// include local header files which are not part of libexiv2
Packit 01d647
#include "getopt.hpp"
Packit 01d647
#include "metacopy.hpp"
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// Main
Packit 01d647
int main(int argc, char* const argv[])
Packit 01d647
{
Packit 01d647
try {
Packit Service fb147c
    Exiv2::XmpParser::initialize();
Packit Service fb147c
    ::atexit(Exiv2::XmpParser::terminate);
Packit Service fb147c
Packit 01d647
    // Handle command line arguments
Packit 01d647
    Params params;
Packit 01d647
    if (params.getopt(argc, argv)) {
Packit 01d647
        params.usage();
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
    if (params.help_) {
Packit 01d647
        params.help();
Packit 01d647
        return 2;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    // Use MemIo to increase test coverage.
Packit 01d647
    Exiv2::BasicIo::AutoPtr fileIo(new Exiv2::FileIo(params.read_));
Packit 01d647
    Exiv2::BasicIo::AutoPtr memIo(new Exiv2::MemIo);
Packit 01d647
    memIo->transfer(*fileIo);
Packit 01d647
Packit 01d647
    Exiv2::Image::AutoPtr readImg = Exiv2::ImageFactory::open(memIo);
Packit 01d647
    assert(readImg.get() != 0);
Packit 01d647
    readImg->readMetadata();
Packit 01d647
Packit 01d647
    Exiv2::Image::AutoPtr writeImg = Exiv2::ImageFactory::open(params.write_);
Packit 01d647
    assert(writeImg.get() != 0);
Packit 01d647
    if (params.preserve_) writeImg->readMetadata();
Packit 01d647
    if (params.iptc_) {
Packit 01d647
        writeImg->setIptcData(readImg->iptcData());
Packit 01d647
    }
Packit 01d647
    if (params.exif_) {
Packit 01d647
        writeImg->setExifData(readImg->exifData());
Packit 01d647
    }
Packit 01d647
    if (params.comment_) {
Packit 01d647
        writeImg->setComment(readImg->comment());
Packit 01d647
    }
Packit 01d647
    if (params.xmp_) {
Packit 01d647
        writeImg->setXmpData(readImg->xmpData());
Packit 01d647
    }
Packit 01d647
Packit 01d647
    try {
Packit 01d647
        writeImg->writeMetadata();
Packit 01d647
    }
Packit 01d647
    catch (const Exiv2::AnyError&) {
Packit 01d647
        std::cerr << params.progname() <<
Packit 01d647
            ": Could not write metadata to (" << params.write_ << ")\n";
Packit 01d647
        return 8;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    return 0;
Packit 01d647
}
Packit 01d647
catch (Exiv2::AnyError& e) {
Packit 01d647
    std::cerr << "Caught Exiv2 exception '" << e << "'\n";
Packit 01d647
    return 10;
Packit 01d647
}
Packit 01d647
}
Packit 01d647
Packit 01d647
int Params::option(int opt, const std::string& /*optarg*/, int optopt)
Packit 01d647
{
Packit 01d647
    int rc = 0;
Packit 01d647
    switch (opt) {
Packit 01d647
    case 'h': help_ = true; break;
Packit 01d647
    case 'i': iptc_ = true; break;
Packit 01d647
    case 'e': exif_ = true; break;
Packit 01d647
    case 'c': comment_ = true; break;
Packit 01d647
    case 'x': xmp_ = true; break;
Packit 01d647
    case 'p': preserve_ = true; break;
Packit 01d647
    case 'a':
Packit 01d647
        iptc_ =true;
Packit 01d647
        exif_ =true;
Packit 01d647
        comment_ =true;
Packit 01d647
        xmp_ =true;
Packit 01d647
        break;
Packit 01d647
    case ':':
Packit 01d647
        std::cerr << progname() << ": Option -" << static_cast<char>(optopt)
Packit 01d647
                  << " requires an argument\n";
Packit 01d647
        rc = 1;
Packit 01d647
        break;
Packit 01d647
    case '?':
Packit 01d647
        std::cerr << progname() << ": Unrecognized option -"
Packit 01d647
                  << static_cast<char>(optopt) << "\n";
Packit 01d647
        rc = 1;
Packit 01d647
        break;
Packit 01d647
    default:
Packit 01d647
        std::cerr << progname()
Packit 01d647
                  << ": getopt returned unexpected character code "
Packit 01d647
                  << std::hex << opt << "\n";
Packit 01d647
        rc = 1;
Packit 01d647
        break;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    return rc;
Packit 01d647
}
Packit 01d647
Packit 01d647
int Params::nonoption(const std::string& argv)
Packit 01d647
{
Packit 01d647
    if (!write_.empty()) {
Packit 01d647
        std::cerr << progname() << ": Unexpected extra argument (" << argv << ")\n";
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
    if (first_) read_ = argv;
Packit 01d647
    else write_ = argv;
Packit 01d647
    first_ = false;
Packit 01d647
    return 0;
Packit 01d647
}
Packit 01d647
Packit 01d647
int Params::getopt(int argc, char* const argv[])
Packit 01d647
{
Packit 01d647
    int rc = Util::Getopt::getopt(argc, argv, optstring_);
Packit 01d647
    // Further consistency checks
Packit 01d647
    if (help_==false) {
Packit 01d647
        if (rc==0 && read_.empty() ) {
Packit 01d647
            std::cerr << progname() << ": Read and write files must be specified\n";
Packit 01d647
            rc = 1;
Packit 01d647
        }
Packit 01d647
        if (rc==0 && write_.empty() ) {
Packit 01d647
            std::cerr << progname() << ": Write file must be specified\n";
Packit 01d647
            rc = 1;
Packit 01d647
        }
Packit 01d647
        if (preserve_ && iptc_ && exif_ && comment_ && xmp_ ) {
Packit 01d647
            std::cerr << progname() << ": Option -p has no effect when all metadata types are specified.\n";
Packit 01d647
            rc = 1;
Packit 01d647
        }
Packit 01d647
    }
Packit 01d647
    return rc;
Packit 01d647
} // Params::getopt
Packit 01d647
Packit 01d647
Packit 01d647
void Params::usage(std::ostream& os) const
Packit 01d647
{
Packit 01d647
    os << "\nReads and writes raw metadata. Use -h option for help.\n"
Packit 01d647
       << "Usage: " << progname()
Packit 01d647
       << " [-iecaph] readfile writefile\n";
Packit 01d647
}
Packit 01d647
Packit 01d647
void Params::help(std::ostream& os) const
Packit 01d647
{
Packit 01d647
    usage(os);
Packit 01d647
    os << "\nOptions:\n"
Packit 01d647
       << "   -i      Read Iptc data from readfile and write to writefile.\n"
Packit 01d647
       << "   -e      Read Exif data from readfile and write to writefile.\n"
Packit 01d647
       << "   -c      Read Jpeg comment from readfile and write to writefile.\n"
Packit 01d647
       << "   -x      Read XMP data from readfile and write to writefile.\n"
Packit 01d647
       << "   -a      Read all metadata from readfile and write to writefile.\n"
Packit 01d647
       << "   -p      Preserve existing metadata in writefile if not replaced.\n"
Packit 01d647
       << "   -h      Display this help and exit.\n\n";
Packit 01d647
} // Params::help
Packit 01d647