diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherimagedecoding.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherimagedecoding.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,221 @@ +/* +* Copyright (c) 2008-2008 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: Implementation of the utility class for asynchronously decoding the header thumbnail image +* +*/ + +#include +#include "ccappcommlauncherimagedecoding.h" + +const TInt KDelay = 500000; // 0.5s +// --------------------------------------------------------------------------- +// Two-phase construction +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherImageDecoding* CCCAppCommLauncherImageDecoding::NewL( + CCCAppCommLauncherHeaderControl* aHeader, const TDesC8* aBitmapData, const TDesC* aImageFile) + { + CCCAppCommLauncherImageDecoding* self = new (ELeave) CCCAppCommLauncherImageDecoding(aHeader); + CleanupStack::PushL(self); + self->ConstructL(aBitmapData, aImageFile); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// First phase (C++) constructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherImageDecoding::CCCAppCommLauncherImageDecoding(CCCAppCommLauncherHeaderControl* aHeader) : +CActive( CActive::EPriorityStandard ), iHeader(aHeader) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// ConstructL, second phase constructor +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherImageDecoding::ConstructL(const TDesC8* aBitmapData, const TDesC* aImageFile) + { + if ( aImageFile ) + { + iImageFullName = aImageFile->AllocL(); + } + if ( aBitmapData ) + { + iBitmapData = aBitmapData->AllocL(); + } + User::LeaveIfError( iFs.Connect() ); + iTimer.CreateLocal(); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherImageDecoding::~CCCAppCommLauncherImageDecoding() + { + DoCancel(); + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iBitmapData) + { + delete iBitmapData; + iBitmapData = NULL; + } + if (iImageFullName) + { + delete iImageFullName; + } + iFs.Close(); + iTimer.Close(); + } + +// --------------------------------------------------------------------------- +// Starts the decoding process +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherImageDecoding::StartL( TSize aImageSize ) + { + iDecoderState = ECcaConvertThumbnailImage; + iBitmapSize = aImageSize; + CreateBitmapL(); + } + +// --------------------------------------------------------------------------- +// Called by the active object framework when the decoding (request) is +// completed. +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherImageDecoding::RunL() + { + User::LeaveIfError( iStatus.Int() ); + switch ( iDecoderState ) + { + case ECcaConvertThumbnailImage: + { + iDecoderState = ECcaScaleThumbnail; + ScaleBitmapL(); + break; + } + + case ECcaScaleThumbnail: + { + if ( iImageFullName ) + { + iDecoderState = ECcaReadImageFromFile; + SetPriority( EPriorityIdle ); + iTimer.After( iStatus, KDelay ); + SetActive(); + } + // don't break here + } + + case ECcaScaleImage: + { + // Ownership of the bitmap is transferred + iHeader->SetBitmap( iBitmap ); + iBitmap = NULL; + delete iBitmapScaler; + iBitmapScaler = NULL; + delete iImgDecoder; + iImgDecoder = NULL; + break; + } + + case ECcaReadImageFromFile: + { + if ( iImageFullName ) + { + iDecoderState = ECcaConvertImageFromFile; + CreateBitmapL(); + } + break; + } + + case ECcaConvertImageFromFile: + { + iDecoderState = ECcaScaleImage; + SetPriority( EPriorityStandard ); + ScaleBitmapL(); + break; + } + + default: + break; + } + } +// --------------------------------------------------------------------------- +// Called when the decoding (request) is cancelled for some reason. +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherImageDecoding::DoCancel() + { + if (iImgDecoder) + { + iImgDecoder->Cancel(); + delete iImgDecoder; + iImgDecoder = NULL; + } + if ( iBitmapScaler ) + { + iBitmapScaler->Cancel(); + delete iBitmapScaler; + iBitmapScaler = NULL; + } + iTimer.Cancel(); + } + +void CCCAppCommLauncherImageDecoding::ScaleBitmapL() + { + iBitmapScaler = CBitmapScaler::NewL(); + iBitmapScaler->Scale( &iStatus, *iBitmap, iBitmapSize ); + SetActive(); + } + +void CCCAppCommLauncherImageDecoding::CreateBitmapL() + { + if ( iDecoderState == ECcaConvertThumbnailImage ) + { + iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData, CImageDecoder::EOptionAlwaysThread ); + } + else if ( iDecoderState == ECcaConvertImageFromFile ) + { + // leaaves if file doesn't exist + TRAPD ( initDecoder, iImgDecoder = CImageDecoder::FileNewL( iFs, *iImageFullName, CImageDecoder::EOptionAlwaysThread ) ); + if ( initDecoder ) + { + delete iBitmapScaler; + iBitmapScaler = NULL; + delete iImgDecoder; + iImgDecoder = NULL; + return; + } + } + + if ( !iBitmap ) + { + TFrameInfo info = iImgDecoder->FrameInfo(); + iBitmap = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode )); + } + + iStatus = KRequestPending; + iImgDecoder->Convert( &iStatus, *iBitmap ); + SetActive(); + }