eapol/eapol_framework/eapol_symbian/am/common/symbian/EapPluginTools.cpp
author hgs
Thu, 16 Sep 2010 13:07:04 +0300
changeset 49 43351a4f2da3
parent 34 ad1f037f1ac2
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
hgs
parents:
diff changeset
     1
/*
34
hgs
parents: 26
diff changeset
     2
* Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
26
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
34
hgs
parents: 26
diff changeset
    14
* Description:  Tools for plugin handling on Symbian.
26
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
/*
49
hgs
parents: 34
diff changeset
    19
* %version: 21 %
26
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <EapTraceSymbian.h>
hgs
parents:
diff changeset
    23
#include <EapTypePlugin.h>
hgs
parents:
diff changeset
    24
#include <ecom.h>
hgs
parents:
diff changeset
    25
34
hgs
parents: 26
diff changeset
    26
#include "EapPluginTools.h"
hgs
parents: 26
diff changeset
    27
#include "EapAutomatic.h"
hgs
parents: 26
diff changeset
    28
26
hgs
parents:
diff changeset
    29
/** @file */
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
EXPORT_C EapPluginTools::EapPluginTools()
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::EapPluginTools(): this=0x%08x.\n"),
hgs
parents:
diff changeset
    36
		this));
hgs
parents:
diff changeset
    37
	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::EapPluginTools()"));
hgs
parents:
diff changeset
    38
}
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
EXPORT_C EapPluginTools::~EapPluginTools()
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::~EapPluginTools(): this=0x%08x.\n"),
hgs
parents:
diff changeset
    45
		this));
hgs
parents:
diff changeset
    46
	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::~EapPluginTools()"));
hgs
parents:
diff changeset
    47
}
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
EXPORT_C void EapPluginTools::CleanupImplArray( TAny* aAny )
hgs
parents:
diff changeset
    52
{
hgs
parents:
diff changeset
    53
	RImplInfoPtrArray* implArray = 
hgs
parents:
diff changeset
    54
		reinterpret_cast<RImplInfoPtrArray*>( aAny );
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
	implArray->ResetAndDestroy();
hgs
parents:
diff changeset
    57
	implArray->Close();
hgs
parents:
diff changeset
    58
}
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
    61
34
hgs
parents: 26
diff changeset
    62
EXPORT_C void EapPluginTools::ListAllEapPluginsL(const TIndexType aIndexType, const TEapExpandedType & aTunnelingEapType, RPointerArray<TEapExpandedType> & aPlugins)
26
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): this=0x%08x, aTunnelingEapType=0xfe%06x%08x.\n"),
hgs
parents:
diff changeset
    65
		this,
hgs
parents:
diff changeset
    66
		aTunnelingEapType.GetVendorId(),
hgs
parents:
diff changeset
    67
		aTunnelingEapType.GetVendorType()));
hgs
parents:
diff changeset
    68
	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: EapPluginTools::ListAllEapPluginsL()"));
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	aPlugins.Reset();   // Reset this first
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
	RImplInfoPtrArray aEapArray;
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
	CleanupStack::PushL( TCleanupItem( CleanupImplArray, &aEapArray ) );
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
	REComSession::ListImplementationsL( KEapTypeInterfaceUid, aEapArray );
hgs
parents:
diff changeset
    77
34
hgs
parents: 26
diff changeset
    78
	// Checks which plugins are allowed inside the tunneling EAP-methods and which are allowed outer most EAP-methods.
26
hgs
parents:
diff changeset
    79
	for( TInt counter = 0; counter < aEapArray.Count(); counter++ )
hgs
parents:
diff changeset
    80
	{
hgs
parents:
diff changeset
    81
		TEapExpandedType plugin_type(aEapArray[counter]->DataType());
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
		EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
hgs
parents:
diff changeset
    84
			counter,
hgs
parents:
diff changeset
    85
			plugin_type.GetVendorId(),
hgs
parents:
diff changeset
    86
			plugin_type.GetVendorType()));
hgs
parents:
diff changeset
    87
49
hgs
parents: 34
diff changeset
    88
		TBool aAllowed(ETrue);
