sysstatemgmt/systemstatemgr/cmn/src/ssmpropertymonitor.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/cmn/src/ssmpropertymonitor.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,135 @@
+// Copyright (c) 2007-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 "ssmpropertymonitor.h"
+#include "cmnpanic.h"
+#include "ssmdebug.h"
+
+/**
+
+ */
+CSsmPropertyMonitor* CSsmPropertyMonitor::NewL(CSsmSystemWideProperty& aObserver, TUint aSwpKey, TUid aProcessSid)
+	{
+	CSsmPropertyMonitor* self = new (ELeave) CSsmPropertyMonitor(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL(aSwpKey, aProcessSid);
+	CleanupStack::Pop(self);
+	return self;
+	} //lint !e1746 Suppress parameter 'aProcessSid' could be made const reference
+
+/**
+
+ */
+CSsmPropertyMonitor::CSsmPropertyMonitor(CSsmSystemWideProperty& aObserver) : 
+	CActive(CActive::EPriorityStandard),
+	iObserver(aObserver),
+	iSwpLocal(TSsmSwp(0,0))
+	{
+	CActiveScheduler::Add(this);
+	}
+
+/**
+
+ */
+CSsmPropertyMonitor::~CSsmPropertyMonitor()
+	{
+	Cancel();
+	iSwpRemote.Close();
+	}
+
+/**
+
+ */
+void CSsmPropertyMonitor::ConstructL(TUint aSwpKey, TUid aProcessSid)
+	{
+	SSMLOGLEAVEIFERROR(iSwpRemote.Connect(aSwpKey, aProcessSid));
+	
+	//Setup change subscription
+	iStatus = KRequestPending;
+	iSwpRemote.Subscribe(iStatus);
+	SetActive();
+	
+	//Read current value and store locally
+	TInt value = 0;
+	if(KErrNone == iSwpRemote.GetValue(value))
+		{
+		iDefined = ETrue;
+		}
+	iSwpLocal.Set(aSwpKey, value);
+	} //lint !e1746 Suppress parameter 'aProcessSid' could be made const reference
+
+/**
+
+ */
+void CSsmPropertyMonitor::DoCancel()
+	{
+	iSwpRemote.SubscribeCancel();
+	}
+
+/**
+
+ */
+void CSsmPropertyMonitor::RunL()
+	{
+	SSMLOGLEAVEIFERROR(iStatus.Int());
+
+	//Re-issue a subscription request before retrieving the current value
+	iStatus = KRequestPending;
+	iSwpRemote.Subscribe(iStatus);
+	SetActive();
+	
+	//Read current value and store locally
+	TInt newValue = 0;
+	SSMLOGLEAVEIFERROR(iSwpRemote.GetValue(newValue));
+	iSwpLocal.Set(iSwpLocal.Key(), newValue);
+	
+	//Notify our clients
+	iObserver.NotifySubscribers(iSwpLocal);			
+	}
+
+/**
+@panic ECmnPropMonError1 if an error occurs in RunL
+ */
+TInt CSsmPropertyMonitor::RunError(TInt aError)
+	{
+	//All possible RProperty errors; KErrPermissionDenied, KErrNotFound and KErrArgument
+	//should occur already in ConstructL and never in RunL.
+	
+	DEBUGPRINT2A("CSsmPropertyMonitor::RunError: %d", aError);
+	User::Panic(KPanicSsmCmn, ECmnPropMonError1);  //A panic here is easier to track than a panic in CActive
+	return aError; //lint !e527 Unreachable
+	}
+
+/**
+
+ */
+TInt CSsmPropertyMonitor::GetValue(TSsmSwp& aSwp) const
+	{
+	if(iDefined)
+		{
+		aSwp.Set(iSwpLocal.Key(), iSwpLocal.Value());
+		return KErrNone;
+		}
+	
+	//The property was not yet defined when this monitor was created
+	TInt value = 0;
+	const TInt err = iSwpRemote.GetValue(value);
+	if(KErrNone == err)
+		{
+		const_cast<TSsmSwp&>(iSwpLocal).Set(iSwpLocal.Key(), value);
+		aSwp.Set(iSwpLocal.Key(), value);
+		}
+	return err;
+	}