40 // --------------------------------------------------------------------------- |
40 // --------------------------------------------------------------------------- |
41 // |
41 // |
42 CThumbnailServerSession::CThumbnailServerSession(): CSession2() |
42 CThumbnailServerSession::CThumbnailServerSession(): CSession2() |
43 { |
43 { |
44 iBitmapHandle = 0; |
44 iBitmapHandle = 0; |
|
45 iBitmap = NULL; |
|
46 iBuffer = NULL; |
45 } |
47 } |
46 |
48 |
47 |
49 |
48 // --------------------------------------------------------------------------- |
50 // --------------------------------------------------------------------------- |
49 // CThumbnailServerSession::~CThumbnailServerSession() |
51 // CThumbnailServerSession::~CThumbnailServerSession() |
158 // Handles service request messages from clients. |
160 // Handles service request messages from clients. |
159 // ----------------------------------------------------------------------------- |
161 // ----------------------------------------------------------------------------- |
160 // |
162 // |
161 void CThumbnailServerSession::ServiceL( const RMessage2& aMessage ) |
163 void CThumbnailServerSession::ServiceL( const RMessage2& aMessage ) |
162 { |
164 { |
163 __ASSERT_DEBUG( !iMessage.Handle(), ThumbnailPanic( |
165 TN_DEBUG1( "CThumbnailServerSession::ServiceL() - begin" ); |
164 EThumbnailMessageNotCompleted )); |
166 |
|
167 __ASSERT_DEBUG( !iMessage.Handle(), ThumbnailPanic(EThumbnailMessageNotCompleted)); |
165 if ( iMessage.Handle()) |
168 if ( iMessage.Handle()) |
166 { |
169 { |
167 iMessage.Complete( KErrUnknown ); |
170 iMessage.Complete( KErrUnknown ); |
168 iMessage = RMessage2(); |
171 iMessage = RMessage2(); |
169 } |
172 } |
|
173 |
170 iMessage = aMessage; |
174 iMessage = aMessage; |
171 |
175 |
|
176 if ( iMessage.Handle()) |
|
177 { |
|
178 // get client thread |
|
179 TInt err = iMessage.Client( iClientThread ); |
|
180 if (err != KErrNone) |
|
181 { |
|
182 TN_DEBUG1( "CThumbnailServerSession::ServiceL() - client thread not found"); |
|
183 |
|
184 iMessage = RMessage2(); |
|
185 } |
|
186 } |
|
187 else |
|
188 { |
|
189 TN_DEBUG1( "CThumbnailServerSession::ServiceL() - message null"); |
|
190 } |
|
191 |
172 // clean up possible trash |
192 // clean up possible trash |
173 if (iBitmapHandle) |
193 if (iBitmapHandle) |
174 { |
194 { |
175 Server()->DeleteBitmapFromPool( iBitmapHandle ); |
195 Server()->DeleteBitmapFromPool( iBitmapHandle ); |
176 iBitmapHandle = 0; |
196 iBitmapHandle = 0; |
181 iBuffer = NULL; |
201 iBuffer = NULL; |
182 iOriginalSize = TSize(); |
202 iOriginalSize = TSize(); |
183 |
203 |
184 TInt ret = KErrNone; |
204 TInt ret = KErrNone; |
185 |
205 |
186 TRAPD( err, |
206 TRAPD( err, ret = DispatchMessageL( aMessage ) ); |
187 { |
207 |
188 ret = DispatchMessageL( aMessage ); |
208 // if message was not completed, or Leave occurred |
189 } |
|
190 ); |
|
191 if ( iMessage.Handle()) |
209 if ( iMessage.Handle()) |
192 { |
210 { |
193 iMessage.Complete( ConvertSqlErrToE32Err( err != KErrNone ? err : ret )); |
211 if ( ClientThreadAlive() ) |
|
212 { |
|
213 iMessage.Complete( ConvertSqlErrToE32Err( err != KErrNone ? err : ret )); |
|
214 } |
|
215 |
194 iMessage = RMessage2(); |
216 iMessage = RMessage2(); |
195 } |
217 } |
196 else |
218 |
197 { |
219 // close thread handle |
198 return; |
220 iClientThread.Close(); |
199 } |
221 |
|
222 TN_DEBUG1( "CThumbnailServerSession::ServiceL() - end" ); |
200 } |
223 } |
201 |
224 |
202 |
225 |
203 // ----------------------------------------------------------------------------- |
226 // ----------------------------------------------------------------------------- |
204 // CThumbnailServerSession::Server() |
227 // CThumbnailServerSession::Server() |
342 CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( |
365 CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( |
343 Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); |
366 Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); |
344 |
367 |
345 CleanupStack::PushL( task ); |
368 CleanupStack::PushL( task ); |
346 task->QueryPathByIdL(params.iThumbnailId, EFalse); |
369 task->QueryPathByIdL(params.iThumbnailId, EFalse); |
347 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); |
370 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread ); |
348 Server()->QueueTaskL( task ); |
371 Server()->QueueTaskL( task ); |
349 CleanupStack::Pop( task ); // owned by processor now |
372 CleanupStack::Pop( task ); // owned by processor now |
350 |
373 |
351 // query task is now responsible for completing the message |
374 // query task is now responsible for completing the message |
352 iMessage = RMessage2(); |
375 iMessage = RMessage2(); |
439 |
462 |
440 CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() |
463 CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() |
441 ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); |
464 ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); |
442 |
465 |
443 CleanupStack::PushL( task ); |
466 CleanupStack::PushL( task ); |
444 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); |
467 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread ); |
445 Server()->QueueTaskL( task ); |
468 Server()->QueueTaskL( task ); |
446 CleanupStack::Pop( task ); // owned by processor now |
469 CleanupStack::Pop( task ); // owned by processor now |
447 |
470 |
448 // Decode task is now responsible for completing the message |
471 // Decode task is now responsible for completing the message |
449 iMessage = RMessage2(); |
472 iMessage = RMessage2(); |
516 |
539 |
517 CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() |
540 CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() |
518 ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); |
541 ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); |
519 |
542 |
520 CleanupStack::PushL( task ); |
543 CleanupStack::PushL( task ); |
521 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); |
544 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread ); |
522 Server()->QueueTaskL( task ); |
545 Server()->QueueTaskL( task ); |
523 CleanupStack::Pop( task ); // owned by processor now |
546 CleanupStack::Pop( task ); // owned by processor now |
524 |
547 |
525 // Decode task is now responsible for completing the message |
548 // Decode task is now responsible for completing the message |
526 iMessage = RMessage2(); |
549 iMessage = RMessage2(); |
624 |
647 |
625 // get bitmap |
648 // get bitmap |
626 CFbsBitmap* bitmap = new( ELeave )CFbsBitmap(); |
649 CFbsBitmap* bitmap = new( ELeave )CFbsBitmap(); |
627 CleanupStack::PushL( bitmap ); |
650 CleanupStack::PushL( bitmap ); |
628 User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) ); |
651 User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) ); |
|
652 |
|
653 // use pool to prevent bitmap leak |
|
654 // this bitmap is shared to several scale tasks, one of which can Leave |
629 Server()->AddBitmapToPoolL( reqId.iSession, bitmap, reqId ); |
655 Server()->AddBitmapToPoolL( reqId.iSession, bitmap, reqId ); |
|
656 |
630 CleanupStack::Pop( bitmap ); |
657 CleanupStack::Pop( bitmap ); |
631 iBitmapHandle = bitmap->Handle(); |
658 iBitmapHandle = bitmap->Handle(); |
632 |
659 |
633 RArray < TThumbnailPersistentSize >* missingSizes = NULL; |
660 RArray < TThumbnailPersistentSize >* missingSizes = NULL; |
634 |
661 |
674 } |
701 } |
675 |
702 |
676 CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(), |
703 CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(), |
677 *Server(), params.iTargetUri, bitmap, bitmapSize, |
704 *Server(), params.iTargetUri, bitmap, bitmapSize, |
678 (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, |
705 (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, |
679 KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse ); |
706 KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, |
|
707 reqId); |
680 CleanupStack::PushL( scaleTask ); |
708 CleanupStack::PushL( scaleTask ); |
681 scaleTask->SetDoStore( ETrue ); |
709 scaleTask->SetDoStore( ETrue ); |
682 Server()->Processor().AddTaskL( scaleTask ); |
710 Server()->Processor().AddTaskL( scaleTask ); |
683 CleanupStack::Pop( scaleTask ); |
711 CleanupStack::Pop( scaleTask ); |
684 |
712 |
685 if( i == count-1 ) |
713 // completion to first task, because task processor works like stack |
|
714 if( i == 0 ) |
686 { |
715 { |
687 // scaleTask is now responsible for completing the RMessage |
716 // scaleTask is now responsible for completing the RMessage |
688 scaleTask->SetMessageData( reqId, iMessage ); |
717 scaleTask->SetMessageData( reqId, iMessage, iClientThread ); |
689 iMessage = RMessage2(); |
718 iMessage = RMessage2(); |
690 } |
719 } |
691 } |
720 } |
692 } |
721 } |
693 else |
722 else |
786 } |
816 } |
787 |
817 |
788 CleanupStack::Pop( aFile ); |
818 CleanupStack::Pop( aFile ); |
789 |
819 |
790 CleanupStack::PushL( task ); |
820 CleanupStack::PushL( task ); |
791 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), |
821 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread ); |
792 iMessage ); |
|
793 Server()->QueueTaskL( task ); |
822 Server()->QueueTaskL( task ); |
794 CleanupStack::Pop( task ); // owned by processor now |
823 CleanupStack::Pop( task ); // owned by processor now |
795 |
824 |
796 if ( missingSizes ) |
825 if ( missingSizes ) |
797 { |
826 { |
894 { |
923 { |
895 task->ScaledBitmapToPool( EFalse ); |
924 task->ScaledBitmapToPool( EFalse ); |
896 } |
925 } |
897 |
926 |
898 CleanupStack::PushL( task ); |
927 CleanupStack::PushL( task ); |
899 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), |
928 task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread ); |
900 iMessage ); |
|
901 Server()->QueueTaskL( task ); |
929 Server()->QueueTaskL( task ); |
902 CleanupStack::Pop( task ); // owned by processor now |
930 CleanupStack::Pop( task ); // owned by processor now |
903 |
931 |
904 if ( missingSizes ) |
932 if ( missingSizes ) |
905 { |
933 { |
916 // |
944 // |
917 void CThumbnailServerSession::FetchThumbnailL() |
945 void CThumbnailServerSession::FetchThumbnailL() |
918 { |
946 { |
919 TN_DEBUG1("CThumbnailServerSession::FetchThumbnailL()"); |
947 TN_DEBUG1("CThumbnailServerSession::FetchThumbnailL()"); |
920 __ASSERT_DEBUG( !iBitmap, ThumbnailPanic( EThumbnailBitmapNotReleased )); |
948 __ASSERT_DEBUG( !iBitmap, ThumbnailPanic( EThumbnailBitmapNotReleased )); |
|
949 __ASSERT_DEBUG( !iBuffer, ThumbnailPanic( EThumbnailBitmapNotReleased )); |
921 |
950 |
922 delete iBitmap; |
951 delete iBitmap; |
923 iBitmap = NULL; |
952 iBitmap = NULL; |
|
953 delete iBuffer; |
|
954 iBuffer = NULL; |
924 |
955 |
925 TThumbnailRequestParams& params = iRequestParams(); |
956 TThumbnailRequestParams& params = iRequestParams(); |
926 |
957 |
927 if ( params.iThumbnailSize != EUnknownThumbnailSize && |
958 if ( params.iThumbnailSize != EUnknownThumbnailSize && |
928 params.iThumbnailSize != ECustomThumbnailSize ) |
959 params.iThumbnailSize != ECustomThumbnailSize ) |
967 params.iFlags& CThumbnailManager::ECropToAspectRatio, |
998 params.iFlags& CThumbnailManager::ECropToAspectRatio, |
968 params.iThumbnailSize, params.iModified, |
999 params.iThumbnailSize, params.iModified, |
969 EFalse, EFalse); |
1000 EFalse, EFalse); |
970 } |
1001 } |
971 |
1002 |
972 if ( ClientThreadAlive(iMessage) ) |
1003 if ( ClientThreadAlive() ) |
973 { |
1004 { |
974 // No need to scale, return iBitmap directly |
1005 TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle()); |
975 |
1006 |
976 TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId; |
1007 params.iBitmapHandle = iBitmap->Handle(); |
977 // No need to scale, return iBitmap directly |
1008 const TSize bitmapSize = iBitmap->SizeInPixels(); |
978 Server()->AddBitmapToPoolL( this, iBitmap, reqId ); |
|
979 |
|
980 CFbsBitmap* bitmap = iBitmap; |
|
981 |
|
982 TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", bitmap->Handle()); |
|
983 |
|
984 iBitmap = NULL; // owned by server now |
|
985 |
|
986 params.iBitmapHandle = bitmap->Handle(); |
|
987 const TSize bitmapSize = bitmap->SizeInPixels(); |
|
988 |
1009 |
989 if ( params.iQualityPreference == CThumbnailManager |
1010 if ( params.iQualityPreference == CThumbnailManager |
990 ::EOptimizeForQualityWithPreview && bitmapSize.iWidth < |
1011 ::EOptimizeForQualityWithPreview && bitmapSize.iWidth < |
991 params.iSize.iWidth && bitmapSize.iHeight < params.iSize.iHeight && |
1012 params.iSize.iWidth && bitmapSize.iHeight < params.iSize.iHeight && |
992 bitmapSize.iWidth < iOriginalSize.iWidth && bitmapSize.iHeight < |
1013 bitmapSize.iWidth < iOriginalSize.iWidth && bitmapSize.iHeight < |
996 params.iControlFlags = EThumbnailPreviewThumbnail; |
1017 params.iControlFlags = EThumbnailPreviewThumbnail; |
997 } |
1018 } |
998 |
1019 |
999 iMessage.WriteL( 0, iRequestParams ); |
1020 iMessage.WriteL( 0, iRequestParams ); |
1000 |
1021 |
|
1022 TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool"); |
|
1023 |
|
1024 TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId; |
|
1025 Server()->AddBitmapToPoolL( this, iBitmap, reqId ); |
|
1026 |
1001 iMessage.Complete( KErrNone ); |
1027 iMessage.Complete( KErrNone ); |
1002 iMessage = RMessage2(); |
1028 iMessage = RMessage2(); |
|
1029 |
|
1030 iBitmap = NULL; // owned by server now |
1003 } |
1031 } |
1004 else |
1032 else |
1005 { |
1033 { |
1006 delete iBitmap; |
1034 delete iBitmap; |
1007 iBitmap = NULL; |
1035 iBitmap = NULL; |
1025 // Cancel pending request. |
1053 // Cancel pending request. |
1026 // ----------------------------------------------------------------------------- |
1054 // ----------------------------------------------------------------------------- |
1027 // |
1055 // |
1028 TInt CThumbnailServerSession::CancelRequest( const RMessage2& aMessage ) |
1056 TInt CThumbnailServerSession::CancelRequest( const RMessage2& aMessage ) |
1029 { |
1057 { |
|
1058 TN_DEBUG1( "CThumbnailServerSession::CancelRequest()" ); |
|
1059 |
1030 const TThumbnailServerRequestId requestId( this, aMessage.Int0()); |
1060 const TThumbnailServerRequestId requestId( this, aMessage.Int0()); |
1031 const TInt err = Server()->DequeTask( requestId ); |
1061 const TInt err = Server()->DequeTask( requestId ); |
1032 TN_DEBUG4( |
1062 TN_DEBUG4( |
1033 "CThumbnailServerSession::CancelRequest(0x%08x/%d) - returning %d", |
1063 "CThumbnailServerSession::CancelRequest(0x%08x/%d) - returning %d", |
1034 requestId.iSession, requestId.iRequestId, err ); |
1064 requestId.iSession, requestId.iRequestId, err ); |
1040 // Change priority of pending request. |
1070 // Change priority of pending request. |
1041 // ----------------------------------------------------------------------------- |
1071 // ----------------------------------------------------------------------------- |
1042 // |
1072 // |
1043 TInt CThumbnailServerSession::ChangePriority( const RMessage2& aMessage ) |
1073 TInt CThumbnailServerSession::ChangePriority( const RMessage2& aMessage ) |
1044 { |
1074 { |
|
1075 TN_DEBUG1( "CThumbnailServerSession::ChangePriority()" ); |
|
1076 |
1045 const TThumbnailServerRequestId requestId( this, aMessage.Int0()); |
1077 const TThumbnailServerRequestId requestId( this, aMessage.Int0()); |
1046 const TInt newPriority = aMessage.Int1(); |
1078 const TInt newPriority = aMessage.Int1(); |
1047 |
1079 |
1048 const TInt err = Server()->ChangeTaskPriority( requestId, newPriority ); |
1080 const TInt err = Server()->ChangeTaskPriority( requestId, newPriority ); |
1049 TN_DEBUG5( |
1081 TN_DEBUG5( |
1125 // allocated by the client. |
1157 // allocated by the client. |
1126 // ----------------------------------------------------------------------------- |
1158 // ----------------------------------------------------------------------------- |
1127 // |
1159 // |
1128 void CThumbnailServerSession::GetMimeTypeListL( const RMessage2& aMessage ) |
1160 void CThumbnailServerSession::GetMimeTypeListL( const RMessage2& aMessage ) |
1129 { |
1161 { |
|
1162 TN_DEBUG1( "CThumbnailServerSession::GetMimeTypeListL()" ); |
|
1163 |
1130 TInt len = aMessage.GetDesMaxLengthL( 0 ); |
1164 TInt len = aMessage.GetDesMaxLengthL( 0 ); |
1131 HBufC* buf = HBufC::NewLC( len ); |
1165 HBufC* buf = HBufC::NewLC( len ); |
1132 TPtr ptr = buf->Des(); |
1166 TPtr ptr = buf->Des(); |
1133 Server()->GetMimeTypeList( ptr ); |
1167 Server()->GetMimeTypeList( ptr ); |
1134 aMessage.WriteL( 0, * buf ); |
1168 aMessage.WriteL( 0, * buf ); |
1328 // --------------------------------------------------------------------------- |
1362 // --------------------------------------------------------------------------- |
1329 // CThumbnailServerSession::ClientThreadAlive() |
1363 // CThumbnailServerSession::ClientThreadAlive() |
1330 // Checks if client thread is still alive and RMessage2 handle valid. |
1364 // Checks if client thread is still alive and RMessage2 handle valid. |
1331 // --------------------------------------------------------------------------- |
1365 // --------------------------------------------------------------------------- |
1332 // |
1366 // |
1333 TBool CThumbnailServerSession::ClientThreadAlive(RMessage2& aMessage) |
1367 TBool CThumbnailServerSession::ClientThreadAlive() |
1334 { |
1368 { |
1335 if ( aMessage.Handle()) |
1369 TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive()"); |
1336 { |
1370 |
1337 RThread clientThread; |
1371 if ( iMessage.Handle()) |
1338 |
1372 { |
1339 // get client thread |
1373 // check if client thread alive |
1340 TInt err = aMessage.Client( clientThread ); |
1374 TExitType exitType = iClientThread.ExitType(); |
1341 if (err != KErrNone) |
1375 |
1342 { |
1376 if( exitType != EExitPending ) |
1343 TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread not found"); |
1377 { |
1344 |
1378 TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread died"); |
1345 aMessage = RMessage2(); |
1379 |
|
1380 iMessage = RMessage2(); |
1346 |
1381 |
1347 return EFalse; |
1382 return EFalse; |
1348 } |
1383 } |
1349 |
|
1350 // check if client thread alive |
|
1351 TExitType exitType = clientThread.ExitType(); |
|
1352 |
|
1353 clientThread.Close(); |
|
1354 |
|
1355 if( exitType != EExitPending ) |
|
1356 { |
|
1357 TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread died"); |
|
1358 |
|
1359 aMessage = RMessage2(); |
|
1360 |
|
1361 return EFalse; |
|
1362 } |
|
1363 else |
1384 else |
1364 { |
1385 { |
1365 // all OK |
1386 // all OK |
1366 return ETrue; |
1387 return ETrue; |
1367 } |
1388 } |
1368 } |
1389 } |
1369 else |
1390 else |
1370 { |
1391 { |
|
1392 TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null"); |
1371 return EFalse; |
1393 return EFalse; |
1372 } |
1394 } |
1373 } |
1395 } |
1374 |
1396 |
1375 // End of file |
1397 // End of file |