commsfwsupport/commselements/rootserver/bindmgr/bm_task.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/rootserver/bindmgr/bm_task.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,225 @@
+// Copyright (c) 2003-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 <cflog.h>
+#include <commschan.h>
+#include <cfshared.h>
+using namespace CommsFW;
+#include "bm_defs.h"
+
+/**
+@file
+@internalComponent
+*/
+
+CTask* CTask::NewL(const TCFMessage &aMessage, const TUint aTaskId /*= 0*/)
+/** Creates new CTask object
+@param aMessage the message to be associated with the task
+@param aTaskId the tasks identifier
+@return Pointer to the new CTask object.
+@leave KErrNoMemory
+*/
+	{
+    CTask* pT = new(ELeave) CTask(aMessage, aTaskId);
+    CleanupStack::PushL(pT);
+    __CFLOG_2(KLogSubSysRS, KLogCode,_L8("CTask(%X)::NewL %d"), pT, aTaskId);
+	CleanupStack::Pop(pT);
+    return pT;
+	}
+
+CTask::CTask(const TCFMessage &aMessage, const TUint aTaskId) :
+	iTaskId(aTaskId),
+	iMessage(aMessage)
+/** Constructor for CTask
+@param aMessage the message to be associated with the task
+@param aTaskId the tasks identifier
+*/
+	{
+	}
+
+CTask::~CTask()
+/** Destructor for CTask
+*/
+	{
+    __CFLOG_1(KLogSubSysRS, KLogCode,_L8("~CTask %d"), iTaskId);
+	Dequeue();
+	}
+
+TUint CTask::TaskId() const
+/** Accessor method for the task id
+@return The task identifier
+*/
+	{
+	return iTaskId;
+	}
+
+const TCFMessage& CTask::Message() const
+/**
+@internalComponent 
+Accessor method for the message
+
+@return the message
+*/
+	{
+	return iMessage;
+	}
+
+void CTask::Dequeue()
+/** Remove this from the linked list
+*/
+	{
+	iLink.Deque();
+	}
+
+
+TBool CTask::CheckIfSame(TCFMessage &aMessage) const
+/** Compares the message code and parameter block of the task's message with the 
+message passed as a parameter and returns the result
+@param aMessage the comparator
+@return ETrue if the messages match
+*/
+	{
+	TBool match = ETrue;
+
+	if (iMessage.Code() != aMessage.Code())
+		{
+		return EFalse;
+		}
+
+	switch (iMessage.Code())
+		{
+	case TCFCommsMessage::ECodeBind:
+		{
+		const TCFBindMsg& iParam = reinterpret_cast<const TCFBindMsg&>(iMessage);
+		const TCFBindMsg& aParam = reinterpret_cast<const TCFBindMsg&>(aMessage);
+		if (iParam.SubModule1() != aParam.SubModule1() ||
+			iParam.SubModule2() != aParam.SubModule2() ||
+			iParam.Type() != aParam.Type())
+			{
+			match = EFalse;
+			}
+		}	
+		break;
+
+	case TCFCommsMessage::ECodeUnbind:
+		{
+		const TCFUnbindMsg& iParam = reinterpret_cast<const TCFUnbindMsg&>(iMessage);
+		const TCFUnbindMsg& aParam = reinterpret_cast<const TCFUnbindMsg&>(aMessage);
+		if (iParam.SubModule1() != aParam.SubModule1() ||
+			iParam.SubModule2() != aParam.SubModule2() ||
+			iParam.PeerIsDead() != aParam.PeerIsDead())
+			{
+			match = EFalse;
+			}
+		}	
+		break;
+
+	case TCFCommsMessage::ECodeDiscover:
+	case TCFCommsMessage::ECodeShutdown:
+		// no params to test
+		break;
+
+	default:
+		__ASSERT_DEBUG(EFalse, User::Panic(KBindMgrPanic, EUnsupportedCFMessage));
+		break;
+		}
+
+	return match;
+	}
+
+
+TBool CTask::NeedReply() const
+/** Checks if the task's message should expect to receive a reply from the 
+server or CPM
+@return ETrue if a reply is expected
+*/
+	{
+	// test message type
+	TBool reply = EFalse;
+
+	switch (iMessage.Code())
+		{
+	case TCFCommsMessage::ECodeBind:
+	case TCFCommsMessage::ECodeUnbind:
+	case TCFCommsMessage::ECodeDiscover:
+		reply = ETrue;
+		break;
+
+	case TCFCommsMessage::ECodeShutdown:
+		// no reply
+		break;
+
+	default:
+		__ASSERT_DEBUG(EFalse, User::Panic(KBindMgrPanic, EUnsupportedCFMessage));
+		break;
+		}
+
+	return reply;
+	}
+
+TBool CTask::ReplyMatches(const TCFMessage &aMessage) const
+/** Determines if the message passed as a parameter is a reply to this task's 
+message and returns the result
+@param aMessage the reply message to test
+@return ETrue if the message is the reply
+*/
+	{
+	// test if message is correct type and has same identifier
+	TBool match = EFalse;
+
+	if (NeedReply() && 
+		(iMessage.Code() == TCFCommsMessage::ECodeBind && aMessage.Code() == TCFCommsMessage::ECodeBindComplete) ||
+		(iMessage.Code() == TCFCommsMessage::ECodeUnbind && aMessage.Code() == TCFCommsMessage::ECodeUnbindComplete) ||
+		(iMessage.Code() == TCFCommsMessage::ECodeDiscover && aMessage.Code() == TCFCommsMessage::ECodeDiscoverResp))
+		{
+
+		TId ida = *((TId*)aMessage.ParamBlock());
+		TId idi = *((TId*)iMessage.ParamBlock());
+
+
+		if (ida==idi)
+			{
+			match = ETrue;
+			}
+		}
+	return match;
+	}
+
+
+TBool CTask::GetMsgReturnCode(const TCFMessage &aMessage, TInt &aStatus)
+/** Extracts the result code from the message supplied and returns it in the 
+status parameter
+@param aMessage the reply containing the result code
+@param aStatus the status to be filled in with the result code
+@return ETrue if the a result code was present
+*/
+	{
+	TBool codePresent = EFalse;
+
+	if (aMessage.Code() == TCFCommsMessage::ECodeBindComplete ||
+		aMessage.Code() == TCFCommsMessage::ECodeUnbindComplete ||
+		aMessage.Code() == TCFCommsMessage::ECodeDiscoverResp)
+		{
+		aStatus = ((TInt*)aMessage.ParamBlock())[1];
+		codePresent = ETrue;
+		}
+	else
+		{
+		aStatus = KErrNone;
+		}
+	return codePresent;
+	}
+
+