mpxplugins/viewplugins/views/collectionviewhg/src/mpxcollectionviewhgtnloader.cpp
changeset 0 ff3acec5bc43
child 11 943ff5625028
--- /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 <thumbnaildata.h>
+#include <AknIconUtils.h>
+#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 );
+    }