eapol/eapol_framework/wapi_symbian/wapi_core/symbian/wapi_am_core_symbian.cpp
changeset 17 8840d3e38314
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/wapi_symbian/wapi_core/symbian/wapi_am_core_symbian.cpp	Fri Mar 19 09:29:58 2010 +0200
@@ -0,0 +1,3926 @@
+/*
+* ============================================================================
+*  Name        : ./accesssec/eapol/eapol_framework/wapi_symbian/wapi_core/symbian/wapi_am_core_symbian.cpp
+*  Part of     : WAPI / WAPI       *** Info from the SWAD
+*  Description : WAPI authentication
+*  Version     : %version: 78.1.7 % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2001-2009 Nokia.  All rights reserved.
+*  This material, including documentation and any related computer
+*  programs, is protected by copyright controlled by Nokia.  All
+*  rights are reserved.  Copying, including reproducing, storing,
+*  adapting or translating, any or all of this material requires the
+*  prior written consent of Nokia.  This material also contains
+*  confidential information which may not be disclosed to others
+*  without the prior written consent of Nokia.
+* ============================================================================
+* Template version: 4.1.1
+*/
+
+// This is enumeration of EAPOL source code.
+#if defined(USE_WAPI_MINIMUM_RELEASE_TRACES)
+	#undef WAPI_FILE_NUMBER_ENUM
+	#define WAPI_FILE_NUMBER_ENUM 148 
+	#undef WAPI_FILE_NUMBER_DATE 
+	#define WAPI_FILE_NUMBER_DATE 1127594498 
+#endif //#if defined(USE_WAPI_MINIMUM_RELEASE_TRACES)
+
+// INCLUDE FILES
+
+#include <f32file.h>
+#include <mmtsy_names.h>
+#include <utf.h>   
+#include "eap_am_memory.h"
+
+#include "eap_variable_data.h"
+#include "eap_automatic_variable.h"
+#include "eap_tools.h"
+#include "eap_type_all.h"
+
+#include "eapol_ethernet_header.h"
+#include "ethernet_core.h"
+#include "eap_am_tools_symbian.h"
+#include "abs_eap_am_tools.h"
+#include "WapiDbDefaults.h"
+#include "eap_crypto_api.h"
+#include "eap_header_string.h"
+#include "eap_am_file_input_symbian.h"
+#include "eap_rogue_ap_entry.h"
+#include "abs_eap_state_notification.h"
+#include "eapol_session_key.h"
+#include "eap_buffer.h"
+#include "eap_config.h"
+#include "wapi_am_core_symbian.h"
+#include "abs_wapi_am_core.h"
+#include "abs_ec_am_certificate_store.h"
+#include "certificate_store_db_symbian.h"
+#include "ec_cs_tlv_header.h"
+#include "eap_array_algorithms.h"
+#include "ec_certificate_store.h"
+#include "wapi_asn1_der_parser.h"
+#include "wapi_core.h"
+
+#if defined(USE_WAPI_FILECONFIG)
+	#include "eap_file_config.h"
+#endif //#if defined(USE_EAP_FILECONFIG)
+
+#if defined (USE_EAPOL_KEY_STATE) 
+	#include "eapol_key_state.h"	
+#endif
+
+#if defined( WAPI_USE_UI_NOTIFIER )   		        
+#include "wapnotifier_struct.h"
+#endif
+
+
+// LOCAL CONSTANTS
+const TUint KMaxConfigStringLength = 256;
+
+const TUint KMaxDeviceSeedLength = RMobilePhone::KPhoneManufacturerIdSize+
+RMobilePhone::KPhoneModelIdSize+
+//RMobilePhone::KPhoneRevisionIdSize+
+RMobilePhone::KPhoneSerialNumberSize;
+const TUint KMaxDeviceSeedSize = 2*KMaxDeviceSeedLength;
+
+// ================= MEMBER FUNCTIONS =======================
+
+wapi_am_core_symbian_c::wapi_am_core_symbian_c(
+	abs_eap_am_tools_c *const aTools,
+	abs_wapi_am_core_c * const aPartner,
+	const bool aIsClientWhenTrue ) 
+    : CActive( CActive::EPriorityStandard )
+    , iState( EWapiStatesNumber )
+    , iAmTools( aTools )
+    , iInReferences( iAmTools )
+    , iReferencesAndDataBlocks( iAmTools )    
+    , iPartner( aPartner )
+    , iCertStorePartner( NULL )
+    , iCertificateStoreDb( NULL )
+    , iCsPassword ( iAmTools )
+    , iCancelCalled( EFalse )
+    , m_authentication_counter(0u)
+    , m_successful_authentications(0u)
+    , m_failed_authentications(0u)
+    , m_is_valid(false)
+    , m_is_client(aIsClientWhenTrue)
+    , m_first_authentication(true)
+    , m_self_disassociated(false)
+    , m_fileconfig(0)
+    , iEapVarData(iAmTools)
+    {
+    }	
+
+//--------------------------------------------------
+
+wapi_am_core_symbian_c::wapi_am_core_symbian_c(
+	abs_eap_am_tools_c *const aTools,
+	abs_wapi_am_core_c *const aPartner,
+	CCertificateStoreDatabase *aCertificateStoreDb,
+    const bool aIsClientWhenTrue)
+    : CActive( CActive::EPriorityStandard )
+    , iState( EWapiStatesNumber )
+    , iAmTools( aTools )
+    , iInReferences( iAmTools )
+    , iReferencesAndDataBlocks( iAmTools )    
+    , iPartner( aPartner )
+    , iCertStorePartner( NULL )
+    , iCertificateStoreDb( aCertificateStoreDb )
+    , iCsPassword ( iAmTools )
+    , iCancelCalled( EFalse )
+    , m_authentication_counter(0u)
+    , m_successful_authentications(0u)
+    , m_failed_authentications(0u)
+    , m_is_valid(false)
+    , m_is_client(aIsClientWhenTrue)
+    , m_first_authentication(true)
+    , m_self_disassociated(false)
+    , m_fileconfig(0)
+    , iEapVarData(iAmTools)
+    {
+    }   
+	
+
+void wapi_am_core_symbian_c::ConstructL()
+{
+	if (iPartner == 0)
+	{
+		User::Leave(KErrGeneral);
+	}
+	// Activate Scheduler
+    CActiveScheduler::Add( this );
+
+    if (iAmTools->configure() != eap_status_ok)
+	{
+		User::Leave(KErrGeneral);
+	}
+
+	iWapiDeviceSeed  = new (ELeave) eap_variable_data_c(iAmTools);
+
+	iWapiDeviceSeed->reset();
+
+	iImportedFilenames.Reset();
+		
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("WAPI INITIALISATION\n")));	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("====================\n")));	
+
+    EAP_TRACE_ALWAYS(
+        iAmTools,
+        TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
+        (EAPL("wapi_am_core_symbian_c::ConstructL: %s: \n"),
+        (m_is_client == true ? "client": "server")));
+
+	// Create the cert store if it wasn't passed as a parameter
+	if ( iCertificateStoreDb == NULL )
+	    {
+	    iCertificateStoreDb = CCertificateStoreDatabase::NewL( iAmTools );
+	    }
+	
+	m_ssid = new (ELeave) eap_variable_data_c(iAmTools);
+
+	// reset sertificate array
+	iCertArray.Reset();
+	
+	if (m_is_client)
+	    {
+#if defined(USE_WAPI_FILECONFIG)
+	    {
+		EAP_TRACE_DEBUG(
+			iAmTools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("Initialize file configuration.\n")));
+			eap_am_file_input_symbian_c fileio(iAmTools);
+
+		eap_variable_data_c file_name_c_data(iAmTools);
+
+		eap_status_e status(eap_status_process_general_error);
+
+		eap_const_string const FILECONFIG_FILENAME_C
+		= "c:\\system\\data\\wapi.conf";
+
+		status = file_name_c_data.set_copy_of_buffer(
+		        FILECONFIG_FILENAME_C,
+		        iAmTools->strlen(FILECONFIG_FILENAME_C));
+		if (status != eap_status_ok)
+		    {
+		    EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+		    User::Leave(iAmTools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(iAmTools, status)));
+		    }
+
+		status = file_name_c_data.add_end_null();
+		if (status != eap_status_ok)
+		    {
+		    EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+		    User::Leave(iAmTools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(iAmTools, status)));
+		    }
+    
+
+		eap_variable_data_c file_name_z_data(iAmTools);
+
+		eap_const_string const FILECONFIG_FILENAME_Z
+            = "z:\\private\\101F8EC5\\wapi.conf";
+
+		status = file_name_z_data.set_copy_of_buffer(
+		        FILECONFIG_FILENAME_Z,
+				iAmTools->strlen(FILECONFIG_FILENAME_Z));
+		if (status != eap_status_ok)
+			{
+			EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+			User::Leave(iAmTools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(iAmTools, status)));
+			}
+
+		status = file_name_z_data.add_end_null();
+		if (status != eap_status_ok)
+		    {
+		    EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+		    User::Leave(iAmTools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(iAmTools, status)));
+			}
+		
+
+		if (status == eap_status_ok)
+		    {
+			// First try open from C: disk.
+			status = fileio.file_open(
+				&file_name_c_data,
+				eap_file_io_direction_read);
+			if (status == eap_status_ok)
+			    {
+				EAP_TRACE_DEBUG(
+					iAmTools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("Opens configure file %s\n"),
+					file_name_c_data.get_data(file_name_c_data.get_data_length())));
+			    }
+			else if (status != eap_status_ok)
+			    {
+				// Second try open from Z: disk.
+				status = fileio.file_open(
+					&file_name_z_data,
+					eap_file_io_direction_read);
+				if (status == eap_status_ok)
+				    {
+					EAP_TRACE_DEBUG(
+						iAmTools,
+						TRACE_FLAGS_DEFAULT,
+						(EAPL("Opens configure file %s\n"),
+						 file_name_z_data.get_data(file_name_z_data.get_data_length())));
+				    }
+			    }
+
+			if (status == eap_status_ok)
+			    {
+				// Some of the files were opened.
+
+				m_fileconfig = new eap_file_config_c(iAmTools);
+				if (m_fileconfig != 0
+					&& m_fileconfig->get_is_valid() == true)
+				    {
+					status = m_fileconfig->configure(&fileio);
+					if (status != eap_status_ok)
+					    {
+						EAP_TRACE_DEBUG(
+							iAmTools,
+							TRACE_FLAGS_DEFAULT,
+							(EAPL("ERROR: Configure read from %s failed.\n"),
+							file_name_c_data.get_data(file_name_c_data.get_data_length())));
+					    }
+					else
+					    {
+						EAP_TRACE_DEBUG(
+							iAmTools,
+							TRACE_FLAGS_DEFAULT,
+							(EAPL("Configure read from %s\n"),
+							file_name_c_data.get_data(file_name_c_data.get_data_length())));
+					    }
+				    }
+				else
+				    {
+					// No file configuration.
+					delete m_fileconfig;
+					m_fileconfig = 0;
+
+					EAP_TRACE_DEBUG(
+						iAmTools,
+						TRACE_FLAGS_DEFAULT,
+						(EAPL("ERROR: Cannot create configure object for file %s\n"),
+						file_name_c_data.get_data(file_name_c_data.get_data_length())));
+				    }
+			    }
+			else
+			    {
+				EAP_TRACE_DEBUG(
+					iAmTools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("ERROR: Cannot open configure file neither %s nor %s\n"),
+					file_name_c_data.get_data(file_name_c_data.get_data_length()),
+					file_name_z_data.get_data(file_name_z_data.get_data_length())));
+			    }
+		    }
+	    }
+
+#endif //#if defined(USE_WAPI_FILECONFIG)
+
+#if defined(USE_WAPI_HARDWARE_TRACE)
+		// Disable traces.
+		iAmTools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
+
+		eap_variable_data_c trace_output_file(iAmTools);
+
+		eap_status_e status = read_configure(
+			cf_str_EAP_TRACE_output_file_name.get_field(),
+			&trace_output_file);
+		if (status == eap_status_ok
+			&& trace_output_file.get_is_valid_data() == true)
+		    {
+			status = iAmTools->set_trace_file_name(&trace_output_file);
+			if (status == eap_status_ok)
+			    {
+				// OK, set the default trace mask.
+				iAmTools->set_trace_mask(
+					eap_am_tools_c::eap_trace_mask_debug
+					| eap_am_tools_c::eap_trace_mask_always
+					| eap_am_tools_c::eap_trace_mask_error);
+			    }
+		    }
+#endif //#if defined(USE_WAPI_HARDWARE_TRACE)
+
+
+    EAP_TRACE_DEBUG(
+        iAmTools,
+        TRACE_FLAGS_DEFAULT,
+        (EAPL("To Configure wapi_am_core_symbian_c\n")));
+        
+		eap_status_e status = configure();
+		if (status != eap_status_ok)
+		    {
+			User::Leave(KErrGeneral);
+		    }
+        
+	    }	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("Configured WAPI AM...\n")));
+
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("Created timer...\n")));
+
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("========================\n")));
+
+	set_is_valid();
+
+#if defined( WAPI_USE_UI_NOTIFIER )	
+    TInt err = iNotifier.Connect();
+    if ( err != KErrNone )
+        {
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    		"ERROR: wapi_am_core_symbian_c::ConstructL() \
+    		Failed to connect to notifier server, err=%d.\n" ), err ) );	
+        return;
+        }
+    if ( !iNotifierDataToUser )
+    	{
+    	iNotifierDataToUser = new(ELeave) TWapiUiNotifierInfo;	
+    	}
+	if ( !iNotifierDataPckgToUser )
+		{
+		iNotifierDataPckgToUser = new(ELeave) TPckg<TWapiUiNotifierInfo> (*iNotifierDataToUser);	
+		}
+	if ( !iNotifierDataFromUser )
+		{
+		iNotifierDataFromUser = new(ELeave) TWapiUiNotifierInfo;
+		}
+	if ( !iNotifierDataPckgFromUser )
+		{
+		iNotifierDataPckgFromUser = new(ELeave) TPckg<TWapiUiNotifierInfo> (*iNotifierDataFromUser);			
+		}
+#endif
+
+    } // wapi_am_core_symbian_c::ConstructL()
+
+
+//--------------------------------------------------
+
+void wapi_am_core_symbian_c::set_am_certificate_store_partner(abs_ec_am_certificate_store_c * const partner)
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+          "wapi_am_core_symbian_c::set_am_certificate_store_partner" ) ) );
+	iCertStorePartner = partner;
+	 
+    }
+
+//--------------------------------------------------
+
+wapi_am_core_symbian_c* wapi_am_core_symbian_c::NewL(
+	abs_eap_am_tools_c* const aTools,
+	abs_wapi_am_core_c * const aPartner,
+	const bool aIsClient)
+    {
+	wapi_am_core_symbian_c* self = new(ELeave) wapi_am_core_symbian_c(
+		aTools, aPartner, aIsClient );
+	CleanupStack::PushL(self);
+	self->ConstructL();
+
+	if (self->get_is_valid() != true)
+	    {
+		User::Leave(KErrGeneral);
+	    }
+
+	CleanupStack::Pop();
+	return self;
+    }
+
+wapi_am_core_symbian_c* wapi_am_core_symbian_c::NewL(
+	abs_eap_am_tools_c* const aTools,
+    abs_wapi_am_core_c * const aPartner,
+    CCertificateStoreDatabase* aCertificateStoreDb,
+    const bool aIsClient)
+    {
+    wapi_am_core_symbian_c* self = new(ELeave) wapi_am_core_symbian_c(
+        aTools, aPartner, aCertificateStoreDb, aIsClient);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    if (self->get_is_valid() != true)
+        {
+        User::Leave(KErrGeneral);
+        }
+
+    CleanupStack::Pop();
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::~wapi_am_core_symbian_c()
+// ---------------------------------------------------------
+//
+wapi_am_core_symbian_c::~wapi_am_core_symbian_c()
+    {
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::~wapi_am_core_symbian_c IN\n" ) ) );
+
+	if (m_is_client)
+	    {
+#if defined(USE_EAP_FILECONFIG)
+	    delete m_fileconfig;
+	    m_fileconfig = 0;
+#endif //#if defined(USE_EAP_FILECONFIG)
+	    }
+	delete iWapiDeviceSeed;
+	    	
+#if defined( WAPI_USE_UI_NOTIFIER )	        
+	iNotifier.Close();
+    delete iNotifierDataToUser;
+    delete iNotifierDataPckgToUser;	
+	delete iNotifierDataFromUser;
+	delete iNotifierDataPckgFromUser;
+#endif // WAPI_USE_UI_NOTIFIER
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::~wapi_am_core_symbian_c OUT\n" ) ) );
+
+    } // wapi_am_core_symbian_c::~wapi_am_core_symbian_c()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::shutdown()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::shutdown()
+    {
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("wapi_am_core_symbian_c::shutdown()\n")));
+
+	// cancel asynch. request of AO
+	iCancelCalled = ETrue;
+	if ( IsActive() )
+		{
+		Cancel();
+		}
+	// Cancel timer	
+	cancel_timer(this, EWapiInitCertificateStoreTimerId);
+    cancel_timer(this, EWapiAddCertificateFileTimerId);
+    cancel_timer(this, EWapiReadCertificateStoreDataTimerId);
+    cancel_timer(this, EWapiWriteCertificateStoreDataTimerId);
+
+   delete m_ssid;
+   m_ssid = NULL;
+   
+   EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("wapi_am_core_symbian_c::shutdown() delete Arrays\n")));
+
+   TInt count=0;
+   while (count < iCertArray.Count())
+       {
+       if (iCertArray[count].iData != NULL)
+           {
+           delete iCertArray[count].iData;
+           iCertArray[count].iData = NULL;
+           }
+       if (iCertArray[count].iReference != NULL)
+           {
+           delete iCertArray[count].iReference;
+           iCertArray[count].iReference= NULL;
+           }
+       count ++;
+       }
+		
+
+	iCertArray.Reset();
+
+	delete m_fileconfig;
+	m_fileconfig = 0;
+	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("WAPI EXITING.\n")));
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);	
+
+	return eap_status_ok;
+	
+    } // wapi_am_core_symbian_c::shutdown()
+
+
+// ================= protected: from CActive =======================
+    
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::RunL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::RunL()
+    {
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"wapi_am_core_symbian_c::RunL() IN, iStatus=%d, iState=%d.\n"),
+		iStatus.Int(), iState ) );
+
+	if ( iStatus.Int() != KErrNone )
+	    {
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	        "ERROR: wapi_am_core_symbian_c::RunL() iStatus=%d" ),
+	        iStatus.Int() ) );
+		return;
+	    }
+	  
+    if ( iState == EWapiHandlingDeviceSeedQueryState )
+		{
+	    CompleteHandlingDeviceSeedQueryState();	    
+        iState = EWapiStatesNumber;
+		}
+#if defined( WAPI_USE_UI_NOTIFIER )   		        
+    else if ( iState == EWapiQueryCertFilePasswordState )
+    	{
+        CompleteQueryCertFilePassword();
+    	}
+    else if ( iState == EWapiQueryImportFilePasswordState )
+    	{
+        CompleteQueryImportFilePassword();
+    	}
+#endif // WAPI_USE_UI_NOTIFIER 
+    else
+    	{
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "ERROR: wapi_am_core_symbian_c::RunL() State is not supported, \
+		    iState = %d." ), iState ) );
+    	}
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::RunL() OUT.\n" ) ) );
+    
+    } // wapi_am_core_symbian_c::RunL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::DoCancel()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::DoCancel()
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::DoCancel() IN\n" ) ) );
+
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+#if defined( WAPI_USE_UI_NOTIFIER )   		        
+	iNotifier.CancelNotifier( KWapiNotifierUid );
+#endif
+	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("wapi_am_core_symbian_c::DoCancel()\n")));
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::DoCancel() OUT\n" ) ) );
+
+    }
+
+//--------------------------------------------------
+
+void wapi_am_core_symbian_c::set_is_valid()
+    {
+	m_is_valid = true;
+    }
+
+bool wapi_am_core_symbian_c::get_is_valid()
+    {
+	return m_is_valid;
+    }
+
+//--------------------------------------------------
+
+//
+void wapi_am_core_symbian_c::state_notification(const abs_eap_state_notification_c * const state)
+{
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+	if(state->get_protocol_layer() == eap_protocol_layer_general)
+	    {
+		if (state->get_current_state() == eap_general_state_authentication_cancelled)
+		    {
+			// Authentication was cancelled. Cannot continue.
+			EAP_TRACE_DEBUG(
+				iAmTools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("Authentication was cancelled. WAPI_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
+
+            }
+		else if (state->get_current_state() == eap_general_state_configuration_error)
+		    {
+			// Configuration error. Cannot continue.
+			EAP_TRACE_DEBUG(
+				iAmTools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("Configuration error. WAPI_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
+
+		    }
+	    }
+
+	
+	if(state->get_protocol_layer() == eap_protocol_layer_eapol)
+	{
+		switch (state->get_current_state())
+		{
+		case eapol_state_no_start_response:
+			EAP_TRACE_DEBUG(
+				iAmTools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("Indication NOT sent to WLM: ENoResponse.\n")));
+			break;
+		default:
+			break;
+		}
+	}
+	else if(state->get_protocol_layer() == eap_protocol_layer_eapol_key)
+	{
+		switch (state->get_current_state())
+		{
+		case eapol_key_state_802_11i_authentication_terminated_unsuccessfull:
+			{					
+
+				// Consider WAPI layer failures fatal.
+				EAP_TRACE_ERROR(
+					iAmTools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("ERROR: Unsuccessful authentication on WAPI level.\n")));
+				EAP_TRACE_DEBUG(
+					iAmTools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("Indication NOT sent to WLM: EThisAPFailed.\n")));
+			}
+			break;
+		case eapol_key_state_802_11i_authentication_finished_successfull:
+			{					
+				EAP_TRACE_ALWAYS(
+					iAmTools,
+					TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
+					(EAPL("EAPOL_KEY: %s: Authentication SUCCESS\n"),
+					(m_is_client == true ? "client": "server")));
+			}
+			break;
+		default:
+			break;
+		}
+	}	
+	
+
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+}
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::timer_expired()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::timer_expired(
+	const u32_t id, void * /* data */)
+    {
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"wapi_am_core_symbian_c::timer_expired() IN, id = %d.\n"),
+		id ) );
+	
+	iWapiCompletionStatus = eap_status_ok;
+	eap_status_e status = eap_status_ok;
+	switch ( id )
+	    {
+	    case EWapiInitCertificateStoreTimerId:
+	    	{
+	    	status = ProcessInitCertificateStore();
+	    	break;
+	    	}
+	    case EWapiAddCertificateFileTimerId:
+	    	{
+	        status = ProcessAddCertificateFile();
+	        break;
+	    	}
+	    case EWapiReadCertificateStoreDataTimerId:
+	    	{	        
+            status = ProcessReadCertificateStoreData();
+            break;
+	    	}
+	    case EWapiWriteCertificateStoreDataTimerId:
+	    	{
+            status = ProcessWriteCertificateStoreData();
+            break;	    	
+	    	}
+	    default:
+	    	{
+	    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+			    "ERROR: wapi_am_core_symbian_c::timer_expired() unknown \
+			    id = %d.\n"), id ) );
+	    	}
+	    } // switch
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::timer_expired() OUT, status = %d.\n" ),
+	    status ) );
+	return status;
+
+    } // wapi_am_core_symbian_c::timer_expired()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::timer_delete_data()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::timer_delete_data(
+	const u32_t id, void *data)
+    {
+    return eap_status_ok;
+    }
+//--------------------------------------------------
+
+EAP_FUNC_EXPORT eap_status_e wapi_am_core_symbian_c::configure()
+    {	
+	EAP_TRACE_DEBUG(
+		iAmTools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("wapi_am_core_symbian_c::configure()\n")));
+
+
+	//----------------------------------------------------------
+	{		
+		eap_variable_data_c EAP_TRACE_disable_traces(iAmTools);
+
+		eap_status_e status = read_configure(
+			cf_str_EAP_TRACE_disable_traces.get_field(),
+			&EAP_TRACE_disable_traces);
+		if (status == eap_status_ok
+			&& EAP_TRACE_disable_traces.get_is_valid_data() == true)
+		    {
+			u32_t *disable_traces = reinterpret_cast<u32_t *>(
+				EAP_TRACE_disable_traces.get_data(sizeof(u32_t)));
+			if (disable_traces != 0
+				&& *disable_traces != 0)
+			    {
+				iAmTools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
+			    }
+			else
+			    {
+				// OK, set the default trace mask.
+				iAmTools->set_trace_mask(
+					eap_am_tools_c::eap_trace_mask_debug
+					| eap_am_tools_c::eap_trace_mask_always
+					| eap_am_tools_c::eap_trace_mask_error);
+			    }
+		    }
+	}
+
+	//----------------------------------------------------------
+
+	{		
+		eap_variable_data_c EAP_TRACE_activate_only_trace_masks_always_and_error(iAmTools);
+
+		eap_status_e status = read_configure(
+			cf_str_EAP_TRACE_activate_only_trace_masks_always_and_error.get_field(),
+			&EAP_TRACE_activate_only_trace_masks_always_and_error);
+		if (status == eap_status_ok
+			&& EAP_TRACE_activate_only_trace_masks_always_and_error.get_is_valid_data() == true)
+		    {
+			u32_t *activate_trace_mask_always
+				= reinterpret_cast<u32_t *>(
+					EAP_TRACE_activate_only_trace_masks_always_and_error.get_data(
+						sizeof(u32_t)));
+			if (activate_trace_mask_always != 0
+				&& *activate_trace_mask_always != 0)
+			    {
+				iAmTools->set_trace_mask(
+					eap_am_tools_c::eap_trace_mask_always
+					| eap_am_tools_c::eap_trace_mask_error
+					);
+			    }
+		    }
+	}
+
+	//----------------------------------------------------------
+
+	{		
+		eap_variable_data_c EAP_TRACE_activate_trace_on_error(iAmTools);
+
+		eap_status_e status = read_configure(
+			cf_str_EAP_TRACE_activate_trace_on_error.get_field(),
+			&EAP_TRACE_activate_trace_on_error);
+		if (status == eap_status_ok
+			&& EAP_TRACE_activate_trace_on_error.get_is_valid_data() == true)
+		    {
+			u32_t *activate_trace_on_error = reinterpret_cast<u32_t *>(
+				EAP_TRACE_activate_trace_on_error.get_data(sizeof(u32_t)));
+			if (activate_trace_on_error != 0
+				&& *activate_trace_on_error != 0)
+			    {
+				iAmTools->set_activate_trace_on_error();
+			    }
+		    }
+	}
+
+    //----------------------------------------------------------
+    {       
+        eap_variable_data_c EAP_TRACE_disable_traces(iAmTools);
+
+        eap_status_e status = read_configure(
+            cf_str_EAP_TRACE_disable_traces.get_field(),
+            &EAP_TRACE_disable_traces);
+        if (status == eap_status_ok
+            && EAP_TRACE_disable_traces.get_is_valid_data() == true)
+            {
+            u32_t *disable_traces = reinterpret_cast<u32_t *>(
+                EAP_TRACE_disable_traces.get_data(sizeof(u32_t)));
+            if (disable_traces != 0
+                && *disable_traces != 0)
+                {
+                iAmTools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
+                }
+            else
+                {
+                // OK, set the default trace mask.
+                iAmTools->set_trace_mask(
+                    eap_am_tools_c::eap_trace_mask_debug
+                    | eap_am_tools_c::eap_trace_mask_always
+                    | eap_am_tools_c::eap_trace_mask_error);
+                }
+            }
+    }
+
+    //----------------------------------------------------------
+
+    //----------------------------------------------------------
+
+	// All of the configuration options are optional.
+	// So we return OK.
+	return eap_status_ok;
+    }
+
+//--------------------------------------------------
+
+eap_status_e wapi_am_core_symbian_c::read_configure(
+	const eap_configuration_field_c * const field,
+	eap_variable_data_c * const data)
+    {
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+	if(field->get_field_length() > KMaxConfigStringLength)
+	    {
+		return eap_status_process_general_error;
+	    }
+	
+	eap_status_e status(eap_status_ok);
+	
+	eap_variable_data_c type_field(iAmTools);
+	eap_variable_data_c type_field_server(iAmTools);
+	
+#if defined(USE_EAP_FILECONFIG)
+		if (m_fileconfig != 0
+			&& m_fileconfig->get_is_valid() == true)
+		    {
+			// Here we could try the final configuration option.
+			status = m_fileconfig->read_configure(
+				field,
+				data);
+		    }
+#endif //#if defined(USE_EAP_FILECONFIG)
+
+	iAmTools->trace_configuration(
+		status,
+		field,
+		data);
+
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(iAmTools, status);
+    }
+
+//--------------------------------------------------
+
+//
+eap_status_e wapi_am_core_symbian_c::set_timer(
+	abs_eap_base_timer_c * const p_initializer, 
+	const u32_t p_id, 
+	void * const p_data,
+	const u32_t p_time_ms)
+    {
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+	const eap_status_e status = iAmTools->am_set_timer(
+		p_initializer, 
+		p_id, 
+		p_data,
+		p_time_ms);
+
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+	return status;
+        }
+
+//--------------------------------------------------
+
+//
+eap_status_e wapi_am_core_symbian_c::cancel_timer(
+	abs_eap_base_timer_c * const p_initializer, 
+	const u32_t p_id)
+    {
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+	
+	const eap_status_e status = iAmTools->am_cancel_timer(
+		p_initializer, 
+		p_id);
+
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+	return status;
+    }
+
+//--------------------------------------------------
+
+//
+eap_status_e wapi_am_core_symbian_c::cancel_all_timers()
+    {
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+	const eap_status_e status = iAmTools->am_cancel_all_timers();
+
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+	return status;
+    }
+
+//--------------------------------------------------
+
+abs_wapi_am_core_c * wapi_am_core_symbian_c::get_am_partner()
+	{
+	return iPartner;
+	}
+
+//--------------------------------------------------
+
+void wapi_am_core_symbian_c::set_am_partner(abs_wapi_am_core_c * const partner)
+	{
+	iPartner = partner;	
+	}
+//--------------------------------------------------
+
+eap_status_e wapi_am_core_symbian_c::reset()
+	{
+	iImportedFilenames.Reset();  
+	return eap_status_ok;
+	}
+//--------------------------------------------------				
+
+eap_status_e wapi_am_core_symbian_c::authentication_finished(
+		const bool true_when_successfull)
+	{
+	return eap_status_ok;
+	}
+
+//----------------------------------------------------
+// These two methods only because of interface support 
+//----------------------------------------------------
+
+eap_status_e wapi_am_core_symbian_c::type_configure_read(
+		const eap_configuration_field_c * const field,
+		eap_variable_data_c * const data)
+	{
+    EAP_TRACE_DATA_DEBUG(
+        iAmTools,
+        TRACE_FLAGS_DEFAULT,
+        (EAPL("Wanted Field"),
+                field->get_field(),
+                field->get_field_length()));
+
+    return eap_status_ok;
+	
+	}
+
+//--------------------------------------------------				
+eap_status_e wapi_am_core_symbian_c::type_configure_write(
+		const eap_configuration_field_c * const field,
+		eap_variable_data_c * const data)
+	{
+	return eap_status_ok;
+	
+	}
+
+
+// ================= protected: from ec_am_base_certificate_store_c =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::initialize_certificate_store()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::initialize_certificate_store(
+	const wapi_completion_operation_e completion_operation )
+	{
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+	EAP_TRACE_DEBUG(iAmTools, 
+		TRACE_FLAGS_DEFAULT, 
+		(EAPL("wapi_am_core_symbian_c::initialize_certificate_store IN\n")));
+	
+	iCompletionOperation = completion_operation;
+	
+	iWapiCompletionStatus = set_timer(
+			this,
+			EWapiInitCertificateStoreTimerId, 
+			0,
+			0);
+	
+	if (iWapiCompletionStatus != eap_status_ok)
+		{
+			EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+		}
+
+	iWapiCompletionStatus = eap_status_pending_request;
+			
+	EAP_TRACE_DEBUG(iAmTools, 
+			TRACE_FLAGS_DEFAULT, 
+			(EAPL("eap_am_type_tls_peap_symbian_c::initialize_certificate_store() OUT\n")));
+	
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);	
+	
+	} // wapi_am_core_symbian_c::initialize_certificate_store()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::read_certificate_store_data()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::read_certificate_store_data(
+	const ec_cs_pending_operation_e in_pending_operation,
+	EAP_TEMPLATE_CONST eap_array_c<ec_cs_data_c> * const in_references )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::read_certificate_store_data() IN, \
+	    in_pending_operation=%d.\n" ), in_pending_operation ) );
+	eap_status_e status = eap_status_ok;
+	
+	// store args in member vars
+	iCsPendingOperation = in_pending_operation;
+	
+	// store references
+	status = copy( in_references,   // original array
+		           &iInReferences,  // copy array
+	               iAmTools,        // am tools
+		           false );         // reset copy array
+	if ( status != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "ERROR: wapi_am_core_symbian_c::read_certificate_store_data() \
+		    Copying of in_references array failed, status=%d.\n" ), status ) );
+		    return status;
+		}
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::read_certificate_store_data() set timer for \
+        EWapiReadCertificateStoreDataTimerId\n" ) ) );
+	status = set_timer( this, EWapiReadCertificateStoreDataTimerId,
+		0, 0 );
+	if ( status != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "wapi_am_core_symbian_c::read_certificate_store_data() \
+		    failed to set timer, status=%d.\n" ), status ) );		
+		    return status;
+		}
+	else
+		{
+		status = eap_status_pending_request;
+		}
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::read_certificate_store_data() OUT, \
+        status=%d.\n" ), status ) );
+	return status;
+	
+	} // wapi_am_core_symbian_c::read_certificate_store_data()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::write_certificate_store_data()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::write_certificate_store_data(
+	const bool when_true_must_be_synchronous_operation,
+	const ec_cs_pending_operation_e in_pending_operation,
+	EAP_TEMPLATE_CONST eap_array_c<ec_cs_data_c> * const in_references_and_data_blocks )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::write_certificate_store_data() IN, \
+        when_true_must_be_synchronous_operation=%d.\n" ),
+        when_true_must_be_synchronous_operation ) );
+	eap_status_e status = eap_status_ok;
+	
+	// store args in member vars
+	iCsPendingOperation = in_pending_operation;
+	
+	eap_variable_data_c aFilename(iAmTools);
+	
+    TInt i = 0;
+    while (i< iImportedFilenames.Count())
+        {
+        aFilename.set_copy_of_buffer(iImportedFilenames[i].Ptr(), iImportedFilenames[i].Size());
+        
+        TRAPD(err, CompleteAddImportedCertificateFileL(&aFilename));
+        if (err)
+            {
+            // Continue to next operation
+            }
+        iImportedFilenames[i].Zero();
+        i++;
+        }
+    iImportedFilenames.Reset();  
+
+
+	// store references
+	status = copy( in_references_and_data_blocks, // original array
+		           &iReferencesAndDataBlocks,     // copy array
+	               iAmTools,                      // am tools
+		           false );                       // reset copy array
+	if ( status != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "ERROR: wapi_am_core_symbian_c::write_certificate_store_data() \
+		    Copying of in_references array failed, status=%d.\n" ), status ) );
+		}
+	
+    if ( when_true_must_be_synchronous_operation )
+    	{ 
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "wapi_am_core_symbian_c::write_certificate_store_data() \
+            Synchronous writing.\n" ) ) );
+    	// no timer is set, writing is done here
+    	ProcessWriteCertificateStoreData();
+    	}
+    else
+    	{ 
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    	    "wapi_am_core_symbian_c::write_certificate_store_data() \
+    	    Asynchronous writing. Set timer for EWapiWriteCertificateStoreDataTimerId\n" ) ) );
+    	status = set_timer( this, EWapiWriteCertificateStoreDataTimerId,
+    		0, 0 );
+    	if ( status != eap_status_ok )
+    		{
+    		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    		    "wapi_am_core_symbian_c::write_certificate_store_data() \
+    		    failed to set timer, status=%d.\n" ), status ) );		
+    		}
+    	else
+    		{
+    		status = eap_status_pending_request;
+    		}
+    	}
+    
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::write_certificate_store_data() OUT\n" ) ) );
+
+	return status;	
+	} // wapi_am_core_symbian_c::write_certificate_store_data()
+
+//--------------------------------------------------	
+
+eap_status_e wapi_am_core_symbian_c::complete_add_imported_certificate_file(
+	const eap_status_e in_completion_status,
+	const eap_variable_data_c * const in_imported_certificate_filename)
+	{
+        iWapiCompletionStatus = eap_status_ok;
+	
+    EAP_TRACE_DEBUG_SYMBIAN(
+        (_L("wapi_am_core_symbian_c::complete_add_imported_certificate_file in_completion_status=%d"),
+                in_completion_status));       
+
+    TBuf8<256> aFile;
+    aFile.Copy(in_imported_certificate_filename->get_data(in_imported_certificate_filename->get_data_length()), in_imported_certificate_filename->get_data_length());
+    iImportedFilenames.Append(aFile);
+    
+    TInt i = 0;
+    while (i< iImportedFilenames.Count())
+        {
+        EAP_TRACE_DATA_DEBUG(
+                iAmTools,
+            TRACE_FLAGS_DEFAULT,
+            (EAPL("eap_am_type_tls_peap_symbian_c::complete_add_imported_certificate_file: Got Filenames "),
+                    iImportedFilenames[i].Ptr(),
+                    iImportedFilenames[i].Size()));
+        i++;
+        }
+
+    iWapiCompletionStatus = set_timer(
+             this,
+             EWapiAddCertificateFileTimerId, 
+             0,
+             0);
+
+    return iWapiCompletionStatus;
+	
+	}
+
+	//--------------------------------------------------	
+void wapi_am_core_symbian_c::CompleteAddImportedCertificateFileL(const eap_variable_data_c * const in_imported_certificate_filename)
+    {
+    RFs aFs;
+     aFs.Connect( KFileServerDefaultMessageSlots );
+
+     HBufC8* buf = HBufC8::NewLC(in_imported_certificate_filename->get_data_length());
+     TPtr8 bufPtr = buf->Des();
+
+     if (in_imported_certificate_filename->get_data_length() != 0)
+         {
+         bufPtr.Copy(in_imported_certificate_filename->get_data(), in_imported_certificate_filename->get_data_length());
+         }
+
+     HBufC* FilePath = HBufC::NewLC(KMaxFileName);
+     TPtr FilePathPtr = FilePath->Des();
+     HBufC8* FilePath8 = HBufC8::NewLC(KMaxFileName);
+     TPtr8 FilePathPtr8 = FilePath8->Des();
+     
+     FilePathPtr8.Zero();
+     FilePathPtr8.Append(KCertificateStoreImportDir);
+     FilePathPtr8.Append(bufPtr);
+
+     FilePathPtr.Copy(FilePathPtr8);
+
+
+     EAP_TRACE_DATA_DEBUG(
+             iAmTools,
+         TRACE_FLAGS_DEFAULT,
+         (EAPL("eap_am_type_tls_peap_symbian_c::CompleteAddImportedCertificateFileL: Filename "),
+         FilePathPtr.Ptr(),
+         FilePathPtr.Size()));
+  
+     if (m_is_client)
+         {
+         EAP_TRACE_DATA_DEBUG(
+                 iAmTools,
+             TRACE_FLAGS_DEFAULT,
+             (EAPL("eap_am_type_tls_peap_symbian_c::CompleteAddImportedCertificateFileL: Delete File"),
+             FilePathPtr.Ptr(),
+             FilePathPtr.Size()));
+     
+         aFs.SetAtt(FilePathPtr, NULL, KEntryAttReadOnly);
+         if(aFs.Delete(FilePathPtr)!= KErrNone)
+             {
+             EAP_TRACE_DATA_DEBUG(
+                     iAmTools,
+                     TRACE_FLAGS_DEFAULT,
+                     (EAPL("eap_am_type_tls_peap_symbian_c::CompleteAddImportedCertificateFileL: Couldn't delete file"),
+                             FilePathPtr.Ptr(),
+                             FilePathPtr.Size()));
+     
+     
+             iWapiCompletionStatus = eap_status_file_does_not_exist;
+             }
+         }
+     else
+         {
+         RDbNamedDatabase& db = iCertificateStoreDb->GetCertificateStoreDb();
+         RDbView view;   
+         // Leave if the view preparation still fails
+         HBufC* buf3 = HBufC::NewLC(KMaxSqlQueryLength);
+         TPtr sqlStatement2 = buf3->Des();
+         _LIT(KSQLQueryRow2, "SELECT * FROM %S");
+         sqlStatement2.Format(KSQLQueryRow2, &KCsWapiCertFileTable);
+
+         EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+             "wapi_am_core_symbian_c::CompleteAddImportedCertificateFileL() sqlStatement",
+             sqlStatement2.Ptr(), 
+             sqlStatement2.Size() ) );    
+
+         User::LeaveIfError ( view.Prepare( db, TDbQuery(sqlStatement2), TDbWindow::EUnlimited, RDbView::EInsertOnly ));
+         CleanupStack::PopAndDestroy( buf3 );
+         CleanupClosePushL(view);
+         User::LeaveIfError(view.EvaluateAll());
+
+         // Use the data insertion function to update data and reference
+         CDbColSet* colSet = view.ColSetL();
+         CleanupStack::PushL( colSet );
+
+         view.InsertL();
+
+         TDbColNo colNo = KDefaultColumnNumberOne;
+         view.SetColL( colNo, bufPtr );
+
+         view.PutL(); 
+
+         CleanupStack::PopAndDestroy( colSet );
+         CleanupStack::PopAndDestroy( &view );        
+
+         }
+     CleanupStack::PopAndDestroy(FilePath8); 
+     CleanupStack::PopAndDestroy(FilePath); 
+     CleanupStack::PopAndDestroy(buf);
+
+    }
+
+eap_status_e wapi_am_core_symbian_c::complete_remove_certificate_store(
+	const eap_status_e in_completion_status)
+	{
+	return eap_status_ok;
+	
+	}
+
+	//--------------------------------------------------		
+
+eap_status_e wapi_am_core_symbian_c::cancel_certificate_store_store_operations()
+	{
+	return eap_status_ok;
+	
+	}
+
+//--------------------------------------------------	
+
+eap_status_e wapi_am_core_symbian_c::set_session_timeout(
+	const u32_t session_timeout_ms)
+	{
+	return eap_status_ok;
+	
+	}
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CreateDeviceSeedAsync()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::CreateDeviceSeedAsync()
+{	
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+
+	EAP_TRACE_DEBUG_SYMBIAN(
+		(_L("wapi_am_core_symbian_c::CreateDeviceSeedAsynch-Start ActiveStatus=%d"),
+		IsActive()));		
+	
+	if ( IsActive() )
+	{
+		EAP_TRACE_DEBUG_SYMBIAN(
+			(_L("wapi_am_core_symbian_c: Already active when tried to create device seed")));		
+		
+		return eap_status_device_busy;
+	}
+
+	eap_status_e status(eap_status_ok);	
+	
+	iState = EWapiHandlingDeviceSeedQueryState;
+		
+	// Create MMETEL connection.
+	TRAPD(error, CreateMMETelConnectionL());
+	if(error !=KErrNone)
+	{
+		return iAmTools->convert_am_error_to_eapol_error(error);
+	}
+	
+   	iPhone.GetPhoneId( iStatus, iDeviceId ); 
+
+	SetActive();
+	return status;
+} // wapi_am_core_symbian_c::CreateDeviceSeedAsynch()
+
+//--------------------------------------------------
+
+TInt wapi_am_core_symbian_c::CreateMMETelConnectionL()
+{
+	EAP_TRACE_BEGIN(iAmTools, TRACE_FLAGS_DEFAULT);
+	EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Creating MMETel connection.\n")));
+
+	TInt errorCode = KErrNone;
+	
+	// MMETel need to be connected only once.    
+    if( !iMMETELConnectionStatus )
+    {
+		RTelServer::TPhoneInfo phoneInfo;
+		TInt phoneCount = 0;
+
+		// Connect to ETel server
+		User::LeaveIfError( iServer.Connect() ); 	
+		
+	    EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Connected to ETel server.\n")));	
+
+		// This function loads an ETel TSY module, mmtsy.
+		errorCode = iServer.LoadPhoneModule( KMmTsyModuleName );	
+		
+	    EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Loaded phone module.\n")));	    
+		
+		if ( errorCode != KErrNone && errorCode != KErrAlreadyExists )
+		{
+			User::Leave( errorCode );
+		}
+
+		iServer.SetExtendedErrorGranularity( RTelServer::EErrorExtended );
+
+		// This function retrieves the total number of phones supported by all 
+		// the currently loaded ETel (TSY) modules.
+		User::LeaveIfError( iServer.EnumeratePhones( phoneCount ) );	
+		
+		EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Number of phones supported by the loaded ETel = %d.\n"), phoneCount));
+		
+		// This function retrieves information associated with the specified phone
+		while ( ( phoneCount-- ) && ( phoneInfo.iName != KMmTsyPhoneName ) ) 
+		{ 
+			User::LeaveIfError( iServer.GetPhoneInfo( phoneCount, phoneInfo ) );		
+			
+		    EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Got phone info.\n")));
+		} 
+
+		// This function opens a phone subsession by name. ("DefaultPhone").
+		User::LeaveIfError( iPhone.Open( iServer, phoneInfo.iName ) );	
+		
+	    EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Opened phone subsession.\n")));
+		
+		// MMETel connected and the phone module loaded fine.	
+		iMMETELConnectionStatus = ETrue; 	
+    }
+    else
+    {
+    	// MMETel already connected.
+	    EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("MMETel connected once already.\n")));
+    }
+	    
+	EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+    
+    return errorCode;	
+}
+
+//--------------------------------------------------				
+
+void wapi_am_core_symbian_c::DisconnectMMETEL()
+	{
+	    if( iMMETELConnectionStatus )
+	    {
+			EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("Closing RMobilePhone and MMETEL.\n")));
+			
+			iPhone.Close();
+			iServer.Close(); // Phone module is unloaded automatically when RTelServer session is closed
+			
+			iMMETELConnectionStatus = EFalse;
+	    }
+	    else
+	    {
+			EAP_TRACE_DEBUG(iAmTools, TRACE_FLAGS_DEFAULT, (EAPL("RMobilePhone and MMETEL already closed.\n")));    	
+	    }	
+	}
+
+
+// ================= private: New, timer expired process methods =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ProcessInitCertificateStore()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::ProcessInitCertificateStore()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::ProcessInitCertificateStore() IN\n" ) ) );
+
+	eap_status_e status = eap_status_ok;
+	if ( iCertificateStoreDb )
+		{
+		iCertStorePartner->remove_cached_certificate_store_data();
+
+		TRAPD( err, iCertificateStoreDb->InitializeCertificateStoreL() );
+		if ( err != KErrNone )
+			{
+			EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL (
+				"ERROR: wapi_am_core_symbian_c::ProcessInitCertificateStore() Leave, InitializeCertificateStoreL(), err=%d.\n" ), err ) );
+			status = iAmTools->convert_am_error_to_eapol_error( err );
+			}
+		}
+	else
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL (
+			"ERROR: wapi_am_core_symbian_c::ProcessInitCertificateStore() \
+			iCertificateStoreDb is NULL.\n" ) ) );
+		status = eap_status_process_general_error;
+		}
+	
+	if ( status == eap_status_ok )
+		{
+	    status = CreateDeviceSeedAsync();
+		}
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::ProcessInitCertificateStore() OUT, \
+	    status=%d.\n" ), status ) );
+	return status;
+	
+	} // wapi_am_core_symbian_c::ProcessInitCertificateStore()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ProcessAddCertificateFile()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::ProcessAddCertificateFile()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"wapi_am_core_symbian_c::ProcessAddCertificateFile() IN\n" ) ) );
+	eap_status_e status = eap_status_ok;
+
+    TRAPD(err, ImportFilesL());
+ 	if (err)
+		{
+		// Complete with ok, even if import fails
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL("ERROR: wapi_am_core_symbian_c::Leave from ImportFilesL () err=%d.\n" ), err ) );
+		}
+    
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::ProcessAddCertificateFile() OUT\n" ) ) );
+    return status;
+	
+	} // wapi_am_core_symbian_c::ProcessAddCertificateFile()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ProcessReadCertificateStoreData()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::ProcessReadCertificateStoreData()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::ProcessReadCertificateStoreData() IN\n" ) ) );
+	
+	// read certificate store
+    TRAPD( err, ReadCertificateStoreDataL() );
+    if ( err != KErrNone )
+    	{
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    		"ERROR: wapi_am_core_symbian_c::ProcessReadCertificateStoreData() LEAVE from ReadCertificateStoreDataL(), err=%d" ), err ) );
+        iWapiCompletionStatus = iAmTools->convert_am_error_to_eapol_error( err );
+     	}
+
+    if ( iWapiCompletionStatus == eap_status_ok || iWapiCompletionStatus == eap_status_pending_request )
+    	{
+        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::ProcessReadCertificateStoreData() \
+                COMPLETE read_certificate_store_data() request, \
+                status=%d, operation=%d" ), iWapiCompletionStatus,
+                iCsPendingOperation ) );
+        iWapiCompletionStatus = iCertStorePartner->complete_read_certificate_store_data(
+                iWapiCompletionStatus,
+                iCsPendingOperation,
+                &iReferencesAndDataBlocks );
+    	}
+     else // error status
+        {
+         iReferencesAndDataBlocks.reset();
+        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::ProcessReadCertificateStoreData() \
+                COMPLETE read_certificate_store_data() request, \
+                status=%d, operation=%d" ), iWapiCompletionStatus,
+                iCsPendingOperation ) );
+        iWapiCompletionStatus = iCertStorePartner->complete_read_certificate_store_data(
+                iWapiCompletionStatus,
+                iCsPendingOperation,
+                &iReferencesAndDataBlocks );
+    }
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ProcessReadCertificateStoreData() OUT, \
+        iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+    return iWapiCompletionStatus;
+    
+	} // wapi_am_core_symbian_c::ProcessReadCertificateStoreData()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ProcessWriteCertificateStoreData()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::ProcessWriteCertificateStoreData()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ProcessWriteCertificateStoreData() IN\n" ) ) );
+		
+	// write to certificate store
+    TRAPD( err, WriteCertificateStoreDataL() );
+    if ( err != KErrNone )
+    	{
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    	        "ERROR: wapi_am_core_symbian_c::ProcessWriteCertificateStoreData() LEAVE from WriteCertificateStoreDataL(), err=%d" ), err ) );
+    	iWapiCompletionStatus = iAmTools->convert_am_error_to_eapol_error( err );
+    	}
+	
+    // process status
+    if ( iWapiCompletionStatus == eap_status_ok || iWapiCompletionStatus == eap_status_pending_request )
+    	{
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+    		"wapi_am_core_symbian_c::ProcessWriteCertificateStoreData(), \
+    		iWapiCompletionStatus=%d\n" ), iWapiCompletionStatus ) );    	
+    	}
+    else // error
+         {
+         // complete request!
+         iReferencesAndDataBlocks.reset();
+         EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::ProcessWriteCertificateStoreData() \
+             COMPLETE write_certificate_store_data() request, \
+             iWapiCompletionStatus=%d, operation=%d" ),
+             iWapiCompletionStatus, iCsPendingOperation ) );
+         eap_status_e status = iCertStorePartner->complete_write_certificate_store_data(
+             iWapiCompletionStatus,
+             iCsPendingOperation );
+         if ( status != eap_status_ok )
+             {
+             // just print an error
+             EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                 "ERROR: wapi_am_core_symbian_c::ProcessWriteCertificateStoreData() \
+                 complete_write_certificate_store_data(), status=%d" ), status ) );
+             }
+         }
+ 
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ProcessWriteCertificateStoreData() OUT\n" ) ) );
+    return iWapiCompletionStatus;
+	
+	} // wapi_am_core_symbian_c::ProcessWriteCertificateStoreData()
+
+
+// ================= private: New, writing to CS =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::WriteCertificateStoreDataL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::WriteCertificateStoreDataL()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCertificateStoreDataL() IN\n" ) ) );
+	
+	iWapiCompletionStatus = eap_status_ok;
+
+	for ( u32_t ind = 0ul;
+	      ind < iReferencesAndDataBlocks.get_object_count();ind++ )
+	    {    
+		const ec_cs_data_c* const dataReference = iReferencesAndDataBlocks.
+		    get_object( ind );
+		if (dataReference->get_is_valid() == false)
+		    {
+	        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	            "wapi_am_core_symbian_c::WriteCertificateStoreDataL() ERROR: datablock to be written is unvalid!\n" )));
+		    return;
+		    }
+		const ec_cs_data_type_e csDataType = dataReference->get_type();
+		
+        if (csDataType == NULL)
+            {
+            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::WriteCertificateStoreDataL() ERROR: data type to be written is unvalid!\n" )));
+            return;
+            }
+	
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+			"wapi_am_core_symbian_c::WriteCertificateStoreDataL() csDataType=%d.\n" ),
+			csDataType ) );
+		
+		if ( dataReference != NULL )
+			{
+		    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+			    "wapi_am_core_symbian_c::WriteCertificateStoreDataL() dataReference data(value):",
+			    dataReference->get_data()->get_data(
+			    	dataReference->get_data()->get_data_length() ),
+			    dataReference->get_data()->get_data_length() ) );
+		
+		    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+			    "wapi_am_core_symbian_c::WriteCertificateStoreDataL() data_reference reference:",
+			    dataReference->get_reference()->get_data(
+			    	dataReference->get_reference()->get_data_length() ),
+			    dataReference->get_reference()->get_data_length() ) );
+		
+		    EAP_TRACE_DEBUG_SYMBIAN( ( _L(
+			    "wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+			    change status=%d.\n" ), dataReference->get_change_status() ) );
+			}
+
+		if ( dataReference != 0
+			&& dataReference->get_is_valid() == true
+			&& dataReference->get_type() != ec_cs_data_type_none
+			&& dataReference->get_change_status() != ec_cs_data_change_status_none )
+		    {			
+		    ec_cs_data_change_status_e changeStatus = dataReference->get_change_status();
+			switch( csDataType )
+			    {
+				case ec_cs_data_type_master_key:
+				case ec_cs_data_type_reference_counter:
+					{
+				    WriteCsDataL( dataReference, EFalse );
+				    break;
+				    }
+				case ec_cs_data_type_password: 
+				case ec_cs_data_type_device_seed: 
+				case ec_cs_data_type_certificate_file_password:
+				    {
+				    // not saved; nothing to do
+				    break;
+				    }
+				case ec_cs_data_type_ca_certificate_data:
+				case ec_cs_data_type_client_certificate_data:
+				case ec_cs_data_type_private_key_data:				
+                case ec_cs_data_type_client_asu_id:
+                case ec_cs_data_type_ca_asu_id:
+				    {
+				    if ( changeStatus == ec_cs_data_change_status_modified )
+				    	{
+					    WriteCsDataWithReferenceL( dataReference, EFalse );				    
+				    	}
+				    else if ( changeStatus == ec_cs_data_change_status_new )
+				    	{
+					    WriteCsDataWithReferenceL( dataReference, ETrue );				    
+				    	}
+				    else if ( changeStatus == ec_cs_data_change_status_delete )
+				    	{
+				    	DeleteCsDataWithReferenceL( dataReference );
+				    	}
+				    else
+				        {
+	                    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                        "ERROR: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+	                        unknown change_status=%d.\n" ), changeStatus ) );
+				        }
+				    break;
+				    }
+				default:
+					{
+					EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+				        "ERROR: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+				        unknown csDataType=%d.\n" ), csDataType ) );
+					iWapiCompletionStatus = eap_status_not_found;
+					User::Leave( KErrArgument );
+					}
+			    } // switch( csDataType )
+			
+		    } // if ( dataReference != 0...
+	    else
+	        {
+	        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                "Warning: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+	                failed" ) ) );
+	        if ( dataReference != 0 )
+	            {
+	            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                    "Warning: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+		                No changes needed, reference: 0x%08x: type %d\n" ),
+		                dataReference, dataReference->get_type() ) );
+
+	            if ( dataReference->get_reference() != 0 )
+	                 {
+	                 EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                         "Warning: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+	                         unknown reference, or no changes needed" ),
+	                         dataReference->get_reference()->get_data(),
+	                         dataReference->get_reference()->get_data_length() ) );
+	                 }
+	            if ( dataReference->get_data() != 0 )
+	                {
+	                EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                        "Warning: wapi_am_core_symbian_c::WriteCertificateStoreDataL() \
+		    	            unknown data" ),
+		    	            dataReference->get_data()->get_data(),
+		    	            dataReference->get_data()->get_data_length() ) );
+	                }
+	            }
+	        } // else
+	    } // for(...)
+
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCertificateStoreDataL() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::WriteCertificateStoreDataL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::WriteCsDataWithReferenceL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::WriteCsDataWithReferenceL(
+    const ec_cs_data_c* const aDataReference,
+    TBool aIsNewEntry )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCsDataWithReferenceL() IN\n" ) ) );
+	
+	// Get the data (or value) from the input
+	HBufC8* csDbColVal8 = HBufC8::NewLC(
+		aDataReference->get_data()->get_data_length() );
+	TPtr8 csDbColValPtr8 = csDbColVal8->Des();
+	csDbColValPtr8.Copy( aDataReference->get_data()->get_data(),
+                         aDataReference->get_data()->get_data_length() );
+	
+	EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+		"wapi_am_core_symbian_c::WriteCsDataWithReferenceL() \
+		8 bit VALUE from common:",
+		csDbColValPtr8.Ptr(), csDbColValPtr8.Size() ) );
+	
+	// Get the reference from the input
+	HBufC8* csDbColRef8 = HBufC8::NewLC(
+		aDataReference->get_reference()->get_data_length() );
+	TPtr8 csDbColRefPtr8 = csDbColRef8->Des();
+	csDbColRefPtr8.Copy( aDataReference->get_reference()->get_data(),
+                         aDataReference->get_reference()->get_data_length() );
+
+	EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+		"wapi_am_core_symbian_c::WriteCsDataWithReferenceL() \
+		8 bit REFERENCE from common:",
+		csDbColRefPtr8.Ptr(), csDbColRefPtr8.Size() ) );
+	
+	iCertificateStoreDb->SetCsDataByReferenceL(
+			aDataReference->get_type(),
+			csDbColValPtr8,
+			csDbColRefPtr8,
+			aIsNewEntry );
+
+    CleanupStack::PopAndDestroy( csDbColRef8 );
+	CleanupStack::PopAndDestroy( csDbColVal8 );
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCsDataWithReferenceL() OUT\n" ) ) );
+
+	} // wapi_am_core_symbian_c::WriteCsDataWithReferenceL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::WriteCsDataL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::WriteCsDataL(
+    const ec_cs_data_c* const aDataReference,
+    TBool aIsNewEntry )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCsDataL() IN\n" ) ) );
+
+	// Get the data (or value) from the input
+	HBufC8* csDbColVal8 = HBufC8::NewLC(
+		aDataReference->get_data()->get_data_length() );
+	TPtr8 csDbColValPtr8 = csDbColVal8->Des();
+	csDbColValPtr8.Copy( aDataReference->get_data()->get_data(),
+                         aDataReference->get_data()->get_data_length() );
+	
+	EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+		"wapi_am_core_symbian_c::WriteCsDataL() \
+		8 bit VALUE from common:",
+		csDbColValPtr8.Ptr(), csDbColValPtr8.Size() ) );
+		
+	iCertificateStoreDb->SetCsDataL(
+		aDataReference->get_type(),
+		csDbColValPtr8,
+        aIsNewEntry );
+
+	CleanupStack::PopAndDestroy( csDbColVal8 );
+	
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::WriteCsDataL() OUT\n" ) ) );
+	
+	} /// wapi_am_core_symbian_c::WriteCsDataL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::DeleteCsDataWithReferenceL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::DeleteCsDataWithReferenceL(
+	const ec_cs_data_c* const aDataReference )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::DeleteCsDataWithReferenceL() IN\n" ) ) );
+	
+    // Get the data (or value) from the input
+    HBufC8* csDbColVal8 = HBufC8::NewLC(
+	    aDataReference->get_data()->get_data_length() );
+    TPtr8 csDbColValPtr8 = csDbColVal8->Des();
+    csDbColValPtr8.Copy( aDataReference->get_data()->get_data(),
+                         aDataReference->get_data()->get_data_length() );
+
+    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+	    "wapi_am_core_symbian_c::DeleteCsDataWithReferenceL() \
+	    8 bit VALUE from common:",
+	    csDbColValPtr8.Ptr(), csDbColValPtr8.Size() ) );
+
+    // Get the reference from the input
+    HBufC8* csDbColRef8 = HBufC8::NewLC(
+	    aDataReference->get_reference()->get_data_length() );
+    TPtr8 csDbColRefPtr8 = csDbColRef8->Des();
+    csDbColRefPtr8.Copy( aDataReference->get_reference()->get_data(),
+                         aDataReference->get_reference()->get_data_length() );
+
+    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+	    "wapi_am_core_symbian_c::DeleteCsDataWithReferenceL() \
+	    8 bit REFERENCE from common:",
+	    csDbColRefPtr8.Ptr(), csDbColRefPtr8.Size() ) );
+
+    iCertificateStoreDb->RemoveCsDataByReferenceL(
+		aDataReference->get_type(),
+		csDbColValPtr8,
+		csDbColRefPtr8 );
+
+    CleanupStack::PopAndDestroy( csDbColVal8 );
+    CleanupStack::PopAndDestroy( csDbColRef8 );
+
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::DeleteCsDataWithReferenceL() OUT\n" ) ) );
+
+	} // wapi_am_core_symbian_c::DeleteCsDataWithReferenceL()
+
+
+// ================= private: New, reading from CS =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadCertificateStoreDataL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadCertificateStoreDataL()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCertificateStoreDataL() IN\n" ) ) );
+
+	iWapiCompletionStatus = eap_status_ok;
+	
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCertificateStoreDataL() \
+        First dataRefType=%d.\n" ), iInReferences.get_object( 0 )->get_type() ) );
+    
+	iReferencesAndDataBlocks.reset();
+
+	for( u32_t ind = 0ul; ind < iInReferences.get_object_count(); ind++ )
+	    {
+
+	    const ec_cs_data_c* const dataReference =
+            iInReferences.get_object( ind );
+	    
+        if (dataReference->get_is_valid() == false)
+            {
+            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::ReadCertificateStoreDataL() ERROR: datablock to be written is unvalid!\n" )));
+            return;
+            }
+
+        if (iInReferences.get_object( ind )->get_reference()->get_data_length() >0)
+	        {
+	        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                "wapi_am_core_symbian_c::ReadCertificateStoreDataL() dataReference:",
+                dataReference->get_reference()->get_data(
+                    dataReference->get_reference()->get_data_length() ), 
+                dataReference->get_reference()->get_data_length() ) );
+	        }
+		if ( dataReference != 0
+			&& dataReference->get_is_valid() == true )
+		    {
+		    ec_cs_data_type_e dataRefType = dataReference->get_type();
+	        if (dataRefType == NULL)
+	            {
+	            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	                "wapi_am_core_symbian_c::ReadCertificateStoreDataL() ERROR: dataType to be written is unvalid!\n" )));
+	            return;
+	            }
+
+			EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+				"wapi_am_core_symbian_c::ReadCertificateStoreDataL() \
+				dataRefType=%d.\n" ), dataRefType ) );
+		    				
+			
+			iGetAll = EFalse;
+			
+			switch( dataRefType )
+			    {
+				case ec_cs_data_type_master_key:         
+				case ec_cs_data_type_reference_counter:  
+				case ec_cs_data_type_client_asu_id_list: 
+				case ec_cs_data_type_ca_asu_id_list:
+					{
+				    ReadCsDataL( dataReference );
+				    break;
+				    }
+				case ec_cs_data_type_password:
+					{
+					ReadPasswordL( dataReference );
+					break;
+					}
+				case ec_cs_data_type_device_seed:
+				    {
+				    ReadDeviceSeedL( dataReference );
+				    break;
+				    }
+				case ec_cs_data_type_certificate_file_password:
+				    {
+				    ReadCertificateFilePasswordL( dataReference );
+				    break;
+				    }
+				case ec_cs_data_type_ca_certificate_data:     
+				case ec_cs_data_type_client_certificate_data: 
+				case ec_cs_data_type_private_key_data:				
+                case ec_cs_data_type_client_asu_id: 
+                case ec_cs_data_type_ca_asu_id:
+                case ec_cs_data_type_selected_ca_id:
+                case ec_cs_data_type_selected_client_id:
+				    {
+				    ReadCsDataByReferenceL( dataReference );				    
+				    break;
+				    }
+				default:
+					{
+					EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+				        "ERROR: wapi_am_core_symbian_c::ReadCertificateStoreDataL() \
+				        unknown dataRefType=%d.\n" ), dataRefType ) );
+					iWapiCompletionStatus = eap_status_not_found;
+					User::Leave( KErrArgument );
+					}
+			    } // switch( dataRefType )
+		    } // if ( dataReference != 0...
+	    } // for(...)
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::ReadCertificateStoreDataL() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::ReadCertificateStoreDataL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadCsDataByReferenceL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadCsDataByReferenceL(
+	const ec_cs_data_c* const aDataReference )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCsDataByReferenceL() IN\n" ) ) );
+
+	HBufC8* outColumnValue = NULL;
+        
+   	GetCsDataByReferenceL( aDataReference, &outColumnValue );   
+   	if ( outColumnValue == NULL )
+    	{
+    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::ReadCsDataByReferenceL() \
+        	outColumnValue is NULL!\n" ) ) );
+    	}
+   	else
+   	    CopyBufToEapVarL( *outColumnValue, iEapVarData );
+   	
+    // ownership was transfered from CS here
+    // delete buffer
+    delete outColumnValue;
+    outColumnValue = NULL;
+    
+    AddObjectL( aDataReference, &iEapVarData );
+    
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCsDataByReferenceL() OUT\n" ) ) );
+    
+    } // wapi_am_core_symbian_c::ReadCsDataByReferenceL()
+
+   
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadCsDataL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadCsDataL(
+	const ec_cs_data_c* const aDataReference )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCsDataL() IN\n" ) ) );
+
+	HBufC8* outColumnValue = NULL;
+	
+	ec_cs_data_type_e dataType = aDataReference->get_type();
+	ec_cs_data_type_e dataTypeToCaller(dataType);
+    iGetAll = EFalse;    
+
+    if (dataType == ec_cs_data_type_ca_asu_id_list)
+		{
+		dataTypeToCaller = ec_cs_data_type_ca_asu_id;
+		iGetAll = ETrue;	
+		}
+	if (dataType == ec_cs_data_type_client_asu_id_list)
+		{
+        dataTypeToCaller = ec_cs_data_type_client_asu_id;
+		iGetAll = ETrue;	
+		}
+	
+	if (iGetAll == EFalse)
+		{
+		TRAPD(err, GetCsDataL( dataType, &outColumnValue ));
+		if (err)
+		    {
+		    delete outColumnValue;
+		    outColumnValue = NULL;
+		    }
+	   	if ( outColumnValue == NULL )
+	    	{
+	    	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	            "ERROR: wapi_am_core_symbian_c::ReadCsDataL() \
+	        	outColumnValue is NULL!\n" ) ) );
+	    	}
+	   	else
+	   	    {
+	   	    CopyBufToEapVarL( *outColumnValue, iEapVarData );
+	   	    }	   	
+	    // ownership was transfered from CS here
+	    // delete buffer
+      AddObjectL( aDataReference, &iEapVarData );
+	    delete outColumnValue;
+	    outColumnValue = NULL;
+	    
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	        "wapi_am_core_symbian_c::ReadCsDataL() OUT\n" ) ) );
+		}
+	else
+		{
+		iCertArray.Reset();
+		TRAPD(err, GetCsTableL( dataType, &outColumnValue, iCertArray ));
+        delete outColumnValue;
+        outColumnValue = NULL;
+		if (err)
+		    {
+	        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	            "wapi_am_core_symbian_c::GetCsTableL() Leave\n" ) ) );
+	        User::Leave(err);
+	        }
+		else
+		    {
+            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::GetCsTableL() Ok\n" ) ) );
+		    TInt aCounter = 0; 
+		    
+             while (aCounter < iCertArray.Count() )
+                {
+                 ec_cs_data_c* const csData = new ec_cs_data_c( iAmTools );
+                   
+                   if ( csData == NULL )
+                       {
+                       iWapiCompletionStatus = eap_status_allocation_error;
+                       EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                           "ERROR: wapi_am_core_symbian_c::AddObjectL() csData is NULL.\n" ) ) );
+                       User::Leave( iAmTools->convert_eapol_error_to_am_error(
+                           eap_status_allocation_error ) );
+                       }
+               if (iCertArray[aCounter].iReference->Size()>0 && iCertArray[aCounter].iData->Size()>0)
+                    {
+                    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                           "wapi_am_core_symbian_c::ReadCsDataL() copy reference\n" ) ) );
+
+                    csData->set_type(dataTypeToCaller);
+                    TPtr8 aDbBinaryColumnRefPtr = iCertArray[aCounter].iReference->Des();
+
+                    iWapiCompletionStatus = csData->get_writable_reference()->
+                    set_copy_of_buffer( aDbBinaryColumnRefPtr.Ptr(), aDbBinaryColumnRefPtr.Size() );
+                    
+                    EAP_TRACE_DATA_DEBUG_SYMBIAN(
+                        ("wapi_am_core_symbian_c::ReadCsDataL: reference to caller",
+                                csData->get_reference()->get_data(csData->get_reference()->get_data_length()), 
+                                csData->get_reference()->get_data_length()));
+                    if ( iWapiCompletionStatus != eap_status_ok )
+                        {
+                        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                            "ERROR: wapi_am_core_symbian_c::ReadCsDataL() Failed to add \
+                            new object, iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+                        delete csData;
+                        User::Leave( iAmTools->convert_eapol_error_to_am_error(
+                            iWapiCompletionStatus ) );
+                        }
+                    
+                    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                        "wapi_am_core_symbian_c::ReadCsDataL() copy data\n" ) ) );
+
+                    TPtr8 aDbBinaryColumnValuePtr = iCertArray[aCounter].iData->Des();
+                     
+                    iWapiCompletionStatus = csData->get_writable_data()->
+                        set_copy_of_buffer( aDbBinaryColumnValuePtr.Ptr(), aDbBinaryColumnValuePtr.Size() );
+                    
+                    EAP_TRACE_DATA_DEBUG_SYMBIAN(
+                        ("wapi_am_core_symbian_c::ReadCsDataL: data to caller",
+                                csData->get_data()->get_data(csData->get_data()->get_data_length()), 
+                                csData->get_data()->get_data_length()));
+
+                    iWapiCompletionStatus = iReferencesAndDataBlocks.add_object( csData, true );
+
+                    delete iCertArray[aCounter].iReference;
+                    iCertArray[aCounter].iReference = NULL;
+                    delete iCertArray[aCounter].iData;
+                    iCertArray[aCounter].iData=NULL;
+                    
+                    if ( iWapiCompletionStatus != eap_status_ok )
+                        {
+                        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                                "ERROR: wapi_am_core_symbian_c::ReadCsDataL() Failed to add \
+                                new object, iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+                        delete csData;
+                        User::Leave( iAmTools->convert_eapol_error_to_am_error(
+                                iWapiCompletionStatus ) );
+                        }
+                    }
+                aCounter++;
+                }
+             iCertArray.Reset();
+             EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "wapi_am_core_symbian_c::ReadCsDataL() OUT\n" ) ) );
+
+		    }
+		}
+	
+    } // wapi_am_core_symbian_c::ReadCsDataL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::GetCsDataByReferenceL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::GetCsDataByReferenceL(
+    const ec_cs_data_c* const aDataReference,
+    HBufC8** aOutColumnValue )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsDataByReferenceL() IN\n" ) ) );
+    
+    const eap_variable_data_c * const reference = aDataReference->get_reference();
+	if ( reference == NULL )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::GetCsDataByReferenceL() \
+            reference is NULL.\n" ) ) );
+		// Can't proceed.
+		User::Leave( KErrArgument );		
+		}
+	if ( reference->get_data_length() <= 0 )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::GetCsDataByReferenceL() \
+            reference is empty.\n" ) ) );
+		// Can't proceed.
+		User::Leave( KErrArgument );		
+		}
+
+	HBufC8* reference8 = HBufC8::NewL( reference->get_data_length() );
+	TPtr8 referencePtr8 = reference8->Des();				
+	referencePtr8.Copy( reference->get_data(), reference->get_data_length() );
+	
+          
+	EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+		"wapi_am_core_symbian_c::GetCsDataByReferenceL() reference to DB",
+		referencePtr8.Ptr(), referencePtr8.Size() ) );			
+
+    ec_cs_data_type_e dataType = aDataReference->get_type();
+    
+  EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+          "wapi_am_core_symbian_c::GetCsDataByReferenceL() dataType = %d, m_is_client=%d ec_cs_data_type_selected_ca_id=%d ec_cs_data_type_selected_client_id=%d\n" ),
+           dataType, m_is_client, ec_cs_data_type_selected_ca_id,ec_cs_data_type_selected_client_id ) );
+
+    if ((dataType == ec_cs_data_type_selected_ca_id || dataType == ec_cs_data_type_selected_client_id) && m_is_client)
+        {
+        TUint32 aIndex = 0;
+        eap_variable_data_c database_reference_index(iAmTools);
+
+        eap_status_e status = iPartner->read_configure(
+            cf_str_WAPI_database_reference_index.get_field(),
+            &database_reference_index);
+        if (status != eap_status_ok
+            || database_reference_index.get_is_valid_data() == false
+            || database_reference_index.get_data_length() != sizeof(u32_t)
+            || database_reference_index.get_data(sizeof(u32_t)) == 0)
+            {
+            EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+            User::Leave( KErrArgument );        
+            }
+
+        u32_t *index = reinterpret_cast<u32_t *>(
+            database_reference_index.get_data(sizeof(u32_t)));
+        if (index != 0)
+            {
+            EAP_TRACE_DEBUG(
+                iAmTools,
+                TRACE_FLAGS_DEFAULT,
+                (EAPL("WAPI_Core: this = 0x%08x, %s: wapi_am_core_symbian_c::GetCsDataByReferenceL(): database_reference_index = %d\n"),
+                 this,
+                 (m_is_client == true ? "client": "server"),
+                 *index));
+            aIndex = static_cast<TUint32>(*index);
+            }
+
+        EAP_TRACE_DEBUG(
+             iAmTools,
+             TRACE_FLAGS_DEFAULT,
+             (EAPL("WAPI_Core: this = 0x%08x, %s: wapi_am_core_symbian_c::GetCsDataByReferenceL(): aIndex = %d\n"),
+              this,
+              (m_is_client == true ? "client": "server"),
+              aIndex));
+        
+        referencePtr8.SetLength(sizeof(aIndex));
+        referencePtr8.Copy( reinterpret_cast<TUint8*>(&aIndex), sizeof(aIndex) );
+        
+        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+            "wapi_am_core_symbian_c::GetCsDataByReferenceL() reference to DB 2",
+            referencePtr8.Ptr(), referencePtr8.Size() ) );          
+        }
+
+	// read certificate store
+	TRAPD( err, iCertificateStoreDb->GetCsDataByReferenceL( 
+			dataType,
+			referencePtr8,
+			aOutColumnValue
+		    ) );
+
+	if ( err != KErrNone )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	        "wapi_am_core_symbian_c::iCertificateStoreDb->GetCsDataByReferenceL() ERROR: %d\n" ),err ) );
+		
+        if ( *aOutColumnValue != NULL )
+        	{ // some data was allocated by CS
+		    delete *aOutColumnValue;
+		    *aOutColumnValue = NULL;
+		    delete reference8;
+		    reference8 = NULL;
+       		}
+		User::Leave( err );
+		}
+	
+	delete reference8;
+	reference8 = NULL;
+	
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsDataByReferenceL() OUT\n" ) ) );
+
+    } // wapi_am_core_symbian_c::GetCsDataByReferenceL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::GetCsDataL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::GetCsDataL(
+    ec_cs_data_type_e aDataType,
+    HBufC8** aOutColumnValue )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsDataL() IN\n" ) ) );
+    
+    // read certificate store
+	TRAPD( err, iCertificateStoreDb->GetCsDataL( 
+		aDataType,         // data type
+		aOutColumnValue,// returned column value, memory is allocated in CS
+		iCertArray,     // data array for certificate info
+		EFalse    		// get all or one row
+	    ) );
+	
+	if ( err != KErrNone )
+		{
+        if ( *aOutColumnValue != NULL )
+        	{
+		    delete *aOutColumnValue;
+		    *aOutColumnValue = NULL;
+        	}
+		User::Leave( err );
+		}
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsDataL() OUT\n" ) ) );
+
+    } // wapi_am_core_symbian_c::GetCsDataL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::GetCsTableL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::GetCsTableL( ec_cs_data_type_e aDataType,
+  			HBufC8** aOutColumnValue,
+  			RArray<SWapiCertEntry>& aArray)
+{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsTableL() IN\n" ) ) );
+
+    // read certificate store
+	TRAPD( err, iCertificateStoreDb->GetCsDataL( 
+		aDataType,         // data type
+		aOutColumnValue,    // returned column value, memory is allocated in CS
+		aArray,     // data array for certificate info
+		ETrue    		// get all or one row
+	    ) );
+	
+	if ( err != KErrNone )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	        "wapi_am_core_symbian_c::GetCsTableL() LEAVE FROM iCertificateStoreDb->GetCsDataL\n" ) ) );
+        TInt aCounter = 0;	
+        while (aCounter < aArray.Count())
+	        {
+	        delete (aArray[aCounter].iData);
+	        aArray[aCounter].iData = NULL;
+	        delete (aArray[aCounter].iReference);
+	        aArray[aCounter].iReference = NULL;
+	        aCounter++;
+	        }
+		User::Leave( err );
+		}
+
+	
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::GetCsTableL() OUT\n" ) ) );
+
+	
+}
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadPasswordL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadPasswordL(
+	const ec_cs_data_c* const aDataReference )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadPasswordL() IN\n" ) ) );
+	
+	/*
+	* NOTE:  The password usage is reserved for future,
+	* when there will be config UI support. Use some 
+	* temporary password now. When password is really used,
+	* delete this code and uncomment below one.
+    */
+	_LIT( KTempPassword, "12345" );
+
+	iWapiCompletionStatus = iCsPassword.set_copy_of_buffer(
+		KTempPassword().Ptr(), KTempPassword().Size() );
+	if ( iWapiCompletionStatus != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "ERROR: wapi_am_core_symbian_c::ReadPasswordL() \
+		    buffer copy failed, status=%d.\n" ), iWapiCompletionStatus ) );
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			iWapiCompletionStatus ) );
+		}
+
+	AddObjectL( aDataReference, &iCsPassword );
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadPasswordL() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::ReadPasswordL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadDeviceSeedL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadDeviceSeedL(
+	const ec_cs_data_c* const aDataReference )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadDeviceSeedL() IN\n" ) ) );
+		
+    eap_variable_data_c csDeviceSeed( iAmTools );
+    
+    iWapiCompletionStatus = csDeviceSeed.set_copy_of_buffer(
+    	iWapiDeviceSeed->get_data( iWapiDeviceSeed->get_data_length() ),
+    	iWapiDeviceSeed->get_data_length() );
+ 	if ( iWapiCompletionStatus != eap_status_ok )
+	    {		
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		    "ERROR: wapi_am_core_symbian_c::ReadDeviceSeedL() \
+			buffer copy failed, status=%d.\n" ), iWapiCompletionStatus ) );
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			iWapiCompletionStatus ) );
+	    }
+
+	EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+		"wapi_am_core_symbian_c::ReadDeviceSeedL() Device seed",
+		csDeviceSeed.get_data( csDeviceSeed.get_data_length() ),
+		csDeviceSeed.get_data_length() ) );
+
+	AddObjectL( aDataReference, &csDeviceSeed );
+
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadDeviceSeedL() OUT\n" ) ) );
+    
+    } // wapi_am_core_symbian_c::ReadDeviceSeedL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadCertificateFilePasswordL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ReadCertificateFilePasswordL(
+	const ec_cs_data_c* const aDataReference )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCertificateFilePasswordL() IN\n" ) ) );
+	
+#if defined( WAPI_USE_UI_NOTIFIER )   		        
+    StartAsynchRequest( EWapiQueryImportFilePasswordState );
+#endif
+    
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ReadCertificateFilePasswordL() OUT\n" ) ) );
+	
+    } // wapi_am_core_symbian_c::ReadCertificateFilePasswordL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::AddObjectL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::AddObjectL(
+	const ec_cs_data_c* const aDataReference,
+	const eap_variable_data_c* const aData )
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::AddObjectL() IN\n" ) ) );
+
+	ec_cs_data_c* const csData = new ec_cs_data_c( iAmTools );
+    
+	if ( csData == NULL )
+		{
+		iWapiCompletionStatus = eap_status_allocation_error;
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::AddObjectL() csData is NULL.\n" ) ) );
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			eap_status_allocation_error ) );
+		}
+	
+	ec_cs_data_type_e type = aDataReference->get_type();
+	csData->set_type( type );					
+
+    // set the reference.
+	iWapiCompletionStatus = csData->get_writable_reference()->
+	    set_copy_of_buffer( aDataReference->get_reference() );
+	if ( iWapiCompletionStatus != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::AddObjectL() Failed to copy \
+            reference, iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+        delete csData;
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			iWapiCompletionStatus ) );
+		}
+
+	iWapiCompletionStatus = csData->get_writable_data()->set_copy_of_buffer(
+		aData );
+	
+     if ( iWapiCompletionStatus != eap_status_ok )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::AddObjectL() Failed to copy \
+            master key, iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+        delete csData;
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			iWapiCompletionStatus ) );
+		}
+	
+	iWapiCompletionStatus = iReferencesAndDataBlocks.add_object( csData, true );
+
+	if ( iWapiCompletionStatus != eap_status_ok )
+	    {
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::AddObjectL() Failed to add \
+            new object, iWapiCompletionStatus=%d.\n" ), iWapiCompletionStatus ) );
+		delete csData;
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+			iWapiCompletionStatus ) );
+		}
+					
+    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+    	"wapi_am_core_symbian_c::AddObjectL() Added data",
+		( csData->get_data() )->get_data( ( csData->get_data() )
+			->get_data_length() ),
+		( csData->get_data() )->get_data_length() ) );						
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::AddObjectL() OUT\n" ) ) );
+
+	} // wapi_am_core_symbian_c::AddObjectL()
+
+
+// ================= private: New, start/complete asynch. requests =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::StartAsynchRequest()
+// ---------------------------------------------------------
+//
+TBool wapi_am_core_symbian_c::StartAsynchRequest(
+	wapi_am_core_symbian_c::TWapiState aState )
+	{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartAsynchRequest() IN, \
+        aState=%d.\n" ), aState ) );
+    TBool status = ETrue;
+
+    if( IsActive() )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::StartAsynchRequest() \
+	        AO is active, iState=%d, aState=%d.\n" ), aState, aState ) );
+		return EFalse;
+		}
+	if ( iCancelCalled )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "wapi_am_core_symbian_c::StartAsynchRequest() \
+		     Cancel was called.\n" ) ) );
+		return EFalse;
+		}
+    iState = aState;    
+    switch ( iState )
+        {
+#if defined( WAPI_USE_UI_NOTIFIER )   		    
+        
+        case EWapiQueryCertFilePasswordState:
+        	{
+        	StartQueryCertFilePassword();
+            SetActive();
+        	}
+        case EWapiQueryImportFilePasswordState:
+        	{
+        	StartQueryImportFilePassword();
+            SetActive();
+        	break;
+        	}
+#endif // WAPI_USE_UI_NOTIFIER
+
+        default:
+        	{
+    	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+   	            "ERROR: wapi_am_core_symbian_c::StartAsynchRequest() \
+   		        State is not supported, iState = %d.\n" ), iState ) );
+    		status = EFalse;
+            break;
+        	}
+        }
+    
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartAsynchRequest() OUT, \
+        status=%d.\n" ), status ) );
+    return status;
+	
+	} // wapi_am_core_symbian_c::StartAsynchRequest()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::StartQueryCertFilePassword()
+// ---------------------------------------------------------
+//
+#if defined( WAPI_USE_UI_NOTIFIER )   		    
+void wapi_am_core_symbian_c::StartQueryCertFilePassword()
+	{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartQueryCertFilePassword() IN\n" ) ) );
+    
+    iNotifierDataToUser->iState = TWapiUiNotifierState::
+        EWapiUiNotifierCsPasswordDialog;
+    iNotifier.StartNotifierAndGetResponse( 
+        iStatus,
+        KWapiNotifierUid,
+        *iNotifierDataPckgToUser,
+        *iNotifierDataPckgFromUser );
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartQueryCertFilePassword() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::StartQueryCertFilePassword()
+#endif // WAPI_USE_UI_NOTIFIER
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CompleteQueryCertFilePassword()
+// ---------------------------------------------------------
+//
+#if defined( WAPI_USE_UI_NOTIFIER )   		    
+void wapi_am_core_symbian_c::CompleteQueryCertFilePassword()
+	{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CompleteQueryCertFilePassword() IN\n" ) ) );
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CompleteQueryCertFilePassword() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::CompleteQueryCertFilePassword()
+#endif // WAPI_USE_UI_NOTIFIER
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::StartQueryImportFilePassword()
+// ---------------------------------------------------------
+//
+#if defined( WAPI_USE_UI_NOTIFIER )   		    
+void wapi_am_core_symbian_c::StartQueryImportFilePassword()
+	{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartQueryImportFilePassword() IN\n" ) ) );
+    
+    iNotifierDataToUser->iState = TWapiUiNotifierState::
+        EWapiUiNotifierImportFileDialog;
+    iNotifier.StartNotifierAndGetResponse( 
+        iStatus,
+        KWapiNotifierUid,
+        *iNotifierDataPckgToUser,
+        *iNotifierDataPckgFromUser );
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::StartQueryImportFilePassword() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::StartQueryImportFilePassword()
+#endif // WAPI_USE_UI_NOTIFIER
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CompleteQueryImportFilePassword()
+// ---------------------------------------------------------
+//
+#if defined( WAPI_USE_UI_NOTIFIER )   		    
+void wapi_am_core_symbian_c::CompleteQueryImportFilePassword()
+	{
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CompleteQueryCertFilePassword() IN\n" ) ) );
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CompleteQueryImportFilePassword() OUT\n" ) ) );
+	
+	} // wapi_am_core_symbian_c::CompleteQueryImportFilePassword()
+#endif // WAPI_USE_UI_NOTIFIER
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ImportFilesL()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::ImportFilesL()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	"wapi_am_core_symbian_c::ImportFilesL() IN\n" ) ) );
+
+	eap_status_e status = eap_status_ok;
+
+    if ( iCertificateStoreDb == NULL )
+        {
+        iCertificateStoreDb = CCertificateStoreDatabase::NewL( iAmTools );
+        }
+
+    EAP_TRACE_ALWAYS(
+        iAmTools,
+        TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
+        (EAPL("ImportFilesL: %s: \n"),
+        (m_is_client == true ? "client": "server")));
+
+    TBool aFileAlreadyInList = EFalse;
+    
+    RDbNamedDatabase& db = iCertificateStoreDb->GetCertificateStoreDb();
+
+   // Create a buffer for the ascii strings - initialised in query
+    HBufC8* asciibuf = HBufC8::NewLC(KMaxFileName);
+    TPtr8 asciiString = asciibuf->Des();
+    asciiString.Zero();
+    
+    // Buffer for unicode parameter
+    HBufC* unicodebuf = HBufC::NewLC(KMaxFileName);
+    TPtr unicodeString = unicodebuf->Des();
+    
+     HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+    TPtr sqlStatement = buf->Des();
+    _LIT(KSQLQueryRow, "SELECT * FROM %S");
+    sqlStatement.Format(KSQLQueryRow, &KCsWapiCertFileTable);
+    
+    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+        "wapi_am_core_symbian_c::ImportFilesL() sqlStatement for delete",
+        sqlStatement.Ptr(), 
+        sqlStatement.Size() ) );    
+
+    RDbView view;
+    User::LeaveIfError(view.Prepare( db, TDbQuery(sqlStatement), TDbWindow::EUnlimited, RDbView::EUpdatable));
+
+    CleanupClosePushL(view);
+    User::LeaveIfError(view.EvaluateAll()); 
+    if (view.FirstL())
+        {
+        if (m_is_client)
+          {
+          do
+              {
+                view.GetL();        
+                switch (view.ColType(KDefaultColumnNumberOne))
+                    {
+                    case EDbColText:                
+                        {
+                            unicodeString = view.ColDes(KDefaultColumnNumberOne);
+                            // Convert to 8-bit
+                            if (unicodeString.Size() > 0)
+                                {
+                                asciiString.Copy(unicodeString);
+                                if (status != eap_status_ok)
+                                    {
+                                    User::Leave(KErrNoMemory);
+                                    }
+                                } 
+                            else 
+                                {
+                                // Empty field. Do nothing...data remains invalid
+                                break;
+                                }
+                        }     
+                     break;
+                    case EDbColBinary:
+                        {
+                        TPtrC8 dbValuePtrC8 = view.ColDes8( KDefaultColumnNumberOne );
+                          
+                        asciiString.Copy( dbValuePtrC8 );
+                        
+                        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                          "ImportFilesL BINARY value from DB",
+                          asciiString.Ptr(), asciiString.Size() ) );
+                        
+                        }
+                        break;
+                    } // switch
+                if (asciiString.Size() > 0)
+                    {
+                    HBufC* FilePathD = HBufC::NewLC(KMaxFileName);
+                    TPtr FilePathPtrD = FilePathD->Des();
+                    HBufC8* FilePathD8 = HBufC8::NewLC(KMaxFileName);
+                    TPtr8 FilePathPtrD8 = FilePathD8->Des();
+                    
+                    FilePathPtrD8.Zero();
+                    FilePathPtrD8.Append(KCertificateStoreImportDir);
+                    FilePathPtrD8.Append(asciiString);
+    
+                    FilePathPtrD.Copy(FilePathPtrD8);
+    
+                    EAP_TRACE_DATA_DEBUG(
+                            iAmTools,
+                        TRACE_FLAGS_DEFAULT,
+                        (EAPL("wapi_am_core_symbian_c::ImportFilesL: Delete File"),
+                        FilePathPtrD.Ptr(),
+                        FilePathPtrD.Size()));
+                    RFs aFs;
+                    aFs.Connect( KFileServerDefaultMessageSlots );
+                    aFs.SetAtt(FilePathPtrD, NULL, KEntryAttReadOnly);
+
+                    if(aFs.Delete(FilePathPtrD)!= KErrNone)
+                        {
+                        EAP_TRACE_DATA_DEBUG(
+                                iAmTools,
+                                TRACE_FLAGS_DEFAULT,
+                                (EAPL("wapi_am_core_symbian_c::ImportFilesL: Couldn't delete file"),
+                                        FilePathPtrD.Ptr(),
+                                        FilePathPtrD.Size()));
+                         }
+                    else
+                        {
+                        view.DeleteL(); // remove current record
+                        }
+                    CleanupStack::PopAndDestroy(FilePathD8); 
+                    CleanupStack::PopAndDestroy(FilePathD);
+                    
+                   }
+               
+              }  while (view.NextL() != EFalse);
+          }
+        }
+
+    CleanupStack::PopAndDestroy(4); // view, asciibuf, unicodebuf, buf
+
+	CDir* aFiles = NULL;
+	 
+	RFs aFs;
+	aFs.Connect( KFileServerDefaultMessageSlots );
+
+	iWapiCompletionStatus = eap_status_pending_request;
+
+	TInt aFileCounter=0;
+	TBool aDirectoryEmpty = false;
+	TBool aDirectoryExists = true;
+	HBufC* buf2 = HBufC::NewLC(KMaxPath);
+    TPtr aFileNamePtr = buf2->Des();
+	HBufC8* aFileName8 = HBufC8::NewLC(KMaxFileName);
+	TUint aFileSize =0;
+	TPtr8 aFileNamePtr8 = aFileName8->Des();
+	TBool aBadFile = false;
+	HBufC* aPath = HBufC::NewLC(KMaxFileName);
+	TPtr aPathPtr = aPath->Des();
+	HBufC8* aPath8 = HBufC8::NewLC(KMaxFileName);
+	TPtr8 aPathPtr8 = aPath8->Des();
+	HBufC8* aReadData = NULL;
+	TBool aFileFound(EFalse);
+	
+	aPathPtr8.Zero();
+	aPathPtr8.Append(KCertificateStoreImportDir);
+
+	aPathPtr.Zero();
+	aPathPtr.Copy(aPathPtr8);
+
+	if (aFs.GetDir(aPathPtr, KEntryAttNormal, ESortByName, aFiles) == KErrNone)
+		{
+		EAP_TRACE_DEBUG_SYMBIAN(
+				(_L("wapi_am_core_symbian_c::ImportFilesL: aFiles %d"),
+						aFiles->Count()));
+		
+		while (aFileFound  == EFalse && (aFileCounter < aFiles->Count()))
+			{
+			aDirectoryExists = true;
+			aFileAlreadyInList = EFalse;
+			if (!((*aFiles)[aFileCounter].IsDir()))
+                {
+                aDirectoryEmpty = false;
+                aFileSize = (*aFiles)[aFileCounter].iSize;
+
+                aFileNamePtr8.Copy((*aFiles)[aFileCounter].iName);
+
+                 EAP_TRACE_DATA_DEBUG(
+                         iAmTools,
+                         TRACE_FLAGS_DEFAULT,
+                         (EAPL("wapi_am_core_symbian_c::ImportFilesL: aFileName"),
+                         aFileNamePtr8.Ptr(),
+                         aFileNamePtr8.Size()));
+
+                 EAP_TRACE_DEBUG_SYMBIAN(
+                        (_L("wapi_am_core_symbian_c::ImportFilesL: aFile size %d"),
+                                aFileSize));
+                 TInt i = 0;
+                 while (i< iImportedFilenames.Count())
+                     {
+                     if (aFileNamePtr8.Compare(iImportedFilenames[i]) == 0)
+                         aFileAlreadyInList = ETrue;
+                     i++;
+                     }
+ 
+                if (CheckFilenameL(aFileNamePtr8) == EFalse && aFileAlreadyInList == EFalse)
+                    {
+                    EAP_TRACE_DEBUG_SYMBIAN(
+                            (_L("wapi_am_core_symbian_c::ImportFilesL: File not yet Imported -> import")));                  
+
+                    if (aFileSize > KMaxCertificateFileSize)
+                        {
+                        EAP_TRACE_DEBUG_SYMBIAN(
+                               (_L("wapi_am_core_symbian_c::ImportFilesL: aFile size %d bigger than limit %d, do not import"),
+                                       aFileSize, KMaxCertificateFileSize));
+                        TBuf8<KMaxFileName> aFile; 
+                        aFile.Copy(aFileNamePtr8.Ptr(),aFileNamePtr8.Size());
+                        iImportedFilenames.Append(aFile);
+                        iWapiCompletionStatus = set_timer(
+                                 this,
+                                 EWapiAddCertificateFileTimerId, 
+                                 0,
+                                 0);
+                        
+                        delete aFiles;
+
+                        CleanupStack::PopAndDestroy(aPath8);
+                        CleanupStack::PopAndDestroy(aPath);
+                        CleanupStack::PopAndDestroy(aFileName8);
+                        CleanupStack::PopAndDestroy(buf2);
+                        EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+                        return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+                        }
+                    else
+                        aFileFound = ETrue;
+                    }
+                else
+                    {
+                    EAP_TRACE_DEBUG_SYMBIAN(
+                            (_L("wapi_am_core_symbian_c::ImportFilesL: File already imported")));                  
+                    }
+                }
+            aFileCounter++;
+			}
+			
+			if (!aFileFound)
+				{
+				EAP_TRACE_DEBUG_SYMBIAN(
+					(_L("wapi_am_core_symbian_c::ImportFilesL: aDirectoryEmpty or files already imported")));					
+				aDirectoryEmpty = true;
+				}
+			if (aDirectoryEmpty == true ||  aDirectoryExists == false || aFileFound == EFalse)
+				{
+				if (aDirectoryExists)
+					{
+                    delete aFiles;
+                    iWapiCompletionStatus = iCertStorePartner->complete_initialize_certificate_store( iCompletionOperation );
+                    CleanupStack::PopAndDestroy(aPath8);
+                    CleanupStack::PopAndDestroy(aPath);
+                    CleanupStack::PopAndDestroy(aFileName8);
+                    CleanupStack::PopAndDestroy(buf2);
+                    EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+                    return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+					}
+				}
+			else if(aFileFound != EFalse)
+				{
+				aPathPtr8.Zero();
+				aPathPtr8.Append(KCertificateStoreImportDir);
+				aPathPtr8.Append(aFileNamePtr8);
+				aPathPtr.Zero();
+				aPathPtr.Copy(aPathPtr8);
+				
+				EAP_TRACE_DEBUG_SYMBIAN(
+						(_L("wapi_am_core_symbian_c::ImportFilesL: Read aFile")));	
+				
+				RFile aFile;
+				if(aFile.Open(aFs, aPathPtr, EFileRead)==KErrNone)
+					{
+					aReadData= HBufC8::NewLC(aFileSize); 
+					TPtr8 aReadDataPtr = aReadData->Des();
+					aFile.Read(aReadDataPtr);
+					aFile.Close();
+					
+					EAP_TRACE_DEBUG_SYMBIAN(
+							(_L("wapi_am_core_symbian_c::ImportFilesL: Copy data")));	
+					
+					eap_variable_data_c * const in_imported_certificate_data = new eap_variable_data_c(iAmTools);
+                    if (in_imported_certificate_data == NULL)
+                        {
+                        CleanupStack::PopAndDestroy(aReadData);
+
+                        delete aFiles;
+
+                        CleanupStack::PopAndDestroy(aPath8);
+                        CleanupStack::PopAndDestroy(aPath);
+                        CleanupStack::PopAndDestroy(aFileName8);
+                        CleanupStack::PopAndDestroy(buf2);
+
+                        iWapiCompletionStatus = eap_status_allocation_error;
+                        EAP_TRACE_DEBUG_SYMBIAN(
+                                (_L("wapi_am_core_symbian_c::ImportFilesL: iWapiCompletionStatus != eap_status_ok")));  
+                        if (in_imported_certificate_data != NULL)
+                            delete in_imported_certificate_data;
+                         return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+                        
+                        }
+
+					iWapiCompletionStatus = in_imported_certificate_data->set_copy_of_buffer(aReadDataPtr.Ptr(), aReadDataPtr.Size());
+
+					eap_variable_data_c * const in_imported_certificate_file_name = new eap_variable_data_c(iAmTools);
+					if (in_imported_certificate_file_name == NULL)
+					    {
+	                    CleanupStack::PopAndDestroy(aReadData);
+
+	                    delete aFiles;
+
+	                    CleanupStack::PopAndDestroy(aPath8);
+	                    CleanupStack::PopAndDestroy(aPath);
+	                    CleanupStack::PopAndDestroy(aFileName8);
+	                    CleanupStack::PopAndDestroy(buf2);
+
+	                    iWapiCompletionStatus = eap_status_allocation_error;
+                        EAP_TRACE_DEBUG_SYMBIAN(
+                                (_L("wapi_am_core_symbian_c::ImportFilesL: iWapiCompletionStatus != eap_status_ok")));  
+                        if (in_imported_certificate_data != NULL)
+                            delete in_imported_certificate_data;
+                        if (in_imported_certificate_file_name != NULL)
+                            delete in_imported_certificate_file_name;
+                        return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+					    
+					    }
+
+					iWapiCompletionStatus = in_imported_certificate_file_name->set_copy_of_buffer(aFileNamePtr8.Ptr(), aFileNamePtr8.Size());
+					
+                    CleanupStack::PopAndDestroy(aReadData);
+
+					EAP_TRACE_DEBUG_SYMBIAN(
+							(_L("wapi_am_core_symbian_c::ImportFilesL: Complete operation")));	
+					
+                    delete aFiles;
+                    aFiles = NULL;
+
+                    CleanupStack::PopAndDestroy(aPath8);
+                    CleanupStack::PopAndDestroy(aPath);
+                    CleanupStack::PopAndDestroy(aFileName8);
+                    CleanupStack::PopAndDestroy(buf2);
+
+                    if (iWapiCompletionStatus != eap_status_ok)
+						{
+	                    EAP_TRACE_DEBUG_SYMBIAN(
+	                            (_L("wapi_am_core_symbian_c::ImportFilesL: iWapiCompletionStatus != eap_status_ok")));  
+						if (in_imported_certificate_data != NULL)
+							delete in_imported_certificate_data;
+						if (in_imported_certificate_file_name != NULL)
+							delete in_imported_certificate_file_name;
+ 						return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);
+						}
+					else
+						{
+                        EAP_TRACE_DEBUG_SYMBIAN(
+                                (_L("wapi_am_core_symbian_c::ImportFilesL: iWapiCompletionStatus == eap_status_ok")));  
+						iWapiCompletionStatus = iCertStorePartner->add_imported_certificate_file(
+							in_imported_certificate_data,
+							in_imported_certificate_file_name);
+                        EAP_TRACE_DEBUG_SYMBIAN(
+                                (_L("wapi_am_core_symbian_c::ImportFilesL: iCertStorePartner->add_imported_certificate_file == %d"), iWapiCompletionStatus));  
+                         if (iWapiCompletionStatus != eap_status_ok && iWapiCompletionStatus != eap_status_pending_request)
+                             {
+                             TBuf8<KMaxFileName> aFile;
+                             aFile.Copy(in_imported_certificate_file_name->get_data(in_imported_certificate_file_name->get_data_length()), in_imported_certificate_file_name->get_data_length());
+                             iImportedFilenames.Append(aFile);
+                             iWapiCompletionStatus = set_timer(
+                                      this,
+                                      EWapiAddCertificateFileTimerId, 
+                                      0,
+                                      0);
+                            }
+                        return EAP_STATUS_RETURN(iAmTools, iWapiCompletionStatus);	
+						}
+					}
+				}
+			else
+				{
+				aBadFile = true;
+				}
+			}
+	
+    delete aFiles;
+
+    CleanupStack::PopAndDestroy(aPath8);
+    CleanupStack::PopAndDestroy(aPath);
+    CleanupStack::PopAndDestroy(aFileName8);
+    CleanupStack::PopAndDestroy(buf2);
+	EAP_TRACE_DEBUG_SYMBIAN(
+		(_L("wapi_am_core_symbian_c::ImportFilesL: Operation failed or Complete")));	
+
+	
+	if(iWapiCompletionStatus != eap_status_pending_request || aFileFound == EFalse)
+		{
+			
+		if(aBadFile == true || aDirectoryEmpty == true ||  aDirectoryExists == false)   	
+				{
+				if (m_is_client)
+				    iWapiCompletionStatus = eap_status_file_does_not_exist;
+				else
+				    iWapiCompletionStatus = eap_status_ok;
+				iCertStorePartner->complete_initialize_certificate_store( iCompletionOperation );
+				}
+			else
+				{
+				iWapiCompletionStatus = eap_status_ok;
+				iCertStorePartner->complete_initialize_certificate_store( iCompletionOperation );
+				}
+		}
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::ImportFilesL() OUT\n" ) ) );
+	return iWapiCompletionStatus;
+	
+	} // wapi_am_core_symbian_c::ImportFilesL()
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CheckFilenameL()
+// ---------------------------------------------------------
+//
+TBool wapi_am_core_symbian_c::CheckFilenameL(TPtr8 aFileNamePtr )
+    {
+    EAP_TRACE_DEBUG(iAmTools, 
+            TRACE_FLAGS_DEFAULT, (
+            EAPL("CheckFilenameL - Start\n")));
+
+    TBool aFound = EFalse;
+//    TBool aSaved = EFalse;
+    
+    RDbNamedDatabase& db = iCertificateStoreDb->GetCertificateStoreDb();
+    
+    // Create a buffer for the ascii strings - initialised in query
+    HBufC8* asciibuf = HBufC8::NewLC(KMaxFileName);
+    TPtr8 asciiString = asciibuf->Des();
+    asciiString.Zero();
+    
+    // Buffer for unicode parameter
+    HBufC* unicodebuf = HBufC::NewLC(KMaxFileName);
+    TPtr unicodeString = unicodebuf->Des();
+    
+    HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+    TPtr sqlStatement = buf->Des();
+
+    _LIT(KSQLQueryRow, "SELECT * FROM %S");
+    sqlStatement.Format(KSQLQueryRow, &KCsWapiCertFileTable);
+
+    EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+    "wapi_am_core_symbian_c::CheckFilenameL() sqlStatement for KCsWapiCertFileTable",
+    sqlStatement.Ptr(), 
+    sqlStatement.Size() ) );    
+  
+    TInt aFileCountInDB = 0;
+    RDbView view;
+    User::LeaveIfError(view.Prepare( db, TDbQuery(sqlStatement), TDbWindow::EUnlimited, RDbView::EUpdatable));
+    
+    CleanupClosePushL(view);
+    User::LeaveIfError(view.EvaluateAll()); 
+    if (view.FirstL())
+        {
+        do
+            {
+            view.GetL();        
+            switch (view.ColType(KDefaultColumnNumberOne))
+                {
+                case EDbColText:                
+                    {
+                    unicodeString = view.ColDes(KDefaultColumnNumberOne);
+                    // Convert to 8-bit
+                                                
+                    if (unicodeString.Size() > 0)
+                        {
+                        asciiString.Copy(unicodeString);
+                        if (aFileNamePtr.Compare(asciiString) == 0)
+                            {
+                                 aFound = ETrue;
+                            }
+                         } 
+                    else 
+                        {
+                        // Empty field. Do nothing
+                        break;
+                        }
+                    }
+                break;
+                case EDbColBinary:
+                    {
+                    TPtrC8 dbValuePtrC8 = view.ColDes8( KDefaultColumnNumberOne );
+                      
+                    asciiString.Copy( dbValuePtrC8 );
+                    
+                    if (asciiString.Size()>0 && aFileCountInDB<3)
+                        {
+                        if (aFileNamePtr.Compare(asciiString) == 0)
+                            {
+                                aFound = ETrue;
+                            }
+                        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                                "wapi_am_core_symbian_c::CheckFilenameL() BINARY value from DB",
+                                asciiString.Ptr(), asciiString.Size() ) );
+                        }
+                    }
+                break;
+               
+                default:
+                    {
+                    EAP_TRACE_DEBUG(
+                            iAmTools,
+                            TRACE_FLAGS_DEFAULT,
+                            (EAPL("wapi_am_core_symbian_c::CheckFilenameL: Unexpected column type. %s\n"), asciiString.Ptr(), asciiString.Size() )); 
+                    }
+                    break;
+                }
+            } while (view.NextL() != EFalse);
+    
+    
+    
+        }
+    
+    CleanupStack::PopAndDestroy(4); //  asciibuf, unicodebuf, buf, view
+    
+    EAP_TRACE_DEBUG(iAmTools, 
+            TRACE_FLAGS_DEFAULT, (
+            EAPL("CheckFilenameL - Out\n")));
+    return aFound;
+   }
+                
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::UpdatePasswordTimeL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::UpdatePasswordTimeL()
+	{
+
+	} // wapi_am_core_symbian_c::UpdatePasswordTimeL()
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CheckPasswordTimeValidityL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::CheckPasswordTimeValidityL()
+	{
+	/* Check validity of password against timelimit */
+	
+	EAP_TRACE_DEBUG(iAmTools, 
+			TRACE_FLAGS_DEFAULT, (
+			EAPL("CheckPasswordTimeValidityL - Start\n")));
+
+	} // wapi_am_core_symbian_c::CheckPasswordTimeValidityL()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC(const TDesC8& aInBuf8,
+        HBufC16** aOutBuf16)
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                            "wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC() IN\n" ) ) );
+
+    // convert utf8->unicode,
+    // aInBuf8 is UTF8 string, unicode max length is
+    // then the length of UTF8 string.
+    // NOTE, HBufC16 length means count of 16-bit objects.
+    *aOutBuf16 = HBufC16::NewL(aInBuf8.Size() );
+    CleanupStack::PushL(aOutBuf16);
+    TPtr16 outBufPtr16 = ( *aOutBuf16 )->Des();
+
+    const TPtrC8 inBufPtrC8(aInBuf8);
+
+    CnvUtfConverter::ConvertToUnicodeFromUtf8(outBufPtr16, inBufPtrC8);
+
+    // print data
+    EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                            "wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC() aInBuf8" ),
+                    inBufPtrC8.Ptr(), inBufPtrC8.Size() ) );
+
+    EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                            "wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC() aOutBuf16" ),
+                    outBufPtr16.Ptr(), outBufPtr16.Size() ) );
+
+     EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                            "wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC() OUT\n" ) ) );
+
+    } // wapi_am_core_symbian_c::ConvertFromBuf8ToBuf16LC()
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::ReadIntDbValue()
+// ---------------------------------------------------------
+//
+TInt64 wapi_am_core_symbian_c::ReadIntDbValueL(
+	RDbNamedDatabase& aDb,
+	const TDesC& aColumnName,
+	const TDesC& aSqlStatement )
+    {
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, (
+			EAPL( "wapi_am_core_symbian_c::ReadIntDbValueL()\n" ) ) );
+    TPtrC columnName;    
+	columnName.Set( aColumnName );
+	
+	RDbView view;
+
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, (
+		EAPL( "ReadIntDbValue() prepare view\n" ) ) );
+
+	User::LeaveIfError( view.Prepare( aDb, TDbQuery(
+		aSqlStatement ) ) );
+	CleanupClosePushL( view );
+	
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, (
+		EAPL("ReadIntDbValue() evaluate view\n" ) ) );
+	User::LeaveIfError( view.EvaluateAll() );		
+	// Get the first (and only) row
+	view.FirstL();
+	view.GetL();
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = view.ColSetL();
+	CleanupStack::PushL( colSet );
+	TInt64 retVal = view.ColInt64( colSet->ColNo( columnName ) );
+
+	CleanupStack::PopAndDestroy( colSet ); 
+	CleanupStack::PopAndDestroy( &view );
+
+	return retVal;
+    } // wapi_am_core_symbian_c::ReadIntDbValueL
+
+
+// ================= New, complete asynch. query methods in active object =======================
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CompleteHandlingDeviceSeedQueryState()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::CompleteHandlingDeviceSeedQueryState()
+	{
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"wapi_am_core_symbian_c::CompleteHandlingDeviceSeedQueryState() IN\n" ) ) );
+	
+	if ( iStatus != KErrNone )
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+			"ERROR: wapi_am_core_symbian_c::CompleteHandlingDeviceSeedQueryState() \
+			aStatus=%d.\n" ), iStatus.Int() ) );
+		}
+	EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"Manufacturer" ), iDeviceId.iManufacturer.Ptr(),
+		iDeviceId.iManufacturer.Size() ) );
+	EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"Model"), iDeviceId.iModel.Ptr(), iDeviceId.iModel.Size() ) );
+	EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"Revision"), iDeviceId.iRevision.Ptr(), iDeviceId.iRevision.Size()));
+	EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		"SerialNumber"), iDeviceId.iSerialNumber.Ptr(),
+		iDeviceId.iSerialNumber.Size() ) );
+		
+	// Combine all needed items.			
+	TBuf<KMaxDeviceSeedLength> deviceSeed16;	
+	deviceSeed16 += iDeviceId.iManufacturer;
+	deviceSeed16 += iDeviceId.iModel;
+	deviceSeed16 += iDeviceId.iSerialNumber;
+		
+	TBuf8<KMaxDeviceSeedSize> deviceSeed8;
+	deviceSeed8.Copy(deviceSeed16);		
+
+	if ( iWapiDeviceSeed != NULL )
+		{
+		if( deviceSeed8.Size() > 0)
+		    {
+		    iWapiDeviceSeed->set_copy_of_buffer(
+			    deviceSeed8.Ptr(),
+				deviceSeed8.Size());
+			}
+		}
+	TRAPD(err, DisconnectMMETEL());
+ 	if (err)
+		{
+		EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+		        "ERROR: wapi_am_core_symbian_c::Leave from DisconnectMMETEL () err=%d.\n" ), err ) );
+		}
+	
+ 	iWapiCompletionStatus = set_timer(
+			this,
+			EWapiAddCertificateFileTimerId, 
+			0,
+			0);
+
+	EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	    "wapi_am_core_symbian_c::CompleteHandlingDeviceSeedQueryState() OUT\n" ) ) );
+	
+	}
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::CopyBufToEapVarL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::CopyBufToEapVarL(
+	const TDesC8& aInBuf, eap_variable_data_c& aOutEapVar )
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CopyBufToEapVar() \
+         buf size=%d.\n" ), aInBuf.Size() ) );
+	
+    iWapiCompletionStatus = eap_status_ok;
+    
+	if ( aInBuf.Size() > 0 )
+		{
+		iWapiCompletionStatus = aOutEapVar.set_copy_of_buffer(
+		    aInBuf.Ptr(), aInBuf.Size() );
+		}
+	else
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+            "ERROR: wapi_am_core_symbian_c::CopyBufToEapVar() \
+            No data to copy!\n" ) ) );
+	    aOutEapVar.reset();
+	    return;
+		}
+	
+	if ( iWapiCompletionStatus != eap_status_ok )
+		{
+	    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+	        "ERROR: wapi_am_core_symbian_c::CopyBufToEapVar() \
+	        Failed to copy data, status=%d\n" ), iWapiCompletionStatus ) );
+		User::Leave( iAmTools->convert_eapol_error_to_am_error(
+		iWapiCompletionStatus ) );
+		}
+	
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+        "wapi_am_core_symbian_c::CopyBufToEapVar() OUT\n" ) ) );
+
+    } // wapi_am_core_symbian_c::CopyBufToEapVar()
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::complete_start_certificate_import()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::complete_start_certificate_import()
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_start_certificate_import()" ) ) );
+    // Now that the certificate import was done, the list of available
+    // certificates can be queried.
+    // This functionality is completed with complete_query_certificate_list
+    
+    iWapiCompletionStatus = iCertStorePartner->query_certificate_list();
+    
+    return iWapiCompletionStatus;
+    
+    }
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::complete_query_certificate_list()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::complete_query_certificate_list(
+    EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const ca_certificates,
+    EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const user_certificates)
+    {
+
+    // Call the actual complete_query function with the implementation
+    TInt trapErr = KErrNone;
+    eap_status_e returnErr = eap_status_ok;
+    TRAP( trapErr, returnErr = complete_query_certificate_listL(ca_certificates, user_certificates ));
+    
+    // There was some allocation error in the trapped function
+    if ( trapErr != KErrNone )
+        {
+        return EAP_STATUS_RETURN( iAmTools, eap_status_allocation_error);
+        }
+    
+    return EAP_STATUS_RETURN( iAmTools, returnErr );
+    }
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::complete_query_certificate_list()
+// ---------------------------------------------------------
+//
+eap_status_e wapi_am_core_symbian_c::complete_query_certificate_listL(
+    EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const ca_certificates,
+    EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const user_certificates)
+    {
+    
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list() start" ) ) );
+    
+     TInt memIndex = 0;
+    eap_status_e status = eap_status_ok;
+    _LIT(KNone, "None");
+    _LIT8(KNone8, "None");
+
+    wapi_asn1_der_parser_c wapiAsn1(iAmTools);
+    if ( wapiAsn1.get_is_valid() == false )
+        {
+        EAP_TRACE_END(iAmTools, TRACE_FLAGS_DEFAULT);
+        return EAP_STATUS_RETURN(iAmTools, eap_status_allocation_error);
+        }
+
+    eap_variable_data_c subjectName(iAmTools);
+    
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list() loops" ) ) );
+    // If there are CA labels, then we store them to the member variable
+    if ( ca_certificates != NULL )
+        {
+        if ( ca_certificates->get_object_count() > 0 )
+            {
+            // Create the array since data exists
+            *iCACerts = new(ELeave) RArray<TBuf<KCsMaxWapiCertLabelLen> >;
+            CleanupStack::PushL(*iCACerts);
+             memIndex++;
+            ( *iCACerts )->Reset();
+
+            *iCACertsData = new(ELeave) RArray<TBuf8<KMaxIdentityLength> >;
+            CleanupStack::PushL(*iCACertsData);
+             memIndex++;
+           
+            ( *iCACertsData )->Reset();
+
+            // Copy "none" as the first item into the array, requested by UI
+            HBufC* tmp = HBufC::NewLC( 4 );
+            HBufC8* tmpData = HBufC8::NewLC( 4 );
+            memIndex++;
+            memIndex++;
+            *tmp = KNone;
+            *tmpData = KNone8;
+            
+            EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                     "wapi_am_core_symbian_c::complete_query_certificate_list() add CA empty" ) ) );
+            ( *iCACerts )->AppendL( *tmp );
+            ( *iCACertsData )->AppendL( *tmpData );
+            
+            // Loop all the given identities through
+            for ( TInt i = 0; i < ca_certificates->get_object_count(); i++ )
+                {
+                EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                         "wapi_am_core_symbian_c::complete_query_certificate_list() loop CA" ) ) );
+                // Decode and store data to the RArray 
+                if (ca_certificates->get_object(i) != NULL)
+                    {
+                    status = wapiAsn1.get_decoded_subject_name(
+                            ca_certificates->get_object(i), &subjectName );
+                    // Don't store label if an error occurred
+                    if ( status != eap_status_ok )
+                        {
+                        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                                 "wapi_am_core_symbian_c::complete_query_certificate_list() decode fail" ) ) );
+                        }
+                    else
+                        {
+                        TBuf8<KCsMaxWapiCertLabelLen> tmpLabel;
+                        tmpLabel.Append( subjectName.get_data( subjectName.get_data_length() ),
+                                         subjectName.get_data_length() );
+                        HBufC16* tmp16Label;
+                        ConvertFromBuf8ToBuf16LC( tmpLabel, &tmp16Label );
+                        memIndex++;
+                       (*iCACerts)->AppendL( *tmp16Label );
+          
+                        HBufC8* tmpData = HBufC8::NewLC( ca_certificates->get_object(i)->get_data_length() );
+                        memIndex++;
+                        TPtr8 tmpDataPtr = tmpData->Des();
+                               
+                        tmpDataPtr.Copy(ca_certificates->get_object(i)->get_data(), ca_certificates->get_object(i)->get_data_length());
+     
+                        ( *iCACertsData )->AppendL( *tmpData );
+    
+                        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                            "wapi_am_core_symbian_c::complete_query_certificate_list() CA identity",
+                            tmpDataPtr.Ptr(), 
+                            tmpDataPtr.Size() ) );    
+                       }
+                    
+                    subjectName.reset();
+                    }
+                }
+            }
+        }
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list() looped CA continue with Client" ) ) );
+    
+    // If there are labels, then we store them to the member variable
+    if ( user_certificates != NULL )
+        {
+        if ( user_certificates->get_object_count() > 0 )
+            {
+            // Create the array since data exists
+            *iUserCerts = new(ELeave) RArray<TBuf<KCsMaxWapiCertLabelLen> >;
+            CleanupStack::PushL(*iUserCerts);
+            memIndex++;
+            ( *iUserCerts )->Reset();
+
+            *iUserCertsData = new(ELeave) RArray<TBuf8<KMaxIdentityLength> >;
+            CleanupStack::PushL(*iUserCertsData);
+             memIndex++;
+            ( *iUserCertsData )->Reset();
+
+            // Copy "none" as the first item into the array, requested by UI
+            HBufC* tmp = HBufC::NewLC( 4 );
+            HBufC8* tmpData = HBufC8::NewLC( 4 );
+            memIndex++;
+            memIndex++;
+            *tmp = KNone;
+            *tmpData = KNone8;
+            
+            ( *iUserCerts )->AppendL( *tmp );
+            ( *iUserCertsData )->AppendL( *tmpData );
+            
+            // Loop all the given identities through
+            for ( TInt i = 0; i < user_certificates->get_object_count(); i++ )
+                {
+                EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                         "wapi_am_core_symbian_c::complete_query_certificate_list() loop user" ) ) );
+                // Decode and store data to the RArray
+                if (user_certificates->get_object(i) != NULL)
+                    {
+                    status = wapiAsn1.get_decoded_subject_name(
+                            user_certificates->get_object(i), &subjectName );
+                    // Don't store label if an error occurred
+                    if (status != eap_status_ok)
+                        {
+                        EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                                 "wapi_am_core_symbian_c::complete_query_certificate_list() decode fail" ) ) );
+                        }
+                    else
+                        {
+                        TBuf8<KCsMaxWapiCertLabelLen> tmpLabel;
+                        tmpLabel.Append( subjectName.get_data( subjectName.get_data_length() ),
+                                         subjectName.get_data_length() );
+                        HBufC16* tmp16Label;
+                        ConvertFromBuf8ToBuf16LC( tmpLabel, &tmp16Label );
+                        memIndex++;
+                        ( *iUserCerts )->AppendL( *tmp16Label );
+                        
+                        HBufC8* tmpData = HBufC8::NewLC( user_certificates->get_object(i)->get_data_length() );
+                        memIndex++;
+                        TPtr8 tmpDataPtr = tmpData->Des();
+                               
+                        tmpDataPtr.Copy(user_certificates->get_object(i)->get_data(), user_certificates->get_object(i)->get_data_length());
+        
+                        ( *iUserCertsData )->AppendL( *tmpData);
+                         
+                        
+                        EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                             "wapi_am_core_symbian_c::complete_query_certificate_list() client identity",
+                             tmpDataPtr.Ptr(), 
+                             tmpDataPtr.Size() ) ); 
+                         }
+                    subjectName.reset();
+                    }
+                }
+            }
+        }
+    if (*iCACerts)
+        {
+        for (TInt aCa = 0; aCa <(*iCACerts)->Count(); aCa++)
+            {
+            TPtrC certPtr;
+            certPtr.Set ((**iCACerts)[aCa]);
+            EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "CaCert:"), certPtr.Ptr(),
+                certPtr.Size() ));
+    
+            EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                "wapi_am_core_symbian_c::complete_query_certificate_list() CA identity",
+                (**iCACertsData )[aCa].Ptr(), 
+                (**iCACertsData )[aCa].Size() ) ); 
+    
+            }
+        }
+    if (*iUserCerts)
+        {
+        for (TInt aCa = 0; aCa <(*iUserCerts)->Count(); aCa++)
+            {
+            TPtrC certPtr;
+            certPtr.Set ((**iUserCerts)[aCa]);
+            EAP_TRACE_DATA_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+                "ClientCert:"), certPtr.Ptr(),
+                certPtr.Size() ));
+    
+            EAP_TRACE_DATA_DEBUG_SYMBIAN( (
+                 "wapi_am_core_symbian_c::complete_query_certificate_list() client identity",
+                 (**iUserCertsData )[aCa].Ptr(), 
+                 (**iUserCertsData )[aCa].Size() ) ); 
+            }
+        }
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list() looping done" ) ) );
+
+    // The memory handling is up to the caller. The pointers to the arrays are set to NULL
+    // and the caller will handle the data and the memory hanling from now on
+    if (memIndex != 0)
+        {
+        CleanupStack::Pop(memIndex);
+        }
+
+    // if the status is failed, then we don't send any lists to the caller,
+    // delete the lists
+    if (status != eap_status_ok)
+        {
+        delete *iUserCerts;
+        delete *iCACerts;
+        delete *iUserCertsData;
+        delete *iCACertsData;
+        *iUserCerts = NULL;
+        *iCACerts = NULL;
+        *iUserCertsData = NULL;
+        *iCACertsData = NULL;
+        }
+    iUserCerts = NULL;
+    iCACerts = NULL;
+    iUserCertsData = NULL;
+    iCACertsData = NULL;
+
+    // Now the wapicertificates function can continue from its getAllCertificates
+    // function
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list(), labels ready" ) ) );
+    TRequestStatus* reqStatus = iWapiCertsStatus;
+    User::RequestComplete(reqStatus, KErrNone);
+
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::complete_query_certificate_list- end" )));
+
+    return status;
+    }
+
+
+// ---------------------------------------------------------
+// wapi_am_core_symbian_c::GetAllCertificateLabelsL()
+// ---------------------------------------------------------
+//
+void wapi_am_core_symbian_c::GetAllCertificateLabelsL( RArray<TBuf<KCsMaxWapiCertLabelLen> > **aUserCerts,
+        RArray<TBuf<KCsMaxWapiCertLabelLen> > **aCACerts,
+        RArray<TBuf8<KMaxIdentityLength> > **aUserCertsData,
+        RArray<TBuf8<KMaxIdentityLength> > **aCACertsData,
+        TRequestStatus& aStatus)
+
+    {
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::GetAllCertificateLabelsL() start" ) ) );
+    
+    // Check that the received pointers are valid
+
+    if ( aUserCerts == NULL || aCACerts == NULL || aUserCertsData == NULL || aCACertsData == NULL )
+        {
+        User::Leave( KErrArgument );
+        }
+    
+    // Set the WAPICertificates Active object status to pending
+    iWapiCertsStatus = &aStatus;
+    *iWapiCertsStatus = KRequestPending;
+    
+    eap_status_e status = eap_status_ok;
+    
+    if ( iCertStorePartner == NULL )
+        {
+        EAP_TRACE_ERROR(
+            iAmTools,
+            TRACE_FLAGS_DEFAULT,
+            (EAPL("ERROR: wapi_am_core_symbian_c::GetAllCertificateLabelsL \
+                    certStoreparner is NULL!\n"))); 
+        User::Leave( KErrGeneral );
+        }
+    
+    // Start certificate import and continue with certificate list query only if everything goes ok
+    status = iCertStorePartner->start_certificate_import();
+    if (status != eap_status_pending_request)
+        {  
+        EAP_TRACE_ERROR(
+            iAmTools,
+            TRACE_FLAGS_DEFAULT,
+            (EAPL("ERROR: wapi_am_core_symbian_c::GetAllCertificateLabelsL\
+                    configure failed!\n")));
+        User::Leave(iAmTools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(iAmTools, status)));
+        } 
+        
+    // store the given pointers to member variables to be able to update
+    // the lists when the operation is completed
+    iUserCerts = aUserCerts;
+    iCACerts = aCACerts;
+    iUserCertsData = aUserCertsData;
+    iCACertsData = aCACertsData;
+    
+    EAP_TRACE_DEBUG( iAmTools, TRACE_FLAGS_DEFAULT, ( EAPL(
+             "wapi_am_core_symbian_c::GetAllCertificateLabelsL() end" ) ) );
+    }
+    
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+EAP_FUNC_EXPORT wapi_am_base_core_c *wapi_am_base_core_c::new_wapi_am_core(
+		abs_eap_am_tools_c * const tools,
+		abs_wapi_am_core_c * const partner,
+		const bool is_client_when_true,
+		const eap_am_network_id_c* eap_id)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	EAP_TRACE_DEBUG(
+		tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("WAPI_Core: wapi_am_core_symbian_c::wapi_am_base_core_c():\n")));
+
+	EAP_TRACE_RETURN_STRING(tools, "returns: wapi_am_base_core_c::wapi_am_base_core_c()");
+
+	wapi_am_core_symbian_c * wapi_am_core_symbian = 0;
+#if defined(WAPI_USE_CERTIFICATE_STORE)
+
+	TRAPD( err, wapi_am_core_symbian = wapi_am_core_symbian_c::NewL(
+		tools,
+		partner,
+		is_client_when_true));
+
+	if (err || wapi_am_core_symbian == 0)
+	{
+		return 0;
+	}
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return wapi_am_core_symbian;
+
+#else
+
+	return 0;
+
+#endif //#if defined(WAPI_USE_CERTIFICATE_STORE)
+
+}
+
+
+//--------------------------------------------------	
+
+// End of file