diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatereferenceplugins/clayer/src/ssmpropertyobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatereferenceplugins/clayer/src/ssmpropertyobserver.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,166 @@ +// 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 "ssmpropertyobserver.h" + +#include "ssmdebug.h" + +/** + * Creates a new CSsmProperty Observer. + * + * @param aCategory The category of the property to monitor. + * @param aKey The key of the property to monitor. + * + * @publishedPartner + * @released + */ +EXPORT_C CSsmPropertyObserver::CSsmPropertyObserver(TUid aCategory, TUint aKey) +: CActive(EPriorityNormal), + iCategory(aCategory), + iKey(aKey) + { + CActiveScheduler::Add(this); + } //lint !e1746 Suppress parameter 'aCategory' could be made const reference + +/** + * Releases any resources allocated to this object. + * + * @publishedPartner + * @released + */ +EXPORT_C CSsmPropertyObserver::~CSsmPropertyObserver() + { + Deque(); + if(iProperty.Handle() != 0) + { + iProperty.Cancel(); + } + iProperty.Close(); + } + +/** + * Initialises this object but does not start responding to changes to the monitored property. + * + * @publishedPartner + * @released + */ +EXPORT_C void CSsmPropertyObserver::InitializeL() + { + TInt err = iProperty.Attach(iCategory, iKey); + if(KErrNone != err) + { + DEBUGPRINT2(_L("CSsmPropertyObserver failed to attach to property with error: %d"), err); + User::Leave(err); + } + } + +/** + * Starts this observer responding to the monitored property. + * + * @publishedPartner + * @released + */ +EXPORT_C void CSsmPropertyObserver::StartL() + { + // To start we just call doRunL() + doRunL(); + } + +/** + * Releases this object freeing any resources allocated to it. + * + * Using this object after calling release will have undefined behaviour. + * + * @publishedPartner + * @released + */ +EXPORT_C void CSsmPropertyObserver::Release() + { + delete this; + } + +/** + * CActive::RunL implementation to call the observer function and to re-request monitoring. + * + * @publishedPartner + * @released + */ +EXPORT_C void CSsmPropertyObserver::RunL() + { + if(KErrNone != iStatus.Int()) + { + DEBUGPRINT2A("CSsmPropertyObserver RunL received error status: %d", iStatus.Int()); + User::Leave(iStatus.Int()); + } + doRunL(); + } + +/** + * Internal RunL helper method + * + * @internalComponent + */ +void CSsmPropertyObserver::doRunL() + { + TInt value; + // subscribe before we get the value, deciding later if we should cancel + iProperty.Subscribe(iStatus); + + TInt err = iProperty.Get(value); + if(KErrNone != err) + { + DEBUGPRINT2A("CSsmPropertyObserver failed to get property with error: %d", err); + // Cancel the subscription before leaving + iProperty.Cancel(); + User::WaitForRequest(iStatus); + + User::Leave(err); + } + TBool resubscribe = PropertyChangedL(value); + if(resubscribe) + { + // Just set active as we resubscribed before + SetActive(); + } + else + { + // Cancel the previous subscription + iProperty.Cancel(); + User::WaitForRequest(iStatus); + } + } + +/** + * Cancels monitoring for this property + * + * @publishedPartner + * @released + */ +EXPORT_C void CSsmPropertyObserver::DoCancel() + { + iProperty.Cancel(); + } + +/** + * CActive::RunError implementation + * + * @publishedPartner + * @released + */ +EXPORT_C TInt CSsmPropertyObserver::RunError(TInt aError) + { + DEBUGPRINT4A("Property observer for UID: %x Key: %d RunError received error: %d", iCategory.iUid, iKey, aError); + return aError; + }