multimediacommsengine/tsrc/testdriver/testclient/filehandler/src/CTcFileHandlerServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/testclient/filehandler/src/CTcFileHandlerServer.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,174 @@
+/*
+* 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 "CTcFileHandlerServer.h"
+#include "CTcFileHandlerSession.h"
+#include "FileHandlerConstants.h"
+
+#ifdef __WINS__
+#include <e32svr.h> // UserSvr
+#endif
+
+void PanicServer( TInt aPanic )
+ {
+ User::Panic( KTcFileHandlerName, aPanic );
+ }
+
+CTcFileHandlerServer* CTcFileHandlerServer::NewLC()
+ {
+ CTcFileHandlerServer* self = new( ELeave ) CTcFileHandlerServer;
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+ return self;
+ }
+
+CTcFileHandlerServer::~CTcFileHandlerServer()
+ {
+ }
+
+CTcFileHandlerServer::CTcFileHandlerServer()
+ : CServer2( EPriorityStandard )
+ {
+ }
+
+void CTcFileHandlerServer::ConstructL()
+ {
+ }
+
+TInt CTcFileHandlerServer::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;
+ }
+
+CSession2* CTcFileHandlerServer::NewSessionL(
+ const TVersion& aVersion,
+ const RMessage2& /*aMessage*/ ) const
+ {
+ // Check that the client version is OK
+ TVersion version( KTcFileHandlerMajorVersion,
+ KTcFileHandlerMinorVersion,
+ KTcFileHandlerBuildVersion );
+ if( !User::QueryVersionSupported( version, aVersion ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ // Create a new session
+ return CTcFileHandlerSession::NewL( const_cast< CTcFileHandlerServer* >( this ) );
+ }
+
+TInt CTcFileHandlerServer::RunError( TInt aError )
+ {
+ // Panic client if we had an error that is caused by the client itself
+ if( ( aError == KErrBadDescriptor ) ||
+ ( aError == KErrBadHandle ) )
+ {
+ Message().Panic( KTcFileHandlerName, 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 CTcFileHandlerServer::SessionAdded()
+ {
+ iSessionCount++;
+ }
+
+void CTcFileHandlerServer::SessionRemoved()
+ {
+ iSessionCount--;
+
+ if( iSessionCount == 0 )
+ {
+ // No more server users, shutdown server
+ CActiveScheduler::Stop();
+ }
+ }
+
+void CTcFileHandlerServer::InitServerL()
+ {
+ // Open the semaphore that was created by the first client
+ RSemaphore semaphore;
+ User::LeaveIfError( semaphore.OpenGlobal( KTcFileHandlerName ) );
+
+ CActiveScheduler* scheduler = NULL;
+ CTcFileHandlerServer* 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 = CTcFileHandlerServer::NewLC( );
+ // Start the server using CServer::StartL()
+ srv->StartL( KTcFileHandlerName );
+ // 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 );
+
+ // Start fielding requests from clients (execution stops here)
+ CActiveScheduler::Start();
+
+ // Remove the active scheduler
+ CActiveScheduler::Install( NULL );
+
+ delete srv;
+ delete scheduler;
+ }