diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/watcherfw/src/cwatcherssastartupmgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/watcherfw/src/cwatcherssastartupmgr.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,329 @@ +// Copyright (c) 2005-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: +// cwatcherssastartupmgr.cpp +// + +#include "cwatcherssastartupmgr.h" + +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "cwatcher.h" +#endif + +static void CleanUpEComInfoArray(TAny* aInfoArray); + +/** +Factory function to create a new instance of the CWatcherSSAStartupMgr +SSA start-up manager. + +The SSA start-up manager registers with the Domain Manager for the +domain KAppServicesDomain3 of the KDmHierarchyIdStartup. + +@return +A new CWatcherSSAStartupMgr object. +*/ + +CWatcherSSAStartupMgr* CWatcherSSAStartupMgr::NewL() + { +#ifndef SYMBIAN_SYSTEM_STATE_MANAGEMENT + CWatcherSSAStartupMgr* self = new (ELeave) CWatcherSSAStartupMgr(KDmHierarchyIdStartup, KAppServicesDomain3); +#else + CWatcherSSAStartupMgr* self = new (ELeave) CWatcherSSAStartupMgr(KDmHierarchyIdStartup, KSM2AppServicesDomain3); +#endif + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +/** +Constructor of CWatcherSSAStartupMgr + +@param aHierarchyId +The Id of the domain hierarchy to connect to +@param aDomainId +The Id of the domain to connect to +*/ +CWatcherSSAStartupMgr::CWatcherSSAStartupMgr(TDmHierarchyId aHierarchyId, TDmDomainId aDomainId) +: CDmDomain(aHierarchyId,aDomainId), iCurrentStartupState(EStartupStateUndefined) + { + } + + +/** +Destructor +*/ +CWatcherSSAStartupMgr::~CWatcherSSAStartupMgr() + { + Cancel(); + iWatcherList.ResetAndDestroy(); + delete iLog, + iFs.Close(); + REComSession::FinalClose(); + } + + +/** +Second-stage constructor. + +This method indicates how the CWatcherSSAStartupMgr interacts with the +Domain manager to keep aware of the startup state change. +*/ +void CWatcherSSAStartupMgr::ConstructL() + { + + // Get ready to log in \logs\watcher\watcher.txt + User::LeaveIfError(iFs.Connect()); + iLog = CWatcherLog::NewL(iFs); + + // Connect to the Domain Manager + + TRAPD( err, CDmDomain::ConstructL() ); + + if( err != KErrNone ) + { + // The connection to the Domain Manager cannot be established, + // we perform a full initialisation + iLog->Printf(_L("CWatcherSSAStartupMgr::InitialiseL(): cannot connect to the Domain Manager, performing full init.")); + PerformFullInitL(); + iCurrentStartupState = EStartupStateNonCritical; + return; + } + + // Get the start-up state from the Domain Manager. + TDmDomainState state = GetState(); + + // Either something wrong with the Domain Manager or final state is reached + if( state <= EStartupStateUndefined || state >= EStartupStateNonCritical ) + { + // We perform a full initialisation + iLog->Printf(_L("CWatcherSSAStartupMgr::InitialiseL(): wrong state, performing full init.")); + PerformFullInitL(); + iCurrentStartupState = EStartupStateNonCritical; + return; + } + + // Perform the initialisation for this state + TBool notFinished = ProcessSSAEventL((TStartupStateIdentifier)state); + if( notFinished ) + { + // Still need to get the state from Domain Manager. + RequestTransitionNotification(); + } + } + + +/** +Executed when the startup state change is done, it does the same thing +as the method InitialiseL(). +*/ +void CWatcherSSAStartupMgr::RunL() + { + // Leave if our previous request to be notified a state change has + // returned an error and let RunError handle this. + User::LeaveIfError(iStatus.Int()); + + // Get the start-up state from the Domain Manager. + TDmDomainState state = GetState(); + + //If the state is EStartupStateUndefined there must be something wrong. + if( state == EStartupStateUndefined ) + { + AcknowledgeLastState(KErrBadHandle); + User::Leave(KErrBadHandle); //RunError will handle this. + } + + // Perform the initialisation for this state + TBool notFinished = ProcessSSAEventL((TStartupStateIdentifier)state); + + // Tell domain manager that we have processed the last state change + AcknowledgeLastState(KErrNone); + + if( notFinished ) + { + RequestTransitionNotification(); + } + } + + +/** +Handle the error if RunL leaves. Here, we just do a full initialisation. + +@param aError +Error code generated by the RunL(), not used here. +@return +KErrNone to avoid CActiveScheduler to panic. +*/ +TInt CWatcherSSAStartupMgr::RunError(TInt /*aError*/) + { + iLog->Printf(_L("CWatcherSSAStartupMgr::RunL() leaves, do a full initialisation")); + TRAP_IGNORE(DoRunErrorL()); + return KErrNone; + } + + +/** +Leaving method trapped by RunError + +If RunError has been called that means RunL has left. +Because watcher.exe is started in the critical-dynamic state it is quite +likely the critical init has been done already (in ConstructL) when RunL +is called so we just want to do the non-critical part of the init. +We check our internal state for confirmation and run the non-critical init. +If our internal state is EStartupStateCriticalDynamic or before we +perform a full init. +*/ +void CWatcherSSAStartupMgr::DoRunErrorL() + { + if ( iCurrentStartupState > EStartupStateCriticalDynamic ) + { + PerformNonCriticalInitL(); + } + else + { + PerformFullInitL(); + } + } + + +/** +Perform the initialisation for a particular state. + +@param aKnownState +The startup state passed into the MStartupStateObserver objects +@return +Whether or not a transition notification should be requested +*/ +TBool CWatcherSSAStartupMgr::ProcessSSAEventL(TStartupStateIdentifier aKnownState) + { + TBool notFinished = ETrue; + + if ( aKnownState != iCurrentStartupState ) + { + + //if we have not performed critical dynamic initialisation and receive a + //notification for it or a state that comes after + + if(iCurrentStartupState= EStartupStateCriticalDynamic) + { + PerformCriticalInitL(); + iCurrentStartupState = EStartupStateCriticalDynamic; + } + + //if we have not performed non-critical initialisation and receive a notification + //for it or a state that comes after + + if(iCurrentStartupState= EStartupStateNonCritical) + { + PerformNonCriticalInitL(); + notFinished = EFalse; + iCurrentStartupState = EStartupStateNonCritical; + } + + } + + return notFinished; + } + + +/** +Perform a full initialisation = start all the watchers +*/ +void CWatcherSSAStartupMgr::PerformFullInitL() + { + // Watchers for the critical-dynamic state: + PerformCriticalInitL(); + // Watchers for the non-critical state: + PerformNonCriticalInitL(); + } + + +/** +Perform initialisation for the 'critical-dynamic' start-up state +*/ +void CWatcherSSAStartupMgr::PerformCriticalInitL() + { + StartWatchersL(KUidEComWatcher); // Legacy watchers + StartWatchersL(KUidMsgCriticalWatchers); + } + +/** +Perform initialisation for the 'non-critical' start-up state +*/ +void CWatcherSSAStartupMgr::PerformNonCriticalInitL() + { + StartWatchersL(KUidMsgNonCriticalWatchers); + } + +/** +Starts all the watchers implementing the specified ECom interface + +@param aEComInterface +The ECom interface of the watchers to be started +*/ +void CWatcherSSAStartupMgr::StartWatchersL(TUid aEComInterface) + { + RImplInfoPtrArray watcherInfoArray; + TCleanupItem cleanup(CleanUpEComInfoArray, &watcherInfoArray); + CleanupStack::PushL(cleanup); + TEComResolverParams eComResolverParams; + + // Get the list of active watcher implementations. + // (list only watcher implementations that are ROM, as it would be + // insecure to load RAM implementations) + REComSession::ListImplementationsL( aEComInterface, eComResolverParams, + KRomOnlyResolverUid, watcherInfoArray); + + const TInt count = watcherInfoArray.Count(); + + #ifdef __WINS__ + _LIT(KLaunchingWatcher, "Launching ECOM watcher %S"); + #endif + + for( TInt ii=0; ii < count; ++ii ) + { + CImplementationInformation* info = watcherInfoArray[ii]; + + // Log details of the watcher + const TDesC& name = info->DisplayName(); + #ifdef __WINS__ + iLog->Printf(KLaunchingWatcher, &name); + #endif + + // Create the watcher launcher + CWatcherLauncher* launcher = CWatcherLauncher::NewL(name, + info->ImplementationUid(), + iFs, + *iLog); + CleanupStack::PushL(launcher); + iWatcherList.AppendL(launcher); + CleanupStack::Pop(launcher); + + } + CleanupStack::PopAndDestroy(&watcherInfoArray); + } + + +// CleanupEComArray function is used for cleanup support +// of locally declared arrays. +void CleanUpEComInfoArray(TAny* aInfoArray) + { + RImplInfoPtrArray* infoArray = (static_cast(aInfoArray)); + infoArray->ResetAndDestroy(); + infoArray->Close(); + } +