280 }; |
282 }; |
281 } |
283 } |
282 |
284 |
283 void CAlfStreamerServer::HandleCompositionRequestL(CAlfStreamerServerSession* aSession, TInt aOp, const RMessage2& aMessage) |
285 void CAlfStreamerServer::HandleCompositionRequestL(CAlfStreamerServerSession* aSession, TInt aOp, const RMessage2& aMessage) |
284 { |
286 { |
285 CAlfStreamerServerSession* wservsession = WservSession( aSession->ScreenNumber() ); |
|
286 |
|
287 TInt length = aMessage.GetDesLength(0); |
287 TInt length = aMessage.GetDesLength(0); |
288 User::LeaveIfError(length); |
288 User::LeaveIfError(length); |
289 HBufC8* message = HBufC8::NewLC(length+4); |
289 HBufC8* message = HBufC8::NewLC(length+4); |
290 TPtr8 clientBuf = message->Des(); |
290 TPtr8 clientBuf = message->Des(); |
291 aMessage.ReadL(0,clientBuf); |
291 aMessage.ReadL(0,clientBuf); |
292 |
292 |
293 if(aOp == KAlfCompOpSetExtent) |
293 HandleCompositionRequestL(aSession,aOp, clientBuf); |
294 { |
294 |
295 TInt* ptr = (TInt*)clientBuf.Ptr(); |
295 if( aOp == KAlfCompOpCreateSource ) |
296 TInt screennumber = ptr[4]; |
296 { |
297 if(screennumber!=aSession->ScreenNumber()) |
297 AppendCompositionSessionL(aSession); |
298 { |
298 TAlfCompParams* param = (TAlfCompParams*)clientBuf.Ptr(); |
299 aSession->ExtentSurfaceId().iInternal[0] = ptr[5]; |
299 for (TInt i = iAlfTargets.Count()-1;i >= 0; i--) |
300 aSession->ExtentSurfaceId().iInternal[1] = ptr[6]; |
300 { |
301 aSession->ExtentSurfaceId().iInternal[2] = ptr[7]; |
301 if (iAlfTargets[i].iWindowHandle == param->iWindowHandle&& |
302 aSession->ExtentSurfaceId().iInternal[3] = ptr[8]; |
302 iAlfTargets[i].iWindowGroup == param->iWindowGroup) |
303 wservsession = WservSession( screennumber ); |
303 { |
304 } |
304 aSession->AlfToken() = iAlfTargets[i].iTarget; |
305 } |
305 __ALFLOGSTRING("CAlfStreamerServer::HandleCompositionRequestL(): Found ALF token for composition session") |
306 else if(aOp == KAlfCompOpSessionClosed) |
306 } |
307 { |
307 } |
308 FreeCompositionSessionExtents(aSession); |
308 aMessage.Complete(reinterpret_cast<TInt>(aSession)); |
309 } |
309 } |
310 |
310 else if ( aOp != KAlfCompOpSetZOrder ) |
311 TInt session = reinterpret_cast<TInt>(aSession); |
311 { |
312 clientBuf.Insert(0, TPtrC8((TUint8*)&session ,sizeof(TInt))); |
312 aMessage.Complete(KErrNone); |
|
313 } |
|
314 |
|
315 CleanupStack::PopAndDestroy(); // unefficient.. |
|
316 } |
|
317 |
|
318 void CAlfStreamerServer::HandleCompositionRequestL(CAlfStreamerServerSession* aSession, TInt aOp, TPtr8& aClientBuf) |
|
319 { |
|
320 CAlfStreamerServerSession* wservsession = WservSession( aSession ? aSession->ScreenNumber() : 0 ); |
|
321 if (!wservsession) |
|
322 { |
|
323 __ALFLOGSTRING("CAlfStreamerServer::HandleCompositionRequestL(): Window server not connected yet") |
|
324 User::Leave(KErrNotReady); |
|
325 } |
|
326 |
|
327 if( aSession ) |
|
328 { |
|
329 if(aOp == KAlfCompOpSetExtent ) |
|
330 { |
|
331 TInt* ptr = (TInt*)aClientBuf.Ptr(); |
|
332 TInt screennumber = ptr[4]; |
|
333 if(screennumber!=aSession->ScreenNumber()) |
|
334 { |
|
335 aSession->ExtentSurfaceId().iInternal[0] = ptr[5]; |
|
336 aSession->ExtentSurfaceId().iInternal[1] = ptr[6]; |
|
337 aSession->ExtentSurfaceId().iInternal[2] = ptr[7]; |
|
338 aSession->ExtentSurfaceId().iInternal[3] = ptr[8]; |
|
339 wservsession = WservSession( screennumber); |
|
340 } |
|
341 } |
|
342 else if(aOp == KAlfCompOpSessionClosed) |
|
343 { |
|
344 FreeCompositionSessionExtents(aSession); |
|
345 } |
|
346 TInt targetId = reinterpret_cast<TInt>(aSession); |
|
347 aClientBuf.Insert(0, TPtrC8((TUint8*)&targetId,sizeof(TInt))); |
|
348 } |
313 |
349 |
314 if( wservsession ) // don't send to any wservsession if composition source does not have a window anywhere and this is not SetExtent operation |
350 if( wservsession ) // don't send to any wservsession if composition source does not have a window anywhere and this is not SetExtent operation |
315 { |
351 { |
316 QueueRequestForSessionL(wservsession, clientBuf, aOp); |
352 QueueRequestForSessionL(wservsession, aClientBuf, aOp); |
317 } |
353 } |
318 |
354 } |
319 CleanupStack::PopAndDestroy(); // unefficient.. |
355 |
320 |
356 void CAlfStreamerServer::CreatePermissionTokenL(TInt aAlfToken, TInt aWindowHandle, TInt aWindowGroup) |
321 if (!wservsession) |
357 { |
322 { |
358 __ALFLOGSTRING3("CAlfStreamerServer::CreatePermissionTokenL %d, %d, %d >>",aAlfToken,aWindowHandle,aWindowGroup) |
323 aMessage.Complete(KErrNotReady); |
359 TAlfCompParams param = {aAlfToken, aAlfToken, aWindowHandle, aWindowGroup}; |
|
360 if (iAlfTargets.Find(param) != KErrNotFound) |
|
361 { |
|
362 __ALFLOGSTRING("CAlfStreamerServer::CreatePermissionTokenL: Already added") |
324 return; |
363 return; |
325 } |
364 } |
326 |
365 TPckg<TAlfCompParams> ptr(param); |
327 if( aOp == KAlfCompOpCreateSource ) |
366 HandleCompositionRequestL(0, KAlfCompOpCreateSource, ptr); |
328 { |
367 User::LeaveIfError(iAlfTargets.Append(param)); |
329 AppendCompositionSessionL(aSession); |
368 __ALFLOGSTRING("CAlfStreamerServer::CreatePermissionTokenL <<") |
330 aMessage.Complete(reinterpret_cast<TInt>(aSession)); |
369 } |
331 } |
370 |
332 else if ( aOp != KAlfCompOpSetZOrder ) |
371 void CAlfStreamerServer::ReleasePermissionTokenL(TInt aAlfToken) |
333 { |
372 { |
334 aMessage.Complete(KErrNone); |
373 __ALFLOGSTRING("CAlfStreamerServer::ReleasePermissionTokenL >>") |
|
374 RemoveTargetFromInactiveSurfaces(aAlfToken); |
|
375 for (TInt i = 0; i < iAlfTargets.Count(); i++) |
|
376 { |
|
377 if (iAlfTargets[i].iTarget == aAlfToken) |
|
378 { |
|
379 TPckg<TInt> ptr(aAlfToken); |
|
380 HandleCompositionRequestL(0, KAlfCompOpSessionClosed, ptr); |
|
381 iAlfTargets.Remove(i); |
|
382 __ALFLOGSTRING("CAlfStreamerServer::ReleasePermissionTokenL: Found <<") |
|
383 return; |
|
384 } |
|
385 } |
|
386 __ALFLOGSTRING("CAlfStreamerServer::ReleasePermissionTokenL: Not Found <<") |
|
387 } |
|
388 |
|
389 void CAlfStreamerServer::QueueRequestSessionsL(TInt aAlfToken, const TPtrC8& aPtr, TInt aOp) |
|
390 { |
|
391 __ALFLOGSTRING("CAlfStreamerServer::QueueRequestSessionsL >>") |
|
392 for(TInt i = iCompositionSessions.Count()-1; i >= 0; i-- ) |
|
393 { |
|
394 if (iCompositionSessions[i]->AlfToken() == aAlfToken) |
|
395 { |
|
396 if (iCompositionSessions[i]->IsBgAnimSession() && |
|
397 (aOp == KAlfCompositionTargetHidden || aOp == KAlfCompositionTargetVisible )) |
|
398 { // omit |
|
399 continue; |
|
400 } |
|
401 |
|
402 __ALFLOGSTRING("CAlfStreamerServer::QueueRequestSessionsL: Session found") |
|
403 iCompositionSessions[i]->QueueL(aPtr, aOp); |
|
404 } |
|
405 } |
|
406 __ALFLOGSTRING("CAlfStreamerServer::QueueRequestSessionsL <<") |
|
407 } |
|
408 |
|
409 |
|
410 void CAlfStreamerServer::QueueRequestBGAnimSessionsL(const TPtrC8& aPtr, TInt aOp) |
|
411 { |
|
412 for(TInt i = iCompositionSessions.Count()-1; i >= 0; i-- ) |
|
413 { |
|
414 if (iCompositionSessions[i]->IsBgAnimSession()) |
|
415 { |
|
416 iCompositionSessions[i]->QueueL(aPtr, aOp); |
|
417 } |
335 } |
418 } |
336 } |
419 } |
337 |
420 |
338 void CAlfStreamerServer::QueueRequestForSessionL(CAlfStreamerServerSession* aSession, const TPtrC8& aPtr, TInt aOp) |
421 void CAlfStreamerServer::QueueRequestForSessionL(CAlfStreamerServerSession* aSession, const TPtrC8& aPtr, TInt aOp) |
339 { |
422 { |
536 } |
619 } |
537 aSession->ExtentSurfaceId().CreateNullId(); |
620 aSession->ExtentSurfaceId().CreateNullId(); |
538 } |
621 } |
539 } |
622 } |
540 |
623 |
|
624 void CAlfStreamerServer::RemoveTargetFromInactiveSurfaces(TInt aTarget) |
|
625 { |
|
626 for (TInt i = 0; i<iInactiveSurfaces.Count(); i++) |
|
627 { |
|
628 if (aTarget == iInactiveSurfaces[i].iTarget) |
|
629 { |
|
630 iInactiveSurfaces.Remove(i); |
|
631 break; |
|
632 } |
|
633 } |
|
634 } |
|
635 |
|
636 void CAlfStreamerServer::AddTargetFromInactiveSurfaces(TInt aTarget) |
|
637 { |
|
638 for (TInt i = 0; i<iInactiveSurfaces.Count(); i++) |
|
639 { |
|
640 if (aTarget == iInactiveSurfaces[i].iTarget) |
|
641 { |
|
642 return; |
|
643 } |
|
644 } |
|
645 |
|
646 for (TInt i = 0; i<iAlfTargets.Count(); i++) |
|
647 { |
|
648 if (aTarget == iAlfTargets[i].iTarget) |
|
649 { // ret value ignored intentionally |
|
650 iInactiveSurfaces.Append(iAlfTargets[i]); |
|
651 break; |
|
652 } |
|
653 } |
|
654 } |
|
655 |
|
656 void CAlfStreamerServer::GetListOfWGsHavingInactiveSurfacesL(const RMessage2& aMessage, TBool aActiveAlso) |
|
657 { |
|
658 RArray<TAlfCompParams>& arrayRef = aActiveAlso?iAlfTargets:iInactiveSurfaces; |
|
659 |
|
660 TInt count = arrayRef.Count(); |
|
661 __ALFLOGSTRING1("CAlfStreamerServer::GetListOfWGsHavingInactiveSurfacesL >> count %d", count) |
|
662 if ( count == 0) |
|
663 { |
|
664 aMessage.Complete(KErrNotFound); |
|
665 return; |
|
666 } |
|
667 |
|
668 TInt maxLength = aMessage.GetDesMaxLength(0); |
|
669 TInt* array = new (ELeave) TInt [maxLength/4]; |
|
670 |
|
671 count = Min(maxLength/4-1, count); |
|
672 for ( TInt i = 0; i<count; i++ ) |
|
673 { |
|
674 __ALFLOGSTRING1("CAlfStreamerServer::GetListOfWGsHavingInactiveSurfacesL adding %d", arrayRef[i].iWindowGroup); |
|
675 array[i] = arrayRef[i].iWindowGroup; |
|
676 } |
|
677 |
|
678 array[count] = 0; |
|
679 |
|
680 TPtr8 ptr((TUint8*)array,maxLength,maxLength); |
|
681 aMessage.WriteL(0, ptr); |
|
682 delete[] array; |
|
683 aMessage.Complete(KErrNone); |
|
684 __ALFLOGSTRING("CAlfStreamerServer::GetListOfWGsHavingInactiveSurfacesL <<") |
|
685 } |
|
686 |
541 // --------------------------------------------------------------------------- |
687 // --------------------------------------------------------------------------- |
542 // constructor |
688 // constructor |
543 // --------------------------------------------------------------------------- |
689 // --------------------------------------------------------------------------- |
544 // |
690 // |
545 CAlfStreamerServerSession::CAlfStreamerServerSession() : iScreenNumber(KErrNotFound) |
691 CAlfStreamerServerSession::CAlfStreamerServerSession() : iScreenNumber(KErrNotFound) |
695 TPckgC<TAlfNativeWindowData> data(server->Bridge()->iAlfWindowData); |
841 TPckgC<TAlfNativeWindowData> data(server->Bridge()->iAlfWindowData); |
696 aMessage.WriteL(0, data); |
842 aMessage.WriteL(0, data); |
697 break; |
843 break; |
698 } |
844 } |
699 |
845 |
|
846 case EAlfPostDataToCompositionClient: |
|
847 { |
|
848 TInt clientBufL = aMessage.GetDesLength(2); |
|
849 TPtr8 ptr(0,0); |
|
850 HBufC8* buf = 0; |
|
851 if (clientBufL > 0) |
|
852 { |
|
853 HBufC8::NewLC(aMessage.GetDesLength(2)); |
|
854 ptr.Set((TUint8*)buf->Ptr(),clientBufL,clientBufL); |
|
855 } |
|
856 TInt op = aMessage.Int0(); |
|
857 TInt key = aMessage.Int1(); |
|
858 |
|
859 aMessage.Complete(KErrNone); |
|
860 TRAP_IGNORE(server->QueueRequestSessionsL(key, ptr, op);) |
|
861 if (buf) |
|
862 { |
|
863 CleanupStack::PopAndDestroy(); |
|
864 } |
|
865 break; |
|
866 } |
|
867 |
|
868 case EAlfPostDataToCompositionTarget: |
|
869 { |
|
870 TInt clientBufL = aMessage.GetDesLength(2); |
|
871 TInt int2 = aMessage.Int1(); |
|
872 TPtr8 ptr(0,0); |
|
873 HBufC8* buf = 0; |
|
874 if (clientBufL > 0) |
|
875 { |
|
876 HBufC8::NewLC(clientBufL); |
|
877 ptr.Set((TUint8*)buf->Ptr(),clientBufL,clientBufL); |
|
878 } |
|
879 else |
|
880 { |
|
881 ptr.Set((TUint8*)&int2, sizeof(TInt),sizeof(TInt)); |
|
882 } |
|
883 TInt op = aMessage.Int0(); |
|
884 aMessage.Complete(KErrNone); |
|
885 TRAP_IGNORE(server->HandleCompositionRequestL(0, op, ptr);) |
|
886 if (buf) |
|
887 { |
|
888 CleanupStack::PopAndDestroy(); |
|
889 } |
|
890 if (op == KAlfCompositionTargetVisible) |
|
891 { |
|
892 server->RemoveTargetFromInactiveSurfaces(int2); |
|
893 } |
|
894 else if (op == KAlfCompositionTargetHidden) |
|
895 { |
|
896 server->AddTargetFromInactiveSurfaces(int2); |
|
897 } |
|
898 break; |
|
899 } |
|
900 case EAlfGetListOfWGsHavingInactiveSurfaces: |
|
901 { |
|
902 server->GetListOfWGsHavingInactiveSurfacesL(aMessage, EFalse); |
|
903 break; |
|
904 } |
|
905 |
|
906 case EAlfQueueRequestBGSessions: |
|
907 { |
|
908 TInt clientBufL = aMessage.GetDesLength(1); |
|
909 TPtr8 ptr(0,0); |
|
910 HBufC8* buf = 0; |
|
911 if (clientBufL > 0) |
|
912 { |
|
913 HBufC8::NewLC(clientBufL); |
|
914 ptr.Set((TUint8*)buf->Ptr(),clientBufL,clientBufL); |
|
915 } |
|
916 TInt op = aMessage.Int0(); |
|
917 aMessage.Complete(KErrNone); |
|
918 TRAP_IGNORE(server->QueueRequestBGAnimSessionsL(ptr, op);) |
|
919 if (buf) |
|
920 { |
|
921 CleanupStack::PopAndDestroy(); |
|
922 } |
|
923 break; |
|
924 } |
|
925 |
|
926 |
700 default: |
927 default: |
701 { |
928 { |
702 aMessage.Complete(KErrNotSupported); |
929 aMessage.Complete(KErrNotSupported); |
703 break; |
930 break; |
704 } |
931 } |
705 } |
932 } |
706 if (!aMessage.IsNull()) |
933 if (!aMessage.IsNull()) |
707 { |
934 { |
708 aMessage.Complete(KErrNone); |
935 aMessage.Complete(KErrNone); |
709 } |
936 } |
710 // RDebug::Print(_L("CAlfStreamerServerSession::ServiceL exit")); |
937 __ALFLOGSTRING("CAlfStreamerServerSession::ServiceL exit") |
711 } |
938 } |
712 |
939 |
713 void CAlfStreamerServerSession::HandleCompositionOpL(TInt aOp, const RMessage2& aMessage, CAlfStreamerServer* aServer) |
940 void CAlfStreamerServerSession::HandleCompositionOpL(TInt aOp, const RMessage2& aMessage, CAlfStreamerServer* aServer) |
714 { |
941 { |
715 switch (aOp) |
942 switch (aOp) |
765 case KAlfCompOpEnableAlpha: |
990 case KAlfCompOpEnableAlpha: |
766 case KAlfCompOpSetOpacity: |
991 case KAlfCompOpSetOpacity: |
767 case KAlfCompOpSetRotation: |
992 case KAlfCompOpSetRotation: |
768 case KAlfCompOpSetExtent: |
993 case KAlfCompOpSetExtent: |
769 case KAlfCompOpEnableKb: |
994 case KAlfCompOpEnableKb: |
770 case KAlfComOpSetBackgroundAnim: |
|
771 case KAlfCompOpSessionClosed: |
995 case KAlfCompOpSessionClosed: |
772 { |
996 { |
773 aServer->HandleCompositionRequestL(this, aOp, aMessage); |
997 aServer->HandleCompositionRequestL(this, aOp, aMessage); |
774 break; |
998 break; |
775 } |
999 } |
|
1000 case KAlfComOpSetBackgroundAnim: |
|
1001 { |
|
1002 TBool isBg(EFalse); |
|
1003 TPckg<TBool> ptr(isBg); |
|
1004 aMessage.Read(0,ptr); |
|
1005 iIsBgAnimSession = isBg; |
|
1006 aServer->HandleCompositionRequestL(this, aOp, aMessage); |
|
1007 break; |
|
1008 } |
|
1009 |
776 case KAlfCompositionWServScreenNumber: |
1010 case KAlfCompositionWServScreenNumber: |
777 { |
1011 { |
778 iScreenNumber = aMessage.Int0(); |
1012 iScreenNumber = aMessage.Int0(); |
779 aMessage.Complete(KErrNone); |
1013 aMessage.Complete(KErrNone); |
780 break; |
1014 break; |