diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatereferenceplugins/clayer/src/ssmsimstatusobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatereferenceplugins/clayer/src/ssmsimstatusobserver.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,174 @@ +// Copyright (c) 2008-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 "ssmsimstatusobserver.h" +#include "ssmuiproviderdll.h" +#include "ssmdebug.h" +#include "startupdomainpskeys.h" +#include + +#include +#include +#include + +/** + * Allocates and returns a new SIM status observer. + * + * Uses the parameters provided by the SSM UI provider DLL for object construction. + * + * @publishedPartner + * @released + */ +EXPORT_C MSsmUtility* CSsmSimStatusObserver::NewL() + { + CSsmSimStatusObserver* self = new (ELeave) CSsmSimStatusObserver(); + return static_cast(self); + } + +/** + * Frees any resources allocated to this object. + * + * @internalComponent + */ +CSsmSimStatusObserver::~CSsmSimStatusObserver() + { + Deque(); + iSimAdaptation.Close(); + iSimStatusProperty.Close(); + } + +/** + * Initialises this object + * + * @internalComponent + */ +void CSsmSimStatusObserver::InitializeL() + { + TInt err = iSimAdaptation.Connect(); + if(KErrNone != err) + { + DEBUGPRINT2A("CSsmSimStatusObserver error connecting to SIM adaptation: %d", err); + User::Leave(err); + } + } + +/** + * Starts requesting notification for SIM events. + * + * @internalComponent + */ +void CSsmSimStatusObserver::StartL() + { + iSimAdaptation.NotifySimEvent(iSimEventPckg, iStatus); + SetActive(); + } + +/** + * Destroys this object and frees any resources + * allocated to it. + * + * @internalComponent + */ +void CSsmSimStatusObserver::Release() + { + delete this; + } + +/** + * CActive::RunL() implementation + * + * @internalComponent + */ +void CSsmSimStatusObserver::RunL() + { + if(KErrNone != iStatus.Int()) + { + DEBUGPRINT2A("CSsmSimStatusObserver RunL status error: %d", iStatus.Int()); + User::Leave(iStatus.Int()); + } + // The adaptation will have queued any events, so we shouldn't miss any while we handle this event + switch(iSimEventPckg()) + { + case ESsmSimUsable: + RequestSimStatusChangeL(ESimUsable); + break; + case ESsmSimReadable: + RequestSimStatusChangeL(ESimReadable); + break; + case ESsmSimNotReady: + RequestSimStatusChangeL(ESimNotReady); + break; + case ESsmSimRemoved: + RequestSimStatusChangeL(ESimNotPresent); + break; + default: + DEBUGPRINT2A("CSsmSimStatusObserver unknown SIM event: %d", iSimEventPckg()); + User::Leave(KErrNotSupported); + break; + } + // Re-request notification + iSimAdaptation.NotifySimEvent(iSimEventPckg, iStatus); + SetActive(); + } + +/** + * Requests a change to the SIM status system wide property. + * + * @internalComponent + */ +void CSsmSimStatusObserver::RequestSimStatusChangeL(TPSSimStatus aSimStatus) + { + DEBUGPRINT2A("CSsmSimStatusObserver SIM status change: %d", aSimStatus); + RSsmStateManager ssm; + User::LeaveIfError(ssm.Connect()); + CleanupClosePushL(ssm); + const TUint KStartupSimSecurityStatusKey = {CSsmUiSpecific::SimStatusPropertyKey()}; + TSsmSwp swpInfo(KStartupSimSecurityStatusKey, aSimStatus); + User::LeaveIfError(ssm.RequestSwpChange(swpInfo)); + CleanupStack::PopAndDestroy(&ssm); + } + +/** + * Cancels the outstanding notification request for this observer. + * + * @internalComponent + */ +void CSsmSimStatusObserver::DoCancel() + { + iSimAdaptation.NotifyCancel(); + } + +/** + * CActive::RunError implementation + * + * @internalComponent + */ +TInt CSsmSimStatusObserver::RunError(TInt aError) + { + DEBUGPRINT2A("CSsmSimStatusObserver RunError received error: %d", aError); + return aError; + } + +/** + * Constructs this object using the parameters provided by the SSM UI provider DLL. + * + * @internalComponent + */ +CSsmSimStatusObserver::CSsmSimStatusObserver() +: CActive(EPriorityNormal) + { + CActiveScheduler::Add(this); + } +