uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp
changeset 31 1b6909418757
parent 29 ac3859d43844
--- a/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Wed May 26 16:47:36 2010 +0300
+++ b/uiacceltk/hitchcock/plugins/alftranseffect/alfgfxtransadapter/src/gfxtransenginetfx.cpp	Tue Jun 08 13:16:48 2010 +0300
@@ -295,6 +295,8 @@
 CGfxTransAdapterTfx::~CGfxTransAdapterTfx()
 	{
 	
+    
+    iControlEffects.Close();
 	__ALFFXLOGSTRING("CGfxTransAdapterTfx for HWA transitionn effects, destructor ");
 //	iIgnoredWOChildControls.Close();
 	//iControlInfo.ResetAndDestroy();
@@ -462,6 +464,16 @@
 	switch(aState)
 		{
 		case EFallback:
+	    case EAbort:
+	        for(TInt i = 0 ; i < iControlEffects.Count(); i++ )
+	            {
+	            // clear ongoing effect for this handle
+	            if( iControlEffects[i].iHandle == aHandle)
+	                {
+	                iControlEffects.Remove(i);
+	                i--;
+	                }
+	            }
 		    break;
 		case EPreBeginCapture:
 		    break;
@@ -470,35 +482,45 @@
 			// GfxTransEffect::Begin(). This makes it possible (NOT QUARANTEENED)
 			// that effect request arrives to Alf before possible visiblity changes are made to 
 			// the control.
-		    if ( iHasPlugin && aKey && aKey->DrawableWindow())
+		    if (aKey && aKey->DrawableWindow() && err == KErrNone)
 		        {
-		        // We must generate our own transition as we won't be sending 
-		        // iClient->TransitionFinished back.
-		        // (Client did not ask for transition to be started, and won't be
-		        // interested in the end.)
-          		TRAP( err, GenerateTransitionL( aKey, transdata ) );
+                TControlEffect newEffect;
+                newEffect.iHandle = aHandle;
+                newEffect.iWindowGroup = aKey->DrawableWindow()->WindowGroupId();
+                newEffect.iWindowHandle =aKey->DrawableWindow()->ClientHandle(); 
+                iControlEffects.Append(newEffect);
 		        }
 		    break;
 		case EPreEndCapture:	
 		    break;
 		case EPostEndCapture:
-		    break;
-		case EAbort:
-		// Abort component transition, handle given.
+            if (aKey && err == KErrNone)
+                {
+                TRAP( err, GenerateComponentTransitionEventL( transdata, MAlfGfxEffectPlugin::EBeginComponentTransition, aHandle ) );
+                }
 		    break;
 		case EGlobalAbort:
-		// abort component transition, no handle.
+		    // abort component transition, no handle.
+		    for(TInt i = 0 ; i < iControlEffects.Count(); i++ )
+                {
+                // clear all on going effects
+                iControlEffects.Remove(i);
+                i--;
+                }
+          // TODO: send abort to server
+		   // TRAP( err, GenerateComponentTransitionEventL( transdata, MAlfGfxEffectPlugin::EAbortComponentTransition) );
+		    
 	        break;
 		case EBeginGroup:
 			{
-			__ALFFXLOGSTRING1("-- BeginGroup: New transition group for groupid: %d)",aHandle);
-			SendGroupCommand(aHandle, EFalse);
+            __ALFFXLOGSTRING1("-- BeginGroup: New transition group for groupid: %d)",aHandle);
+            SendGroupCommand(aHandle, EFalse);
 		    break;
 			}
 		case EEndGroup:
 			{
-			__ALFFXLOGSTRING1("-- EndGroup: closing transition group: %d)",aHandle);
-			SendGroupCommand(aHandle, ETrue);
+            __ALFFXLOGSTRING1("-- EndGroup: closing transition group: %d)",aHandle);
+            SendGroupCommand(aHandle, ETrue);
 		    break;
 			}
 		default:
@@ -777,90 +799,109 @@
     TSecureId result(aAppUid);
     if ( aAppUid == TUid::Null() )
         {
+        iCachedUidMapping.iWindowGroupId = -1;
         return result;
         }
-
-    TBool found = EFalse;
+    
+    __ALFFXLOGSTRING1("CGfxTransAdapterTfx::SecureIdFromAppUid Searching SID&WGID for aAppUid: 0x%x", aAppUid.iUid );
 
     // first check the cache
     if ( iCachedUidMapping.iAppUid == aAppUid.iUid && iCachedUidMapping.iSecureId != 0 )
         {
-        result = iCachedUidMapping.iSecureId;
-        found = ETrue;
-    }
+        __ALFFXLOGSTRING2( "CGfxTransAdapterTfx::SecureIdFromAppUid using cached SID 0x%x and WGID: %d", 
+                iCachedUidMapping.iSecureId,
+                iCachedUidMapping.iWindowGroupId );
+        return TSecureId(iCachedUidMapping.iSecureId);
+        }
+
+    TInt windowGroupId = -1;
+    RProcess thisProcess;
+    TUidType uidType = thisProcess.Type();
     
-    if ( !found )
+    if ( uidType.IsValid() )
         {
-        // do the hard work
-        // first check this process - this is quick
-        // also, if this is the start-up effect on an application, the TApaTask is not yet updated with the 
-        // window group created by this application (yet).
-        TInt windowGroupId = -1;
-        RProcess thisProcess;
-        TUidType uidType = thisProcess.Type();
-        if ( uidType.IsValid() )
+        bool thisApplication = false;
+        if ( uidType[2] == aAppUid ) // 0 = UID1, 1 = UID2, 2 = UID3
+            { 
+            // this application
+            result = thisProcess.SecureId();
+            thisApplication = ETrue;
+            __ALFFXLOGSTRING2("CGfxTransAdapterTfx::SecureIdFromAppUid Own SID 0x%x in thread %S", 
+                    result.iId, 
+                    &RThread().Name() );
+            }
+        
+        CCoeEnv* env = CCoeEnv::Static();
+        RWsSession localSession;
+        RWsSession* usedWsSession = NULL;
+        if ( env ) 
             {
-            if ( uidType[2] == aAppUid ) // 0 = UID1, 1 = UID2, 2 = UID3
-                { 
-                result = thisProcess.SecureId();
-                // take the window gruop ID as well if available
-                CCoeEnv* env = CCoeEnv::Static();
-                if ( env )
-                    {
-                    windowGroupId = env->RootWin().Identifier();
-                    }
-                found = ETrue;
+            usedWsSession = &env->WsSession();
+            }
+        else 
+            {
+            if ( localSession.Connect() == KErrNone ) 
+                {
+                usedWsSession = &localSession;
                 }
             }
-        thisProcess.Close();
-
-        // If not this application, find UID using the TApaTask
-        if ( !found )
+        
+        // check if the AppArcServer has already information about this Application
+        if ( usedWsSession  ) 
             {
-            TApaTaskList taskList( CCoeEnv::Static()->WsSession() ); 
+            TApaTaskList taskList( *usedWsSession ); 
             const TApaTask task = taskList.FindApp( aAppUid );
-            const TThreadId threadId = task.ThreadId();
-            RThread otherThread;
-            if ( otherThread.Open( threadId ) == KErrNone ) // ignore error
+            const TThreadId otherThreadId = task.ThreadId();
+            
+            if ( thisApplication ) 
                 {
-                result = otherThread.SecureId();
-                windowGroupId = task.WgId(); // take it for free at this point.
-                found = ETrue;
-                }
-            otherThread.Close();
-            }
-        
-        if ( found )
-            {
-            // update cache
-            if ( iCachedUidMapping.iAppUid == aAppUid.iUid )
-                {
-                // found the missing secure ID
-                iCachedUidMapping.iSecureId = result.iId;
-                
-                if ( windowGroupId > 0 )
+                // if security ID of the other thread matched, we take the WG ID from AppArcServer
+                RThread otherThread;
+                if ( otherThread.Open( otherThreadId ) == KErrNone ) 
                     {
-                    // if we got the window group ID, update that as well to the cache
-                    iCachedUidMapping.iWindowGroupId = windowGroupId;
+                    __ALFFXLOGSTRING1("CGfxTransAdapterTfx::SecureIdFromAppUid Exising TApaTask found using thread %S", &otherThread.Name() );
+                    if ( otherThread.SecureId() == result )
+                        {
+                        windowGroupId = task.WgId();
+                        __ALFFXLOGSTRING1("CGfxTransAdapterTfx::SecureIdFromAppUid SID match -> WGID : &d found from TApaTask", windowGroupId );
+                        }
+                    else 
+                        {
+                        __ALFFXLOGSTRING2("CGfxTransAdapterTfx::SecureIdFromAppUid otherSID 0x%x otherWGID : &d not matching in TApaTask", otherThread.SecureId().iId , task.WgId() );
+                        }
+                    }
+                otherThread.Close();
+
+                if ( windowGroupId == -1 && env )
+                    {
+                    // take the root WG ID
+                    windowGroupId = env->RootWin().Identifier();
+                    __ALFFXLOGSTRING1("CGfxTransAdapterTfx::SecureIdFromAppUid root WGID %d used", windowGroupId );
                     }
                 }
-            else 
+            else  
                 {
-                iCachedUidMapping.iAppUid = aAppUid.iUid;
-                iCachedUidMapping.iSecureId = result.iId;
-                // wgid might not be updated at this point.
-                iCachedUidMapping.iWindowGroupId = Max(windowGroupId,0); // might be -1 -> treat 0 and -1 is just 0
+                RThread otherThread;
+                if ( otherThread.Open( otherThreadId ) == KErrNone )
+                    {
+                    result = otherThread.SecureId();
+                    windowGroupId = task.WgId();
+                    __ALFFXLOGSTRING3("CGfxTransAdapterTfx::SecureIdFromAppUid Taking SID 0x%x WGID %d from thread %S via TApaTask", result.iId, windowGroupId, &otherThread.Name() );
+                    }
+                otherThread.Close();
                 }
             }
+
+        localSession.Close();
         }
+    thisProcess.Close();
     
-    if ( !found )
+    if ( windowGroupId != -1 )
         {
-        __ALFFXLOGSTRING1( "CGfxTransAdapterTfx::SecureIdFromAppUid AppUid 0x%x not found (yet)", aAppUid.iUid );
-        }
-    else if ( aAppUid.iUid != result.iId )
-        {
-        __ALFFXLOGSTRING2( "CGfxTransAdapterTfx::SecureIdFromAppUid SecureID 0x%x differs form AppUid 0x%x", result.iId, aAppUid.iUid );
+        // update cache
+        iCachedUidMapping.iAppUid = aAppUid.iUid;
+        iCachedUidMapping.iSecureId = result;
+        iCachedUidMapping.iWindowGroupId = windowGroupId;
         }
 
     return result;
@@ -872,55 +913,13 @@
 //
 TInt32 CGfxTransAdapterTfx::WindowGroupIdFromAppUid( TUid aAppUid )
     {
-    if ( aAppUid == TUid::Null() )
-        {
-        return 0;
-        }
-    
-    TInt result = 0;
-    TBool found = EFalse;
-    
-    // check the cache. most likely this is already up-to-date due the previous execution of SecureIdFromAppUid
-    if ( iCachedUidMapping.iAppUid == aAppUid.iUid )
-        {
-        if ( iCachedUidMapping.iWindowGroupId > 0 )
-            {
-            result = iCachedUidMapping.iWindowGroupId;
-            iCachedUidMapping.iSecureId = 0;
-            found = true;
-            }
-        }
-    
-    if ( !found )
+    TInt32 result = 0; 
+    if ( iCachedUidMapping.iAppUid == aAppUid.iUid ) 
         {
-        // do the hard work
-        TApaTaskList taskList( CCoeEnv::Static()->WsSession() ); 
-        const TApaTask task = taskList.FindApp( aAppUid );
-        result = TInt32(task.WgId());
-        
-        if ( result > 0 )
-            {
-            // update cache
-            found = ETrue;
-            if ( iCachedUidMapping.iAppUid != aAppUid.iUid )
-                {
-                iCachedUidMapping.iAppUid = aAppUid.iUid;
-                iCachedUidMapping.iSecureId = 0;
-                }
-            iCachedUidMapping.iWindowGroupId = result;
-            }
-        else
-            {
-            result = 0; // might be -1 -> treat 0 and -1 is just 0
-            }
+        result = iCachedUidMapping.iWindowGroupId;
         }
-    
-    if ( !found )
-        {
-        __ALFFXLOGSTRING1( "CGfxTransAdapterTfx::WindowGroupIdFromAppUid AppUid 0x%x not found (yet)", aAppUid.iUid );
-        }
-
-    return TInt32(result);
+    iCachedUidMapping.iSecureId = 0;
+    return result;
     }
 
 
@@ -1264,20 +1263,41 @@
 	__ALFFXLOGSTRING("CGfxTransAdapterTfx::DoStartTransitionL <<");
 	}
 
-void CGfxTransAdapterTfx::GenerateTransitionL( const CCoeControl* aKey, const CTransitionData* aTransData)
+void CGfxTransAdapterTfx::GenerateComponentTransitionEventL(const CTransitionData* aTransData, TInt aOp, TInt aHandle)
     {
 
     // We generate a transition call from begin capture for control exit transitions
-	TPtr8 inPtr = iTransferBuffer->Des();
-	inPtr.Zero();
-	TPtr8 outPtr = iReturnBuffer->Des();
-	outPtr.Zero();
-	RDesWriteStream inBuf( inPtr );
-    TInt op = MAlfGfxEffectPlugin::EBeginComponentTransition;
-    TInt windowGroup = aKey->DrawableWindow()->WindowGroupId();
-    TInt windowHandle = aKey->DrawableWindow()->ClientHandle(); 
+    TPtr8 inPtr = iTransferBuffer->Des();
+    inPtr.Zero();
+    TPtr8 outPtr = iReturnBuffer->Des();
+    outPtr.Zero();
+    RDesWriteStream inBuf( inPtr );
+    TInt op = aOp;
     
-    __ALFFXLOGSTRING4("CGfxTransAdapterTfx::GenerateTransitionL - Operation: MAlfGfxEffectPlugin::EBeginComponentTransition Action: %d,  Uid: 0x%x, WindowGroup: %d, WindowHandle: %d  >>",
+    TInt windowGroup = KErrNotFound;
+    TInt windowHandle = KErrNotFound;
+    if( aHandle != KErrNotFound )
+        {
+        for(TInt i = 0 ; i < iControlEffects.Count(); i++ )
+            {
+            // we take the last one. to make hopefully clean up any earlier effect that was not finished for some reason.
+            if( iControlEffects[i].iHandle == aHandle)
+                {
+                windowGroup = iControlEffects[i].iWindowGroup;
+                windowHandle = iControlEffects[i].iWindowHandle;
+                iControlEffects.Remove(i);
+                i--;
+                }
+            }
+        }
+    if(aHandle != KErrNotFound && (windowGroup == KErrNotFound  || windowHandle == KErrNotFound))
+        {
+        return;
+        }
+    
+    __ALFFXLOGSTRING1("CGfxTransAdapterTfx::GenerateComponentTransitionEventL - Operation: %d", op );
+
+    __ALFFXLOGSTRING4("CGfxTransAdapterTfx::GenerateComponentTransitionEventL - Action: %d,  Uid: 0x%x, WindowGroup: %d, WindowHandle: %d  >>",
         aTransData->iAction,
         aTransData->iUid.iUid,
         windowGroup,
@@ -1298,17 +1318,17 @@
     inBuf.Release();
     inBuf.Close();
 
-    __ALFFXLOGSTRING( "CGfxTransAdapterTfx::GenerateTransitionL" );
+    __ALFFXLOGSTRING( "CGfxTransAdapterTfx::GenerateTransitionL - iTfxServer.SendSynchronousData " );
     iTfxServer.SendSynchronousData( iPluginImplementation, inPtr, outPtr );
     // clear out used data    
-	inPtr.Zero();
-	outPtr.Zero();
-	
-	// Don't signal client because client did not request the transition to start
+    inPtr.Zero();
+    outPtr.Zero();
+    
+    // Don't signal client because client did not request the transition to start
     __ALFFXLOGSTRING("CGfxTransAdapterTfx::GenerateTransitionL <<");
-    }
-	
-	
+    }	
+
+
 // ---------------------------------------------------------------------------
 // finds a control
 // ---------------------------------------------------------------------------