authenticationservices/authenticationserver/test/tAuthSvr/src/step_base.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 24 Nov 2009 09:06:03 +0200
changeset 19 ece3df019add
permissions -rw-r--r--
Revision: 200948 Kit: 200948

/*
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
* CTestStep derived implementation
*
*/


#include "tAuthSvrStep.h"
#include <test/testexecutelog.h>

#ifndef __INIPARSER_H__
	#include <cinidata.h>
#endif // __INIPARSER_H__

#include <s32file.h>
#include <f32file.h>
#include "authrepository.h"
using namespace AuthServer;

CTAuthSvrStepBase::CTAuthSvrStepBase()
	{
	}

TInt CTAuthSvrStepBase::writeToNamedConfig(CIniData* aFile, const TDesC& aSectName,const TDesC& aKeyName,const TPtrC& aResult)
	{
	TInt retValue = KErrNone;
	// Look for a key under a named section, retrieve text value	
		
	TInt ret = KErrNone;	//return value from FindVar functions
	ret=aFile->SetValue(aSectName, aKeyName ,aResult);
	if(ret != KErrNone)
		{			
		if(ret == KErrNotFound)
			{
			RDebug::Print(_L("Key not found. Unable to set value in ini file.  SectionName = %S, KeyName = %S, value = %S."),  &aSectName, &aKeyName, &aResult);
			}
		else
			{
			RDebug::Print(_L("Unable to set value in ini file. SectionName = %S, KeyName = %S, value = %S."), &aSectName, &aKeyName, &aResult);
			}							
		retValue = ret;
		}
	return retValue;	
	}

TInt CTAuthSvrStepBase::writeToNamedConfig(CIniData* aFile, const TDesC& aKeyName,const TPtrC& aResult)
	{
	
	TInt retValue = KErrNone;
	// Look for a key under no named section, retrieve text value	
	
	TInt ret = KErrNone;	//return value from FindVar functions
	ret=aFile->SetValue(aKeyName ,aResult);
	if(ret != KErrNone)
		{
		if(ret == KErrNotFound)
			{
			RDebug::Print(_L("Key not found. Unable to set value in ini file. KeyName = %S, value = %S."), &aKeyName, &aResult);
			}			
		else
			{
			RDebug::Print(_L("Unable to set value in ini file. KeyName = %S, value = %S."), &aKeyName, &aResult);
			}
		retValue = ret;
		}
	return retValue;	
	}
	
TInt CTAuthSvrStepBase::readFromNamedConfigL(const TDesC& aFileName, const TDesC& aSectName,const TDesC& aKeyName, HBufC*& aResult)
	{
	TInt retValue = KErrNone;	
	CIniData* file;
	file = CIniData::NewL(aFileName);	
	CleanupStack::PushL(file);
	
	// Look for a key under a named section, retrieve text value	
	TBool ret=EFalse;	//return value from FindVar functions	
	TPtrC resultPtr;
	
	ret=file->FindVar(aSectName, aKeyName ,resultPtr);	
	if(ret == EFalse)
		{		
		RDebug::Print(_L("Unable to read value in ini file. Filename: %S, SectionName = %S, value = %S."), &aFileName, &aSectName, &aResult);
		retValue = ret;
		}
	else
		{
		aResult = resultPtr.AllocL();
		CleanupStack::PushL(aResult);
		file->WriteToFileL(); //apply the implementation
		CleanupStack::Pop(aResult);
		}
	CleanupStack::PopAndDestroy(file);

	return retValue;
	
	}
	
TInt CTAuthSvrStepBase::readFromNamedConfigL(const TDesC& aFileName,const TDesC& aKeyName, HBufC*& aResult)
	{
	TInt retValue = KErrNone;	
	CIniData* file=NULL;
	file = CIniData::NewL(aFileName);	
	CleanupStack::PushL(file);

	TBool ret=EFalse;	//return value from FindVar functions
	
	TPtrC resultPtr;
	ret=file->FindVar(aKeyName, resultPtr);
	if(ret == EFalse)
		{
	    RDebug::Print(_L("Unable to read value in ini file. Filename: %S, SectionName = %S, value = %S."), &aFileName, &aKeyName, &aResult);
		retValue = ret;
		}
	else
		{			
		aResult = resultPtr.AllocL();
		CleanupStack::PushL(aResult);
		file->WriteToFileL(); //apply the implementation
		CleanupStack::Pop(aResult);
		}	
	CleanupStack::PopAndDestroy(file);

	return retValue;
	}



void CTAuthSvrStepBase::SetDefaultPluginIdL(TInt aDefault)
	{
	//Read the default plugin value from the configuration file.
	CRepository* repository = CRepository::NewL(KUidAuthServerRepository);
	CleanupStack::PushL(repository);
		
	User::LeaveIfError(repository->Set(KAuthDefaultPlugin, aDefault));
	
	//Retrieve from file
	TInt defaultPlugin(0);
	User::LeaveIfError(repository->Get(KAuthDefaultPlugin, defaultPlugin));
	INFO_PRINTF2(_L("Default plugin value set in cenrep to %d"),defaultPlugin);
	
	CleanupStack::PopAndDestroy(repository);
		
	}	
