networkcontrol/qosfwconfig/qos/src/interface.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/qosfwconfig/qos/src/interface.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,185 @@
+// Copyright (c) 2006-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 <nifman.h>
+#include <comms-infras/nifif.h>
+#include <in_iface.h>
+
+#include "qos_if.h"
+#include "qos_prot.h"
+#include "modules.h"
+#include "interface.h"
+
+
+CInterface* CInterface::NewL(CProtocolQoS& aProt, CNifIfBase* aNif)
+	{
+	CInterface* iface = new (ELeave) CInterface(aProt, aNif);
+	CleanupStack::PushL(iface);
+	iface->ConstructL();
+	CleanupStack::Pop();
+	//coverity[leave_without_push]
+	LOG(Log::Printf(_L("\t\tIF [%S] '%S' created"), &iface->iName, &iface->iInterfaceName));
+	return iface;
+	}
+
+
+CInterface::CInterface(CProtocolQoS& aProt, CNifIfBase* aNif) : iProtocol(aProt), iNif(aNif)
+	{
+	LOG(Log::Printf(_L("new\tqos IF for NIF[%u] size=%d"), (TInt)aNif, sizeof(CInterface)));
+	iIapId = 0;
+	}
+
+
+CInterface::~CInterface()
+	{
+	LOG(Log::Printf(_L("~\tqos IF [%S] destructor -- start"), &iName));
+	
+	if (iTrafficControl)
+		{
+		iTrafficControl->Module()->InterfaceDetached(iInterfaceName, iNif);
+		delete iTrafficControl;
+		}
+
+	LOG(Log::Printf(_L("~\tqos IF [%S] destructor -- end"), &iName));
+	}
+
+void CInterface::ConstructL()
+	{
+	iTrafficControl = NULL;
+	iIapId = 0;
+	GetInterfaceInfo();
+	// If the control module is not available, for some reason,
+	// then this status will cause all channel
+	// negotiations for this interface to fail, but does not
+	// prevent normal packet flow.
+	iTrafficControlStatus = LoadControlModule();
+	}
+
+
+void CInterface::GetInterfaceInfo()
+	{
+	TNifIfInfo info;
+	iNif->Info(info);
+	iName = info.iName;
+
+	TInt aPlace;
+	TChar aMark('.');
+	aPlace = iName.LocateReverse(aMark);
+	if (aPlace > 0)
+		iInterfaceName.Set(iName.Left(aPlace));
+	else
+		iInterfaceName.Set(iName);
+
+	// Get NetworkId and IapId
+	TSoIfConnectionInfo netinfo;
+	TPckg<TSoIfConnectionInfo> option(netinfo);
+	if (iNif->Control(KSOLInterface, KSoIfGetConnectionInfo, option) == KErrNone)
+		iIapId = netinfo.iIAPId;
+	LOG(Log::Printf(_L("\t\tIF [%S] '%S' NET=%d IAP=%d"), &iName, &iInterfaceName, netinfo.iNetworkId, iIapId));
+	}
+
+
+TInt CInterface::GetPlugIn(TSoIfControllerInfo& aPluginInfo)
+	{
+	TPckg<TSoIfControllerInfo> opt(aPluginInfo);
+	TInt ret;
+
+	ret = iNif->Control(KSOLInterface, KSoIfControllerPlugIn, opt);
+	if (!ret)
+		{
+		_LIT(KDescPrt, ".prt");
+		TInt aPlace;
+		aPlace = aPluginInfo.iPlugIn.Match(KDescPrt);
+		if (aPlace == KErrNotFound)
+			aPluginInfo.iPlugIn.Append(KDescPrt);
+		}
+	return ret;
+	}
+
+
+// Load technology-specific control module
+TInt CInterface::LoadControlModule()
+	{
+	TInt ret;
+	TSoIfControllerInfo aPluginInfo;
+	ret = GetPlugIn(aPluginInfo);
+	if (ret == KErrNone)
+		{
+		RModule* module = NULL;
+		TRAP(ret, module = iProtocol.ModuleMgr()->LoadModuleL(iProtocol.NetworkService()->Protocol(), aPluginInfo.iPlugIn, aPluginInfo.iProtocolId));
+		if (ret == KErrNone)
+			{
+			SetTrafficControl(module);
+			LOG(Log::Printf(_L("\t\tCalling module[%S]::InterfaceAttached(IF [%S])"), &aPluginInfo.iPlugIn, &iName));
+			module->Module()->InterfaceAttached(iInterfaceName, iNif);
+			}
+		else
+			{
+			LOG(Log::Printf(_L("\t\tFailed to load module[%S] for IF [%S] , err=%d"), &aPluginInfo.iPlugIn, &iName, ret));
+			}
+		}
+	return ret;
+	}
+
+CInterfaceManager* CInterfaceManager::NewL(CProtocolQoS& aProtocol)
+	{
+	return new (ELeave) CInterfaceManager(aProtocol);
+	}
+
+CInterfaceManager::CInterfaceManager(CProtocolQoS& aProtocol) : iProtocol(aProtocol)
+	{
+	LOG(Log::Printf(_L("new\tqos Interface Manager[%u] size=%d"), (TInt)this, sizeof(CInterfaceManager)));
+	iInterfaces.SetOffset(_FOFF(CInterface, iLink));
+	}
+
+CInterfaceManager::~CInterfaceManager()
+	{
+	LOG(Log::Printf(_L("~\tqos Interface Manager[%u] -- start"), (TInt)this));
+	while (!iInterfaces.IsEmpty())
+		{
+		CInterface* iface = iInterfaces.First();
+		iInterfaces.Remove(*iface);
+		delete iface;
+		}
+	iInterfaces.Reset();
+	LOG(Log::Printf(_L("~\tqos Interface Manager[%u] -- done"), (TInt)this));
+	}
+
+CInterface* CInterfaceManager::AddInterfaceL(CNifIfBase* aNif)
+	{
+	CInterface* iface = CInterface::NewL(iProtocol, aNif);
+	iInterfaces.AddLast(*iface);
+	return iface;
+	}
+
+void CInterfaceManager::RemoveInterface(CInterface* aInterface)
+	{
+	iInterfaces.Remove(*aInterface);
+	delete aInterface;
+	}
+
+
+CInterface* CInterfaceManager::FindInterface(CNifIfBase* aNif)
+	{
+	TSglQueIter<CInterface> iter(iInterfaces);
+	CInterface* i;
+
+	while ((i = iter++) != NULL)
+		{
+		if (i->Nif() == aNif)
+			return i;
+		}
+	return NULL;
+	}