26
hgs
parents:
diff changeset
    89
34
hgs
parents: 26
diff changeset
    90
		if (aIndexType == ELan
hgs
parents: 26
diff changeset
    91
			&& aTunnelingEapType == (*EapExpandedTypeNone.GetType()))
26
hgs
parents:
diff changeset
    92
		{
34
hgs
parents: 26
diff changeset
    93
			// Filter out the EAP types which are NOT allowed outside PEAP, TTLS or FAST on WLAN.
26
hgs
parents:
diff changeset
    94
			if( CEapTypePlugin::IsDisallowedOutsidePEAP( *aEapArray[counter] ) )
hgs
parents:
diff changeset
    95
			{
hgs
parents:
diff changeset
    96
				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedOutsidePEAP()\n"),
hgs
parents:
diff changeset
    97
					counter,
hgs
parents:
diff changeset
    98
					plugin_type.GetVendorId(),
hgs
parents:
diff changeset
    99
					plugin_type.GetVendorType()));
hgs
parents:
diff changeset
   100
49
hgs
parents: 34
diff changeset
   101
				aAllowed = EFalse;
26
hgs
parents:
diff changeset
   102
			}
hgs
parents:
diff changeset
   103
		}
hgs
parents:
diff changeset
   104
		else if (aTunnelingEapType == (*EapExpandedTypePeap.GetType())
hgs
parents:
diff changeset
   105
			|| aTunnelingEapType == (*EapExpandedTypeFast.GetType()))
hgs
parents:
diff changeset
   106
		{
hgs
parents:
diff changeset
   107
			// Filter out the EAP types which are NOT allowed inside PEAP or FAST.
hgs
parents:
diff changeset
   108
			if( CEapTypePlugin::IsDisallowedInsidePEAP( *aEapArray[counter] ) )
hgs
parents:
diff changeset
   109
			{
hgs
parents:
diff changeset
   110
				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedInsidePEAP()\n"),
hgs
parents:
diff changeset
   111
					counter,
hgs
parents:
diff changeset
   112
					plugin_type.GetVendorId(),
hgs
parents:
diff changeset
   113
					plugin_type.GetVendorType()));
hgs
parents:
diff changeset
   114
49
hgs
parents: 34
diff changeset
   115
				aAllowed = EFalse;
26
hgs
parents:
diff changeset
   116
			}
hgs
parents:
diff changeset
   117
		}
hgs
parents:
diff changeset
   118
		else if (aTunnelingEapType == (*EapExpandedTypeTtls.GetType()))
hgs
parents:
diff changeset
   119
		{
hgs
parents:
diff changeset
   120
			// Filter out the EAP types which are NOT allowed inside TTLS.
hgs
parents:
diff changeset
   121
			if( CEapTypePlugin::IsDisallowedInsideTTLS( *aEapArray[counter] ) )
hgs
parents:
diff changeset
   122
			{
hgs
parents:
diff changeset
   123
				EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x, IsDisallowedInsideTTLS()\n"),
hgs
parents:
diff changeset
   124
					counter,
hgs
parents:
diff changeset
   125
					plugin_type.GetVendorId(),
hgs
parents:
diff changeset
   126
					plugin_type.GetVendorType()));
hgs
parents:
diff changeset
   127
49
hgs
parents: 34
diff changeset
   128
				aAllowed = EFalse;
26
hgs
parents:
diff changeset
   129
			}
hgs
parents:
diff changeset
   130
		}
49
hgs
parents: 34
diff changeset
   131
		else if (aTunnelingEapType != (*EapExpandedTypeNone.GetType()))
hgs
parents: 34
diff changeset
   132
		{
hgs
parents: 34
diff changeset
   133
			EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x is NOT allowed inside EAP-type=0xfe%06x%08x\n"),
hgs
parents: 34
diff changeset
   134
				counter,
hgs
parents: 34
diff changeset
   135
				plugin_type.GetVendorId(),
hgs
parents: 34
diff changeset
   136
				plugin_type.GetVendorType(),
hgs
parents: 34
diff changeset
   137
				aTunnelingEapType.GetVendorId(),
hgs
parents: 34
diff changeset
   138
				aTunnelingEapType.GetVendorType()));