/**
 Read data from testexecute ini file that will be used to initialise the Authentication Server
*/
TInt CTAuthSvrStepBase::InitAuthServerFromFileL()
	{

	//Set a default plugin using an ini file. Read this value from a file if it is specified	
	//Set this to be the default plugin (update the policy file) if the test case specifies it (in the script's ini file).
	
	TPtrC defaultPluginFromFile;
	
	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TDriveName sysDriveName (sysDrive.Name());
	TBuf<128> fileName (sysDriveName);
	fileName.Append(KAuthSvrPolicyFile);

	CIniData* policyFile=NULL;
	TRAPD(r,policyFile=CIniData::NewL(fileName));
	CleanupStack::PushL(policyFile);

	fileName.Copy(sysDriveName);
	fileName.Append(KPluginIniFile);
	
	CIniData* pluginFile=NULL;
	TRAP(r,pluginFile=CIniData::NewL(fileName));
	CleanupStack::PushL(pluginFile);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3100File);
	
	CIniData* p3100File=NULL;
	TRAP(r,p3100File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3100File);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3101File);
	
	CIniData* p3101File=NULL;
	TRAP(r,p3101File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3101File);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3102File);
	CIniData* p3102File=NULL;
	TRAP(r,p3102File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3102File);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3103File);

	CIniData* p3103File=NULL;
	TRAP(r,p3103File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3103File);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3104File);
	
	CIniData* p3104File=NULL;
	TRAP(r,p3104File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3104File);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin4100File);
	
	CIniData* p4100File=NULL;
	TRAP(r,p4100File=CIniData::NewL(fileName));
	CleanupStack::PushL(p4100File);
	
	if (GetStringFromConfig(ConfigSection(),_L("defaultPlugin"), defaultPluginFromFile) != EFalse) // the tag 'defaultPlugin' was present
		{ 
		//Write this value to the policy file
		writeToNamedConfig(policyFile, KDefaultPluginTag, defaultPluginFromFile);
	//	SetDefaultPluginIdL(defaultPluginFromFile);
		}
	TInt defaultPluginId(0);
	if (GetIntFromConfig(ConfigSection(),_L("defaultPluginId"), defaultPluginId) != EFalse) // the tag 'defaultPlugin' was present
		{ 
		//Write this value to the policy file
		//writeToNamedConfig(policyFile, KDefaultPluginTag, defaultPluginFromFile);
		SetDefaultPluginIdL(defaultPluginId);
		}
	//Set whether a plugin supports default data. Read this value from a file if it is specified
	_LIT(KTrueText,"true");
	_LIT(KFalseText,"false");
	
	TBool iSupportsDefaultDataFromFile(ETrue);	//Default case - the plugin supports default data
	
	TBufC<16> trueBuf1(KTrueText);
	TBufC<16> falseBuf1(KFalseText);
	TPtr valueToWrite = trueBuf1.Des();			//Default case - the plugin supports default data
	if (GetBoolFromConfig(ConfigSection(),_L("iSupportsDefaultData"), iSupportsDefaultDataFromFile) != EFalse) // the tag 'isTrusted' was present
		{
		//Set the value that will be picked up by the constructor of the plugin		
		if (iSupportsDefaultDataFromFile)
			{ valueToWrite = trueBuf1.Des();	}
		else
			{ valueToWrite = falseBuf1.Des();	}			
		writeToNamedConfig(pluginFile, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);	
		writeToNamedConfig(p3100File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3101File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3102File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3103File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p4100File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		}
	else
		{
		INFO_PRINTF1(_L("The iSupportsDefaultData tag was not specified in the testexecute ini file."));
		//Use the default value of TRUE		
		valueToWrite = trueBuf1.Des();
		writeToNamedConfig(pluginFile, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3100File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3101File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3102File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p3103File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		writeToNamedConfig(p4100File, KPluginIniSection, _L("iSupportsDefaultData"), valueToWrite);
		}
	
	//Set a value for the training input that will be used by the CTPinAuthPlugin
	//in the file AuthSvrPolicy.ini
	TPtrC userPinInputFromFile;
	TPtrC supportsDefaultFromFile;
	TPtrC activeStateFromFile;

	if (GetStringFromConfig(ConfigSection(),_L("Pin11113100InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin11113100Input' was present
		{ writeToNamedConfig(p3100File, KIdEnteredPinTag, userPinInputFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113101InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin11113101Input' was present
		{ writeToNamedConfig(p3101File, KIdEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113102InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin11113102Input' was present
		{ writeToNamedConfig(p3102File, KIdEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113103InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin11113103Input' was present
		{ writeToNamedConfig(p3103File, KIdEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113104InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin11113104Input' was present
		{ writeToNamedConfig(p3104File, KIdEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin10234100InputId"), userPinInputFromFile) != EFalse) // the tag 'Pin10234100Input' was present
		{ writeToNamedConfig(p4100File, KIdEnteredPinTag, userPinInputFromFile); }
	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113100InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113100Input' was present
		{ writeToNamedConfig(p3100File, KTrainEnteredPinTag, userPinInputFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113101InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113101Input' was present
		{ writeToNamedConfig(p3101File, KTrainEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113102InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113102Input' was present
		{ writeToNamedConfig(p3102File, KTrainEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113103InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113103Input' was present
		{ writeToNamedConfig(p3103File, KTrainEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113104InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113104Input' was present
		{ writeToNamedConfig(p3104File, KTrainEnteredPinTag, userPinInputFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin10234100InputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin10234100Input' was present
		{ writeToNamedConfig(p4100File, KTrainEnteredPinTag, userPinInputFromFile); }
		
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113100Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin11113102Default' was present
		{ writeToNamedConfig(p3100File, KSupportsDefaultTag, supportsDefaultFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113101Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin11113101Default' was present
		{ writeToNamedConfig(p3101File, KSupportsDefaultTag, supportsDefaultFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113102Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin11113102Default' was present
		{ writeToNamedConfig(p3102File, KSupportsDefaultTag, supportsDefaultFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113104Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin11113104Default' was present
		{ writeToNamedConfig(p3104File, KSupportsDefaultTag, supportsDefaultFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin10234100Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin10234100Default' was present
		{ writeToNamedConfig(p4100File, KSupportsDefaultTag, supportsDefaultFromFile); }

	if (GetStringFromConfig(ConfigSection(),_L("Pin11113103Default"), supportsDefaultFromFile) != EFalse) // the tag 'Pin11113103Default' was present
		{ writeToNamedConfig(p3103File, KSupportsDefaultTag, supportsDefaultFromFile); }
	else 
		{ writeToNamedConfig(p3103File, KSupportsDefaultTag, falseBuf1.Des()); }	

	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113100Active"), activeStateFromFile) != EFalse) // the tag 'Pin11113100Active' was present
		{ writeToNamedConfig(p3100File, KActiveStateTag, activeStateFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113101Active"), activeStateFromFile) != EFalse) // the tag 'Pin11113101Active' was present
		{ writeToNamedConfig(p3101File, KActiveStateTag, activeStateFromFile); }
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113102Active"), activeStateFromFile) != EFalse) // the tag 'Pin11113102Active' was present
		{ writeToNamedConfig(p3102File, KActiveStateTag, activeStateFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113104Active"), activeStateFromFile) != EFalse) // the tag 'Pin11113104Active' was present
		{ writeToNamedConfig(p3104File, KActiveStateTag, activeStateFromFile); }	
	if (GetStringFromConfig(ConfigSection(),_L("Pin10234100Active"), activeStateFromFile) != EFalse) // the tag 'Pin10234100Active' was present
		{ writeToNamedConfig(p4100File, KActiveStateTag, activeStateFromFile); }	
		
	if (GetStringFromConfig(ConfigSection(),_L("Pin11113103Active"), activeStateFromFile) != EFalse) // the tag 'Pin11113103Active' was present
		{ writeToNamedConfig(p3103File, KActiveStateTag, activeStateFromFile); }	
	else 
		{ writeToNamedConfig(p3103File, KActiveStateTag, falseBuf1.Des()); }	
	
	// ... Other PinPluginDb's can be added
	//Else the data is set in the 'Defaultdata() function'

	policyFile->WriteToFileL();
	pluginFile->WriteToFileL();
	p3100File->WriteToFileL();
	p3101File->WriteToFileL();
	p3102File->WriteToFileL();
	p3103File->WriteToFileL();
	p3104File->WriteToFileL();
	p4100File->WriteToFileL();

	CleanupStack::PopAndDestroy(8,policyFile);
	return KErrNone;
	}

/**
 Read plugin input train data from testexecute ini file , when aInitTrainInput
 is set to true, or plugin input id when set to false.This data will be used to 
 initialise the Authentication Server.
  
*/	
TInt CTAuthSvrStepBase::InitPluginDataFromFileL(TBool aInitTrainInput)
	{
	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TDriveName sysDriveName (sysDrive.Name());
	TBuf<128> fileName (sysDriveName);
	fileName.Append(KPlugin3100File);
	
	CIniData* p3100File = NULL;
	TRAPD(r,p3100File = CIniData::NewL(fileName));
	if(r != KErrNone)
		{
		RDebug::Print(_L("Unable to create CIniData object. Error = %d, File = %S"), r, &fileName);
		return r;
		}
		
	CleanupStack::PushL(p3100File);
	
	TPtrC userPinInputFromFile;
	
	if(aInitTrainInput)
		{
		if (GetStringFromConfig(ConfigSection(),_L("PinInputTrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113100Input' was present
			{ writeToNamedConfig(p3100File, KTrainEnteredPinTag, userPinInputFromFile); }
	
		}
		
	else
		{
		if (GetStringFromConfig(ConfigSection(),_L("PinInputRetrain"), userPinInputFromFile) != EFalse) // the tag 'Pin11113100Input' was present
			{ writeToNamedConfig(p3100File, KIdEnteredPinTag, userPinInputFromFile); }
		
		}
		
	p3100File->WriteToFileL();
	CleanupStack::PopAndDestroy(p3100File);
	return KErrNone;
	}

/**
 Wait for the server to shut down and so release the authentication database.
*/
void CTAuthSvrStepBase::WaitForServerToReleaseDb()
	{
	TFullName name;
	for (;;)
		{
		TFindServer find(::KAuthServerName);
		if (find.Next(name) != KErrNone)
			{
			break;
			}

		// Wait for server to terminate
		User::After(1 * 1000 * 1000);
		}
	}
	
/**
 	Remove any existing database file.
*/
void CTAuthSvrStepBase::RemoveExistingDbL()
	{
	WaitForServerToReleaseDb();

	TInt r = KErrNone;
	
	TBuf<80> dbName(AuthServer::KDbName);
	dbName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());				
	while ((r = iFs.Delete(dbName)) == KErrInUse)
		{
		User::After(50000);
		}
	if ((KErrPathNotFound == r) || (KErrNotFound == r))  //-12 or -1
		{
		INFO_PRINTF1(_L("The database file was absent when I tried to delete it. \
			Ignoring..."));
		r = KErrNone;	//Not Important
		}
		User::LeaveIfError(r);

	
		
	TBuf<80> pinDbName(_L("!:\\private\\102740FC\\plugin.store"));
	pinDbName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());				
	while ((r = iFs.Delete(pinDbName)) == KErrInUse)
		{
		User::After(50000);
		}
	
	if ((KErrPathNotFound == r) || (KErrNotFound == r))  //-12 or -1
		{
		INFO_PRINTF1(_L("The pin plugin database file was absent when I tried to delete it. \
					Ignoring..."));
		r = KErrNone;	//Not Important
		}
	User::LeaveIfError(r);
			
	TBuf<80> pinDbName1(_L("!:\\t_pinplugindlg_in.dat"));
	pinDbName1[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());				
	while ((r = iFs.Delete(pinDbName1)) == KErrInUse)
		{
	User::After(50000);
		}
			
	if ((KErrPathNotFound == r) || (KErrNotFound == r))  //-12 or -1
		{
		INFO_PRINTF1(_L("The pin plugin database file (t_pinplugindlg_in.dat)was absent when I tried to delete it. \
						Ignoring..."));
		r = KErrNone;	//Not Important
	}
	User::LeaveIfError(r);
		
			
	TBuf<80> pinDbName2(_L("!:\\t_pinplugindlg_out.dat"));
	pinDbName2[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());				
	while ((r = iFs.Delete(pinDbName2)) == KErrInUse)
		{
		User::After(50000);
		}
				
	if ((KErrPathNotFound == r) || (KErrNotFound == r))  //-12 or -1
		{
		INFO_PRINTF1(_L("The pin plugin database file (t_pinplugindlg_out.dat)was absent when I tried to delete it. \
						Ignoring..."));
		r = KErrNone;	//Not Important
		}
	User::LeaveIfError(r);
		
	
	//Reset the data 'AllUserID&PinValues' in AuthSvrPolicy.ini & the 
	// individual plugin Db files
	TBufC<16> initPinDbBuffer(KInitPinDatabaseValue);
	TPtr valueToWrite = initPinDbBuffer.Des();
	
	TBufC<16> initEnteredPinBuffer(KDefaultInput);
	TPtr defaultInputValue = initEnteredPinBuffer.Des();
	
	TBuf<2> noIdentityVal;
	_LIT16(KFormatLastAuth,"%u");
	
	noIdentityVal.Format(KFormatLastAuth, KErrNone); //generates:

	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TDriveName sysDriveName (sysDrive.Name());
	TBuf<128> fileName (sysDriveName);
	fileName.Append(KAuthSvrPolicyFile);
	
	CIniData* policyFile=NULL;
	TRAP(r,policyFile=CIniData::NewL(fileName));
	CleanupStack::PushL(policyFile);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3100File);
	
	CIniData* p3100File=NULL;
	TRAP(r,p3100File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3100File);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3101File);
	
	CIniData* p3101File=NULL;
	TRAP(r,p3101File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3101File);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3102File);
	
	CIniData* p3102File=NULL;
	TRAP(r,p3102File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3102File);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3103File);
	
	CIniData* p3103File=NULL;
	TRAP(r,p3103File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3103File);
	
	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin3104File);

	CIniData* p3104File=NULL;
	TRAP(r,p3104File=CIniData::NewL(fileName));
	CleanupStack::PushL(p3104File);

	fileName.Copy(sysDriveName);
	fileName.Append(KPlugin4100File);

	CIniData* p4100File=NULL;
	TRAP(r,p4100File=CIniData::NewL(fileName));
	CleanupStack::PushL(p4100File);
	
	writeToNamedConfig(policyFile, KLastAuthIdTag, noIdentityVal);
	writeToNamedConfig(policyFile, KTotalDbTag, valueToWrite);
	writeToNamedConfig(p3100File, KPinDbTag, valueToWrite); 
	writeToNamedConfig(p3101File, KPinDbTag, valueToWrite); 
	writeToNamedConfig(p3102File, KPinDbTag, valueToWrite); 
	writeToNamedConfig(p3103File, KPinDbTag, valueToWrite); 
	writeToNamedConfig(p3104File, KPinDbTag, valueToWrite);
	writeToNamedConfig(p4100File, KPinDbTag, valueToWrite);
	writeToNamedConfig(p3100File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3101File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3102File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3103File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3104File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p4100File, KIdEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3100File, KTrainEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3101File, KTrainEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3102File, KTrainEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3103File, KTrainEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p3104File, KTrainEnteredPinTag, defaultInputValue);
	writeToNamedConfig(p4100File, KTrainEnteredPinTag, defaultInputValue);
	
	policyFile->WriteToFileL();
	p3100File->WriteToFileL();
	p3101File->WriteToFileL();
	p3102File->WriteToFileL();
	p3103File->WriteToFileL();
	p3104File->WriteToFileL();
	p4100File->WriteToFileL();

	CleanupStack::PopAndDestroy(7,policyFile);
	}
	
/**
 	Utility function coverting HexString to Integer
*/
TInt CTAuthSvrStepBase::HexString2Num(const TDesC8& aStr)
  {
  	TInt data = 0;
	TInt char2hex = 0;
	TInt c = 0;
	for (TInt i = 0 ; i < aStr.Length() ; ++i)
	  {
	  c = aStr[i];
	  
	  if (c < 'A')
	    {
	    char2hex='0';
	    }
	  else if (c < 'a')
	    {
	    char2hex='A';
	    }
	  else
	    {
	    char2hex='a';
	    }
	  data = data << 4;      
	  data += aStr[i]-char2hex; 
	  }
	return data;
  }


/**
 Utility function to Update the Global Db by removing the training data 
 that is associated with a given Id. The removal will not happen if 
 the identity is not present in this list, however, this is not expected
 Called at the same time as RAuthMgrClient::RemoveIdentityL(aId)
 Returns KErrNone, or some error code
*/
TInt CTAuthSvrStepBase::RemoveIdFromGlobalDbL (TUint32 aId)
	{
	
	TBuf8<500> totalDbFileContents, totalDbFileContents2;
	TInt retValue = KErrNone;
	CIniData* file=NULL;
	
	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TDriveName sysDriveName (sysDrive.Name());
	TBuf<128> fileName (sysDriveName);
	fileName.Append(KAuthSvrPolicyFile);
	
	TRAPD(r,file=CIniData::NewL(fileName));	
	if(r!=KErrNone)
		{
		RDebug::Print(_L("Unable to create CIniData object. Error = %d, File = %S"), r, &fileName);
		retValue = r;
		}	
	else
		{
		// Look for a key under a named section, retrieve text value	
		TPtrC result;		
		TBool ret=EFalse;	//return value from FindVar functions		
				
		ret=file->FindVar(KPluginIniSection, KTotalDbTag,result);
		if(!ret)
			{
			RDebug::Print(_L("Unable to find the %S key in the file %S."), &KTotalDbTag, &fileName);
			retValue = KErrNotFound;		
			}
		else
			{
			//Copy the data from the named section in the file, and see if any previous user has used this input string
			totalDbFileContents.Copy(result);
			
			//Format the searchstring as defined in the file so that it starts with a ',' and ends with a ':'.
			_LIT8(KFormatValue3, ",%d:");
			TBuf8<20> searchString;
			searchString.Format(KFormatValue3, aId);
			TInt searchResult;			
			searchResult = totalDbFileContents.Find(searchString);
			
			if (searchResult)	// the tag was found
			{				
				//Extract the rest of the pinFileContents string before the start of the PIN (before the ':')
				totalDbFileContents2 = totalDbFileContents.Left(searchResult);
				
				//The userId starts at the first ',' from the end of pinFileContents2, 
				// where p2 is the portion of p1 to the left of searchResult
				TInt userIdStartPos = totalDbFileContents2.LocateReverse(',');
				
				//Find where the PIN ends
				TInt PinEndPos = searchResult + searchString.Length() - 1;
								
				//remove the found (total) string from the list
				totalDbFileContents.Delete(userIdStartPos, (PinEndPos - userIdStartPos) );
				
				//Update the file
				//For the purpose of writing the data to a file, i'll create a 16-bit version of pinFileContents
					TInt ret2 = 0;
					HBufC* buf;
					buf = HBufC::NewL(500);	
					buf->Des().Copy(totalDbFileContents);
								
				ret2 = file->SetValue(KPluginIniSection, KTotalDbTag, *buf);
				
				TRAPD(r,file->WriteToFileL());
				if (KErrNone != r)
					{
					RDebug::Print(_L("Error occurred while writing to the file. Filename = %S, KeyName = AllUserID&PinValues, value = %S."), &fileName, buf);
					}
				delete buf;		//Memory cleanup. This string was only needed for the above Print function
				
				if (KErrNone !=ret2)
					{
					RDebug::Print(_L("Error occurred in WriteToFileL(). Error = %d. Filename= %S"), ret2, &fileName);						
					retValue = ret2;
					}
				else
					{
					retValue = KErrNone;		
					}				
				}
				else // The identity was not found in the Db. 											
				{				
				RDebug::Print(_L("RemoveIdFromGlobalDb: The specified ID was not found in the totalDbFile"));
				retValue = KErrAuthServIdentityNotFound;									
				}
			}//End check for key&section search in file
		delete file;
		}//End check for safe file access
	return retValue;
	}

/**
Returns EPass or EFail
*/
TVerdict CTAuthSvrStepBase::checkAndSetUserNameL(AuthServer::RAuthClient& authClient1, TInt idPosition)
	{	
	TBool retValue = ETrue;
	TPtrC initNameValue;
	TPtrC finalNameValue;
	//Check that the user has specified the initial and later userNames for the identity 
	
	if( (GetStringFromConfig(ConfigSection(),_L("finalUserName"), finalNameValue)) 
			!= EFalse) // the tags 'initUserName' and finalUserName are present
		{
		//Get a list of all the present identities
		RIdentityIdArray ids;
		authClient1.IdentitiesL(ids);
		CleanupClosePushL(ids);
		
		//Check the userName of particular identity that was mentioned in the function call
		HBufC* idName = authClient1.IdentityStringL(ids[idPosition]);
		CleanupStack::PushL(idName);
		
		//Change the userName to what is desired
		authClient1.SetIdentityStringL(ids[idPosition], finalNameValue);
		
		//Compare to the expected final value of the userName
		
		HBufC* idNameFinal = authClient1.IdentityStringL(ids[idPosition]);
		
		if (idNameFinal->Compare(finalNameValue) != 0)
			{
			INFO_PRINTF4(_L("Id %d has the Final name %S instead of %S"), idPosition, idNameFinal, &finalNameValue);
			retValue = EFalse;
			}
		else
			{
			INFO_PRINTF4(_L("Id %d had the initial name %S and the Final name %S"), idPosition, idName, idNameFinal);	
			retValue = ETrue;
			}		
		delete idNameFinal;			
		CleanupStack::PopAndDestroy(2, &ids);	//idName, ids
		}
	else
		{
		INFO_PRINTF1(_L("finalUserName tag is absent in the script file"));		
		}
		
	if (retValue)
		{SetTestStepResult(EPass);}
	else
		{SetTestStepResult(EFail);}	
	
	return TestStepResult();
	}


//
void CTAuthSvrStepBase::CheckSpecifiedPluginStatusL ()
	{
	//If the pluginId is quoted in the ini file, check it's training status
	TInt plugin1IdValue = 0;
	if (GetHexFromConfig(ConfigSection(),_L("plugin1Id"), plugin1IdValue) != EFalse) // the tag 'pluginId1' was present
		{
		AuthServer::RAuthClient ac;
		User::LeaveIfError(ac.Connect());
		CleanupClosePushL(ac);
		// Get the status of the specified plugin
		TInt plugin1StatusValue;
		if (GetIntFromConfig(ConfigSection(),_L("plugin1Status"), plugin1StatusValue) != EFalse) 
			{
			TAuthTrainingStatus plugin1Status;// = plugin1StatusValue;
			switch (plugin1StatusValue)
				{
				case EAuthUntrained:
					plugin1Status = EAuthUntrained;
					break;
				case EAuthTrained:
					plugin1Status = EAuthTrained;
					break;
				case EAuthFullyTrained:
					plugin1Status = EAuthFullyTrained;
					break;
				default:
					ERR_PRINTF2(_L("Error receiving a value of the pluginIdStatus. Value in file : %d "), plugin1StatusValue);
					plugin1Status = EAuthUntrained;
					break;
				}				
			
			
			RPluginDescriptions pluginList1;
			TCleanupItem cleanup(CleanupEComArray, &pluginList1);
			CleanupStack::PushL(cleanup);				
			ac.PluginsL(pluginList1);
						
			TInt numPlugins = pluginList1.Count();
			for(TInt i = 0; i < numPlugins; i++)
				{
				TInt presentPluginIdVal = pluginList1[i]->Id();
								
				if (presentPluginIdVal == plugin1IdValue)
					{
					TInt presentPluginStatus = pluginList1[i]->TrainingStatus();
					if (presentPluginStatus == plugin1Status)
						{
						INFO_PRINTF3(_L("PluginId=%x has the expected status =%i"), presentPluginIdVal, presentPluginStatus);
						SetTestStepResult(EPass);
						}
					else
						{
						ERR_PRINTF4(_L("PluginId=%x has status =%i, instead of %i"), 
							presentPluginIdVal, presentPluginStatus, plugin1Status);
						SetTestStepResult(EFail);
						}
					break;	//Don't check any other plugins	
					}
				else
					{
					SetTestStepResult(EFail);	//After this, check others
					}
				}
			if(numPlugins == 0) 				
				{
				ERR_PRINTF1(_L("No plugins in the system"));
				SetTestStepResult(EFail);					
				}
				
			if (TestStepResult() == EFail)
				{
				ERR_PRINTF3(_L("PluginId=%x does not have the expected status %i"), 
					plugin1IdValue, plugin1StatusValue);
				}
				
			CleanupStack::PopAndDestroy(&pluginList1); //infoArray, results in a call to CleanupEComArray
			}
		else
			{
			INFO_PRINTF1(_L("plugin1Status was not specified in the ini file"));
			}
		CleanupStack::PopAndDestroy(&ac);	// ac	
		}
	else
		{
		INFO_PRINTF1(_L("plugin1Id was not specified in the ini file"));	
		}
	}



enum TOp
    {
    ENone =0,
    EOr = 1,
    EAnd = 2
    };
    
enum TState
    {
    EFirstToken  = 0,
    ESecondToken = 1,
    EThirdToken  = 2,
    ENumTokens = 3
    };
    
AuthServer::CAuthExpression* CTAuthSvrStepBase::CreateAuthExprLC (const TDesC& aString)
    {
   
    TLex  input(aString);
    
    _LIT(KKnowledge,"K");    
    _LIT(KBiometric,"B");
    _LIT(KToken,"T");  
    _LIT(KDefault,"D");
    _LIT(KAnd,"&");
    _LIT(KOr,"|");
    _LIT(KUnexpected, "Unexpected '%S' token while parsing authexpression");
    
    AuthServer::CAuthExpression* result = 0;
    TState state = EFirstToken;
    TOp op = ENone;
    TBool err;
    TPluginId plugin = 0;
    
    if (aString == KNullDesC)
       	{
       	result = AuthExpr();
       	CleanupStack::PushL(result);
       	return result;
       	}
    for (TPtrC token = input.NextToken(); token.Size() > 0 ; 
         token.Set(input.NextToken()))
        { 
        AuthServer::CAuthExpression* newExpr = 0; 
        INFO_PRINTF3(_L("Token %S Size = %d"), &token, token.Size()); 
        if (token.Length() > 1)
            {
            TLex lexer(token);
            if (lexer.Val(plugin,EHex) == KErrNone)
                {
                err = (state != EFirstToken && state != EThirdToken );
                if (err) ERR_PRINTF2(KUnexpected, &token);
                newExpr = AuthExpr(plugin);
                }
            else
                {
                err = true;
                ERR_PRINTF2(KUnexpected, &token);
                }
            }
        else if (token.CompareF(KKnowledge) == 0)
            {
            err = (state != EFirstToken && state != EThirdToken );
            if (err) ERR_PRINTF2(KUnexpected, &token);
            newExpr = AuthExpr(EAuthKnowledge);
            }
        else if (token.CompareF(KBiometric) == 0)
            {   
            err = (state != EFirstToken && state != EThirdToken );
            if (err) ERR_PRINTF2(KUnexpected, &token);
            newExpr = AuthExpr(EAuthBiometric);    
            }
        else if (token.CompareF(KToken) == 0)
            {
            err = (state != EFirstToken && state != EThirdToken );
            if (err) ERR_PRINTF2(KUnexpected, &token);
            newExpr = AuthExpr(EAuthToken);
            }
        else if (token.CompareF(KDefault) == 0)
            {
            err = (state != EFirstToken && state != EThirdToken );
            if (err) ERR_PRINTF2(KUnexpected, &token);
            newExpr = AuthExpr(EAuthDefault);
            }
        else if (token.CompareF(KAnd) == 0)
            {
            err = state != ESecondToken;
            if (err) ERR_PRINTF2(KUnexpected, &token);
            op = EAnd;
            }
        else if (token.CompareF(KOr) == 0)
            {
            err = state != ESecondToken;
            if (err) ERR_PRINTF2(KUnexpected, &token);
            op = EOr;
            }
        else 
            {
            err = true;
            ERR_PRINTF2(_L("Unknown '%S' token while parsing authexpression"), &token);
            }
            
        if (err) 
            {
            User::Leave(KErrGeneral);
            }
        switch (state)    
            {
            case EFirstToken:
                if ( result == 0 && op == ENone)
                    {
                    result = newExpr;
                    CleanupStack::PushL(result);
                    }
                else 
                    {
                    //err?
                    }
                state = ESecondToken;
                break;
            case ESecondToken:
                state = EThirdToken;
                break;
            case EThirdToken:
                if (op == EOr)
                    {
                    CleanupStack::Pop(result);
                    result =  AuthOr(result, newExpr);
                    CleanupStack::PushL(result);
    
                    }
                else
                    {
                    CleanupStack::Pop(result);
                    result =  AuthAnd(result, newExpr);
                    CleanupStack::PushL(result);
                    }
                op = ENone;
                state = ESecondToken;
            }
        }
    if (state == EThirdToken)
        {
        ERR_PRINTF1(_L("Unexpected end of stream while parsing authexpression"));
        User::Leave(KErrGeneral);
        }
    return result;
    }
    
void CTAuthSvrStepBase::CheckSpecifiedPluginStatusConnectedL (AuthServer::RAuthClient& ac)
	{
	//If the pluginId is quoted in the ini file, check it's training status
	TInt plugin1IdValue = 0;
	if (GetHexFromConfig(ConfigSection(),_L("plugin1Id"), plugin1IdValue) != EFalse) // the tag 'pluginId1' was present
		{
		// Get the status of the specified plugin
		TInt plugin1StatusValue = 0;
		if (GetIntFromConfig(ConfigSection(),_L("plugin1Status"), plugin1StatusValue) != EFalse) 
			{
			TAuthTrainingStatus plugin1Status;// = plugin1StatusValue;
			switch (plugin1StatusValue)
				{
				case EAuthUntrained:
					plugin1Status = EAuthUntrained;
					break;
				case EAuthTrained:
					plugin1Status = EAuthTrained;
					break;
				case EAuthFullyTrained:
					plugin1Status = EAuthFullyTrained;
					break;
				default:
					ERR_PRINTF2(_L("Error receiving a value of the pluginIdStatus. Value in file : %d "), plugin1StatusValue);
					plugin1Status = EAuthUntrained;
					break;
				}				
			
			
			RPluginDescriptions pluginList1;
			TCleanupItem cleanup(CleanupEComArray, &pluginList1);
			CleanupStack::PushL(cleanup);						
			ac.PluginsL(pluginList1);
						
			TInt numPlugins = pluginList1.Count();
			for(TInt i = 0; i < numPlugins; i++)
				{
				TInt presentPluginIdVal = pluginList1[i]->Id();
								
				if (presentPluginIdVal == plugin1IdValue)
					{
					TInt presentPluginStatus = pluginList1[i]->TrainingStatus();
					if (presentPluginStatus == plugin1Status)
						{
						INFO_PRINTF3(_L("PluginId=%x has the expected status =%i"), presentPluginIdVal, presentPluginStatus);
						SetTestStepResult(EPass);
						}
					else
						{
						ERR_PRINTF4(_L("PluginId=%x has status =%i, instead of %i"), 
							presentPluginIdVal, presentPluginStatus, plugin1Status);
						SetTestStepResult(EFail);
						}
					break;	//Don't check any other plugins	
					}
				else
					{
					SetTestStepResult(EFail);	//After this, check others
					}
				}
			if(numPlugins == 0) 				
				{
				ERR_PRINTF1(_L("No plugins in the system"));
				SetTestStepResult(EFail);					
				}
				
			if (TestStepResult() == EFail)
				{
				ERR_PRINTF3(_L("PluginId=%x does not have the expected status %i"), 
					plugin1IdValue, plugin1StatusValue);
				}
				
			CleanupStack::PopAndDestroy(&pluginList1); //infoArray, results in a call to CleanupEComArray
			}
		else
			{
			INFO_PRINTF1(_L("plugin1Status was not specified in the ini file"));
			}		
		}
	else
		{
		INFO_PRINTF1(_L("plugin1Id was not specified in the ini file"));	
		}	
	}

TBool CTAuthSvrStepBase::CheckPluginStatusAllL (AuthServer::RAuthClient& ac)
	{
	TBool retValue = EFalse;
	
	//Get a list of all the present plugins
	RPluginDescriptions pluginList1;
	TCleanupItem cleanup(CleanupEComArray, &pluginList1);
	CleanupStack::PushL(cleanup);	
	ac.PluginsL(pluginList1);
	
	//Get a list of all the present identities
	RIdentityIdArray ids;
	ac.IdentitiesL(ids);
	CleanupClosePushL(ids);
	TInt actualNumIdsFromServer = ids.Count();
	CleanupStack::PopAndDestroy(&ids);
	
	//Get the number of identities that has been trained for each of my 3 plugins
	TInt numIdsTrained;

	TInt numPlugins = pluginList1.Count();
	for(TInt i = 0; i < numPlugins; i++)
		{
		TInt presentPluginStatus = pluginList1[i]->TrainingStatus();
		TInt presentPluginId = pluginList1[i]->Id();
		TInt expectedStatus = 0;
		
		TDriveUnit sysDrive (RFs::GetSystemDrive());
		TDriveName sysDriveName (sysDrive.Name());
		TBuf<128> fileName (sysDriveName);
		
		switch (presentPluginId)
			{
			case 0x11113100:
				{
				fileName.Append(KPlugin3100File);
				numIdsTrained = GetNumIdsFromPluginDbL(fileName);
				break;
				}
			
			case 0x11113101:
				{
				fileName.Append(KPlugin3101File);
				numIdsTrained = GetNumIdsFromPluginDbL(fileName);
				break;
				}
				
			case 0x11113102:
				{
				fileName.Append(KPlugin3102File);
				numIdsTrained = GetNumIdsFromPluginDbL(fileName);
				break;
				}
				
			case 0x10234100:
				{
				fileName.Append(KPlugin4100File);
				numIdsTrained = GetNumIdsFromPluginDbL(fileName);
				break;
				}
				
			case 0x200032E5:
				{
				numIdsTrained = actualNumIdsFromServer - 1;
				}
				
			default:				
				numIdsTrained = KErrNotFound;
				break;
			}
		if (KErrNotFound != numIdsTrained)
			{
			//We are only considering the 3 specified Ids
			if (0 == numIdsTrained)
				{ expectedStatus = EAuthUntrained; }
			else if(actualNumIdsFromServer == numIdsTrained)
				{ expectedStatus = EAuthFullyTrained; }
			else if (actualNumIdsFromServer > numIdsTrained)
				{ expectedStatus = EAuthTrained; }
			else 
				{
				ERR_PRINTF2(_L("Error!! PluginId=%x has an unexpected Number of Ids in the Database = %i"), 
						numIdsTrained);
				ERR_PRINTF2(_L("Actual number of Ids registered by the authServer = %i"), 
						actualNumIdsFromServer);				
				}
			
			//Final check
			if (presentPluginStatus != expectedStatus)
				{
				ERR_PRINTF4(_L("Present PluginStatus of plugin %x is not as expected. It is %i instead of %i"), 
							presentPluginId, presentPluginStatus, expectedStatus);
				retValue = EFalse;
				}
			else
				{
				retValue = ETrue;	
				}
			}
		}//End of for loop
	CleanupStack::PopAndDestroy(&pluginList1); //infoArray, results in a call to CleanupEComArray
	return retValue;	
	}

TInt CTAuthSvrStepBase::GetNumIdsFromPluginDbL(const TDesC& aFileName)
	{
	TBuf8<500> pluginDbFileContents;
	TInt numIds = 0;	
	CIniData* file=NULL;
	file = CIniData::NewL(aFileName);	
	CleanupStack::PushL(file);
	
	// Look for a key under a named section, retrieve text value	
	TBool ret=EFalse;	//return value from FindVar functions	
	TPtrC resultPtr;
	
	ret=file->FindVar(KPluginIniSection, KPinDbTag, resultPtr);	
	if(ret == EFalse)
		{		
		RDebug::Print(_L("Unable to read value in ini file. Filename: %S, SectionName = %S, value = %S."), &aFileName, &KPluginIniSection, &KPinDbTag);
		numIds = ret;
		}
	else
		{
		pluginDbFileContents.Copy(resultPtr);
		_LIT8(KMarker, ":");
		TBuf8<3> searchString;		
		searchString = KMarker;
		
		TInt dBLen = pluginDbFileContents.Length();
		for (TInt i = 0; i < dBLen; i++)
			{
			if (pluginDbFileContents[i] == ':')
				{
				numIds++;
				}
			}//End for
		}//End check
	CleanupStack::PopAndDestroy(file);
	return numIds;
	}

void CTAuthSvrStepBase::CreatePinPluginInputFileL(TPinPluginDialogOperation aOperation, TPinValue aPinValue)
	{
	RFileWriteStream stream;
	RFs fs;
	User::LeaveIfError(fs.Connect());
	TInt err = stream.Replace(fs, KInputFile, EFileWrite | EFileShareExclusive);
	User::LeaveIfError(err);
	stream.PushL();
	
	MStreamBuf* streamBuf = stream.Sink();
	streamBuf->SeekL(MStreamBuf::EWrite, EStreamEnd);
	stream.WriteInt32L(aOperation);
	stream.WriteInt32L(aPinValue.Length());
	stream.WriteL(aPinValue);
	stream.WriteInt32L(0);
	stream.WriteInt32L(4);
	TPinPluginDialogResult cmdResult = EOk;
	stream.WriteInt32L(cmdResult);
	aOperation = EPinPluginInfo;
	stream.WriteInt32L(aOperation);
	TPinPluginDialogResult cmdFinalResult = EOk;
	stream.WriteInt32L(cmdFinalResult);
	stream.WriteInt32L(2);
	stream.CommitL();
	CleanupStack::PopAndDestroy(); // stream
	
	}

TPinValue CTAuthSvrStepBase::GetPinFromOutputFileL()
	{
	RFileReadStream stream;
	RFs fs;
	TPinValue pinValue;
	
	User::LeaveIfError(fs.Connect());
	TInt err = stream.Open(fs, KOutputFile, EFileRead | EFileShareExclusive);
	if(err == KErrNotFound)
		{
		pinValue.Copy(_L("11111"));
		return pinValue;
		}
	
	User::LeaveIfError(err);
	stream.PushL();

	MStreamBuf* streamBuf = stream.Source();
	
	stream.ReadInt32L();
	TInt pinValueLength = stream.ReadInt32L();
	HBufC8* pinValueBuf = HBufC8::NewMaxLC(pinValueLength);
	TPtr8 pinValuePtr(pinValueBuf->Des());
	stream.ReadL(pinValuePtr, pinValueLength);
	pinValue.Copy(pinValuePtr);
	
	CleanupStack::PopAndDestroy(2, &stream);	

	return pinValue;
	}

AuthServer::TIdentityId CTAuthSvrStepBase::getLastAuthId()
/**
	Retrieve the last Identity that was authenticated from the Global Db file
	@return		The last authenticated Identity
 */
	{
	TIdentityId lastId;
	lastId = 0;
		
	HBufC* valueFromFile;
	TInt ret = 0;
	TInt err = 0;
	
	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TBuf<128> authSvrPolicyFile (sysDrive.Name());
	authSvrPolicyFile.Append(KAuthSvrPolicyFile);
	
	TRAP(err, ret = readFromNamedConfigL(authSvrPolicyFile, KLastAuthIdTag, valueFromFile));
	
	if (KErrNotFound == ret)
		{		
		ERR_PRINTF3(_L("Error while getting last AuthId. Tag %S not found in %S file"), KLastAuthIdTag, &authSvrPolicyFile);
		}
	else
		{		
		TLex input (*valueFromFile);
		TRadix aRadix = EDecimal;
		input.Val(lastId, aRadix);
		RDebug::Print(_L("UserId that is retrieved from file = %u"), lastId);
		}
		
	delete valueFromFile;		
	
	return lastId;
	}
	
	
void CTAuthSvrStepBase::ClientMessage(TBool aIsMessage, const TDesC& aDisplayString)
	{
	TDriveUnit sysDrive (RFs::GetSystemDrive());
	TDriveName sysDriveName (sysDrive.Name());
	TBuf<128> fileName (sysDriveName);
	
	fileName.Append(KAuthSvrPolicyFile);
	CIniData* file=NULL;
	TRAPD(r,file=CIniData::NewL(fileName));	
	CleanupStack::PushL(file);
	if(r!=KErrNone)
	{
	RDebug::Print(_L("Unable to create CIniData object. Error = %d, File = %S"), r, &fileName);
	}	
	
	if(aIsMessage)
		{
		TBool ret=file->SetValue(KPluginIniSection, KDisplayMessage, aDisplayString);
		file->WriteToFileL();
		}
	else
		{
		TBool ret=file->SetValue(KPluginIniSection, KDisplayMessage, KNullDesC());	
		}
	file->WriteToFileL();
	CleanupStack::PopAndDestroy(file);
	}

//Implementation of member functions for CTStepActSch

TVerdict CTStepActSch::doTestStepPreambleL()
/**
	Override CTestStep by allocating an active scheduler which is available to the subclass.	
	@return					This test step's result, which isn't actually used by ThreadStepExecutionL.
 */
	{
	CTAuthSvrStepBase::doTestStepPreambleL();
	iActSchd = new(ELeave) CActiveScheduler;
	return TestStepResult();
	}


TVerdict CTStepActSch::doTestStepPostambleL()
/**
	Override CTestStep by deleting the active scheduler which allocated in doTestStepPreambleL.
	@return					This test step's result, which isn't actually used by ThreadStepExecutionL.
 */
	{
	CTAuthSvrStepBase::doTestStepPostambleL();
	delete iActSchd;
	return TestStepResult();
	}

/**
 Utility clean up function used when working with locally declared arrays
 */
void CleanupEComArray(TAny* aArrayOfPlugins)
	{	
	(static_cast<RImplInfoPtrArray*> (aArrayOfPlugins))->ResetAndDestroy();
	(static_cast<RImplInfoPtrArray*> (aArrayOfPlugins))->Close();	
	}