diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/testdriver/testclient/watcher/src/CTcWatcherServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/tsrc/testdriver/testclient/watcher/src/CTcWatcherServer.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,215 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation +* +*/ + +#include "CTcWatcherServer.h" +#include "CTcWatcherSession.h" +#include "CTcAppLauncher.h" +#include "WatcherConstants.h" + +#ifdef __WINS__ +#include // UserSvr +#endif + +void PanicServer( TInt aPanic ) + { + User::Panic( KTcWatcherName, aPanic ); + } + +CTcWatcherServer* CTcWatcherServer::NewLC() + { + CTcWatcherServer* self = new( ELeave ) CTcWatcherServer; + CleanupStack::PushL( self ); + + self->ConstructL(); + return self; + } + +CTcWatcherServer::~CTcWatcherServer() + { + delete iShutdownTimer; + iLaunchers.ResetAndDestroy(); + } + +CTcWatcherServer::CTcWatcherServer() + : CServer2( EPriorityStandard ), iLaunchers( 4 ) + { + TCallBack cb( Shutdown ); + iShutdownTimerEntry.Set( cb ); + } + +void CTcWatcherServer::ConstructL() + { + iShutdownTimer = CDeltaTimer::NewL( CActive::EPriorityLow ); + } + +TInt CTcWatcherServer::ThreadMain( TAny* /*aParam*/ ) + { + __UHEAP_MARK; + + // Create the cleanup stack + CTrapCleanup* cleanup = CTrapCleanup::New(); + if( cleanup == NULL ) + { + PanicServer( KErrNoMemory ); + } + + // Initialize and start the server + TRAPD( error, InitServerL() ); + if( error != KErrNone ) + { + PanicServer( error ); + } + + // InitServerL() will hold execution for the lifetime + // of the server. The server has died now, delete cleanup stack. + delete cleanup; + + __UHEAP_MARKEND; + + return KErrNone; + } + +#ifdef __IPC_V2_PRESENT__ +CSession2* CTcWatcherServer::NewSessionL( const TVersion& aVersion, + const RMessage2& /*aMessage*/ ) const +#else +CSharableSession* CTcWatcherServer::NewSessionL( const TVersion& aVersion ) const +#endif + { + // Check that the client version is OK + TVersion version( KTcWatcherMajorVersion, + KTcWatcherMinorVersion, + KTcWatcherBuildVersion ); + if( !User::QueryVersionSupported( version, aVersion ) ) + { + User::Leave( KErrNotSupported ); + } + + // Create a new session +#ifdef __IPC_V2_PRESENT__ + return CTcWatcherSession::NewL( const_cast< CTcWatcherServer* >( this ) ); +#else + RThread client = Message().Client(); + return CTcWatcherSession::NewL( client, + const_cast< CTcWatcherServer* >( this ) ); +#endif + } + +void CTcWatcherServer::Died( const TDesC& aAppName, TBool aDismissDialog ) + { + TRAP_IGNORE( + { + CTcAppLauncher* launcher = CTcAppLauncher::NewLC( aAppName, aDismissDialog, iLaunchers ); + iLaunchers.AppendL( launcher ); + CleanupStack::Pop( launcher ); + } ) + } + +TInt CTcWatcherServer::RunError( TInt aError ) + { + // Panic client if we had an error that is caused by the client itself + if( ( aError == KErrBadDescriptor ) || + ( aError == KErrBadHandle ) ) + { + Message().Panic( KTcWatcherName, aError ); + } + // Otherwise just complete the request with an error code + else + { + Message().Complete( aError ); + } + + // Restart server as it was interrupted when + // the leave at CServer::RunL() happened + ReStart(); + + // We're fully recovered now + return KErrNone; + } + +void CTcWatcherServer::SessionAdded() + { + iSessionCount++; + if( iShutdownTimer->IsActive() ) + { + iShutdownTimer->Remove( iShutdownTimerEntry ); + } + } + +void CTcWatcherServer::SessionRemoved() + { + iSessionCount--; + + // way to go.. + if( iSessionCount == 0 ) + { + // Queue a shutdown after 30 seconds + iShutdownTimer->Queue( KTcShutdownTime, iShutdownTimerEntry ); + } + } + +TInt CTcWatcherServer::Shutdown( TAny* /*aPtr*/) + { + CActiveScheduler::Stop(); + return KErrNone; + } + +void CTcWatcherServer::InitServerL() + { + // Open the semaphore that was created by the first client + RSemaphore semaphore; + User::LeaveIfError( semaphore.OpenGlobal( KTcWatcherName ) ); + + CActiveScheduler* scheduler = NULL; + CTcWatcherServer* srv = NULL; + + // We don't want the client waiting on the semaphore indefinitely + // even if server start fails. + TRAPD( err, + { + // Start scheduler and server + scheduler = new( ELeave ) CActiveScheduler; + CleanupStack::PushL( scheduler ); + CActiveScheduler::Install( scheduler ); + + // Create server instance + srv = CTcWatcherServer::NewLC( ); + // Start the server using CServer::StartL() + srv->StartL( KTcWatcherName ); + // we have to pop this before crossing TRAP boundary + CleanupStack::Pop( 2 ); // srv, scheduler + } ) + + // Signal the client that we are ready and willing + semaphore.Signal(); + semaphore.Close(); + User::LeaveIfError( err ); +/* +#ifdef __WINS__ + // Notify the kernel that a server has been started. + UserSvr::ServerStarted(); +#endif +*/ + // Start fielding requests from clients (execution stops here) + CActiveScheduler::Start(); + + // Remove the active scheduler + CActiveScheduler::Install( NULL ); + + delete srv; + delete scheduler; + }