diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstarter/src/SysStart.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstarter/src/SysStart.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,137 @@ +// 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: +// + +#include "SysStart.h" + +#include +#include +#include + +#include "StartupState.h" +#include "StartupStateInfo.h" +#include "SysStartDebug.h" + +#include "sysstartpanic.h" +#include "resourcefilereader2.h" + +// +// Standard Symbian factory functions/destructor +// + +CSystemStarter* CSystemStarter::NewL() + { + CSystemStarter* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +CSystemStarter* CSystemStarter::NewLC() + { + CSystemStarter* self = new (ELeave) CSystemStarter; + CleanupStack::PushL(self); + return self; + } + +CSystemStarter::~CSystemStarter() + { + Cancel(); + } + +// +// Public member functions +// + +void CSystemStarter::Start() + { + // We need an active request so that we can actually start the active + // scheduler, hence this roundabout way of kicking things off... + RequestNotify(); + } + +// +// Member function overrides (CActive) +// + +void CSystemStarter::RunL() + { + TInt bootMode = 0; + TInt err = RProperty::Get(KUidSystemCategory, KSystemStartupModeKey, bootMode); + DEBUGPRINT4(_L("SysStart: key=%d bootMode=%d error = %d"), KSystemStartupModeKey, bootMode, err); + if(KErrNone != err) + { + PanicNow(KPanicSysStart, EPropertyRetrieveError); + } + + // Domain manager has already been started by the boot starter... + err = RDmDomainManager::AddDomainHierarchy(KDmHierarchyIdStartup); + if(KErrNone != err && KErrAlreadyExists !=err) + { + PanicNow(KPanicSysStart, EAddDomainHierarchyError); + } + + RDmDomainManager::WaitForInitialization(); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + CResourceFileReader* resourceReader = CResourceFileReader::NewLC(bootMode, fs); // bootMode is stored for later chekcing. + const MStartupStateInfo* info = resourceReader->GetStateInfoL(); + + __UHEAP_MARK; + while (info) + { + CStartupState* state = CStartupState::NewLC(*info); + state->Start(); + CleanupStack::PopAndDestroy(state); + delete info; + info = resourceReader->GetStateInfoL(); + } + __UHEAP_MARKEND; + + CleanupStack::PopAndDestroy(resourceReader); + CleanupStack::PopAndDestroy(); // fs + + CActiveScheduler::Stop(); + } + + +TInt CSystemStarter::RunError(TInt /*aError*/) + { + return KErrNone; + } + +void CSystemStarter::DoCancel() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrCancel); + } + +// +// Private member functions +// + +CSystemStarter::CSystemStarter() : + CActive(EPriorityStandard) + { + CActiveScheduler::Add(this); + } + +void CSystemStarter::RequestNotify() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + }