/** =========================================================== * @file * * This file is a part of digiKam project * http://www.digikam.org * * @date 2009-11-14 * @brief Embedded preview loading * * @author Copyright (C) 2009-2014 by Gilles Caulier * caulier dot gilles at gmail dot com * @author Copyright (C) 2009-2012 by Marcel Wiesweg * marcel dot wiesweg at gmx dot de * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ #include "kexiv2previews.h" // Local includes #include "kexiv2_p.h" #include "kexiv2.h" namespace KExiv2Iface { class KExiv2Previews::Private { public: Private() { manager = 0; } ~Private() { delete manager; } void load(Exiv2::Image::AutoPtr image_) { image = image_; image->readMetadata(); manager = new Exiv2::PreviewManager(*image); Exiv2::PreviewPropertiesList props = manager->getPreviewProperties(); // reverse order of list, which is smallest-first Exiv2::PreviewPropertiesList::reverse_iterator it; for (it = props.rbegin() ; it != props.rend() ; ++it) { properties << *it; } } public: Exiv2::Image::AutoPtr image; Exiv2::PreviewManager* manager; QList properties; }; KExiv2Previews::KExiv2Previews(const QString& filePath) : d(new Private) { try { Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*)(QFile::encodeName(filePath))); d->load(image); } catch( Exiv2::Error& e ) { KExiv2::Private::printExiv2ExceptionError("Cannot load metadata using Exiv2 ", e); } catch(...) { kError() << "Default exception from Exiv2"; } } KExiv2Previews::KExiv2Previews(const QByteArray& imgData) : d(new Private) { try { Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((Exiv2::byte*)imgData.data(), imgData.size()); d->load(image); } catch( Exiv2::Error& e ) { KExiv2::Private::printExiv2ExceptionError("Cannot load metadata using Exiv2 ", e); } catch(...) { kError() << "Default exception from Exiv2"; } } KExiv2Previews::~KExiv2Previews() { delete d; } bool KExiv2Previews::isEmpty() { return d->properties.isEmpty(); } QSize KExiv2Previews::originalSize() const { if (d->image.get()) return QSize(d->image->pixelWidth(), d->image->pixelHeight()); return QSize(); } QString KExiv2Previews::originalMimeType() const { if (d->image.get()) return d->image->mimeType().c_str(); return QString(); } int KExiv2Previews::count() { return d->properties.size(); } int KExiv2Previews::dataSize(int index) { if (index < 0 || index >= size()) return 0; return d->properties[index].size_; } int KExiv2Previews::width(int index) { if (index < 0 || index >= size()) return 0; return d->properties[index].width_; } int KExiv2Previews::height(int index) { if (index < 0 || index >= size()) return 0; return d->properties[index].height_; } QString KExiv2Previews::mimeType(int index) { if (index < 0 || index >= size()) return 0; return QString::fromLatin1(d->properties[index].mimeType_.c_str()); } QString KExiv2Previews::fileExtension(int index) { if (index < 0 || index >= size()) return 0; return QString::fromLatin1(d->properties[index].extension_.c_str()); } QByteArray KExiv2Previews::data(int index) { if (index < 0 || index >= size()) return QByteArray(); kDebug() << "index: " << index; kDebug() << "d->properties: " << count(); try { Exiv2::PreviewImage image = d->manager->getPreviewImage(d->properties[index]); return QByteArray((const char*)image.pData(), image.size()); } catch( Exiv2::Error& e ) { KExiv2::Private::printExiv2ExceptionError("Cannot load metadata using Exiv2 ", e); return QByteArray(); } catch(...) { kError() << "Default exception from Exiv2"; return QByteArray(); } } QImage KExiv2Previews::image(int index) { QByteArray previewData = data(index); QImage image; if (!image.loadFromData(previewData)) return QImage(); return image; } } // namespace KExiv2Iface