diff -r 000000000000 -r 8466d47a6819 emailservices/emailservermonitor/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailservermonitor/src/main.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,168 @@ +/* +* 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: +* Main entry point of EmailServerMonitor +* +*/ + +// Include Files +#include +#include +#include // Descriptors +#include // CCommandLineArguments + +#include "emailtrace.h" +#include "emailshutdownconst.h" +#include "emailservermonitorconst.h" +#include "emailservermonitorutilities.h" +#include "emailservermonitor.h" +#include "emailshutter.h" + + +// --------------------------------------------------------------------------- +// Defines operation mode by parsing command line parameters +// --------------------------------------------------------------------------- +// +LOCAL_C TEmailServerMonitorMode ParseCommandLineArgumentsL() + { + FUNC_LOG; + TEmailServerMonitorMode mode = EEsmModeNormal; + + CCommandLineArguments* args = CCommandLineArguments::NewLC(); + // Check if some command line arguments were given + if( args->Count() > 1 ) + { + TPtrC argumentPtr( args->Arg(1) ); + if( argumentPtr == KEmailShutdownHandlerArgOnlyShutter ) + { + mode = EEsmModeOnlyShutter; + } + else if( argumentPtr == KEmailShutdownHandlerArgRestart ) + { + mode = EEsmModeRestartAfterInstallation; + } + } + CleanupStack::PopAndDestroy(args); + + INFO_1( "TEmailServerMonitorMode: %d", mode ); + return mode; + } + +// --------------------------------------------------------------------------- +// Starts active scheduler, runs the needed operations, and then deletes +// the active scheduler when everything is done +// --------------------------------------------------------------------------- +// +LOCAL_C void DoStartL() + { + FUNC_LOG; + // Create active scheduler (to run active objects) + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + TEmailServerMonitorMode mode = ParseCommandLineArgumentsL(); + + // Start email shutter functionality + CEmailShutter* shutter = CEmailShutter::NewLC(); + if( mode == EEsmModeRestartAfterInstallation ) + { + shutter->SetPsKeyInstallationFinished(); + shutter->RestartServicesAfterInstallation(); + } + shutter->StartObservingShutdownEvent(); + + CEmailServerMonitor* monitor = NULL; + if( mode != EEsmModeOnlyShutter ) + { + // Start email server observing functionality + monitor = CEmailServerMonitor::NewLC(); + monitor->Start(); + shutter->SetMonitor( monitor ); + } + + // Complete client's Rendezvous + RProcess::Rendezvous( KErrNone ); + + // Start asynchronous services + CActiveScheduler::Start(); + + INFO( "ActiveScheduler stopped, closing down" ); + // Cancel any pending requests and delete handler objects + // after active scheduler is stopped + + if( monitor ) + { + monitor->Cancel(); + CleanupStack::PopAndDestroy( monitor ); + } + + shutter->Cancel(); + CleanupStack::PopAndDestroy( shutter ); + + // Delete active scheduler + CleanupStack::PopAndDestroy( scheduler ); + } + +// ======== GLOBAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Executable main entry point +// --------------------------------------------------------------------------- +// +GLDEF_C TInt E32Main() + { + FUNC_LOG; + __UHEAP_MARK; + + RProcess ownProcess; + TSecureId ownUid = ownProcess.SecureId(); + INFO_1( "%S", &ownProcess.FileName() ); + ownProcess.Close(); + + // Just exit if there is another process already running + if( IsProcessRunning( ownUid ) ) + { + INFO( "Another instance of Email Server Monitor already running!" ); + } + else + { + // Rename thread for debug purposes, return code can be ignored + RThread::RenameMe( KEmailServerMonitorName ); + + // Create the cleanup stack + CTrapCleanup* cleanup = NULL; + cleanup = CTrapCleanup::New(); + if ( !cleanup ) + { + // No errors leaked outside, return success. + INFO( "Could not create clean up stack!" ); + return KErrNone; + } + + // Run application code inside TRAP harness + TRAPD( mainError, DoStartL() ); + + if( mainError != KErrNone ) + { + ERROR_1( mainError, "Email Server Monitor main error code: %d", mainError ); + } + + delete cleanup; + } + + INFO( "Email Server Monitor finished!" ); + __UHEAP_MARKEND; + return KErrNone; + }