engine/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmdsthumbnail.cpp
changeset 43 72396548277c
parent 24 99ad1390cd33
child 54 0f0f3f26f787
equal deleted inserted replaced
42:5e1df1b52eb3 43:72396548277c
   154 // ----------------------------------------------------------------------------
   154 // ----------------------------------------------------------------------------
   155 //          
   155 //          
   156 void CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()
   156 void CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()
   157     {
   157     {
   158     TRACER("CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()") 
   158     TRACER("CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL()") 
       
   159 #ifdef _DEBUG
       
   160     iStartTime.HomeTime(); 
       
   161 #endif
   159     CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   162     CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   160     
   163     
   161     TGlxThumbnailRequest tnReq;
   164     TGlxThumbnailRequest tnReq;
   162     request->ThumbnailRequest(tnReq);
   165     request->ThumbnailRequest(tnReq);
   163 #ifdef _DEBUG
   166     GLX_DEBUG4("*** CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL() Id=%d, TN Size w(%d) h(%d) ***", tnReq.iId.Value(),
   164 	RDebug::Print(_L("==> CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL - FetchThumbnailL(Id=%d), W(%d), H(%d)"), request->ItemId().Value(), tnReq.iSizeClass.iWidth, tnReq.iSizeClass.iHeight);
   167     						tnReq.iSizeClass.iWidth, tnReq.iSizeClass.iHeight);
   165 	iStartTime.HomeTime(); // Get home time
   168     GLX_DEBUG2("CGlxDataSourceTaskMdeThumbnail::ExecuteRequestL() iPriorityMode=%d", tnReq.iPriorityMode);
   166 #endif
   169 	
   167 #ifdef USE_S60_TNM
   170 #ifdef USE_S60_TNM
   168 	if(request->ThumbnailInfo())
   171 	if(request->ThumbnailInfo())
   169 		{
   172 		{
   170 		if (tnReq.iSizeClass.iWidth > 0 && tnReq.iSizeClass.iHeight > 0 )
   173 		if (tnReq.iSizeClass.iWidth > 0 && tnReq.iSizeClass.iHeight > 0 )
   171 			{
   174 			{
   172 			DataSource()->FetchThumbnailL(iRequest, *this);
   175 			DataSource()->FetchThumbnailL(iRequest, *this);
   173 			}
   176 			}
   174 		else
   177 		else
   175 			{
   178 			{
   176 			ThumbnailFetchComplete(KErrNone);
   179 			ThumbnailFetchComplete(KErrNone, ETrue);
   177 			}
   180 			}
   178 		}
   181 		}
   179 	else
   182 	else
   180 		{
   183 		{
   181 	   	FetchFileInfoL();
   184 	   	FetchFileInfoL();
   239 void CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL(const TGlxMediaId& aId,
   242 void CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL(const TGlxMediaId& aId,
   240         TGlxThumbnailQuality aQuality)
   243         TGlxThumbnailQuality aQuality)
   241     {
   244     {
   242     TRACER("CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL()")
   245     TRACER("CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL()")
   243     __ASSERT_DEBUG(dynamic_cast<CGlxThumbnailRequest*>(iRequest), Panic(EGlxPanicLogicError));
   246     __ASSERT_DEBUG(dynamic_cast<CGlxThumbnailRequest*>(iRequest), Panic(EGlxPanicLogicError));
       
   247     CGlxThumbnailRequest* req = static_cast<CGlxThumbnailRequest*>(iRequest);
       
   248     GLX_DEBUG2("*** CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL() Id=%d ***", req->ItemId().Value());
   244 #ifdef _DEBUG
   249 #ifdef _DEBUG
   245     iStopTime.HomeTime(); // Get home time
   250     iStopTime.HomeTime(); 
   246 	RDebug::Print(_L("==> ThumbnailFetchComplete <%d> us"), (TInt)iStopTime.MicroSecondsFrom(iStartTime).Int64());
   251     GLX_DEBUG2("CGlxDataSourceTaskMdeThumbnail:HandleThumbnailFetchCompleteL() took %d us",
   247 #endif
   252                      (TInt)iStopTime.MicroSecondsFrom(iStartTime).Int64());
   248     CGlxThumbnailRequest* req = static_cast<CGlxThumbnailRequest*>(iRequest);
   253 #endif    
   249     delete iResponse;
   254     delete iResponse;
   250     iResponse = NULL;
   255     iResponse = NULL;
   251     iResponse = CMPXMedia::NewL();
   256     iResponse = CMPXMedia::NewL();
   252     CGlxThumbnailAttribute* tnAttribute = new (ELeave) CGlxThumbnailAttribute;
   257     CGlxThumbnailAttribute* tnAttribute = new (ELeave) CGlxThumbnailAttribute;
   253     CleanupStack::PushL(tnAttribute);
   258     CleanupStack::PushL(tnAttribute);
   255     req->ThumbnailRequest(tnRequest); 
   260     req->ThumbnailRequest(tnRequest); 
   256     TSize size(tnRequest.iSizeClass);
   261     TSize size(tnRequest.iSizeClass);
   257     tnAttribute->iDimensions = size;
   262     tnAttribute->iDimensions = size;
   258     tnAttribute->iCroppingRect = tnRequest.iCroppingRect;
   263     tnAttribute->iCroppingRect = tnRequest.iCroppingRect;
   259     tnAttribute->iThumbnailQuality = aQuality;
   264     tnAttribute->iThumbnailQuality = aQuality;
       
   265     GLX_DEBUG2("CGlxDataSourceTaskMdeThumbnail::HandleThumbnailFetchCompleteL() aQuality=%d", aQuality);
   260 
   266 
   261     TUint attributeId = req->AttributeId();
   267     TUint attributeId = req->AttributeId();
   262     if ( GlxIsFullThumbnailAttribute(attributeId) )
   268     if ( GlxIsFullThumbnailAttribute(attributeId) )
   263         {
   269         {
   264         TBool quality = (EGlxThumbnailQualityHigh == aQuality);
   270         TBool quality = (EGlxThumbnailQualityHigh == aQuality);
   271                 TMPXAttribute(KGlxMediaIdThumbnail, attributeId), tnAttribute);
   277                 TMPXAttribute(KGlxMediaIdThumbnail, attributeId), tnAttribute);
   272     CleanupStack::PopAndDestroy(tnAttribute);
   278     CleanupStack::PopAndDestroy(tnAttribute);
   273     }
   279     }
   274 
   280 
   275 #ifdef USE_S60_TNM
   281 #ifdef USE_S60_TNM
   276 void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(TInt aError)
   282 void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(TInt aError, 
       
   283                                                             TBool aQuality)
   277 	{
   284 	{
   278     TRACER("CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(TNM)")
   285     TRACER("CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(TNM)")
   279     CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   286     CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   280     TGlxThumbnailRequest tnRequest;
   287     TGlxThumbnailRequest tnRequest;
   281     request->ThumbnailRequest(tnRequest); 
   288     request->ThumbnailRequest(tnRequest); 
   282     TInt err = aError;
   289     TInt err = aError;
   283     if(!err)
   290     if(!err)
   284         {
   291         {
   285         TRAP(err, HandleThumbnailFetchCompleteL(tnRequest.iId, EGlxThumbnailQualityHigh));
   292         TGlxThumbnailQuality tnQuality = EGlxThumbnailQualityHigh;
       
   293         if (!aQuality)
       
   294             {
       
   295             tnQuality = EGlxThumbnailQualityLow;
       
   296             }
       
   297         TRAP(err, HandleThumbnailFetchCompleteL(tnRequest.iId, tnQuality));
   286         }
   298         }
   287     HandleRequestComplete(err);
   299     HandleRequestComplete(err);
   288 	}
   300 	}
   289 #else
   301 #else
   290 // -----------------------------------------------------------------------------
   302 // -----------------------------------------------------------------------------
   295 //
   307 //
   296 void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(
   308 void CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete(
   297     const TGlxMediaId& aItemId, TGlxThumbnailQuality aQuality, TInt aErrorCode)
   309     const TGlxMediaId& aItemId, TGlxThumbnailQuality aQuality, TInt aErrorCode)
   298     {
   310     {
   299     TRACER("CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete()")
   311     TRACER("CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete()")
       
   312     GLX_DEBUG2("CGlxDataSourceTaskMdeThumbnail::ThumbnailFetchComplete() aErrorCode=%d", aErrorCode);
   300     iTnRequestInProgress = EFalse;
   313     iTnRequestInProgress = EFalse;
   301     TInt err = aErrorCode;
   314     TInt err = aErrorCode;
   302     if(!err)
   315     if(!err)
   303         {
   316         {
   304         TRAP(err, HandleThumbnailFetchCompleteL(aItemId, aQuality));
   317         TRAP(err, HandleThumbnailFetchCompleteL(aItemId, aQuality));
   366         TGlxMediaId container = aItemId;
   379         TGlxMediaId container = aItemId;
   367         CMdEObjectDef* objectDef = &item->Def();
   380         CMdEObjectDef* objectDef = &item->Def();
   368         
   381         
   369         /// @todo: use default filter so we can ensure we always get correct first item if filters change
   382         /// @todo: use default filter so we can ensure we always get correct first item if filters change
   370         iFilterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
   383         iFilterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
   371         iFilterProperties.iSortDirection = EGlxFilterSortDirectionAscending;
   384         iFilterProperties.iSortDirection = EGlxFilterSortDirectionOverrideToDescendingIfDate;
   372         iFilterProperties.iLastCaptureDate = ETrue;
   385         iFilterProperties.iLastCaptureDate = ETrue;
   373 
   386 
   374         if( CGlxDataSource::EContainerTypeMonth == containerType )
   387         if( CGlxDataSource::EContainerTypeMonth == containerType )
   375             {
   388             {
   376             iFilterProperties.iOrigin = EGlxFilterOriginCamera;
   389             iFilterProperties.iOrigin = EGlxFilterOriginAll;
   377             AddMonthFilterL(item, iFilterProperties);
   390             AddMonthFilterL(item, iFilterProperties);
   378             container = TGlxMediaId(KGlxCollectionRootId);
   391             container = TGlxMediaId(KGlxCollectionRootId);
   379             objectDef = &DataSource()->ObjectDef();
   392             objectDef = &DataSource()->ObjectDef();
   380             }
   393             }
   381             
   394             
   382         DoQueryL(*objectDef, ETrue, EContainerFirstItemQuery,  EQueryResultModeObjectWithFreetexts, container);        
   395         DoQueryL(*objectDef, ETrue, EContainerFirstItemQuery,  
       
   396                 EQueryResultModeItem, container);        
   383         }
   397         }
   384     else
   398     else
   385         {
   399         {
   386         CompleteFetchFileInfoL(item);
   400         CompleteFetchFileInfoL(item);
   387         }
   401         }
   431         {
   445         {
   432         iTnFileInfo->iFileSize = size->Uint32ValueL();
   446         iTnFileInfo->iFileSize = size->Uint32ValueL();
   433         }
   447         }
   434 
   448 
   435     CMdEProperty* lastModifiedDateProperty;
   449     CMdEProperty* lastModifiedDateProperty;
   436     CMdEPropertyDef& lastModifiedDatePropertyDef = aItem->Def().GetPropertyDefL(KPropertyDefNameLastModifiedDate);
   450     CMdEPropertyDef& lastModifiedDatePropertyDef = aItem->Def().GetPropertyDefL(
       
   451             KPropertyDefNameLastModifiedDate);
   437 
   452 
   438 #ifdef _DEBUG
   453 #ifdef _DEBUG
   439     TInt index = // This variable is only required for the assert debug below. If it is not wrapped in an  
   454     TInt index = // This variable is only required for the assert debug below. If it is not wrapped in an  
   440                  // #ifdef _DEBUG, it will cause a warning in non debug builds.
   455                  // #ifdef _DEBUG, it will cause a warning in non debug builds.
   441 #endif    
   456 #endif    
   465         // should be present for all normally harvested images
   480         // should be present for all normally harvested images
   466         // so this should only be where we didn't pre-fetch the attributes
   481         // so this should only be where we didn't pre-fetch the attributes
   467         // i.e. background thumbnail generation
   482         // i.e. background thumbnail generation
   468         // so we get status from CAF to avoid forcing second stage harvest
   483         // so we get status from CAF to avoid forcing second stage harvest
   469         TRAP(err, 
   484         TRAP(err, 
   470             ContentAccess::CContent* content = ContentAccess::CContent::NewLC(iTnFileInfo->FilePath());
   485             ContentAccess::CContent* content = ContentAccess::CContent::NewLC(
       
   486                     iTnFileInfo->FilePath());
   471             content->GetAttribute(ContentAccess::EIsProtected, iTnFileInfo->iIsProtected);
   487             content->GetAttribute(ContentAccess::EIsProtected, iTnFileInfo->iIsProtected);
   472             CleanupStack::PopAndDestroy(content);
   488             CleanupStack::PopAndDestroy(content);
   473             );
   489             );
   474         }
   490         }
   475     else
   491     else
   510 // ----------------------------------------------------------------------------
   526 // ----------------------------------------------------------------------------
   511 //
   527 //
   512 void CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest(TInt aError)
   528 void CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest(TInt aError)
   513 	{
   529 	{
   514     TRACER("CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest(TInt aError)")
   530     TRACER("CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest(TInt aError)")
       
   531     GLX_DEBUG2("CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest  aError=%d", aError);
   515 #ifdef USE_S60_TNM
   532 #ifdef USE_S60_TNM
   516 	if (aError != KErrNone)
   533 	if (aError != KErrNone)
   517 		{
   534 		{
   518 		ThumbnailFetchComplete(aError);
   535 		ThumbnailFetchComplete(aError, EFalse);
   519 		}
   536 		}
   520 	else
   537 	else
   521 		{
   538 		{
   522 	    CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   539 	    CGlxThumbnailRequest* request = static_cast<CGlxThumbnailRequest*>(iRequest);
   523         TGlxThumbnailRequest tnReq;
   540         TGlxThumbnailRequest tnReq;
   524 	   	request->ThumbnailRequest(tnReq);
   541 	   	request->ThumbnailRequest(tnReq);
   525 
   542 
   526 		if (tnReq.iSizeClass.iWidth > 0 && tnReq.iSizeClass.iHeight > 0 )
   543 		if (tnReq.iSizeClass.iWidth > 0 && tnReq.iSizeClass.iHeight > 0 )
   527 			{
   544 			{
   528 		    request->SetThumbnailInfo(iTnFileInfo);
   545 		    request->SetThumbnailInfo(iTnFileInfo);
       
   546 		    //This function is called number of times as a callback ,
       
   547             //hence not trapping the leaving function which costs time and memory.
       
   548             //Ignoring this for code scanner warnings - Leaving functions called in non-leaving functions.
   529 			DataSource()->FetchThumbnailL(iRequest, *this);
   549 			DataSource()->FetchThumbnailL(iRequest, *this);
   530 			}
   550 			}
   531 		else
   551 		else
   532 			{
   552 			{
   533 			ThumbnailFetchComplete(KErrArgument);
   553 		    GLX_LOG_INFO("CGlxDataSourceTaskMdeThumbnail::CompleteThumbnailRequest KErrArgument");
       
   554 			ThumbnailFetchComplete(KErrArgument, EFalse);
   534 			}
   555 			}
   535 			}
   556 			}
   536 #else
   557 #else
   537     if (iTnRequestStatus)
   558     if (iTnRequestStatus)
   538         {
   559         {
   569         TGlxMediaId container = request->ItemId();
   590         TGlxMediaId container = request->ItemId();
   570         CMdEObjectDef* objectDef = &item->Def();
   591         CMdEObjectDef* objectDef = &item->Def();
   571         
   592         
   572         /// @todo: use default filter so we can ensure we always get correct first item if filters change
   593         /// @todo: use default filter so we can ensure we always get correct first item if filters change
   573         iFilterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
   594         iFilterProperties.iSortOrder = EGlxFilterSortOrderCaptureDate;
   574         iFilterProperties.iSortDirection = EGlxFilterSortDirectionAscending;
   595         iFilterProperties.iSortDirection = EGlxFilterSortDirectionOverrideToDescendingIfDate;
   575         iFilterProperties.iLastCaptureDate = ETrue;
   596         iFilterProperties.iLastCaptureDate = ETrue;
   576 
   597 
   577         if( CGlxDataSource::EContainerTypeMonth == containerType )
   598         if( CGlxDataSource::EContainerTypeMonth == containerType )
   578             {
   599             {
   579             iFilterProperties.iOrigin = EGlxFilterOriginCamera;
   600             iFilterProperties.iOrigin = EGlxFilterOriginAll;
   580             AddMonthFilterL(item, iFilterProperties);
   601             AddMonthFilterL(item, iFilterProperties);
   581             container = TGlxMediaId(KGlxCollectionRootId);
   602             container = TGlxMediaId(KGlxCollectionRootId);
   582             objectDef = &DataSource()->ObjectDef();
   603             objectDef = &DataSource()->ObjectDef();
   583             }
   604             }
   584             
   605             
   585         DoQueryL(*objectDef, ETrue, EContainerFirstItemQuery,  EQueryResultModeObjectWithFreetexts, container);        
   606         DoQueryL(*objectDef, ETrue, EContainerFirstItemQuery, 
       
   607                 EQueryResultModeItem, container);        
   586         }
   608         }
   587     else
   609     else
   588         {
   610         {
   589         CompleteFetchFileInfoL(item);
   611         CompleteFetchFileInfoL(item);
   590         }
   612         }