diff -r 000000000000 -r 8466d47a6819 emailservices/emailserver/mailserverautostart/src/fsmailserverautostart.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailserver/mailserverautostart/src/fsmailserverautostart.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,164 @@ +/* +* Copyright (c) 2007-2008 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: This file implements class CFSMailServerAutoStart. +* +*/ + + +#include "emailtrace.h" +#include "emailshutdownconst.h" +#include "fsmailserverautostart.h" + +_LIT( KFSMailServerAutoStartName, "FSMailServerAutoStart" ); + +// Format string for process finder to find processes by executable name +_LIT( KFormatProcessFinder, "%S*" ); + +// ======== MEMBER FUNCTIONS ======== + +CFSMailServerAutoStart* CFSMailServerAutoStart::NewL() + { + FUNC_LOG; + CFSMailServerAutoStart *self = new(ELeave) CFSMailServerAutoStart(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +CFSMailServerAutoStart::CFSMailServerAutoStart() + { + FUNC_LOG; + } + +//----------------------------------------------------------------------// +// Currently is chosen that no errors are leaked out of this class +// if possible. +// In case of failure in timer construction this might not be possible, +// but that should be improbable. +//----------------------------------------------------------------------// +void CFSMailServerAutoStart::ConstructL() + { + FUNC_LOG; + + // start fs mail server + TRAPD( startError, StartOneApplicationL( KEmailShutdownHandlerExe() ) ); + if ( startError != KErrNone ) + { + ERROR_1( startError, "EmailServerMonitor start failed, error code: %d", startError ); + } + } + +// ----------------------------------------------------------------------------- +// Starts one application by the executable name given as parameter +// ----------------------------------------------------------------------------- +// +void CFSMailServerAutoStart::StartOneApplicationL( const TDesC& aAppName ) const + { + FUNC_LOG; + + // Start the application only if it's not already running + if( !IsProcessRunningL( aAppName ) ) + { + RProcess process; + TInt err = process.Create( aAppName, KEmailShutdownHandlerArgRestart ); + + if( err == KErrNone ) + { + TRequestStatus stat = KRequestPending; + process.Rendezvous( stat ); + + if( stat != KRequestPending ) + { + ERROR_1( stat.Int(), "RProcess::Rendezvous failed, error code: %d", stat.Int() ); + process.Kill( KErrNone ); + } + else + { + process.Resume(); + + User::WaitForRequest( stat ); + } + } + else + { + ERROR_1( err, "RProcess::Create failed, error code: %d", err ); + } + + process.Close(); + } + } + +// ----------------------------------------------------------------------------- +// Checks if process with the specified name is running +// ----------------------------------------------------------------------------- +TBool CFSMailServerAutoStart::IsProcessRunningL( const TDesC& aAppName ) const + { + TFullName fullName; + + HBufC* findBuf = HBufC::NewLC( aAppName.Length() + KFormatProcessFinder().Length() ); + findBuf->Des().Format( KFormatProcessFinder, &aAppName ); + + TFindProcess findProcess( *findBuf ); + + TBool found = EFalse; + // Loop through all the found processes to check is any of those running + while( !found && findProcess.Next( fullName ) == KErrNone ) + { + RProcess process; + TInt error = process.Open( findProcess ); + // Check is the found process alive + if( error == KErrNone && + process.ExitType() == EExitPending ) + { + found = ETrue; + } + process.Close(); + } + + CleanupStack::PopAndDestroy( findBuf ); + + return found; + } + + +//Main Thread Entry point +GLDEF_C TInt E32Main() + { + RThread::RenameMe( KFSMailServerAutoStartName ); + + // Create the cleanup stack + CTrapCleanup* cleanup = NULL; + cleanup = CTrapCleanup::New(); + if ( cleanup == NULL ) + { + // No errors leaked outside, return success. + return KErrNone; + } + + CFSMailServerAutoStart* autoStart = NULL; + + TRAPD( mainError, autoStart = CFSMailServerAutoStart::NewL() ); + if ( mainError != KErrNone ) + { + ERROR_1( mainError, "EmailServerMonitor start failed, error code: %d", mainError ); + } + + // Delete all objects created above. + delete autoStart; + delete cleanup; + + return KErrNone; + } // end E32Main