diff -r 085f765766a0 -r 860cd8a5168c brandingserver/bsclient/bsprocessstarter.cpp --- a/brandingserver/bsclient/bsprocessstarter.cpp Fri May 28 18:27:27 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,405 +0,0 @@ -/* -* Copyright (c) 2009 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: bsprocessstarter.cpp -* -*/ -// INCLUDE FILES -#include "bsprocessstarter.h" -#include -#include - - -// CONSTANTS -_LIT( KEka2ExeDir,"\\sys\\bin\\"); -_LIT( KEka2LaunchMutexExt, "[lMtx]" ); -const TInt KEka2SrvConnTries = 7; -const TInt KEka2SrvConnInitialRetryWait = 500; //MicroSeconds => 0.0005s - - - -// ============================================================== -// ====================== HELPER CLASS ========================== -// ============================================================== - -/** - * RSessionBase accessor to give to the ProcessStarter - * access to RSessionBase::CreateSession(). - */ -class REka2SessionBaseAccessor : public RSessionBase - { - public: // Constructor - inline REka2SessionBaseAccessor() - { - } - - public: // New functions - - /** - * Public access to RSessionBase::CreateSession(). - */ - inline TInt CreateSession( const TDesC& aServer, - const TVersion& aVersion, - TInt aAsyncMessageSlots ) - { - return RSessionBase::CreateSession( aServer, - aVersion, - aAsyncMessageSlots ); - } - }; - - - - - -// ============================================================== -// ====================== PROCESSSTARTER ======================== -// ============================================================== - - -// -------------------------------------------------------------- -// BSProcessStarter::FullExePathForClienLocation() -// -------------------------------------------------------------- -// -void BSProcessStarter::FullExePathForClienLocation( - const TDesC& aExeName, - TFileName& aFullExePath ) - { - //Get drive (C:) where this client code is installed - { - TFileName tmp; - Dll::FileName( tmp ); - aFullExePath.Copy( TParsePtrC( tmp ).Drive() ); - } - - //Build the rest from the exe path - aFullExePath.Append( KEka2ExeDir ); - aFullExePath.Append( aExeName ); - } - - - -// -------------------------------------------------------------- -// BSProcessStarter::StartInstance() -// -------------------------------------------------------------- -// -TInt BSProcessStarter::StartInstance( - const TDesC& aFullExePath, - const TDesC& aCommand, - const TArray< TProcessStartupParam >* aParams ) - { - RMutex launchMutex; - TInt error = KErrNotFound; - - { - // Dynamic mutex name used to allow code share - TName launchMutexName( TParsePtrC( aFullExePath ).Name() ); - launchMutexName.Append( KEka2LaunchMutexExt ); - - // Open or Create mutex to serialize to access to server startup code. - // (race condition safe way) - while( error == KErrNotFound ) - { - error = launchMutex.CreateGlobal( launchMutexName ); - if( error != KErrAlreadyExists ) - { - break; - } - error = launchMutex.OpenGlobal( launchMutexName ); - } - - if( error != KErrNone ) - { - return error; - } - } - - - launchMutex.Wait(); - - //Serialized access - error = BSProcessStarter::DoStartInstance( aFullExePath, - aCommand, - aParams ); - - launchMutex.Signal(); - launchMutex.Close(); - - return error; - } - - - -// -------------------------------------------------------------- -// BSProcessStarter::ConnectToServer() -// -------------------------------------------------------------- -// -TInt BSProcessStarter::ConnectToServer( - const TDesC& aFullExePath, - const TDesC& aCommand, - const TArray< TProcessStartupParam >* aParams, - RSessionBase& aSessionToConnect, - const TDesC& aServerName, - const TVersion& aClientVersion, - TInt aAsyncMessageSlots ) - { - if( aSessionToConnect.Handle() != KNullHandle ) - { - return KErrInUse; - } - - TInt err = KErrNone; - TInt startupWait = KEka2SrvConnInitialRetryWait; - - //Server connect and launch loop - for( TInt trie = 0 ; trie < KEka2SrvConnTries ; trie++ ) - { - REka2SessionBaseAccessor acc; - err = acc.CreateSession( aServerName, - aClientVersion, - aAsyncMessageSlots ); - - if( err == KErrNone ) - { - //session ownership is now on client - aSessionToConnect = acc; - return KErrNone; - } - - else if( ( err == KErrNotFound ) || - ( err == KErrServerTerminated ) ) - { - //Server missing or died when connecting - //Start a new server - err = BSProcessStarter::StartInstance( aFullExePath, - aCommand, - aParams ); - - //If process exist already, then all is fine - //(some other process started it between the origical connect and launch trie) - if( err == KErrAlreadyExists ) - { - err = KErrNone; - } - - //If server process start failed, bail out. - if( err != KErrNone ) - { - return err; - } - - //If this is 2nd or subsequent try, - //give some time for server to startup - if( trie > 0 ) - { - // Code scanner warning : Use of User::After (id:92) - // it is required to be used here - User::After( startupWait ); // CSI: 92 # See above - startupWait = 2 * startupWait; - } - } - - else - { - //Server process start failed. Bail out. - return err; - } - } - - return err; - } - - - -// -------------------------------------------------------------- -// BSProcessStarter::DoStartServerInstance() -// -------------------------------------------------------------- -// -TInt BSProcessStarter::DoStartInstance( - const TDesC& aFullExePath, - const TDesC& aCommand, - const TArray< TProcessStartupParam >* aParams ) - { - TInt error = KErrNone; - - //Create process - RProcess process; - error = process.Create( aFullExePath, aCommand ); - - if( error == KErrNone ) - { - //Set process startup parameters - error = ApplyParameters( aParams, process ); - - //And execute the process and wait it's startup - if( error == KErrNone ) - { - TRequestStatus rendezvousStatus; - process.Rendezvous( rendezvousStatus ); - - process.Resume(); - // Codescanner warning: user of User::WaitForRequest (Id:94) - // it is required to use at server startup - User::WaitForRequest( rendezvousStatus ); // CSI: 94 # See above - error = rendezvousStatus.Int(); - - if( process.ExitType() != EExitPending ) - { - //Something failed in server startup - //Force the error code to be always something - //else than KErrNone - if( error == KErrNone ) - { - error = KErrServerTerminated; - } - } - } - } - - process.Close(); - - return error; - } - - - -// -------------------------------------------------------------- -// BSProcessStarter::ApplyParameters() -// -------------------------------------------------------------- -// -TInt BSProcessStarter::ApplyParameters( - const TArray< TProcessStartupParam >* aParams, - RProcess& aProcess ) - { - TInt error = KErrNone; - if( aParams ) - { - const TInt paramCount = aParams->Count(); - for( TInt ix = 0; ix < paramCount; ix++ ) - { - error = (*aParams)[ ix ].ApplyParam( aProcess ); - if( error != KErrNone ) - { - break; - } - } - } - - return error; - } - - - -// ============================================================== -// ================== TPROCESSSTARTUPPARAM ====================== -// ============================================================== - -// -------------------------------------------------------------- -// TProcessStartupParam::TProcessStartupParam() -// -------------------------------------------------------------- -// -TProcessStartupParam::TProcessStartupParam() - : iType( EUnknown ), - iSlot( KErrNotFound ) - { - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::Set() -// -------------------------------------------------------------- -// -void TProcessStartupParam::Set( TInt aSlot, - const RHandleBase& aHandle ) - { - iType = EHandle; - iSlot = aSlot; - iHandle = &aHandle; - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::Set() -// -------------------------------------------------------------- -// -void TProcessStartupParam::Set( TInt aSlot, - const RSubSessionBase& aSubSession ) - { - iType = ESubSession; - iSlot = aSlot; - iSubSession = &aSubSession; - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::Set() -// -------------------------------------------------------------- -// -void TProcessStartupParam::Set( TInt aSlot, - const TDesC16& aDes ) - { - iType = EDes16; - iSlot = aSlot; - iDes16.Set( aDes ); - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::Set() -// -------------------------------------------------------------- -// -void TProcessStartupParam::Set( TInt aSlot, - const TDesC8& aDes ) - { - iType = EDes8; - iSlot = aSlot; - iDes8.Set( aDes ); - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::Set() -// -------------------------------------------------------------- -// -void TProcessStartupParam::Set( TInt aSlot, - TInt aInt ) - { - iType = EInt; - iSlot = aSlot; - iInt = aInt; - } - - -// -------------------------------------------------------------- -// TProcessStartupParam::ApplyParam() -// -------------------------------------------------------------- -// -TInt TProcessStartupParam::ApplyParam( RProcess& aProcess ) const - { - switch( iType ) - { - case EHandle: return aProcess.SetParameter( iSlot, *iHandle ); - case ESubSession: return aProcess.SetParameter( iSlot, *iSubSession ); - case EDes16: return aProcess.SetParameter( iSlot, iDes16 ); - case EDes8: return aProcess.SetParameter( iSlot, iDes8 ); - case EInt: return aProcess.SetParameter( iSlot, iInt ); - } - - return KErrUnknown; - } - - -// END OF FILE - - -