servicewidget/servicewidgetdatapublisher/src/cservicewidgetimagedecoder.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:18 +0200
changeset 0 5e5d6b214f4f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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:  presene avatar decoder handler 
 *                
 *
*/

 
#include "cservicewidgetimagedecoder.h"
#include "servicewidgetcpglobals.h"
#include <cbsbitmap.h>
#include <ImageConversion.h> 

const TInt KMimeLength = 16;
// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::NewL
// Two-phase construction
// ---------------------------------------------------------------------------
//
CServiceWidgetImageDecoder* CServiceWidgetImageDecoder::NewL(MServiceWidgetImagerDecodeObserver& aObserver )
    {
    CServiceWidgetImageDecoder* self = new (ELeave) CServiceWidgetImageDecoder(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::CServiceWidgetImageDecoder
// First phase (C++) constructor
// ---------------------------------------------------------------------------
//
CServiceWidgetImageDecoder::CServiceWidgetImageDecoder(MServiceWidgetImagerDecodeObserver& aObserver ) 
	: 
	CActive( CActive::EPriorityStandard ), 
	iObserver(aObserver)
    { 
    CActiveScheduler::Add(this); 
    }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::ConstructL
// ConstructL, second phase constructor
// ---------------------------------------------------------------------------
//
void CServiceWidgetImageDecoder::ConstructL()
    {
    User::LeaveIfError( iFs.Connect() );
    }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::~CServiceWidgetImageDecoder
// ---------------------------------------------------------------------------
//
CServiceWidgetImageDecoder::~CServiceWidgetImageDecoder()
    {
    DoCancel();
    if (iImgDecoder)
        {
        delete iImgDecoder;
        iImgDecoder = NULL;
        }
    if (iBitmap)
        {
        delete iBitmap;
        iBitmap = NULL;
        }
    if (iBitmapData)
        {
        delete iBitmapData;
        iBitmapData = NULL;
        }
    iFs.Close();
    }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::StartDecodingL
// Starts the decoding process
// ---------------------------------------------------------------------------
//
void CServiceWidgetImageDecoder::StartDecodingL(const TDesC8& aBitmapData )
    {
    iBitmapData = aBitmapData.AllocL();
    
    iMimeType = HBufC8::NewL( KMimeLength);
    TPtr8 mimePtr = iMimeType->Des();
    CImageDecoder::GetMimeTypeDataL( *iBitmapData , mimePtr );
     
    iImgDecoder = CImageDecoder::DataNewL( iFs, *iBitmapData );
    TFrameInfo info = iImgDecoder->FrameInfo();
    iBitmap = new ( ELeave ) CFbsBitmap;
    User::LeaveIfError( iBitmap->Create( info.iOverallSizeInPixels, info.iFrameDisplayMode ));
    
    iNextOperationId = EOpEncodeBitmap;
    iStatus = KRequestPending;
    iImgDecoder->Convert( &iStatus, *iBitmap );
    SetActive();
    }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::RunL
// Called by the active object framework when the decoding (request) is
// completed.
// ---------------------------------------------------------------------------
//
void CServiceWidgetImageDecoder::RunL() 
	{
	User::LeaveIfError( iStatus.Int() );
	
	switch( iNextOperationId )
		{
		case EOpEncodeBitmap: 
			{
			StartEncodingL();
			break;	
			}
		case EOpComplete: 
			{
			iObserver.HandlerDecodeCompleteL();
			break;	
			}
		}
   }

// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::DoCancel
// Called when the decoding (request) is cancelled for some reason.
// ---------------------------------------------------------------------------
//
void CServiceWidgetImageDecoder::DoCancel()
    { 
    iImgDecoder->Cancel(); 
    }
// ---------------------------------------------------------------------------
// CServiceWidgetImageDecoder::StartEncodingL
// Called when the decoding (request) is cancelled for some reason.
// ---------------------------------------------------------------------------
//
void CServiceWidgetImageDecoder::StartEncodingL()
    { 
 	iImageEncoder = CImageEncoder::FileNewL(iFs, 
 											KSeTAvatarPath, 
 											*iMimeType, 
 											CImageEncoder::EOptionExtUseWithSetThumbnail );
    iImageEncoder->SetThumbnail(ETrue);
    
    iNextOperationId = EOpComplete;
    iStatus = KRequestPending;
    iImageEncoder->Convert( &iStatus, *iBitmap );
    SetActive();
    }

// end of file