diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/ssmcustcmds/ssmsystemcmds/src/ssmpskeyobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/ssmcustcmds/ssmsystemcmds/src/ssmpskeyobserver.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,170 @@ +/* +* 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: +* Implementation of CSsmPsKeyObserver class. +* +*/ + + +#include "ssmpskeyobserver.h" +#include "trace.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::CSsmPsKeyObserver +// +// --------------------------------------------------------------------------- +// +CSsmPsKeyObserver::CSsmPsKeyObserver( TUid aCategory, TUint aKey ) + : CActive( EPriorityHigh ), + iCategory( aCategory ), + iKey( aKey ) + { + FUNC_LOG; + + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::~CSsmPsKeyObserver +// +// --------------------------------------------------------------------------- +// +CSsmPsKeyObserver::~CSsmPsKeyObserver() + { + FUNC_LOG; + + Cancel(); + iProperty.Close(); + Complete( KErrCancel ); // Just in case + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::StartObserving +// +// --------------------------------------------------------------------------- +// +void CSsmPsKeyObserver::StartObserving( TRequestStatus& aStatus ) + { + FUNC_LOG; + ASSERT_TRACE( !IsActive() ); + + aStatus = KRequestPending; + iClientStatus = &aStatus; + + TInt errorCode = iProperty.Attach( iCategory, iKey ); + ERROR_2( errorCode, "Failed to attach to property 0x%08x::0x%08x", + iCategory.iUid, iKey ); + + if ( errorCode == KErrNone ) + { + CheckKeyValue(); + } + else + { + Complete( errorCode ); + } + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::DoCancel +// +// --------------------------------------------------------------------------- +// +void CSsmPsKeyObserver::DoCancel() + { + FUNC_LOG; + + iProperty.Cancel(); + Complete( KErrCancel ); + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::RunL +// +// --------------------------------------------------------------------------- +// +void CSsmPsKeyObserver::RunL() + { + FUNC_LOG; + INFO_1( "CSsmPsKeyObserver::iStatus = %d", iStatus.Int() ); + + if ( iStatus == KErrCancel || + iStatus == KErrServerTerminated || + iStatus ==KErrNotSupported ) + { + Complete( iStatus.Int() ); + } + else + { + CheckKeyValue(); + } + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::CheckKeyValue +// +// --------------------------------------------------------------------------- +// +void CSsmPsKeyObserver::CheckKeyValue() + { + FUNC_LOG; + ASSERT( !IsActive() ); + + iProperty.Subscribe( iStatus ); + SetActive(); + + TInt value( -KMaxTInt ); + TInt errorCode = iProperty.Get( value ); + ERROR_2( errorCode, "Failed to get value of property 0x%08x::0x%08x", + iCategory.iUid, iKey ); + if ( errorCode != KErrNone || IsMatch( value ) ) + { + INFO_3( "Property 0x%08x::0x%08x reached the target value %d.", + iCategory.iUid, iKey, value ); + + Complete( errorCode ); + Cancel(); + } + else + { + INFO_3( "Value of property 0x%08x::0x%08x is %d. Waiting...", + iCategory.iUid, iKey, value ); + } + } + + +// --------------------------------------------------------------------------- +// CSsmPsKeyObserver::Complete +// +// --------------------------------------------------------------------------- +// +void CSsmPsKeyObserver::Complete( const TInt aErrorCode ) + { + FUNC_LOG; + + if ( iClientStatus ) + { + INFO_1( "Completing request with status %d", aErrorCode ); + + User::RequestComplete( iClientStatus, aErrorCode ); + iClientStatus = NULL; + } + }