emailservices/emailserver/mailserverautostart/src/fsmailserverautostart.cpp
changeset 0 8466d47a6819
--- /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