Blame samples/exifprint.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
// exifprint.cpp
Packit 01d647
// Sample program to print the Exif metadata of an image
Packit 01d647
Packit 01d647
#include <exiv2/exiv2.hpp>
Packit 01d647
Packit 01d647
#include <iostream>
Packit 01d647
#include <iomanip>
Packit 01d647
#include <cassert>
Packit 01d647
Packit 01d647
// https://github.com/Exiv2/exiv2/issues/468
Packit 01d647
#if defined(EXV_UNICODE_PATH) && defined(__MINGW__)
Packit 01d647
#undef  EXV_UNICODE_PATH
Packit 01d647
#endif
Packit 01d647
Packit 01d647
#ifdef  EXV_UNICODE_PATH
Packit 01d647
#define _tchar      wchar_t
Packit 01d647
#define _tstrcmp    wcscmp
Packit 01d647
#define _t(s)       L##s
Packit 01d647
#define _tcout      wcout
Packit 01d647
#define _tmain      wmain
Packit 01d647
#else
Packit 01d647
#define _tchar      char
Packit 01d647
#define _tstrcmp    strcmp
Packit 01d647
#define _t(s)       s
Packit 01d647
#define _tcout      cout
Packit 01d647
#define _tmain      main
Packit 01d647
#endif
Packit 01d647
Packit 01d647
int _tmain(int argc, _tchar* const argv[])
Packit 01d647
try {
Packit Service fb147c
    Exiv2::XmpParser::initialize();
Packit Service fb147c
    ::atexit(Exiv2::XmpParser::terminate);
Packit Service fb147c
Packit 01d647
    const _tchar* prog = argv[0];
Packit 01d647
    const _tchar* file = argv[1];
Packit 01d647
Packit 01d647
    if (argc != 2) {
Packit Service fb147c
        std::_tcout << _t("Usage: ") << prog << _t(" [ path | --version | --version-test ]") << std::endl;
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    if ( _tstrcmp(file,_t("--version")) == 0 ) {
Packit 01d647
        exv_grep_keys_t keys;
Packit 01d647
        Exiv2::dumpLibraryInfo(std::cout,keys);
Packit 01d647
        return 0;
Packit 01d647
    } else if ( _tstrcmp(file,_t("--version-test")) == 0 ) {
Packit 01d647
        // verifies/test macro EXIV2_TEST_VERSION
Packit 01d647
        // described in include/exiv2/version.hpp
Packit 01d647
        std::cout << "EXV_PACKAGE_VERSION             " << EXV_PACKAGE_VERSION             << std::endl
Packit 01d647
                  << "Exiv2::version()                " << Exiv2::version()                << std::endl
Packit 01d647
                  << "strlen(Exiv2::version())        " << ::strlen(Exiv2::version())      << std::endl
Packit 01d647
                  << "Exiv2::versionNumber()          " << Exiv2::versionNumber()          << std::endl
Packit 01d647
                  << "Exiv2::versionString()          " << Exiv2::versionString()          << std::endl
Packit 01d647
                  << "Exiv2::versionNumberHexString() " << Exiv2::versionNumberHexString() << std::endl
Packit 01d647
                  ;
Packit 01d647
Packit 01d647
        // Test the Exiv2 version available at runtime but compile the if-clause only if
Packit 01d647
        // the compile-time version is at least 0.15. Earlier versions didn't have a
Packit 01d647
        // testVersion() function:
Packit 01d647
        #if EXIV2_TEST_VERSION(0,15,0)
Packit 01d647
            if (Exiv2::testVersion(0,13,0)) {
Packit 01d647
              std::cout << "Available Exiv2 version is equal to or greater than 0.13\n";
Packit 01d647
            } else {
Packit 01d647
              std::cout << "Installed Exiv2 version is less than 0.13\n";
Packit 01d647
            }
Packit 01d647
        #else
Packit 01d647
              std::cout << "Compile-time Exiv2 version doesn't have Exiv2::testVersion()\n";
Packit 01d647
        #endif
Packit 01d647
        return 0;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(file);
Packit 01d647
    assert(image.get() != 0);
Packit 01d647
    image->readMetadata();
Packit 01d647
Packit 01d647
    Exiv2::ExifData &exifData = image->exifData();
Packit 01d647
    if (exifData.empty()) {
Packit 01d647
        std::string error("No Exif data found in file");
Packit 01d647
        throw Exiv2::Error(Exiv2::kerErrorMessage, error);
Packit 01d647
    }
Packit 01d647
Packit 01d647
    Exiv2::ExifData::const_iterator end = exifData.end();
Packit 01d647
    for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
Packit 01d647
        const char* tn = i->typeName();
Packit 01d647
        std::cout << std::setw(44) << std::setfill(' ') << std::left
Packit 01d647
                  << i->key() << " "
Packit 01d647
                  << "0x" << std::setw(4) << std::setfill('0') << std::right
Packit 01d647
                  << std::hex << i->tag() << " "
Packit 01d647
                  << std::setw(9) << std::setfill(' ') << std::left
Packit 01d647
                  << (tn ? tn : "Unknown") << " "
Packit 01d647
                  << std::dec << std::setw(3)
Packit 01d647
                  << std::setfill(' ') << std::right
Packit 01d647
                  << i->count() << "  "
Packit Service fb147c
                  << std::dec << i->toString()
Packit 01d647
                  << "\n";
Packit 01d647
    }
Packit 01d647
Packit 01d647
    return 0;
Packit 01d647
}
Packit 01d647
//catch (std::exception& e) {
Packit 01d647
//catch (Exiv2::AnyError& e) {
Packit 01d647
catch (Exiv2::Error& e) {
Packit 01d647
    std::cout << "Caught Exiv2 exception '" << e.what() << "'\n";
Packit 01d647
    return -1;
Packit 01d647
}