/** Copyright (c) 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: CCchStartupCounter implementation**/// INCLUDE FILES#include "cchlogger.h"#include "cchstartupcounter.h"#include "cchserverbase.h"#include "cchspshandler.h"#include "cchservicehandler.h"#include "cchprivatecrkeys.h"#include <centralrepository.h>// EXTERNAL DATA STRUCTURES// None// EXTERNAL FUNCTION PROTOTYPES// None// CONSTANTS// Some critical process has crashed three times during startup registration// to avoid bootlock situation set startup flag to OFF after max countconst TInt KCCHMaxStartupCount = 3;// MACROS// None// LOCAL CONSTANTS AND MACROS// None// MODULE DATA STRUCTURES// None// LOCAL FUNCTION PROTOTYPES// None// FORWARD DECLARATIONS// None// ============================= LOCAL FUNCTIONS =============================// ============================ MEMBER FUNCTIONS =============================// ---------------------------------------------------------------------------// CCchStartupCounter::CCchStartupCounter// C++ default constructor can NOT contain any code, that might leave.// ---------------------------------------------------------------------------//CCchStartupCounter::CCchStartupCounter( CCCHServerBase& aServer ) : iServer( aServer ) { // No implementation required }// ---------------------------------------------------------------------------// CCchStartupCounter::ConstructL// Symbian 2nd phase constructor can leave.// ---------------------------------------------------------------------------//void CCchStartupCounter::ConstructL() { iStartupRepository = CRepository::NewL( KCRUidCch ); }// ---------------------------------------------------------------------------// CCchStartupCounter::NewL// Two-phased constructor.// ---------------------------------------------------------------------------//CCchStartupCounter* CCchStartupCounter::NewL( CCCHServerBase& aServer ) { CCchStartupCounter* self = new (ELeave) CCchStartupCounter( aServer ); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); return self; }// DestructorCCchStartupCounter::~CCchStartupCounter() { delete iStartupRepository; }// ---------------------------------------------------------------------------// CCchStartupCounter::StartupOccuredL// // (other items were commented in a header).// ---------------------------------------------------------------------------//void CCchStartupCounter::StartupOccuredL() { CCHLOGSTRING( "CCchStartupCounter::StartupOccuredL IN" ); TInt startupCounter( KErrNone ); User::LeaveIfError( iStartupRepository->Get( KCCHStartupCounter, startupCounter ) ); startupCounter++; CCHLOGSTRING2( "CCchStartupCounter -> startup counter: %d", startupCounter ); if ( startupCounter >= KCCHMaxStartupCount ) { CCHLOGSTRING( "CCchStartupCounter -> set startup flag to OFF" ); // Some critical process has crashed three times during startup registration.. startupCounter = 0; // ..to avoid bootlock situation set startup flag to OFF HandleStartupExceptionsL(); } User::LeaveIfError( iStartupRepository->Set( KCCHStartupCounter, startupCounter ) ); CCHLOGSTRING( "CCchStartupCounter::StartupOccuredL OUT" ); }// ---------------------------------------------------------------------------// CCchStartupCounter::HandleStartupExceptionsL// // (other items were commented in a header).// ---------------------------------------------------------------------------//void CCchStartupCounter::HandleStartupExceptionsL() { CCHLOGSTRING( "CCchStartupCounter::HandleStartupExceptionsL IN" ); RArray<TUint> serviceIds; CleanupClosePushL( serviceIds ); RArray<TCCHSubserviceType> subserviceTypes; CleanupClosePushL( subserviceTypes ); iServer.SPSHandler().GetServiceIdsL( serviceIds ); for ( TInt i( 0 ); i < serviceIds.Count(); i++ ) { iServer.ServiceHandler().GetSubserviceTypesL( serviceIds[ i ], subserviceTypes ); for ( TInt j( 0 ); j < subserviceTypes.Count(); j++ ) { iServer.ServiceHandler().SetStartupFlag( TServiceSelection( serviceIds[ i ], subserviceTypes[ j ] ), EFalse ); iServer.SPSHandler().SetLoadAtStartUpL( serviceIds[ i ], subserviceTypes[ j ], EFalse ); } } CleanupStack::PopAndDestroy( &subserviceTypes ); CleanupStack::PopAndDestroy( &serviceIds ); CCHLOGSTRING( "CCchStartupCounter::HandleStartupExceptionsL OUT" ); }// ---------------------------------------------------------------------------// CCchStartupCounter::ResetStartupCounter// // (other items were commented in a header).// ---------------------------------------------------------------------------//void CCchStartupCounter::ResetStartupCounter() { CCHLOGSTRING( "CCchStartupCounter::ResetStartupCounter IN" ); iStartupRepository->Set( KCCHStartupCounter, KErrNone ); CCHLOGSTRING( "CCchStartupCounter::ResetStartupCounter OUT" ); }// ========================== OTHER EXPORTED FUNCTIONS =======================// End of File