telephonyserverplugins/simtsy/src/CSimPubSub.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/CSimPubSub.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,133 @@
+// Copyright (c) 2004-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:
+// Implements the CSimPubSub class
+// 
+//
+
+#include "CSimPubSub.h"
+#include "Simlog.h"
+
+
+/**
+Standard two phase construction.
+
+@param aPSSimObserver pointer to event observer
+@param aUid uids of Publish&Subscribe uids to subscribe to.
+*/
+CSimPubSub* CSimPubSub::NewL(MPSSimObserver* aPSSimObserver, const CSimPubSub::TPubSubProperty aProperty)
+	{
+	LOGSCOMMON1(">>CSimPubSub::NewL");
+	CSimPubSub* pubsub=new(ELeave) CSimPubSub(aPSSimObserver,aProperty);
+	CleanupStack::PushL(pubsub);
+	pubsub->ConstructL();
+	CleanupStack::Pop();
+	LOGSCOMMON1("<<CSimPubSub::NewL");
+	return pubsub;
+	}
+
+/**
+Private constructor used in the first phase of construction.
+ 
+@param aPSSimObserver pointer to event observer
+@param aUid uids of Publish&Subscribe uids to subscribe to.
+*/
+CSimPubSub::CSimPubSub(MPSSimObserver* aPSSimObserver, const CSimPubSub::TPubSubProperty aProperty)
+	: CActive(EPriorityStandard),
+	iProperty(aProperty),
+	iPSSimCallBack(aPSSimObserver)
+	{
+	}
+
+/**
+2nd phase of construction - subscribe to event.
+*/
+void CSimPubSub::ConstructL()
+	{
+	User::LeaveIfError(iSubscribe.Attach(iProperty.iCategory,iProperty.iKey));
+	CActiveScheduler::Add(this);
+	}
+
+/**
+Destructor.  Cancels any outstanding request on P&S.
+*/
+CSimPubSub::~CSimPubSub()
+	{
+	Cancel();
+	iSubscribe.Close();
+	}
+	
+/**
+Start the subscription
+*/
+void CSimPubSub::Start()
+	{
+	iSubscribe.Subscribe(iStatus);
+	SetActive();
+	}
+
+/**
+Handles completion of our P&S request.
+Notifies the event observer.
+*/
+void CSimPubSub::RunL()
+	{
+	TInt status = iStatus.Int();
+	// As described in documentation resubscribe before processing new value to prevent missing updates.
+	if(status != KErrNone)
+		User::After(1000000L);	//pause before attempting re-subscribe to avoid a tight-loop.
+	Start();
+	//pass new state to observer
+	if (status==KErrNone)
+		{
+		TInt state;
+		if(iSubscribe.Get(state) == KErrNone)
+			{
+			iPSSimCallBack->SimPSEvent(iProperty,state);	
+			}
+		}
+	}
+
+/**
+Handles a request to cancel the state machine.
+Cancels any P&S subscriptions.
+*/
+void CSimPubSub::DoCancel()
+	{
+	iSubscribe.Cancel();
+	}
+
+/**
+Empty constructor
+*/
+CSimPubSub::TPubSubProperty::TPubSubProperty()
+{
+}
+
+
+/**
+Overloaded constructor
+*/
+CSimPubSub::TPubSubProperty::TPubSubProperty(TUid aCategory, TInt aKey,	TInt aType)
+: iCategory(aCategory), iKey(aKey), iType(aType)
+{
+}
+
+
+/**
+Compare for equality.
+*/
+TBool CSimPubSub::TPubSubProperty::operator==(const CSimPubSub::TPubSubProperty& aProperty) const
+	{
+	return (iCategory == aProperty.iCategory && iKey == aProperty.iKey	&& iType == aProperty.iType);
+	}