--- /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;
+ }