diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsimagedecoder.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 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: Utility class for asynchronously decoding the header thumbnail image + * +*/ + + +#include "cvimpstdetailsimagedecoder.h" + +#include "cvimpstdetailsheadercontrol.h" + +#include +#include +#include + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::NewL +// Two-phase construction +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsImageDecoder* CVIMPSTDetailsImageDecoder::NewL(CVIMPSTDetailsHeaderControl& aHeader, const TDesC8& aBitmapData) + { + CVIMPSTDetailsImageDecoder* self = new (ELeave) CVIMPSTDetailsImageDecoder(aHeader); + CleanupStack::PushL(self); + self->ConstructL(aBitmapData); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::CVIMPSTDetailsImageDecoder +// First phase (C++) constructor +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsImageDecoder::CVIMPSTDetailsImageDecoder(CVIMPSTDetailsHeaderControl& aHeader) : + CActive( CActive::EPriorityStandard ), iHeader(aHeader) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::ConstructL +// ConstructL, second phase constructor +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::ConstructL(const TDesC8& aBitmapData) + { + iBitmapData = aBitmapData.AllocL(); + User::LeaveIfError( iFs.Connect() ); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::~CVIMPSTDetailsImageDecoder +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsImageDecoder::~CVIMPSTDetailsImageDecoder() + { + DoCancel(); + if (iImgDecoder) + { + delete iImgDecoder; + iImgDecoder = NULL; + } + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iBitmapData) + { + delete iBitmapData; + iBitmapData = NULL; + } + if (iBitmapScaler) + { + delete iBitmapScaler; + iBitmapScaler = NULL; + } + + iFs.Close(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::Start +// Starts the decoding process +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::StartL(TSize aBitmapSize) + { + iDecoderState = ECcaConvertThumbnailImage; + iBitmapSize = aBitmapSize; + CreateBitmapL(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::RunL +// Called by the active object framework when the decoding (request) is +// completed. +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::RunL() + { + User::LeaveIfError( iStatus.Int() ); + switch ( iDecoderState ) + { + case ECcaConvertThumbnailImage: + { + iDecoderState = ECcaScaleThumbnail; + ScaleBitmapL(); + break; + } + case ECcaScaleThumbnail: + { + // don't delete + // Ownership of the bitmap is transferred + iHeader.SetBitmap(iBitmap, NULL ); + iBitmap = NULL; + } + default: + break; + } + + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::DoCancel +// Called when the decoding (request) is cancelled for some reason. +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::DoCancel() + { + iImgDecoder->Cancel(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::ScaleBitmapL +// scaling it to fit to the screen +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsImageDecoder::ScaleBitmapL() + { + iBitmapScaler = CBitmapScaler::NewL(); + iBitmapScaler->Scale( &iStatus, *iBitmap, iBitmapSize ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsImageDecoder::CreateBitmapL +// creates the bitmap +// --------------------------------------------------------------------------- +// + +void CVIMPSTDetailsImageDecoder::CreateBitmapL() + { + if ( iDecoderState == ECcaConvertThumbnailImage ) + { + iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData, CImageDecoder::EOptionAlwaysThread ); + } + 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(); + } +// end of file