diff -r 000000000000 -r af10295192d8 networkcontrol/ipnetworklayer/src/IPProtoDeMux.cpp --- /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 +#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(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; + }