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 } |