networkprotocols/tcpipv4v6prt/src/in_fmly.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocols/tcpipv4v6prt/src/in_fmly.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,159 @@
+// Copyright (c) 2004-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:
+// in_fmly.cpp - internet protocol family
+//
+
+#include "icmp6.h"
+#include "ip6.h"
+#include "udp.h"
+#include "tcp.h"
+#include "res.h"
+#include "iface.h"
+#include "in_fmly.h"
+#include "rawip.h"
+
+//
+// CProtocolFamilyInet6
+// ********************
+// Internal to this implementation, no need to be defined in headers!
+//
+class CProtocolFamilyInet6 : public CProtocolFamilyBase
+	{
+public:
+	CProtocolFamilyInet6();
+	virtual ~CProtocolFamilyInet6();
+
+	virtual TInt Install();
+	virtual TUint ProtocolList(TServerProtocolDesc *& aProtocolList);
+	virtual CProtocolBase* NewProtocolL(TUint aSockType,TUint aProtocol);
+private:
+	CIfManager *iInterfacer;	// Interface Manager (created in Install())
+	};
+
+
+
+
+
+
+// Force export of non-mangled name
+extern "C" { IMPORT_C CProtocolFamilyBase *Install(void); }
+EXPORT_C CProtocolFamilyBase *Install()
+	{
+	return new CProtocolFamilyInet6;
+	}
+
+
+
+void Panic(TInet6Panic aPanic)
+	{
+	_LIT(KTcpIp6, "TCPIP6");
+	User::Panic(KTcpIp6, aPanic);
+	}
+
+
+CProtocolFamilyInet6::CProtocolFamilyInet6()
+	{
+	}
+
+CProtocolFamilyInet6::~CProtocolFamilyInet6()
+	{
+	delete iInterfacer;
+	}
+
+//
+// CProtocolFamilyInet6::Install
+// *****************************
+// The "non-leaving" Install() is called from ESOCK
+//
+TInt CProtocolFamilyInet6::Install()
+	{
+	TRAPD(err, iInterfacer = CIfManager::NewL());
+	return err;
+	}
+
+
+TUint CProtocolFamilyInet6::ProtocolList(TServerProtocolDesc *& aProtocolList)
+	{
+	// This function should be a leaving fn
+	// apparently it is OK for it to leave
+	TServerProtocolDesc *p = new (ELeave) TServerProtocolDesc[8]; // Esock catches this leave
+
+	IP6::Identify(p[0], KProtocolInet6Ip);
+	ICMP6::Identify(p[1], KProtocolInet6Icmp);
+	CProtocolUDP6::Describe(p[2]);
+	CProtocolTCP6::Describe(p[3]);
+	RES::Identify(p[4]);
+	//
+	// IPv4 versions of dual stack at end for the time being...
+	//
+	IP6::Identify(p[5], KProtocolInetIp);
+	ICMP6::Identify(p[6], KProtocolInetIcmp);
+	RAWIP::Identify(p[7]);
+	aProtocolList = p;
+	return 8;
+	}
+
+CProtocolBase* CProtocolFamilyInet6::NewProtocolL(TUint aSockType,TUint aProtocol)
+	{
+	if (iInterfacer)
+		{
+		// Is this test for Undefined protocol required? Does SocketServer
+		// already do this. Although, how can it know which of the datagram
+		// protocols (IP, IP6, ICMP, ICMP6 and UDP) is actually the preferred
+		// one...? -- msa
+		if (aProtocol == KUndefinedProtocol)
+			{
+			if (aSockType == KSockDatagram)
+				aProtocol = KProtocolInetUdp;
+			else if (aSockType == KSockStream)
+				aProtocol = KProtocolInetTcp;
+			else
+				goto no_support;
+			}
+
+		switch (aProtocol)
+			{
+		case KProtocolInet6Ip:	// IPv6 support for the dual stack
+		case KProtocolInetIp:	// IPv4 support for the dual stack
+			if (aSockType == KSockDatagram)
+				return IP6::NewL(iInterfacer, aProtocol);
+			break;
+		case KProtocolInetRawIp:
+			if (aSockType == KSockRaw)
+				return RAWIP::NewL();
+			break;
+		case KProtocolInet6Icmp:
+		case KProtocolInetIcmp:
+			if (aSockType == KSockDatagram)
+				return ICMP6::NewL(aProtocol);
+			break;
+		case KProtocolInetUdp:
+			if (aSockType == KSockDatagram)
+				return new (ELeave) CProtocolUDP6;
+			break;
+		case KProtocolInetTcp:
+			if (aSockType == KSockStream)
+				return new (ELeave) CProtocolTCP6;
+			break;
+		case KProtocolInet6Res:
+			return RES::NewL(iInterfacer);
+		default:
+			break;
+			}
+		}
+no_support:
+	User::Leave(KErrNotSupported);
+	// NOTREACHED
+	return 0;	// To keep compiler happy...
+	}