26
hgs
parents:
diff changeset
   139
49
hgs
parents: 34
diff changeset
   140
			aAllowed = EFalse;
hgs
parents: 34
diff changeset
   141
		}
hgs
parents: 34
diff changeset
   142
hgs
parents: 34
diff changeset
   143
		if (!aAllowed)
26
hgs
parents:
diff changeset
   144
		{
hgs
parents:
diff changeset
   145
			EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): Removes EAP-plugin aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
hgs
parents:
diff changeset
   146
				counter,
hgs
parents:
diff changeset
   147
				plugin_type.GetVendorId(),
hgs
parents:
diff changeset
   148
				plugin_type.GetVendorType()));
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
			// Delete the EAP type, which isn't allowed here from the array.
hgs
parents:
diff changeset
   151
			delete aEapArray[counter];
hgs
parents:
diff changeset
   152
			aEapArray.Remove( counter );
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
			// One item removed from the array. So reduce the item counter.
hgs
parents:
diff changeset
   155
			counter--;
hgs
parents:
diff changeset
   156
		}
hgs
parents:
diff changeset
   157
	}
hgs
parents:
diff changeset
   158
34
hgs
parents: 26
diff changeset
   159
	// Adds allowed EAP-methods to an array.
26
hgs
parents:
diff changeset
   160
	for (TInt ind = 0; ind < aEapArray.Count(); ind++ )
hgs
parents:
diff changeset
   161
	{
hgs
parents:
diff changeset
   162
		TEapExpandedType * eap_type = new TEapExpandedType;
hgs
parents:
diff changeset
   163
		if (eap_type != 0)
hgs
parents:
diff changeset
   164
		{
hgs
parents:
diff changeset
   165
			*eap_type = aEapArray[ind]->DataType();
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
			EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::ListAllEapPluginsL(): aEapArray[%d] EAP-type=0xfe%06x%08x\n"),
hgs
parents:
diff changeset
   168
				ind,
hgs
parents:
diff changeset
   169
				eap_type->GetVendorId(),
hgs
parents:
diff changeset
   170
				eap_type->GetVendorType()));
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
			User::LeaveIfError( aPlugins.Append( eap_type ) );
hgs
parents:
diff changeset
   173
		}
hgs
parents:
diff changeset
   174
	}
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
	CleanupStack::PopAndDestroy(&aEapArray);
hgs
parents:
diff changeset
   177
}
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
EXPORT_C void EapPluginTools::GetPrivatePathL(
hgs
parents:
diff changeset
   182
	RFs& aFileServerSession,
hgs
parents:
diff changeset
   183
	TFileName& aPrivateDatabasePathName)
hgs
parents:
diff changeset
   184
{
34
hgs
parents: 26
diff changeset
   185
	// Reads the private folder. Caller must connect file server before calling this function.
26
hgs
parents:
diff changeset
   186
34
hgs
parents: 26
diff changeset
   187
	CleanupClosePushL(aFileServerSession);
26
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - calls aFileServerSession.PrivatePath()\n")));
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
	aPrivateDatabasePathName.SetLength(0);
hgs
parents:
diff changeset
   192
34
hgs
parents: 26
diff changeset
   193
	TInt error = aFileServerSession.PrivatePath(aPrivateDatabasePathName);
26
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - aFileServerSession.PrivatePath(), error=%d\n"), error));
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
	User::LeaveIfError(error);
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
	EAP_TRACE_DATA_DEBUG_SYMBIAN(("aPrivateDatabasePathName",
hgs
parents:
diff changeset
   200
		aPrivateDatabasePathName.Ptr(),
hgs
parents:
diff changeset
   201
		aPrivateDatabasePathName.Size()));
34
hgs
parents: 26
diff changeset
   202
hgs
parents: 26
diff changeset
   203
	CleanupStack::Pop(&aFileServerSession);
26
hgs
parents:
diff changeset
   204
}
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
EXPORT_C void EapPluginTools::GetPrivatePathL(
hgs
parents:
diff changeset
   209
	TFileName& aPrivateDatabasePathName)
