diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgtnloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgtnloader.cpp Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2006 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: Thumbnail loader implementation +* +*/ + + +#include +#include +#include "mpxcollectionviewhgtnloader.h" +#include "mpxlog.h" + +_LIT( KMPXAlbumMimeType, "audio/mpeg3" ); + + +// ----------------------------------------------------------------------------- +// CODEScrollerTNLoader::NewL() +// ----------------------------------------------------------------------------- +// +CMpxTNLoader* CMpxTNLoader::NewL ( + MMpxTNLoaderObserver& aObserver, TThumbnailSize aSize ) + { + CMpxTNLoader* self = new (ELeave) CMpxTNLoader(aObserver, aSize ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader:~CMpxTNLoader() +// ----------------------------------------------------------------------------- +// +CMpxTNLoader::~CMpxTNLoader ( ) + { + // cancel outstanding requests + if(iTnEngine) + { +// CancelAll(); + } + + iLoading.ResetAndDestroy(); + delete iTnEngine; + + if( iAsyncCallBack ) + iAsyncCallBack->Cancel(); + + delete iAsyncCallBack; + } + +TInt CMpxTNLoader::LoadThumbnail( TAny* aSelf ) + { + CMpxTNLoader* self = (CMpxTNLoader*)aSelf; + self->LoadNextTN(); + return KErrNone; + } + +void CMpxTNLoader::LoadNextTN() + { + if( iLoading.Count() > 0 ) + { + TInt index = iLoading[0]->iIndex; + if( index >= 0 && iLoading[0]->iId == 0) + { + CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC(iLoading[0]->iFileName, KMPXAlbumMimeType); + TRAPD(err, iLoading[0]->iId = iTnEngine->GetThumbnailL( *source, NULL, 0 ); ) + MPX_DEBUG4( "GetThumbnailL: %d [%d,%d]", err, index, iLoading[0]->iId); + CleanupStack::PopAndDestroy(source); + } + } + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::ThumbnailPreviewReady() +// ----------------------------------------------------------------------------- +// +void CMpxTNLoader::ThumbnailPreviewReady (MThumbnailData& /*aThumbnail*/, + TThumbnailRequestId /*aId*/ ) + { + // Previews not currently used + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::ThumbnailReady() +// ----------------------------------------------------------------------------- +// +void CMpxTNLoader::ThumbnailReady (TInt aError, + MThumbnailData& aThumbnail, TThumbnailRequestId aId ) + { + TInt index = FindLoadingById(aId, ETrue); + MPX_DEBUG4( "ThumbnailReady: %d [%d,%d]", aError, index, aId ); + + if( index != KErrNotFound ) + { + CFbsBitmap* bitmap = (aError == KErrNone ? aThumbnail.DetachBitmap() : NULL); + + TRAP_IGNORE(iObserver.TNReadyL(aError, bitmap, NULL, index)); + + if( iLoading.Count() > 0 ) + { + if(!iAsyncCallBack->IsActive()) + iAsyncCallBack->CallBack(); + } + } + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::CMpxTNLoader() +// ----------------------------------------------------------------------------- +// +CMpxTNLoader::CMpxTNLoader (MMpxTNLoaderObserver& aObserver, TThumbnailSize aSize ) +: iObserver( aObserver ), iSize(aSize) + { + + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::ConstructL() +// ----------------------------------------------------------------------------- +// +void CMpxTNLoader::ConstructL () + { + iTnEngine = CThumbnailManager::NewL( *this ); + iTnEngine->SetFlagsL( CThumbnailManager::EDefaultFlags ); + iTnEngine->SetQualityPreferenceL( CThumbnailManager::EOptimizeForQuality ); + iTnEngine->SetThumbnailSizeL( iSize ); + TCallBack callback(CMpxTNLoader::LoadThumbnail, this); + iAsyncCallBack = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard ); + iAsyncCallBack->Set(callback); + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::FindLoading() +// ----------------------------------------------------------------------------- +// +TInt CMpxTNLoader::FindLoadingById(TThumbnailRequestId aId, TBool aRemove) + { + TInt index = KErrNotFound; + for(TInt i = 0; i < iLoading.Count(); ++i) + { + if(iLoading[i]->iId == aId) + { + index = iLoading[i]->iIndex; + if(aRemove) + { + delete iLoading[i]; + iLoading.Remove(i); + } + break; + } + } + return index; + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::FindLoading() +// ----------------------------------------------------------------------------- +// +TInt CMpxTNLoader::FindLoadingByIndex(TInt aIndex, TBool aRemove) + { + TInt index = KErrNotFound; + for(TInt i = 0; i < iLoading.Count(); ++i) + { + if(iLoading[i]->iIndex == aIndex) + { + index = i; + if(aRemove) + { + delete iLoading[i]; + iLoading.Remove(i); + } + break; + } + } + return index; + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::LoadThumbL() +// ----------------------------------------------------------------------------- +// +void CMpxTNLoader::LoadThumbL( TInt aIndex, const TDesC& aFileName ) + { + if( FindLoadingByIndex(aIndex) == KErrNotFound ) + { + iLoading.Append( new (ELeave) TLoadingTN( 0, aIndex, aFileName ) ); + if( !iAsyncCallBack->IsActive() ) + iAsyncCallBack->CallBack(); + } + } + +// ----------------------------------------------------------------------------- +// CMpxTNLoader::CancelThumb() +// ----------------------------------------------------------------------------- +// +void CMpxTNLoader::CancelThumb( TInt aIndex ) + { + TInt loadingIndex = FindLoadingByIndex( aIndex ); + if(loadingIndex != KErrNotFound) + { + // Current thumbnail manager has bugs in thumbnail request cancelation. + // There is a fix coming in near future but until that we cannot cancel requests + // since after that we dont get any thumbnails from server. +// if( iLoading[loadingIndex]->iId != 0 ) +// { +// RDebug::Print(_L("!!CANCEL REQUEST!!")); +// iTnEngine->CancelRequest( iLoading[loadingIndex]->iId ); +// } + delete iLoading[loadingIndex]; + iLoading.Remove(loadingIndex); + } + } + +void CMpxTNLoader::CancelAll() + { + iLoading.ResetAndDestroy(); + return; + // Current thumbnail manager has bugs in thumbnail request cancelation. + // There is a fix coming in near future but until that we cannot cancel requests + // since after that we dont get any thumbnails from server. + while ( iLoading.Count() > 0 ) + { + if( iLoading[0]->iId != 0 ) + iTnEngine->CancelRequest( iLoading[0]->iId ); + delete iLoading[0]; + iLoading.Remove(0); + } + } + +void CMpxTNLoader::SetSizeL( TThumbnailSize aSize ) + { + iTnEngine->SetThumbnailSizeL( aSize ); + }