plugins/networking/winsockprt/src/wsp_protocolfamily.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/networking/winsockprt/src/wsp_protocolfamily.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,96 @@
+// wsp_protocolfamily.cpp
+// 
+// Copyright (c) 2002 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+
+#include <f32file.h>
+#undef SYMBIAN_ENABLE_SPLIT_HEADERS // More tb92 stopgaps, this time for es_sock_partner.h
+#include <winsockprt.h>
+#include <in_sock.h>
+#include "wsp_protocolfamily.h"
+#include "wsp_protocol.h"
+#include "wsp_log.h"
+
+
+CWinSockProtocolFamily::~CWinSockProtocolFamily()
+	{
+	WSP_LOG(WspLog::Write(_L("CWinSockProtocolFamily::~CWinSockProtocolFamily")));
+	if (iWin32Factory)
+		{
+		iWin32Factory->Close();
+		delete iWin32Factory;
+		}
+	WSP_LOG(WspLog::Close());
+	}
+
+CWinSockProtocolFamily::CWinSockProtocolFamily()
+	{
+	}
+
+CWinSockProtocolFamily* CWinSockProtocolFamily::NewL()
+	{
+	WSP_LOG(WspLog::Write(_L("CWinSockProtocolFamily::NewL")));
+	return new(ELeave) CWinSockProtocolFamily();
+	}
+
+TInt CWinSockProtocolFamily::Install()
+	{
+	return KErrNone;
+	}
+
+CProtocolBase* CWinSockProtocolFamily::NewProtocolL(TUint aSockType, TUint /*aProtocol*/)
+	{
+	WSP_LOG(WspLog::Printf(_L("CWinSockProtocolFamily::NewProtocolL, socket type: %d"), aSockType));
+	if (iWin32Factory == NULL)
+		{
+		RWin32Factory* factory = new(ELeave) RWin32Factory();
+		CleanupStack::PushL(factory);
+		User::LeaveIfError(factory->Open());
+		CleanupStack::Pop(factory);
+		iWin32Factory = factory;
+		}
+	return CWinSockProtocol::NewL(aSockType, *iWin32Factory);
+	}
+
+TUint CWinSockProtocolFamily::ProtocolList(TServerProtocolDesc*& aProtocolList)
+	{
+	TBool realTcpipActive(EFalse);
+	TRAP_IGNORE(realTcpipActive = RealTcpipActiveL());
+	const TInt numProtocols = realTcpipActive ? 2 : 5;
+	TRAPD(ret, aProtocolList=new(ELeave) TServerProtocolDesc[numProtocols]);
+	if (ret != KErrNone)
+		{
+		return 0;
+		}
+
+	CWinSockProtocol::ProtocolIdentity(&aProtocolList[0], KSockStream, KProtocolWinsockTcp);
+	CWinSockProtocol::ProtocolIdentity(&aProtocolList[1], KSockDatagram, KProtocolWinsockUdp);
+	if (!realTcpipActive)
+		{
+		CWinSockProtocol::ProtocolIdentity(&aProtocolList[2], KSockStream, KProtocolInetTcp);
+		CWinSockProtocol::ProtocolIdentity(&aProtocolList[3], KSockDatagram, KProtocolInetUdp);
+		CWinSockProtocol::ProtocolIdentity(&aProtocolList[4], KSockDatagram, KProtocolInetIp);
+		}
+	
+	return numProtocols;
+	}
+
+TBool CWinSockProtocolFamily::RealTcpipActiveL() const
+	{
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	TUint att;
+	_LIT(KTcpipEskFileName, "c:\\Private\\101f7989\\esock\\ip.tcpip.esk");
+	TBool active = (fs.Att(KTcpipEskFileName, att) == KErrNone);
+	CleanupStack::PopAndDestroy(&fs);
+	return active;
+	}