diff -r a05c44bc3c61 -r d881023c13eb mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp --- a/mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp Fri Apr 16 15:28:14 2010 +0300 +++ b/mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp Mon May 03 12:58:40 2010 +0300 @@ -129,6 +129,42 @@ } // ---------------------------------------------------------------------------- +// Searches process id for target selector plugin. +// When the player has been opened in a mode, which is bound to the same engine +// than certain application's engine, then need to fetch its process id. +// (As a reference for parameter aMode see MMPXPlaybackUtility modes.) +// Otherwise target selector plugin is notified wrongly about client statuses +// and key events are not propagated to correct application. +// ---------------------------------------------------------------------------- +// +void CMPXPlaybackServer::FindProcessIdForTsp( + const CMPXPlaybackEngine* aEngine, + TProcessId& aProcessId ) + { + TBool processFound( EFalse ); + TFindProcess processFinder; + TFullName processName; + + while ( processFinder.Next( processName ) == KErrNone && !processFound ) + { + RProcess process; + TInt err = process.Open( processFinder ); + if( err == KErrNone ) + { + if( process.SecureId().iId == aEngine->ModeId().iUid && + process.ExitType() == EExitPending ) + { + MPX_DEBUG4("CMPXPlaybackServer::FindProcessIdForTsp(): pid changed from %d to %d (mode 0x%x)", + TUint(aProcessId), TUint(process.Id()), aEngine->ModeId().iUid); + aProcessId = process.Id(); + processFound = ETrue; + } + process.Close(); + } + } + } + +// ---------------------------------------------------------------------------- // Increments number of sessions this server holds // ---------------------------------------------------------------------------- // @@ -386,12 +422,13 @@ if (!aActive) { #ifdef RD_TSP_CLIENT_MAPPER + TProcessId lastPid( aEngine->LastActiveProcessId() ); + FindProcessIdForTsp( aEngine, lastPid ); iClientMapper->SetTspTargetClientToOtherType( CTspClientMapper::EStoppedClients, - aEngine->LastActiveProcessId()); - MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to stopped client %d", - TUint( aEngine->LastActiveProcessId())); - + lastPid); + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Added as stopped client %d", + TUint( lastPid)); #endif if (EPbStatePaused != aEngine->State()) { @@ -406,11 +443,20 @@ else {// else aEngine is active player #ifdef RD_TSP_CLIENT_MAPPER - iClientMapper->SetTspTargetClientToOtherType( - CTspClientMapper::EPlayingClients, - aEngine->LastActiveProcessId()); - MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to playing client %d", - TUint( aEngine->LastActiveProcessId())); + TProcessId lastPid( aEngine->LastActiveProcessId() ); + FindProcessIdForTsp( aEngine, lastPid ); + TInt err = iClientMapper->SetTspTargetClientToOtherType( + CTspClientMapper::EPlayingClients, lastPid ); + if ( err != KErrNone && (TUint)lastPid != KNullProcessId ) + { + // Setting target type failed probably because client PID could not be found. + // As a fallback set client as new playing client. + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to playing client %d", + (TUint)lastPid ); + iClientMapper->SetTspTargetClient( CTspClientMapper::EPlayingClients, lastPid ); + } + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Added as playing client %d", + (TUint)lastPid ); #endif } @@ -466,9 +512,9 @@ if (MMPXClientlistObserver::EAdd == aChangeType) { iClientMapper->SetTspTargetClient( - CTspClientMapper::EPlayingClients, + CTspClientMapper::ERegisteredClients, aPid); - MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Adding to registered client %d", + MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Added as registered client %d", TUint( aPid )); } else @@ -476,7 +522,7 @@ iClientMapper->RemoveTspTargetClient( CTspClientMapper::EPlayingClients, aPid); - MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Adding to EPlayingClients client %d", + MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Removed from EPlayingClients client %d", TUint( aPid )); } #else