eapol/eapol_framework/eapol_symbian/am/common/symbian/EapPluginTools.cpp
branchRCL_3
changeset 18 bad0cc58d154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/am/common/symbian/EapPluginTools.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  Tools for plugin handling on Symbian.
+*
+*/
+
+/*
+* %version: 19 %
+*/
+
+#include <EapTraceSymbian.h>
+#include <EapTypePlugin.h>
+#include <ecom.h>
+
+#include "EapPluginTools.h"
+#include "EapAutomatic.h"
+
+/** @file */
+
+// ----------------------------------------------------------------------
+
+EXPORT_C EapPluginTools::EapPluginTools()
+{
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::EapPluginTools(): this=0x%08x.\n"),
+		this));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::EapPluginTools()"));
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C EapPluginTools::~EapPluginTools()
+{
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::~EapPluginTools(): this=0x%08x.\n"),
+		this));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::~EapPluginTools()"));
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C void EapPluginTools::CleanupImplArray( TAny* aAny )
+{
+	RImplInfoPtrArray* implArray = 
+		reinterpret_cast<RImplInfoPtrArray*>( aAny );
+
+	implArray->ResetAndDestroy();
+	implArray->Close();
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C void EapPluginTools::ListAllEapPluginsL(const TIndexType aIndexType, const TEapExpandedType & aTunnelingEapType, RPointerArray<TEapExpandedType> & aPlugins)
+{
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): this=0x%08x, aTunnelingEapType=0xfe%06x%08x.\n"),
+		this,
+		aTunnelingEapType.GetVendorId(),
+		aTunnelingEapType.GetVendorType()));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::ListAllEapPluginsL()"));
+
+	aPlugins.Reset();   // Reset this first
+
+	RImplInfoPtrArray aEapArray;
+
+	CleanupStack::PushL( TCleanupItem( CleanupImplArray, &aEapArray ) );
+
+	REComSession::ListImplementationsL( KEapTypeInterfaceUid, aEapArray );
+
+	// Checks which plugins are allowed inside the tunneling EAP-methods and which are allowed outer most EAP-methods.
+	for( TInt counter = 0; counter < aEapArray.Count(); counter++ )
+	{
+		TEapExpandedType plugin_type(aEapArray[counter]->DataType());
+
+		EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
+			counter,
+			plugin_type.GetVendorId(),
+			plugin_type.GetVendorType()));
+
+		TBool aNotAllowed(EFalse);
+
+		if (aIndexType == ELan
+			&& aTunnelingEapType == (*EapExpandedTypeNone.GetType()))
+		{
+			// Filter out the EAP types which are NOT allowed outside PEAP, TTLS or FAST on WLAN.
+			if( CEapTypePlugin::IsDisallowedOutsidePEAP( *aEapArray[counter] ) )
+			{
+				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedOutsidePEAP()\n"),
+					counter,
+					plugin_type.GetVendorId(),
+					plugin_type.GetVendorType()));
+
+				aNotAllowed = ETrue;
+			}
+		}
+		else if (aTunnelingEapType == (*EapExpandedTypePeap.GetType())
+			|| aTunnelingEapType == (*EapExpandedTypeFast.GetType()))
+		{
+			// Filter out the EAP types which are NOT allowed inside PEAP or FAST.
+			if( CEapTypePlugin::IsDisallowedInsidePEAP( *aEapArray[counter] ) )
+			{
+				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedInsidePEAP()\n"),
+					counter,
+					plugin_type.GetVendorId(),
+					plugin_type.GetVendorType()));
+
+				aNotAllowed = ETrue;
+			}
+		}
+		else if (aTunnelingEapType == (*EapExpandedTypeTtls.GetType()))
+		{
+			// Filter out the EAP types which are NOT allowed inside TTLS.
+			if( CEapTypePlugin::IsDisallowedInsideTTLS( *aEapArray[counter] ) )
+			{
+				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedInsideTTLS()\n"),
+					counter,
+					plugin_type.GetVendorId(),
+					plugin_type.GetVendorType()));
+
+				aNotAllowed = ETrue;
+			}
+		}
+
+		if (aNotAllowed)
+		{
+			EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): Removes EAP-plugin aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
+				counter,
+				plugin_type.GetVendorId(),
+				plugin_type.GetVendorType()));
+
+			// Delete the EAP type, which isn't allowed here from the array.
+			delete aEapArray[counter];
+			aEapArray.Remove( counter );
+
+			// One item removed from the array. So reduce the item counter.
+			counter--;
+		}
+	}
+
+	// Adds allowed EAP-methods to an array.
+	for (TInt ind = 0; ind < aEapArray.Count(); ind++ )
+	{
+		TEapExpandedType * eap_type = new TEapExpandedType;
+		if (eap_type != 0)
+		{
+			*eap_type = aEapArray[ind]->DataType();
+
+			EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
+				ind,
+				eap_type->GetVendorId(),
+				eap_type->GetVendorType()));
+
+			User::LeaveIfError( aPlugins.Append( eap_type ) );
+		}
+	}
+
+	CleanupStack::PopAndDestroy(&aEapArray);
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C void EapPluginTools::GetPrivatePathL(
+	RFs& aFileServerSession,
+	TFileName& aPrivateDatabasePathName)
+{
+	// Reads the private folder. Caller must connect file server before calling this function.
+
+	CleanupClosePushL(aFileServerSession);
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - calls aFileServerSession.PrivatePath()\n")));
+
+	aPrivateDatabasePathName.SetLength(0);
+
+	TInt error = aFileServerSession.PrivatePath(aPrivateDatabasePathName);
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - aFileServerSession.PrivatePath(), error=%d\n"), error));
+
+	User::LeaveIfError(error);
+
+	EAP_TRACE_DATA_DEBUG_SYMBIAN(("aPrivateDatabasePathName",
+		aPrivateDatabasePathName.Ptr(),
+		aPrivateDatabasePathName.Size()));
+
+	CleanupStack::Pop(&aFileServerSession);
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C void EapPluginTools::GetPrivatePathL(
+	TFileName& aPrivateDatabasePathName)
+{
+	// Reads the private folder.
+
+	RFs aFileServerSession;
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - calls aFileServerSession.Connect()\n")));
+
+	TInt error = aFileServerSession.Connect();
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - aFileServerSession.Connect(), error=%d\n"), error));
+
+	User::LeaveIfError(error);
+
+	EapPluginTools::GetPrivatePathL(
+		aFileServerSession,
+		aPrivateDatabasePathName);
+
+	aFileServerSession.Close();
+}
+
+// ----------------------------------------------------------------------
+
+EXPORT_C void EapPluginTools::CreateDatabaseLC(
+	RDbNamedDatabase& aDatabase,
+	RFs& aFileServerSession,
+	TInt& error,
+	const TDesC& aDatabaseName,
+	TFileName& aPrivateDatabasePathName)
+{
+	// Caller must connect file server before calling this function.
+
+	// aDatabase is pushed to the cleanup stack even though they may be member
+	// variables of the calling class and would be closed in the destructor anyway. This ensures
+	// that if they are not member variables they will be closed. Closing the handle twice
+	// does no harm.	
+	CleanupClosePushL(aFileServerSession);
+	CleanupClosePushL(aDatabase);
+
+	// Create the private database in the private folder of EAP-server.
+
+	EapPluginTools::GetPrivatePathL(
+		aFileServerSession,
+		aPrivateDatabasePathName);
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - calls aPrivateDatabasePathName.Append()\n")));
+
+	aPrivateDatabasePathName.Append(aDatabaseName);
+
+	EAP_TRACE_DATA_DEBUG_SYMBIAN(("aPrivateDatabasePathName",
+		aPrivateDatabasePathName.Ptr(),
+		aPrivateDatabasePathName.Size()));
+
+	User::LeaveIfError(error);
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - calls aDatabase.Create()\n")));
+
+	error = aDatabase.Create(aFileServerSession, aPrivateDatabasePathName);
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - Created private DB for %S. error=%d, (%d is KErrAlreadyExists)\n"),
+		&aDatabaseName,
+		error,
+		KErrAlreadyExists));
+}
+
+// ----------------------------------------------------------------------
+// End