hgs
parents:
diff changeset
   210
{
hgs
parents:
diff changeset
   211
	// Reads the private folder.
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
	RFs aFileServerSession;
hgs
parents:
diff changeset
   214
34
hgs
parents: 26
diff changeset
   215
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - calls aFileServerSession.Connect()\n")));
hgs
parents: 26
diff changeset
   216
hgs
parents: 26
diff changeset
   217
	TInt error = aFileServerSession.Connect();
hgs
parents: 26
diff changeset
   218
hgs
parents: 26
diff changeset
   219
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::GetPrivatePathL(): - aFileServerSession.Connect(), error=%d\n"), error));
hgs
parents: 26
diff changeset
   220
hgs
parents: 26
diff changeset
   221
	User::LeaveIfError(error);
hgs
parents: 26
diff changeset
   222
26
hgs
parents:
diff changeset
   223
	EapPluginTools::GetPrivatePathL(
hgs
parents:
diff changeset
   224
		aFileServerSession,
hgs
parents:
diff changeset
   225
		aPrivateDatabasePathName);
34
hgs
parents: 26
diff changeset
   226
hgs
parents: 26
diff changeset
   227
	aFileServerSession.Close();
26
hgs
parents:
diff changeset
   228
}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
EXPORT_C void EapPluginTools::CreateDatabaseLC(
hgs
parents:
diff changeset
   233
	RDbNamedDatabase& aDatabase,
hgs
parents:
diff changeset
   234
	RFs& aFileServerSession,
hgs
parents:
diff changeset
   235
	TInt& error,
hgs
parents:
diff changeset
   236
	const TDesC& aDatabaseName,
hgs
parents:
diff changeset
   237
	TFileName& aPrivateDatabasePathName)
hgs
parents:
diff changeset
   238
{
34
hgs
parents: 26
diff changeset
   239
	// Caller must connect file server before calling this function.
26
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
	// aDatabase is pushed to the cleanup stack even though they may be member
hgs
parents:
diff changeset
   242
	// variables of the calling class and would be closed in the destructor anyway. This ensures
hgs
parents:
diff changeset
   243
	// that if they are not member variables they will be closed. Closing the handle twice
hgs
parents:
diff changeset
   244
	// does no harm.	
34
hgs
parents: 26
diff changeset
   245
	CleanupClosePushL(aFileServerSession);
hgs
parents: 26
diff changeset
   246
	CleanupClosePushL(aDatabase);
26
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
	// Create the private database in the private folder of EAP-server.
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
	EapPluginTools::GetPrivatePathL(
hgs
parents:
diff changeset
   251
		aFileServerSession,
hgs
parents:
diff changeset
   252
		aPrivateDatabasePathName);
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - calls aPrivateDatabasePathName.Append()\n")));
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
	aPrivateDatabasePathName.Append(aDatabaseName);
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
	EAP_TRACE_DATA_DEBUG_SYMBIAN(("aPrivateDatabasePathName",
hgs
parents:
diff changeset
   259
		aPrivateDatabasePathName.Ptr(),
hgs
parents:
diff changeset
   260
		aPrivateDatabasePathName.Size()));
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
	User::LeaveIfError(error);
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - calls aDatabase.Create()\n")));
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
	error = aDatabase.Create(aFileServerSession, aPrivateDatabasePathName);
hgs
parents:
diff changeset
   267
49
hgs
parents: 34
diff changeset
   268
	EAP_TRACE_DEBUG_SYMBIAN((_L("EapPluginTools::CreateDatabaseLC(): - Created private DB for %S. error=%d, (%d is KErrAlreadyExists, %d is KErrInUse)\n"),
26
hgs
parents:
diff changeset
   269
		&aDatabaseName,
hgs
parents:
diff changeset
   270
		error,
49
hgs
parents: 34
diff changeset
   271
		KErrAlreadyExists,
hgs
parents: 34
diff changeset
   272
		KErrInUse));
26
hgs
parents:
diff changeset
   273
}
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
// ----------------------------------------------------------------------
hgs
parents:
diff changeset
   276
// End