--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailservermonitor/inc/emailshutter.h Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* 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:
+* Header definition for EmailShutter
+*
+*/
+
+#ifndef EMAILSHUTTER_H
+#define EMAILSHUTTER_H
+
+// Include Files
+#include <e32base.h> // CActive
+#include <e32cmn.h> // TUid
+#include <e32property.h> // RProperty
+
+/////////////////////////////////////////////////////////////////////////////
+// FORWARD DECLARATIONS
+class CEmailServerMonitor;
+
+/////////////////////////////////////////////////////////////////////////////
+// CONSTANT DEFINITIONS
+
+// Security policies used when defining P&S keys
+static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
+static _LIT_SECURITY_POLICY_C1(KPowerMgmtPolicy,ECapabilityPowerMgmt);
+
+// Value to be set in shutdown P&S key.
+const TInt KEmailShutterPsValue = 1;
+
+// Maximum waiting times used to wait processes to close themselves gracefully
+const TInt KTimeToWaitApplicationsInSeconds = 2;
+const TInt KMaxTimeToWaitClientsInSeconds = 10;
+const TInt KMaxTimeToWaitPluginsInSeconds = 10;
+const TInt KMaxTimeToWaitMsgStoreInSeconds = 5;
+
+// Cycle length (in seconds) to check if some processes are still running
+const TInt KWaitTimeCycleInSeconds = 2;
+
+// Format string used with process finder to find processes by their UID
+_LIT( KFormatProcessFinderByUid, "*[%x]*" );
+// Length of the formatted process finder string, basically length of
+// KFormatProcessFinderByUid + length of 32 bit number in hexadecimal format
+const TInt KFormatProcessFinderByUidLength = 12;
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CLASS DECLARATION
+
+/**
+* Class CEmailShutter implements functionality that shuts down all email
+* related services when IAD/sisx update starts. Shutdown is initiated by a
+* Publish & Subscribe event sent by email installation initiator.
+*/
+NONSHARABLE_CLASS( CEmailShutter ) : public CActive
+ {
+
+public: // Public construcor and destructor
+ /**
+ * Two-phased class constructor.
+ */
+ static CEmailShutter* NewL();
+
+ /**
+ * Two-phased class constructor, leaves created object in cleanup stack.
+ */
+ static CEmailShutter* NewLC();
+
+ /**
+ * Destructor of CEmailShutter class.
+ */
+ ~CEmailShutter();
+
+public: // Public member functions
+
+ /**
+ * Start observing shutdown event.
+ */
+ void StartObservingShutdownEvent();
+
+ /**
+ * Set P&S key after installation is done
+ */
+ void SetPsKeyInstallationFinished();
+
+ /**
+ * Restart needed services after installation is finished
+ */
+ void RestartServicesAfterInstallation();
+
+ /**
+ * Set pointer to Email Server Monitor object
+ */
+ void SetMonitor( CEmailServerMonitor* aMonitor );
+
+private: // Private definitions
+
+ /**
+ * Definition of possible killing modes when killing processes gracelessly
+ */
+ enum TEmailShutterKillingMode
+ {
+ EKillingModeAll,
+ EKillingModeClients,
+ EKillingModePlugins,
+ EKillingModeMsgStore
+ };
+
+private: // Private constructors
+ /**
+ * Default class constructor.
+ * Only NewL can be called
+ */
+ CEmailShutter();
+
+ /**
+ * Second phase class constructor.
+ */
+ void ConstructL();
+
+private: // From base class CActive
+
+ void RunL();
+ void DoCancel();
+
+private: // Private member functions
+
+ /**
+ * Highest level function to close everything in right order
+ */
+ void StartShutdown();
+
+ /**
+ * End client applications gracefully
+ */
+ void EndClients();
+
+ /**
+ * End UI applications gracefully
+ */
+ void EndApplicationsL();
+
+ /**
+ * Define and publish the P&S key to inform all related services about the
+ * installation, so that they can shutdown themselves gracefully
+ */
+ void PublishPsKey( TInt aKey );
+
+ /**
+ * Closes all non-email related plugins/services
+ */
+ void Close3rdPartyServices();
+
+ /**
+ * Sends command to Always Online server to stop fs email plugin
+ */
+ void CloseAOPluginL();
+
+ /**
+ * Sends command to Always Online server to start fs email plugin
+ */
+ void StartAoPluginL() const;
+
+ /**
+ * Closes PCS (Predictive Contact Search) server
+ */
+ void ClosePcsServerL();
+
+ /**
+ * Starts PCS (Predictive Contact Search) server
+ */
+ void StartPcsServerL() const;
+
+ /**
+ * Try to find the UID given as parameter from the array given as parameter.
+ *
+ * @param aSid Process UID to be searched
+ * @param aArray Array from where to search
+ * @param aArrayCount Item count of the aArray
+ * @return ETrue if the UID can be found from the array, otherwise EFalse.
+ */
+ TBool FindFromArray(
+ const TUid aSid,
+ const TUid aArray[],
+ const TInt aArrayCount );
+
+ /**
+ * Checks does this UID belong to the list of the services that we need to
+ * close down.
+ *
+ * @param aSid Process UID to check
+ * @param aMode Killing mode, are we now killing clients, plugins or msg store
+ * @return ETrue if this is one of the services we need to close in specified
+ * mode, otherwise EFalse
+ */
+ TBool NeedToKillThisProcess(
+ const TUid aSid,
+ const TEmailShutterKillingMode aMode );
+
+ /**
+ * Kills all the related processes gracelessly. This is used as a backup for
+ * those processes that didn't close themselves gracefully.
+ *
+ * @param aMode Process killing mode as defined in TEmailShutterKillingMode
+ * @param aOnlyCheckIfRunning If EFalse (default value) when calling this
+ * function, it kills all the processes that match the mode and
+ * are running. If ETrue when calling this function, it only
+ * checks if at least one process needs to be killed (is running).
+ * @return ETrue if at least one process was killed or need to be killed.
+ */
+ TBool KillEmAll( const TEmailShutterKillingMode aMode = EKillingModeAll,
+ const TBool aOnlyCheckIfRunning = EFalse );
+
+ /**
+ * Waits in cycles and checks between cycles have all relevant processes
+ * closed or do we still need to wait. Returns when either aMaxWaitTime
+ * has elapsed or when all relevant processes have been shutdown.
+ *
+ * @param aMaxWaitTime Maximum time to wait in seconds
+ * @param aMode Killing mode, are we now killing clients, plugins or msg
+ * store. Used to determine are there still some processes
+ * that have not closed themselves.
+ */
+ void WaitInCycles( const TInt aMaxWaitTime,
+ const TEmailShutterKillingMode aMode );
+
+private: // Member variables
+
+ /**
+ * Publish & Subscribe property to be observed.
+ */
+ RProperty iInstStatusProperty;
+
+ /**
+ * Pointer to Email Server Monitor
+ * Not owned
+ */
+ CEmailServerMonitor* iMonitor;
+
+ };
+
+
+#endif // EMAILSHUTTER_H
+