diff -r 000000000000 -r 2014ca87e772 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp Tue Jan 26 15:18:05 2010 +0200 @@ -0,0 +1,621 @@ +/* +* Copyright (c) 2006-2007 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 class of Thumbnail Manager. + * +*/ + + +#include +#include +#include +#include +#include + +#include + +#include "thumbnailmanagerimpl.h" +#include "thumbnailrequestactive.h" +#include "thumbnailprovider.h" +#include "thumbnailsession.h" +#include "thumbnailmanageruids.hrh" +#include "thumbnailmanagerprivatecrkeys.h" +#include "thumbnailpanic.h" + +#include "thumbnaildata.h" + + +const TInt KThumbnailMimeTypeListGranularity = 8; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::~CThumbnailManagerImpl() +// Destructor. +// --------------------------------------------------------------------------- +// +CThumbnailManagerImpl::~CThumbnailManagerImpl() + { + delete iRequestQueue; + iSession.Close(); + iFs.Close(); + + // Check if we need to disconnect Fbs + TInt sessionCount = (TInt)Dll::Tls(); + if ( sessionCount > 0) + { + if( --sessionCount == 0 ) + { + TN_DEBUG1( "CThumbnailManagerImpl::~CThumbnailManagerImpl() - Disconnect FBS" ); + iFbsSession.Disconnect(); + } + TN_DEBUG2( "CThumbnailManagerImpl::~CThumbnailManagerImpl() - update sessionCount == %d to TLS", sessionCount ); + Dll::SetTls( (TAny*)sessionCount ); + } + + delete iMimeTypeList; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::NewLC() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CThumbnailManagerImpl* CThumbnailManagerImpl::NewLC( MThumbnailManagerObserver& + aObserver ) + { + CThumbnailManagerImpl* self = new( ELeave )CThumbnailManagerImpl( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::CThumbnailManagerImpl() +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CThumbnailManagerImpl::CThumbnailManagerImpl( MThumbnailManagerObserver& + aObserver ): iObserver( aObserver ), iDisplayMode( + KThumbnailDefaultDisplayMode ), iFlags( EDefaultFlags ), iQualityPreference + ( EOptimizeForQuality ), iRequestId( 0 ) + { + // No implementation required + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::ConstructL() +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::ConstructL() + { + User::LeaveIfError( iSession.Connect()); + User::LeaveIfError( iFs.Connect()); + User::LeaveIfError( iFs.ShareProtected()); + + if ( !RFbsSession::GetSession() ) + { + // We need to connect to Fbs (first user in this thread) + // Maintain a reference count in TLS + User::LeaveIfError( iFbsSession.Connect()); + Dll::SetTls( (TAny*)1 ); + TN_DEBUG2( "CThumbnailManagerImpl::ConstructL() - update sessionCount == %d to TLS", 1 ); + } + else + { + TInt sessionCount = (TInt)Dll::Tls(); + if( sessionCount++ > 0 ) + { + // Increase the reference count in TLS + Dll::SetTls( (TAny*)sessionCount ); + TN_DEBUG2( "CThumbnailManagerImpl::ConstructL() - update sessionCount == %d to TLS", sessionCount ); + } + else + { + // Fbs connection was available in the beginning, no need to + // increase the reference count + } + } + + // request processor + iRequestQueue = CThumbnailRequestQueue::NewL(); + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::GetThumbnailL +// Get a thumbnail for an object file. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::GetThumbnailL( + CThumbnailObjectSource& aObjectSource, TAny* aClientData /*= NULL*/, const + TInt aPriority, TBool aGeneratePersistentSizesOnly) + { + iRequestId++; + TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() URI==%S, iThumbnailSize==%d %d", &aObjectSource.Uri(), iThumbnailSize, iRequestId ); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + if(aObjectSource.Id() > 0) + { + getThumbnailActive->GetThumbnailL( aObjectSource.Uri(), aObjectSource.Id(), iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, aGeneratePersistentSizesOnly, + KNullDesC, iThumbnailSize); + } + else if ( aObjectSource.Uri().Length()) + { + getThumbnailActive->GetThumbnailL( aObjectSource.Uri(), aObjectSource.Id(), iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, aGeneratePersistentSizesOnly, + KNullDesC, iThumbnailSize ); + } + else + { + getThumbnailActive->GetThumbnailL( aObjectSource.FileHandle(), aObjectSource.Id(), iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, aGeneratePersistentSizesOnly, + KNullDesC, iThumbnailSize ); + } + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + TN_DEBUG2( "CThumbnailManagerImpl::GetThumbnailL() - request ID: %d", iRequestId ); + + return iRequestId; + } + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::GetThumbnailL +// Get a thumbnail for an object file. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::GetThumbnailL( + CThumbnailObjectSource& aObjectSource, TAny* aClientData /*= NULL*/, const + TInt aPriority ) + { + return GetThumbnailL( aObjectSource, aClientData, aPriority, EFalse ); + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::GetThumbnailL +// Get a thumbnail for an object file. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::GetThumbnailL( const TThumbnailId + aThumbnailId, TAny* aClientData /*= NULL*/, TInt aPriority) + { + iRequestId++; + TN_DEBUG5( "CThumbnailManagerImpl::GetThumbnailL() reqid==%d, aThumbnailId==%d, iThumbnailSize==%d %d", iRequestId, aThumbnailId, iThumbnailSize, iRequestId ); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + getThumbnailActive->GetThumbnailL( KNullDesC, aThumbnailId, iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, + EFalse, KNullDesC, iThumbnailSize ); + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + TN_DEBUG2( "CThumbnailManagerImpl::GetThumbnailL() - request ID: %d", iRequestId ); + + return iRequestId; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::ImportThumbnailL +// Import an image to be used as thumbnail for an object. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::ImportThumbnailL( + CThumbnailObjectSource& aObjectSource, const TDesC& aTargetUri, + TAny* aClientData /*= NULL*/, const TInt aPriority) + { + iRequestId++; + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + if ( aObjectSource.Uri().Length()) + { + getThumbnailActive->GetThumbnailL( aObjectSource.Uri(), aObjectSource.Id(), iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, + EFalse, aTargetUri, iThumbnailSize ); + } + else + { + getThumbnailActive->GetThumbnailL( aObjectSource.FileHandle(), aObjectSource.Id(), + iFlags, iQualityPreference, iSize, iDisplayMode, aPriority, aClientData, + EFalse, aTargetUri, iThumbnailSize ); + } + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + TN_DEBUG2( "CThumbnailManagerImpl::ImportThumbnailL() - request ID: %d", iRequestId ); + + return iRequestId; + } + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetThumbnailL +// Import an image to be used as thumbnail for an object. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::SetThumbnailL( CThumbnailObjectSource& aObjectSource, + TAny* aClientData, TInt aPriority ) + { + iRequestId++; + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + if ( aObjectSource.Uri().Length() && + aObjectSource.Buffer() != NULL && + aObjectSource.MimeType() != KNullDesC8) + { + getThumbnailActive->SetThumbnailL( aObjectSource.GetBufferOwnership(), aObjectSource.Id(), + aObjectSource.MimeType(), iFlags, iQualityPreference, iSize, iDisplayMode, + aPriority, aClientData, EFalse, aObjectSource.Uri(), iThumbnailSize); + } + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + TN_DEBUG2( "CThumbnailManagerImpl::SetThumbnailL() - request ID: %d", iRequestId ); + + return iRequestId; + } + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::CreateThumbnails +// Create persistent size thumbnails for an object. +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::CreateThumbnails( + CThumbnailObjectSource& aObjectSource, TInt aPriority ) + { + TRAPD(err, + TN_DEBUG2( "CThumbnailManagerImpl::CreateThumbnails() aObjectSource==%S ", &aObjectSource.Uri() ); + iRequestId++; + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + + CleanupStack::PushL( getThumbnailActive ); + + if (aObjectSource.Bitmap()) + { + // from bitmap + getThumbnailActive->SetThumbnailL( aObjectSource.GetBitmapOwnership(), + aObjectSource.Id(), KBmpMime, iFlags, iQualityPreference, + iSize, iDisplayMode, aPriority, NULL, ETrue, + aObjectSource.Uri(), EUnknownThumbnailSize); + } + else if( !aObjectSource.Buffer() ) + { + getThumbnailActive->GetThumbnailL( aObjectSource.Id(), + aObjectSource.Uri(), iFlags, iQualityPreference, iSize, + iDisplayMode, aPriority, NULL, ETrue, aObjectSource.Uri(), + EUnknownThumbnailSize); + } + else + { + // from buffer + getThumbnailActive->SetThumbnailL( aObjectSource.GetBufferOwnership(), + aObjectSource.Id(), aObjectSource.MimeType(), iFlags, + iQualityPreference, iSize, iDisplayMode, aPriority, NULL, + ETrue, aObjectSource.Uri(), EUnknownThumbnailSize); + } + + iRequestQueue->AddRequestL( getThumbnailActive ); + + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + TN_DEBUG2( "CThumbnailManagerImpl::CreateThumbnails() - request ID: %d", iRequestId ); + ); + + if( err != KErrNone) + { + return err; + } + + return iRequestId; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::DisplayMode() +// Get the current display mode for thumbnail bitmaps. +// --------------------------------------------------------------------------- +// +TDisplayMode CThumbnailManagerImpl::DisplayMode()const + { + return iDisplayMode; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetDisplayModeL() +// Set the current display mode for thumbnail bitmaps. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::SetDisplayModeL( const TDisplayMode aDisplayMode ) + { + iDisplayMode = aDisplayMode; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::QualityPreference() +// Get the current quality versus performance preference. +// --------------------------------------------------------------------------- +// +CThumbnailManager::TThumbnailQualityPreference CThumbnailManagerImpl + ::QualityPreference()const + { + return iQualityPreference; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetQualityPreferenceL() +// Set quality versus performance preference. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::SetQualityPreferenceL( const + TThumbnailQualityPreference aQualityPreference ) + { + iQualityPreference = aQualityPreference; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::ThumbnailSize() +// Get the current desired size for thumbnail bitmaps. +// --------------------------------------------------------------------------- +// +const TSize& CThumbnailManagerImpl::ThumbnailSize()const + { + return iSize; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetThumbnailSizeL() +// Set desired size for thumbnail bitmaps. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::SetThumbnailSizeL( const TSize& aThumbnailSize ) + { + iSize = aThumbnailSize; + iThumbnailSize = ECustomThumbnailSize; + } + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetThumbnailSizeL() +// Set desired size for thumbnail bitmaps. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::SetThumbnailSizeL( const TThumbnailSize aThumbnailSize ) + { + iThumbnailSize = aThumbnailSize; + } + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::Flags() +// Get current flags for thumbnail generation. +// --------------------------------------------------------------------------- +// +CThumbnailManager::TThumbnailFlags CThumbnailManagerImpl::Flags()const + { + return iFlags; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::SetFlagsL() +// Set flags for thumbnail generation. Several flags may be enabled +// by combining the values using bitwise or. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::SetFlagsL( const TThumbnailFlags aFlags ) + { + iFlags = aFlags; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::DeleteThumbnails() +// Delete all thumbnails for a given object. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::DeleteThumbnails( CThumbnailObjectSource& + aObjectSource ) + { + TRAP_IGNORE( + iRequestId++; + TN_DEBUG2( "CThumbnailManagerImpl::DeleteThumbnails() URI==%S ", &aObjectSource.Uri() ); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, CActive::EPriorityIdle, iRequestQueue ); + + CleanupStack::PushL( getThumbnailActive ); + + const TDesC& uri = aObjectSource.Uri(); + + if ( uri.Length()) + { + getThumbnailActive->DeleteThumbnails( uri, 0, CActive::EPriorityIdle ); + } + else + { + TInt err = aObjectSource.FileHandle().FullName( iFileNameBuf ); + if ( !err ) + { + getThumbnailActive->DeleteThumbnails( iFileNameBuf, 0, CActive::EPriorityIdle ); + } + } + + iRequestQueue->AddRequestL( getThumbnailActive ); + + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + ); + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::DeleteThumbnailsL() +// Delete thumbnails by TThumbnailId. +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::DeleteThumbnails( const TThumbnailId aItemId ) + { + TRAP_IGNORE( + iRequestId++; + TN_DEBUG2( "CThumbnailManagerImpl::DeleteThumbnails() aItemId==%d ", aItemId ); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, CActive::EPriorityIdle, iRequestQueue ); + + CleanupStack::PushL( getThumbnailActive ); + + getThumbnailActive->DeleteThumbnails( KNullDesC, aItemId, CActive::EPriorityIdle ); + + iRequestQueue->AddRequestL( getThumbnailActive ); + + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + ); + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::CancelRequest() +// Cancel a thumbnail operation. +// --------------------------------------------------------------------------- +// +TInt CThumbnailManagerImpl::CancelRequest( const TThumbnailRequestId aId ) + { + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + TN_DEBUG2( "CThumbnailManagerImpl::CancelRequest() - request ID: %d", aId ); + + return iRequestQueue->CancelRequest(aId); + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::ChangePriority() +// Change the priority of a queued thumbnail operation. +// --------------------------------------------------------------------------- +// +TInt CThumbnailManagerImpl::ChangePriority( const TThumbnailRequestId aId, + const TInt aNewPriority ) + { + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + TN_DEBUG2( "CThumbnailManagerImpl::ChangePriority() - request ID: %d", aId ); + + return iRequestQueue->ChangePriority(aId, aNewPriority); + } + +// --------------------------------------------------------------------------- +// Get the list of supported file systems from server +// --------------------------------------------------------------------------- +// +const CDesCArray& CThumbnailManagerImpl::GetSupportedMimeTypesL() + { + if ( !iMimeTypeList ) + { + iMimeTypeList = new( ELeave )CDesCArraySeg( + KThumbnailMimeTypeListGranularity ); + HBufC* buf = iSession.GetMimeTypeListL(); + CleanupStack::PushL( buf ); + TLex lex( *buf ); + while ( !lex.Eos()) + { + iMimeTypeList->AppendL( lex.NextToken()); + } + CleanupStack::PopAndDestroy( buf ); + } + return * iMimeTypeList; + } + + +// --------------------------------------------------------------------------- +// CThumbnailManagerImpl::UpdateThumbnails() +// Update thumbnails by given ID +// --------------------------------------------------------------------------- +// +void CThumbnailManagerImpl::UpdateThumbnailsL( const TThumbnailId aItemId, const TDesC& aPath, + const TInt aOrientation, const TInt64 aModified, + TInt aPriority ) + { + iRequestId++; + TN_DEBUG4( "CThumbnailManagerImpl::UpdateThumbnailsL() URI==%S, aItemId==%d %d", &aPath, aItemId, iRequestId); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, aPriority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + getThumbnailActive->UpdateThumbnailsL( aPath, aItemId, iFlags, iQualityPreference, + iDisplayMode, aPriority, aOrientation, aModified ); + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + } + +// End of file