diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/View/src/CPbkEmbeddedThumbnail.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/View/src/CPbkEmbeddedThumbnail.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Methods for Phonebook contact item field embedded thumbnail reader. +* +*/ + + +// INCLUDE FILES + +#include "CPbkEmbeddedThumbnail.h" +#include "CPbkImageReader.h" +#include "MPbkThumbnailOperationObservers.h" +#include "PbkImageData.h" +#include + +#include +#include +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +#ifdef _DEBUG +enum TPanicCode + { + EPanicReadPreCond_Constructor = 1, + EPanicReadPreCond_StartReadL, + + EPanicWritePreCond_Constructor = 100, + EPanicWritePreCond_CreateImageWriterL, + EPanicWritePreCond_StoreImageL_CMdaImageDataWriteUtility + }; +#endif + + +// ==================== LOCAL FUNCTIONS ==================== + +#ifdef _DEBUG +void Panic(TPanicCode aPanicCode) + { + _LIT(KPanicText, "CPbkEmbeddedThumbnail"); + User::Panic(KPanicText, aPanicCode); + } +#endif + +// When thumbnail image is saved to contactdatabase then during saving +// some extra disk space is consumed besides raw thumbnail data. +// Following const is approximation for this needed extra space. +const TInt KHdOverhead = 1024; + +// Gives approximation for saved thumbnail size on the disk +inline TInt ThumbnailSizeOnDisk(TInt aBytes) + { + return aBytes+KHdOverhead; + } + +} // namespace + + +// ================= MEMBER FUNCTIONS ======================= + +///////////////////////////////////////////////////////////////// +// CPbkEmbeddedThumbnailReader + +inline CPbkEmbeddedThumbnailReader::CPbkEmbeddedThumbnailReader + (const TPbkContactItemField& aField, + MPbkThumbnailGetObserver& aObserver) : + CPbkThumbnailReaderBase(aObserver), + iField(aField) + { + __ASSERT_DEBUG(iField.StorageType()==KStorageTypeStore, + Panic(EPanicReadPreCond_Constructor)); + } + +inline void CPbkEmbeddedThumbnailReader::ConstructL() + { + CPbkThumbnailReaderBase::ConstructL(); + } + +CPbkEmbeddedThumbnailReader* CPbkEmbeddedThumbnailReader::NewLC + (const TPbkContactItemField& aField, + MPbkThumbnailGetObserver& aObserver) + { + CPbkEmbeddedThumbnailReader* self = + new(ELeave) CPbkEmbeddedThumbnailReader(aField,aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPbkEmbeddedThumbnailReader::~CPbkEmbeddedThumbnailReader() + { + } + +void CPbkEmbeddedThumbnailReader::StartReadL(const TPbkImageLoadParameters* aParameters) + { + HBufC8* imageBuf = iField.ContactItemField().StoreStorage()->Thing(); + __ASSERT_DEBUG(imageBuf && imageBuf->Length()>0, + Panic(EPanicReadPreCond_StartReadL)); + CancelRead(); + if (imageBuf) + { + ImageReader().ReadFromBufferL(*imageBuf, aParameters); + } + } + +///////////////////////////////////////////////////////////////// +// CPbkEmbeddedThumbnailImageReader +inline CPbkEmbeddedThumbnailImageReader::CPbkEmbeddedThumbnailImageReader + (const TPbkContactItemField& aField, + MPbkThumbnailGetImageObserver& aObserver) : + CPbkThumbnailImageReaderBase(aObserver), + iField(aField) + { + __ASSERT_DEBUG(iField.StorageType()==KStorageTypeStore && !iField.IsEmpty(), + Panic(EPanicReadPreCond_Constructor)); + } + +CPbkEmbeddedThumbnailImageReader* CPbkEmbeddedThumbnailImageReader::NewLC + (const TPbkContactItemField& aField, + MPbkThumbnailGetImageObserver& aObserver) + { + CPbkEmbeddedThumbnailImageReader* self = + new(ELeave) CPbkEmbeddedThumbnailImageReader(aField,aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +void CPbkEmbeddedThumbnailImageReader::ConstructL() + { + CPbkThumbnailImageReaderBase::ConstructL(); + } + +CPbkEmbeddedThumbnailImageReader::~CPbkEmbeddedThumbnailImageReader() + { + } + +void CPbkEmbeddedThumbnailImageReader::DoStartReadL(const TPbkImageLoadParameters* aParameters) + { + const TDesC8& imageBuffer = ImageBuffer(); + ImageReader().RecognizeFormatFromBufferL(imageBuffer); + ImageReader().ReadFromBufferL(imageBuffer, aParameters); + } + +MPbkImageData* CPbkEmbeddedThumbnailImageReader::CreateImageDataLC() + { + CPbkImageBufferData* imageData = CPbkImageBufferData::NewL(ImageBuffer()); + CleanupStack::PushL(imageData); + return imageData; + } + +const TDesC8& CPbkEmbeddedThumbnailImageReader::ImageBuffer() const + { + return *(iField.ContactItemField().StoreStorage()->Thing()); + } + + +///////////////////////////////////////////////////////////////// +// CPbkEmbeddedThumbnailWriter + +inline CPbkEmbeddedThumbnailWriter::CPbkEmbeddedThumbnailWriter + (TPbkContactItemField& aField, + MPbkThumbnailSetObserver& aObserver) : + CPbkThumbnailWriterBase(aObserver), iField(aField) + { + __ASSERT_DEBUG(iField.StorageType()==KStorageTypeStore, + Panic(EPanicWritePreCond_Constructor)); + } + +inline void CPbkEmbeddedThumbnailWriter::ConstructL() + { + CPbkThumbnailWriterBase::ConstructL(); + iFFSCheck=CPbkFFSCheck::NewL(); + } + +CPbkEmbeddedThumbnailWriter* CPbkEmbeddedThumbnailWriter::NewLC + (TPbkContactItemField& aField, + MPbkThumbnailSetObserver& aObserver) + { + CPbkEmbeddedThumbnailWriter* self = + new(ELeave) CPbkEmbeddedThumbnailWriter(aField, aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPbkEmbeddedThumbnailWriter::~CPbkEmbeddedThumbnailWriter() + { + delete iBitmapBlob; + delete iFFSCheck; + } + +CImageEncoder* CPbkEmbeddedThumbnailWriter::CreateImageWriterL() + { + __ASSERT_DEBUG(!iBitmapBlob, Panic(EPanicWritePreCond_CreateImageWriterL)); + + return CImageEncoder::DataNewL + (iBitmapBlob, CImageEncoder::EOptionNone, KImageTypeJPGUid); + } + +void CPbkEmbeddedThumbnailWriter::StoreImageL(const MPbkImageData& aImageData) + { + const TDesC8& imageBuffer = aImageData.GetBufferL(); + if(iFFSCheck->FFSClCheckL(ThumbnailSizeOnDisk(imageBuffer.Length()))) + { + iField.ContactItemField().StoreStorage()->SetThingL(imageBuffer); + } + } + +void CPbkEmbeddedThumbnailWriter::StoreImageL + (CImageEncoder& /*aImageWriter*/) + { + __ASSERT_DEBUG(iBitmapBlob, + Panic(EPanicWritePreCond_StoreImageL_CMdaImageDataWriteUtility)); + if(iFFSCheck->FFSClCheckL(ThumbnailSizeOnDisk(iBitmapBlob->Length()))) + { + iField.ContactItemField().StoreStorage()->SetThingL(*iBitmapBlob); + } + } + +void CPbkEmbeddedThumbnailWriter::DoCancel() + { + delete iBitmapBlob; + iBitmapBlob = NULL; + + // Let base class do its own canceling + CPbkThumbnailWriterBase::DoCancel(); + } + +TSize CPbkEmbeddedThumbnailWriter::ImageSize() const + { + if (EPbkFieldIdCodImageID==iField.PbkFieldId()) + { + return (static_cast(CCoeEnv::Static()->AppUi()))-> + ApplicationRect().Size(); + } + else + { + //Default: EPbkFieldIdThumbnailImage + return KPbkPersonalImageSize; + } + } + +// End of File