|
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 |
|