sysstatemgmt/systemstatereferenceplugins/clayer/src/ssmpropertyobserver.cpp
changeset 0 4e1aa6a622a0
--- /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;
+	}