diff options
Diffstat (limited to 'kopete/libkopete/kopetepicture.cpp')
-rw-r--r-- | kopete/libkopete/kopetepicture.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/kopete/libkopete/kopetepicture.cpp b/kopete/libkopete/kopetepicture.cpp new file mode 100644 index 00000000..1c586b40 --- /dev/null +++ b/kopete/libkopete/kopetepicture.cpp @@ -0,0 +1,197 @@ +/* + kopetepicture.cpp - Kopete Picture + + Copyright (c) 2005 by Michaƫl Larouche <michael.larouche@kdemail.net> + + Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org> + + ************************************************************************* + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + ************************************************************************* +*/ +#include "kopetepicture.h" + +#include <qbuffer.h> + +#include <kabc/picture.h> + +#include <kmdcodec.h> +#include <kstandarddirs.h> +#include <kdebug.h> + +namespace Kopete +{ + +class Picture::Private : public KShared +{ +public: + Private() + {} + + QString pictureBase64; + QImage pictureImage; + QString picturePath; +}; + +Picture::Picture() + : d(new Private) +{ +} + +Picture::Picture(const QString &path) + : d(new Private) +{ + setPicture(path); +} + +Picture::Picture(const QImage &image) + : d(new Private) +{ + setPicture(image); +} + +Picture::Picture(const KABC::Picture &picture) + : d(new Private) +{ + setPicture(picture); +} + +Picture::Picture(const Picture &other) + : d(other.d) +{} + +Picture::~Picture() +{} + +Picture &Picture::operator=(const Picture &other) +{ + d = other.d; + return *this; +} + +QImage Picture::image() +{ + // Do the conversion if only needed. + // If the image is null, the path is not empty then. + if( d->pictureImage.isNull() ) + { + d->pictureImage = QImage(d->picturePath); + } + + return d->pictureImage; +} + +QString Picture::base64() +{ + if( d->pictureBase64.isEmpty() ) + { + // Generate base64 cache for the picture. + QByteArray tempArray; + QBuffer tempBuffer( tempArray ); + tempBuffer.open( IO_WriteOnly ); + // Make sure it create a image cache. + if( image().save( &tempBuffer, "PNG" ) ) + { + d->pictureBase64 = KCodecs::base64Encode(tempArray); + } + } + + return d->pictureBase64; +} + +QString Picture::path() +{ + if( d->picturePath.isEmpty() ) + { + // For a image source, finding a filename is tricky. + // I decided to use MD5 Hash as the filename. + QString localPhotoPath; + + // Generate MD5 Hash for the image. + QByteArray tempArray; + QBuffer tempBuffer(tempArray); + tempBuffer.open( IO_WriteOnly ); + image().save(&tempBuffer, "PNG"); + KMD5 context(tempArray); + // Save the image to a file. + localPhotoPath = context.hexDigest() + ".png"; + localPhotoPath = locateLocal( "appdata", QString::fromUtf8("metacontactpicturecache/%1").arg( localPhotoPath) ); + if( image().save(localPhotoPath, "PNG") ) + { + d->picturePath = localPhotoPath; + } + } + + return d->picturePath; +} + +bool Picture::isNull() +{ + if( d->pictureBase64.isEmpty() && d->picturePath.isEmpty() && d->pictureImage.isNull() ) + { + return true; + } + else + { + return false; + } +} + +void Picture::clear() +{ + detach(); + d->pictureBase64 = QString::null; + d->picturePath = QString::null; + d->pictureImage = QImage(); +} + +void Picture::setPicture(const QImage &image) +{ + detach(); + + d->pictureImage = image; + + // Clear the path and base64, it will call the update of then when "getted" + d->picturePath= QString::null; + d->pictureBase64 = QString::null; +} + +void Picture::setPicture(const QString &path) +{ + detach(); + d->picturePath = path; + + // Clear the image and base64, it will call the update of then when "getted" + d->pictureImage = QImage(); + d->pictureBase64 = QString::null; +} + +void Picture::setPicture(const KABC::Picture &picture) +{ + // No need to call detach() here because setPicture will do it. + if ( picture.isIntern()) + { + setPicture( picture.data() ); + } + else + { + setPicture( picture.url() ); + } +} + +void Picture::detach() +{ + // there is no detach in KSharedPtr. + if( d.count() == 1 ) + return; + + // Warning: this only works as long as the private object doesn't contain pointers to allocated objects. + d = new Private(*d); +} + +} // END namespace Kopete |