datacommsserver/esockserver/test/providers/dummy/src/dummypr_mcprpubsubsubscriber.cpp
branchRCL_3
changeset 13 0b0e9fce0b58
parent 2 dee179edb159
--- a/datacommsserver/esockserver/test/providers/dummy/src/dummypr_mcprpubsubsubscriber.cpp	Mon Mar 15 12:45:15 2010 +0200
+++ b/datacommsserver/esockserver/test/providers/dummy/src/dummypr_mcprpubsubsubscriber.cpp	Wed Mar 31 23:27:09 2010 +0300
@@ -38,15 +38,6 @@
 using namespace Messages;
 using namespace ESock;
 
-CMCPrPubSubSubscriber* CMCPrPubSubSubscriber::NewL(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
-	{
-	CMCPrPubSubSubscriber* self = new (ELeave) CMCPrPubSubSubscriber(aProvBase,aStopCode);
-	CleanupStack::PushL(self);
-	self->StartL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
 CMCPrPubSubSubscriber::CMCPrPubSubSubscriber(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
 :	CActive(EPriorityNormal),
 	iNode(aProvBase),
@@ -54,35 +45,6 @@
 	{
 	}
 
-void CMCPrPubSubSubscriber::StartAvailabilityMonitoringL(const Messages::TNodeCtxId& aAvailabilityActivity)
-    {
-    iAvailabilityActivity = aAvailabilityActivity;
-    TInt score = TAvailabilityStatus::EUnknownAvailabilityScore;
-    
-    TInt result = iProperty.Attach(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId());
-    if(result != KErrNone)
-        {
-        User::LeaveIfError(iProperty.Define(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId(), RProperty::EInt));
-        User::LeaveIfError(iProperty.Attach(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId()));
-        }
-
-    iProperty.Subscribe(iStatus);
-    SetActive();
-    iProperty.Get(score); //If Get() is unsuccessful score must not be modified!
-    
-    if (score != TAvailabilityStatus::EUnknownAvailabilityScore)
-        {
-        //Send the intial availability status.
-        TAvailabilityStatus status(score);
-        RClientInterface::OpenPostMessageClose(NodeId(), iAvailabilityActivity,
-                TCFAvailabilityControlClient::TAvailabilityNotification(status).CRef());
-        }
-    }
-
-void CMCPrPubSubSubscriber::CancelAvailabilityMonitoring()
-    {
-    iAvailabilityActivity = Messages::TNodeCtxId::NullId();
-    }
 
 void CMCPrPubSubSubscriber::StartL()
 	{
@@ -90,25 +52,6 @@
 	CActiveScheduler::Add(this);
 	}
 
-void CMCPrPubSubSubscriber::RunL()
-	{
-	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubSubscriber::RunL")));
-	User::LeaveIfError(iStatus.Int());
-
-	// resubscribe immediately
-	iProperty.Subscribe(iStatus);
-	SetActive();
-
-    // then process
-	TInt value;
-	User::LeaveIfError(iProperty.Get(value));
-	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubSubscriber subscribed value now %d"),value));
-
-    ASSERT(!iAvailabilityActivity.IsNull()); //maybe a bit defensive, but this is test code after all. The test changes availability when nobody is listenning; Surely test is wrong?
-    RClientInterface::OpenPostMessageClose(Id(), iAvailabilityActivity,
-        TCFAvailabilityControlClient::TAvailabilityNotification(value).CRef());
-	}
-
 TInt CMCPrPubSubSubscriber::RunError(TInt /*aError*/)
 	{
 	//path uncovered.
@@ -126,3 +69,150 @@
 	this->Cancel(); // object must be stoppable by destcruction due to cleanup restrictions
 	iProperty.Close();
 	}
+
+//
+
+CMCPrPubSubAvailability* CMCPrPubSubAvailability::NewL(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
+	{
+	CMCPrPubSubAvailability* self = new (ELeave) CMCPrPubSubAvailability(aProvBase,aStopCode);
+	CleanupStack::PushL(self);
+	self->StartL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CMCPrPubSubAvailability::CMCPrPubSubAvailability(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
+:   CMCPrPubSubSubscriber(aProvBase,aStopCode)
+    {
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubAvailability ctor")));
+	}
+
+void CMCPrPubSubAvailability::StartAvailabilityMonitoringL(const Messages::TNodeCtxId& aAvailabilityActivity)
+    {
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubSubscriber::StartAvailabilityMonitoringL")));
+
+    iAvailabilityActivity = aAvailabilityActivity;
+    TInt score = TAvailabilityStatus::EUnknownAvailabilityScore;
+
+    TInt result = iProperty.Attach(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId());
+    if(result != KErrNone)
+        {
+        User::LeaveIfError(iProperty.Define(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId(), RProperty::EInt));
+        User::LeaveIfError(iProperty.Attach(TUid::Uid(EAvailabilityTestingPubSubUid), iNode.ProviderInfo().APId()));
+        }
+
+    iProperty.Subscribe(iStatus);
+    SetActive();
+    iProperty.Get(score); //If Get() is unsuccessful score must not be modified!
+
+    if (score != TAvailabilityStatus::EUnknownAvailabilityScore)
+        {
+        //Send the intial availability status.
+        TAvailabilityStatus status(score);
+        RClientInterface::OpenPostMessageClose(NodeId(), iAvailabilityActivity,
+                TCFAvailabilityControlClient::TAvailabilityNotification(status).CRef());
+        }
+    }
+
+void CMCPrPubSubAvailability::CancelAvailabilityMonitoring()
+    {
+    iAvailabilityActivity = Messages::TNodeCtxId::NullId();
+    }
+
+void CMCPrPubSubAvailability::RunL()
+	{
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubAvailability::RunL")));
+	User::LeaveIfError(iStatus.Int());
+
+	// resubscribe immediately
+	iProperty.Subscribe(iStatus);
+	SetActive();
+
+    // then process
+	TInt value;
+	User::LeaveIfError(iProperty.Get(value));
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubAvailability subscribed value now %d"),value));
+
+    __ASSERT_DEBUG(!iAvailabilityActivity.IsNull(), User::Panic(KSpecAssert_DummyPrStopSubsc, 1)); //maybe a bit defensive, but this is test code after all. The test changes availability when nobody is listenning; Surely test is wrong?
+    RClientInterface::OpenPostMessageClose(Id(), iAvailabilityActivity,
+        TCFAvailabilityControlClient::TAvailabilityNotification(value).CRef());
+	}
+
+//
+
+CMCPrPubSubStopTrigger* CMCPrPubSubStopTrigger::NewL(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
+	{
+	CMCPrPubSubStopTrigger* self = new (ELeave) CMCPrPubSubStopTrigger(aProvBase,aStopCode);
+	CleanupStack::PushL(self);
+	self->StartL();
+	CleanupStack::Pop(self);
+	return self;
+	__ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_DummyPrStopSubsc, 2));
+
+	}
+
+CMCPrPubSubStopTrigger::CMCPrPubSubStopTrigger(const ESock::CMetaConnectionProviderBase& aProvBase, TUint aStopCode)
+:   CMCPrPubSubSubscriber(aProvBase,aStopCode),
+	iNodeId(aProvBase.Id())
+    {
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubStopTrigger ctor")));
+	}
+
+void
+CMCPrPubSubStopTrigger::StartL()
+    {
+	CMCPrPubSubSubscriber::StartL();
+	TInt result = iProperty.Attach(TUid::Uid(EStopTriggeringPubSubUid), 1);
+	if(result != KErrNone)
+		{
+		User::LeaveIfError(iProperty.Define(TUid::Uid(EStopTriggeringPubSubUid), 1, RProperty::EInt));
+		User::LeaveIfError(iProperty.Attach(TUid::Uid(EStopTriggeringPubSubUid), 1));
+		}
+	iProperty.Subscribe(iStatus);
+    SetActive();
+    }
+
+void CMCPrPubSubStopTrigger::RunL()
+	{
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubStopTrigger::RunL")));
+	User::LeaveIfError(iStatus.Int());
+
+	// resubscribe immediately
+	iProperty.Subscribe(iStatus);
+	SetActive();
+
+    // then process
+	TInt value;
+	User::LeaveIfError(iProperty.Get(value));
+	__CFLOG_VAR((KDummyMCprTag, KDummyMCprSubTag, _L8("CMCPrPubSubStopTrigger subscribed value now %d"),value));
+
+	CMetaConnectionProviderBase* provider = const_cast<CMetaConnectionProviderBase*>(static_cast<const CMetaConnectionProviderBase*>(&iNode));
+	__ASSERT_DEBUG(provider, User::Panic(KSpecAssert_DummyPrStopSubsc, 3));
+
+	if(value==KStart)
+		{
+		if(iBlocking)
+			{
+			// Decrement semaphore to stop the provider from being destroyed once all of it's children have been stopped.
+			provider->DecrementBlockingDestroy();
+			iBlocking = false;
+			}
+
+		TCFServiceProvider::TStart msg;
+		RClientInterface::OpenPostMessageClose(iNodeId, iNodeId, msg);
+		}
+	else
+	if((value==KBlockingStop || value==KStop) && iNode.ServiceProvider() != NULL)
+		{
+		if(!iBlocking && value==KBlockingStop)
+			{
+			// Increment semaphore to stop the provider from being destroyed once all of it's children have been stopped.
+			provider->IncrementBlockingDestroy();
+			iBlocking = true;
+			}
+
+		TCFServiceProvider::TStop msg(iStopCode);
+		RClientInterface::OpenPostMessageClose(iNodeId, iNodeId, msg);
+		}
+	}
+