networkcontrol/ipnetworklayer/src/IPProtoDeMux.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/ipnetworklayer/src/IPProtoDeMux.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,162 @@
+// 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:
+// IPProto demultiplexor implementation
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <nifmbuf.h>
+#include "IPProtoDeMux.h"
+
+CIPProtoBinder::CIPProtoBinder(CIPShimSubConnectionFlow& aFlow)
+	:iBinderControl(NULL),
+	 iLowerControl(NULL),
+	 iFlow(aFlow),
+	 iNif(NULL)
+	{    
+	
+	}
+
+
+CIPProtoBinder* CIPProtoBinder::NewL(CIPShimSubConnectionFlow& aFlow, const TDesC8& aProtocolName)
+	{
+	CIPProtoBinder* me = new (ELeave) CIPProtoBinder(aFlow);
+	me->SetProtocolName(aProtocolName);
+    return me;
+	}
+	
+void CIPProtoBinder::StartL()
+	{
+	ASSERT(iNif);
+	iNif->StartL();
+	}
+
+CIPProtoBinder::~CIPProtoBinder()
+	{
+	ASSERT(iNif == NULL); // should have been unbound by this stage
+	}
+
+void CIPProtoBinder::BindL(CIPShimIfBase* aNif)
+	{
+	__CFLOG_2(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tBindL(%08x)"), this, aNif); 
+	ASSERT(iNif == NULL); // shouldn't be binding twice
+	iNif = aNif;
+	}
+
+void CIPProtoBinder::Unbind()
+	{
+	__CFLOG_1(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tUnbind()"), this); 
+	ASSERT(iNif);
+	iNif = NULL;
+	}
+
+void CIPProtoBinder::BindToLowerFlowL(ESock::MFlowBinderControl& aLowerBinderControl)
+	{
+	ASSERT(iNif);
+
+	__CFLOG_2(KIPProtoTag1, KIPProtoTag2, _L8("CIPProtoBinder %08x:\tBindToLowerFlowL(): protocol '%S'"), this, &iNif->ProtocolName()); 
+
+	iBinderControl = &aLowerBinderControl;
+	iLowerControl = iBinderControl->GetControlL(iNif->ProtocolName());
+	iLowerDataSender = iBinderControl->BindL(iNif->ProtocolName(), this, this);
+	}	
+	
+void CIPProtoBinder::UnbindFromLowerFlow()
+	{
+	__CFLOG_1(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tUnbindFromLowerFlow()"), this); 
+
+	if (!iBinderControl)
+		return;
+	
+	iBinderControl->Unbind(this, this);
+	iBinderControl = NULL;
+
+	iLowerControl = NULL;
+	iLowerDataSender = NULL;
+	}
+
+//-=========================================
+// MUpperDataReceiver methods
+//-=========================================        
+void CIPProtoBinder::Process(RMBufChain& aData)
+	{
+	if (iNif)
+		{
+		ASSERT(iNif->iUpperProtocol);
+		iNif->iUpperProtocol->Process(aData, reinterpret_cast<CProtocolBase*>(iNif));
+		}
+	}
+
+//-=========================================
+// MUpperControl methods
+//-=========================================        
+void CIPProtoBinder::StartSending()
+	{
+	__CFLOG_1(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tStartSending()"), this);
+	Flow().BinderReady();	
+	iNif->StartSending();
+	}
+	
+void CIPProtoBinder::Error(TInt aError)
+	{
+	__CFLOG_2(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tError(%d)"), this, aError);
+	Flow().BinderError(aError, this);
+	}
+//-=========================================
+// MLowerDataSender methods
+//-========================================= 
+ESock::MLowerDataSender::TSendResult CIPProtoBinder::Send(RMBufChain& aData)
+	{
+	return iLowerDataSender->Send(aData);
+	}
+
+//-=========================================
+// MLowerControl methods
+//-========================================= 
+TInt CIPProtoBinder::GetName(TDes& aName)
+	{
+	return iLowerControl->GetName(aName);
+	}
+	
+TInt CIPProtoBinder::BlockFlow(TBlockOption aOption)
+	{
+	__CFLOG_2(KIPProtoTag1, KIPProtoTag2, _L("CIPProtoBinder %08x:\tBlockFlow(%d)"), this, aOption);
+	return iLowerControl->BlockFlow(aOption);
+	}
+TInt CIPProtoBinder::GetConfig(TBinderConfig& aConfig)
+	{
+	return iLowerControl->GetConfig(aConfig);
+	}
+	
+TInt CIPProtoBinder::Control(TUint aLevel, TUint aName, TDes8& aOption)
+	{
+	return iLowerControl->Control(aLevel, aName, aOption);
+	}
+
+//-========================================= 
+void CIPProtoBinder::SetProtocolName(const TDesC8& aProtocol)
+	{
+	iProtocolName.Copy(aProtocol);
+	}
+
+
+const TDesC8& CIPProtoBinder::ProtocolName()
+	{
+	ASSERT(iProtocolName.Length());
+	return iProtocolName;
+	}