--- a/engine/collectionframework/datasource/plugins/glxdatasourcemde/src/glxdatasourcetaskmdethumbnail.cpp Mon Sep 27 15:13:20 2010 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,464 +0,0 @@
-/*
-* 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:
-*
-*/
-
-
-
-#include "glxdatasourcetaskmdethumbnail.h"
-
-#include <caf/content.h>
-#include <glxcollectionpluginCamera.hrh>
-#include <glxcollectionpluginDownloads.hrh>
-#include <glxcollectionpluginMonths.hrh>
-#include <glxcollectionpluginalbums.hrh>
-#include <glxcollectionpluginall.hrh>
-#include <glxcollectionplugintags.hrh>
-#include <glxerrors.h>
-#include <glxfilterfactory.h>
-#include <glxgetrequest.h>
-#include <glxidlistrequest.h>
-#include <glxlog.h>
-#include <glxmediacollectioninternaldefs.h>
-#include <glxmediageneraldefs.h>
-#include <glxrequest.h>
-#include <glxthumbnailattributeinfo.h>
-#include <glxthumbnailrequest.h>
-#include <glxtndatabase.h>
-#include <glxtnfileinfo.h>
-#include <glxtnthumbnailcreator.h>
-#include <lbsposition.h>
-#include <mdeconstants.h>
-#include <mdelogiccondition.h>
-#include <mdeobject.h>
-#include <mdeobjectdef.h>
-#include <mdeobjectquery.h>
-#include <mdepropertydef.h>
-#include <mderelationdef.h>
-#include <mdesession.h>
-#include <mdetextproperty.h>
-#include <mpxmedia.h>
-#include <mpxmediaarray.h>
-#include <mpxmediacollectiondetaildefs.h>
-#include <mpxmediacontainerdefs.h>
-#include <mpxmediadrmdefs.h>
-#include <mpxmediageneraldefs.h>
-
-#include "glxdatasourcemde.h"
-#include "glxdatasourcemde.hrh"
-
-// CONSTANTS
-
-_LIT(KPropertyDefNameDRM, "DRM");
-_LIT(KPropertyDefNameItemType, "ItemType");
-_LIT(KPropertyDefNameLastModifiedDate, "LastModifiedDate");
-_LIT(KPropertyDefNameSize, "Size");
-_LIT(KUnsupportedItemType, "video/x-pn-realvideo");
-_LIT(KUnsupportedItemType1, "video/x-pn-multirate-realvideo");
-_LIT(KUnsupportedItemType2, "video/vnd.rn-realvideo");
-_LIT(KUnsupportedItemType3, "video/x-ms-wmv");
-
-// ----------------------------------------------------------------------------
-// IsUnsupportedL
-// Tests to see if an item type is unsupported
-// ----------------------------------------------------------------------------
-//
-TBool IsUnsupportedL(CMdESession& aSession, TItemId aItemId)
- {
- GLX_LOG_ENTRY_EXIT("IsUnsupportedL()");
- TBool isUnsupported = EFalse;
- CMdEObject* item = aSession.GetObjectL(aItemId);
-
- if (!item)
- {
- User::Leave(KErrNotFound);
- }
-
- CleanupStack::PushL(item);
- CMdEProperty* itemType = NULL;
- CMdEPropertyDef* itemTypeProperty = item->Def().GetPropertyDefL(KPropertyDefNameItemType);
-
- TInt itemTypeIndex = item->Property(*itemTypeProperty, itemType);
- if (itemTypeIndex > KErrNotFound)
- {
- const TDesC& des = static_cast< CMdETextProperty *>(itemType)->Value();
- if (des.Compare(KUnsupportedItemType) == 0 ||
- des.Compare(KUnsupportedItemType1) == 0 ||
- des.Compare(KUnsupportedItemType2) == 0 ||
- des.Compare(KUnsupportedItemType3) == 0)
- {
- // The item is unsupported
- isUnsupported = ETrue;
- }
- }
- CleanupStack::PopAndDestroy(item);
-
- return isUnsupported;
- }
-
-// ----------------------------------------------------------------------------
-// Constructor
-// ----------------------------------------------------------------------------
-//
-CGlxDataSourceTaskMdeThumbnail:: CGlxDataSourceTaskMdeThumbnail(CGlxThumbnailRequest* aRequest,
- MGlxDataSourceRequestObserver& aObserver, CGlxDataSource* aDataSource)
- : CGlxDataSourceTaskMde(aRequest, aObserver, aDataSource)
- {
- GLX_LOG_ENTRY_EXIT("CGlxDataSourceTaskMdeThumbnail::CGlxDataSourceTaskMdeThumbnail()");
- iFilterProperties = TGlxFilterFactory::ExtractAttributes(iRequest->Filter());
- }
-
-// ----------------------------------------------------------------------------
-// Destructor
-// ----------------------------------------------------------------------------
-//
-CGlxDataSourceTaskMdeThumbnail::~CGlxDataSourceTaskMdeThumbnail()
- {
- GLX_LOG_ENTRY_EXIT("CGlxDataSourceTaskMdeThumbnail::~CGlxDataSourceTaskMdeThumbnail()");
- if( iTnRequestStatus )
- {
- CancelFetchUri(TGlxMediaId());
- }
- if( iTnRequestInProgress )
- {
- CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
-
- TGlxThumbnailRequest tnReq;
- request->ThumbnailRequest(tnReq);
- DataSource()->ThumbnailCreator().CancelRequest(tnReq.iId);
- }
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::ExecuteRequest
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()");
- CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
-
- TGlxThumbnailRequest tnReq;
- request->ThumbnailRequest(tnReq);
- iTnRequestInProgress = ETrue;
- DataSource()->ThumbnailCreator().FetchThumbnailL(tnReq, *this);
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::HandleRequestComplete
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::HandleRequestComplete(TInt aError)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::HandleRequestComplete()");
- CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
- if(request && !(aError == KErrNone || aError == KErrNoMemory))
- {
- // An error has occured.
- TBool isUnsupported = EFalse;
- // If the item type is unsupported the we want to display the default
- // icon rather than the corrupt icon.
- TRAPD(err, isUnsupported = IsUnsupportedL(DataSource()->Session(),
- TItemId(request->ItemId().Value())));
- if (isUnsupported)
- {
- aError = KErrNotSupported;
- }
- else if (err != KErrNone)
- {
- aError = err;
- }
- }
- CGlxDataSourceTask::HandleRequestComplete(aError);
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::DoHandleQueryCompletedL
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::DoHandleQueryCompletedL(CMdEQuery& /*aQuery*/)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::DoHandleQueryCompletedL()");
- if (EContainerFirstItemQuery == iQueryTypes[0])
- {
- TRAPD(err, DoHandleContainerFirstItemQueryCompletedL());
-
- if (err != KErrNone)
- {
- CompleteThumbnailRequest(err);
- }
- }
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL(const TGlxMediaId& aId,
- TGlxThumbnailQuality aQuality)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL()");
- __ASSERT_DEBUG(dynamic_cast<CGlxThumbnailRequest*>(iRequest), Panic(EGlxPanicLogicError));
- CGlxThumbnailRequest* req = static_cast<CGlxThumbnailRequest*>(iRequest);
- delete iResponse;
- iResponse = NULL;
- iResponse = CMPXMedia::NewL();
- CGlxThumbnailAttribute* tnAttribute = new (ELeave) CGlxThumbnailAttribute;
- CleanupStack::PushL(tnAttribute);
- TGlxThumbnailRequest tnRequest;
- req->ThumbnailRequest(tnRequest);
- TSize size(tnRequest.iSizeClass);
- tnAttribute->iDimensions = size;
- tnAttribute->iCroppingRect = tnRequest.iCroppingRect;
- tnAttribute->iThumbnailQuality = aQuality;
-
- TUint attributeId = req->AttributeId();
- if ( GlxIsFullThumbnailAttribute(attributeId) )
- {
- TBool quality = (EGlxThumbnailQualityHigh == aQuality);
- attributeId = GlxFullThumbnailAttributeId(quality,
- size.iWidth, size.iHeight);
- }
-
- iResponse->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, aId.Value());
- iResponse->SetNoNewLCObjectL(
- TMPXAttribute(KGlxMediaIdThumbnail, attributeId), tnAttribute);
- CleanupStack::PopAndDestroy(tnAttribute);
- }
-
-// -----------------------------------------------------------------------------
-// ThumbnailFetchComplete
-// Notifies that a thumbnail for a given item is available, or that
-// thumbnail generation failed.
-// -----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(
- const TGlxMediaId& aItemId, TGlxThumbnailQuality aQuality, TInt aErrorCode)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete()");
- iTnRequestInProgress = EFalse;
- TInt err = aErrorCode;
- if(!err)
- {
- TRAP(err, HandleThumbnailFetchCompleteL(aItemId, aQuality));
- }
- HandleRequestComplete(err);
- }
-
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::ThumbnailDeletionComplete
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::ThumbnailDeletionComplete(
- const TGlxMediaId& /*aItemId*/, TInt /*aErrorCode*/)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::ThumbnailDeletionComplete()");
- }
-
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::FilterAvailableComplete
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::FilterAvailableComplete(
- const RArray<TGlxMediaId>& /*aIdArray*/, TInt /*aErrorCode*/)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::FilterAvailableComplete()");
- // No implementation
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::FetchFileInfoL
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::FetchFileInfoL(CGlxtnFileInfo* aInfo,
- const TGlxMediaId& aItemId, TRequestStatus* aStatus)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::FetchFileInfoL()");
- __ASSERT_DEBUG(dynamic_cast<CGlxThumbnailRequest*>(iRequest), Panic(EGlxPanicLogicError));
- CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
- if(request->ThumbnailInfo())
- {
- aInfo->CopyInfoL(*request->ThumbnailInfo());
- *aStatus = KRequestPending;
- User::RequestComplete(aStatus, KErrNone);
- return;
- }
-
- CMdEObject* item = DataSource()->Session().GetObjectL((TMdEItemId)aItemId.Value());
- if(!item)
- {
- User::Leave(KErrNotFound);
- }
-
- CleanupStack::PushL(item);
- iTnRequestStatus = aStatus;
- iTnFileInfo = aInfo;
- *iTnRequestStatus = KRequestPending;
-
- CGlxDataSource::TContainerType containerType = DataSource()->ContainerType(item);
- if( CGlxDataSource::EContainerTypeNotAContainer != containerType )
- {
- iTnFileInfo->iTemporary = ETrue;
-
- TGlxMediaId container = aItemId;
- CMdEObjectDef* objectDef = &item->Def();
-
- /// @todo: use default filter so we can ensure we always get correct first item if filters change
- iFilterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
- iFilterProperties.iSortDirection = EGlxFilterSortDirectionDescending;
- iFilterProperties.iLastCaptureDate = ETrue;
-
- if( CGlxDataSource::EContainerTypeMonth == containerType )
- {
- AddMonthFilterL(item, iFilterProperties);
- container = DataSource()->CameraAlbumId();
- objectDef = &DataSource()->AlbumDef();
- }
-
- DoQueryL(*objectDef, ETrue, EContainerFirstItemQuery, EQueryResultModeObjectWithoutFreetexts, container);
- }
- else
- {
- CompleteFetchFileInfoL(item);
- }
-
- CleanupStack::PopAndDestroy(item);
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::CompleteFetchFileInfoL
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::CompleteFetchFileInfoL(CMdEObject* aItem)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::CompleteFetchFileInfoL()");
- TParsePtrC parser(aItem->Uri());
- iTnFileInfo->SetFilePathL(parser.FullName());
-
- CMdEProperty* size;
- CMdEPropertyDef* sizeProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameSize);
- TInt sizeIndex = aItem->Property(*sizeProperty, size);
- if( KErrNotFound == sizeIndex )
- {
- iTnFileInfo->iFileSize = 0;
- }
- else
- {
- iTnFileInfo->iFileSize = static_cast< CMdEInt32Property *>(size)->Value();
- }
-
- CMdEProperty* lastModifiedDateProperty;
- CMdEPropertyDef* lastModifiedDatePropertyDef = aItem->Def().GetPropertyDefL(KPropertyDefNameLastModifiedDate);
-
-#ifdef _DEBUG
- TInt index = // This variable is only required for the assert debug below. If it is not wrapped in an
- // #ifdef _DEBUG, it will cause a warning in non debug builds.
-#endif
- aItem->Property(*lastModifiedDatePropertyDef, lastModifiedDateProperty);
- __ASSERT_DEBUG(index > KErrNotFound, Panic(EGlxPanicRequiredPropertyNotFound));
-
- iTnFileInfo->iFileTime = static_cast<CMdETimeProperty*>(lastModifiedDateProperty)->Value();
-
- CGlxDataSource::TItemType itemType = DataSource()->ItemType(aItem);
- iTnFileInfo->iIsVideo = ( CGlxDataSource::EItemTypeVideo == itemType );
-
- CMdEProperty* drmProtected;
- CMdEPropertyDef* drmProtectedProperty = aItem->Def().GetPropertyDefL(KPropertyDefNameDRM);
- TInt drmProtectedIndex = aItem->Property(*drmProtectedProperty, drmProtected);
- TInt err = KErrNone;
- if( KErrNotFound == drmProtectedIndex)
- {
- // should be present for all normally harvested images
- // so this should only be where we didn't pre-fetch the attributes
- // i.e. background thumbnail generation
- // so we get status from CAF to avoid forcing second stage harvest
- TRAP(err,
- ContentAccess::CContent* content = ContentAccess::CContent::NewLC(iTnFileInfo->FilePath());
- content->GetAttribute(ContentAccess::EIsProtected, iTnFileInfo->iIsProtected);
- CleanupStack::PopAndDestroy(content);
- );
- }
- else
- {
- iTnFileInfo->iIsProtected = static_cast<CMdEBoolProperty*>(drmProtected)->Value();
- }
-
- CompleteThumbnailRequest(err);
- iTnFileInfo = NULL;
- iTnRequestStatus = NULL;
- }
-
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::CancelFetchUri
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::CancelFetchUri(const TGlxMediaId& /*aItemId*/)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::CancelFetchUri()");
- CompleteThumbnailRequest(KErrCancel);
- }
-
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::ThumbnailStorage
-// ----------------------------------------------------------------------------
-//
-MGlxtnThumbnailStorage* CGlxDataSourceTaskMdeThumbnail::ThumbnailStorage()
- {
- GLX_LOG_ENTRY_EXIT("MGlxtnThumbnailStorage* CGlxDataSourceTaskMdeThumbnail::ThumbnailStorage()");
- return &DataSource()->ThumbnailDatabase();
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::DoHandleContainerFirstItemQueryCompletedL
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::DoHandleContainerFirstItemQueryCompletedL()
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::DoHandleContainerFirstItemQueryCompletedL()");
- if( !iQueries[0]->Count() )
- {
- User::Leave(KErrGlxEmptyContainer); // leave with a specific Error code so UI can display empty folder icon
- }
-
- CMdEObject* item = static_cast<CMdEObject*>(iQueries[0]->TakeOwnershipOfResult(0));
- if(!item)
- {
- User::Leave(KErrNotFound);
- }
-
- CleanupStack::PushL(item);
- CompleteFetchFileInfoL(item);
- CleanupStack::PopAndDestroy(item);
- }
-
-// ----------------------------------------------------------------------------
-// CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest
-// ----------------------------------------------------------------------------
-//
-void CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest(TInt aError)
- {
- GLX_LOG_ENTRY_EXIT("void CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest()");
- if (iTnRequestStatus)
- {
- *iTnRequestStatus = KRequestPending;
- User::RequestComplete(iTnRequestStatus, aError);
- iTnFileInfo = NULL;
- iTnRequestStatus = NULL;
- }
- }