diff -r 000000000000 -r 164170e6151a wim/WimPlugin/src/WimAuthenticationObjectList.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimPlugin/src/WimAuthenticationObjectList.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,353 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Implementation of authentication object list +* +*/ + + +// INCLUDE FILES + +#include "WimAuthenticationObjectList.h" +#include "WimAuthenticationObject.h" +#include "WimPin.h" +#include "WimClsv.h" +#include "WimTrace.h" +#include "WimTokenListener.h" +#include "WimImplementationUID.hrh" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::CWimAuthenticationObjectList() +// Default constructor +// ----------------------------------------------------------------------------- +// +CWimAuthenticationObjectList::CWimAuthenticationObjectList( CWimToken& aToken ) : + CActive( EPriorityHigh ), + iToken( aToken ) + { + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::NewL() +// Two phased constructor +// ----------------------------------------------------------------------------- +// +CWimAuthenticationObjectList* + CWimAuthenticationObjectList::NewL( CWimToken& aToken ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::NewL()" ) ); + CWimAuthenticationObjectList* that = + new( ELeave ) CWimAuthenticationObjectList( aToken ); + CleanupStack::PushL( that ); + that->ConstructL(); + CleanupStack::Pop( that ); + return that; + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::ConstructL() +// Second phase constructor. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::ConstructL() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::ConstructL()" ) ); + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CWimKeyStore::DoRelease() +// Deletes this interface on demand. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::DoRelease() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::DoRelease()" ) ); + delete this; + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::~CWimAuthenticationObjectList() +// Destructor +// ----------------------------------------------------------------------------- +// +CWimAuthenticationObjectList::~CWimAuthenticationObjectList() + { + _WIMTRACE ( + _L( "CWimAuthenticationObjectList::~CWimAuthenticationObjectList()" ) ); + Cancel(); + TInt count = iAuthObjects.Count(); + + while ( count ) + { + CWimAuthenticationObject* entry = iAuthObjects[count - 1]; + entry->Release(); + iAuthObjects.Remove( count - 1 ); + count--; + } + + iAuthObjects.Close(); + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::Token() +// Returns a reference to current token (MCTToken) of this authentication +// object list interface. +// ----------------------------------------------------------------------------- +// +MCTToken& CWimAuthenticationObjectList::Token() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::Token()" ) ); + return iToken; + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::List() +// Lists all authentication objects. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::List( + RMPointerArray& aAuthObjects, + TRequestStatus& aStatus ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::List()" ) ); + + if ( TokenRemoved() ) + { + return; + } + + _WIMTRACE ( _L( "CWimAuthenticationObjectList::List() after TokenRemoved checking" ) ); + aStatus = KRequestPending; + iPhase = ECreateList; + + iClientStatus = &aStatus; + iClientAuthObjects = &aAuthObjects; + + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + + _WIMTRACE ( _L( "CWimAuthenticationObjectList::List() End" ) ); + + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::DoListL() +// Fetches first all authentication objects from Wim. After that makes a copy +// each of them for the client. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::DoListL( + RMPointerArray& aAuthObjects ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::DoListL()" ) ); + + TInt count = iAuthObjects.Count(); + + for ( TInt i = 0; i < count; i++ ) + { + + //SecModUI will call Status() to get the PIN status later. + //We donot need to send PIN status in the phase + + TUint32 status = 0; + CWimAuthenticationObject* me = + MakeAuthObjectL( iAuthObjects[i]->TokenWider(), + iAuthObjects[i]->PinModule(), + iAuthObjects[i]->Label(), + iAuthObjects[i]->Type(), + iAuthObjects[i]->Handle().iObjectId, + status ); + CleanupStack::PushL( me ); + User::LeaveIfError( aAuthObjects.Append( me ) ); + CleanupStack::Pop( me ); + } + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::CreateListL() +// This function creates an internal array for authentication objects. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::CreateListL( TRequestStatus& aStatus ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::CreateListL()" ) ); + + // Delete previous ones + TInt count = iAuthObjects.Count(); + + while ( count ) + { + CWimAuthenticationObject* entry = iAuthObjects[count - 1]; + entry->Release(); + iAuthObjects.Remove( count - 1 ); + count--; + } + + TInt ret = iToken.WimSecModule()->PinNrEntriesL( iPinNRs, aStatus ); + + if ( ret != KErrNone ) + { + User::Leave( ret ); + } + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::MakeAuthObjectL() +// This function is called from two different places +// ----------------------------------------------------------------------------- +// +CWimAuthenticationObject* + CWimAuthenticationObjectList::MakeAuthObjectL( CWimToken& aToken, + CWimPin& aPinModule, + const TDesC& aLabel, + TUid aType, + TUint32 aHandle, + TUint32 aStatus ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::MakeAuthObjectL()" ) ); + CWimAuthenticationObject* me = + CWimAuthenticationObject::NewLC( aToken, + aPinModule, + aLabel, + aType, + aHandle, + aStatus ); + CleanupStack::Pop( me ); + return me; + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::CancelList() +// Because List is synchronous, there is nothing to do here. +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::CancelList() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::CancelList()" ) ); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::TokenRemoved() +// Returns true or false indicating if token is removed +// ----------------------------------------------------------------------------- +// +TBool CWimAuthenticationObjectList::TokenRemoved() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::TokenRemoved()" ) ); + // If token listener is not alive, then token is removed + if ( iToken.TokenListener()->TokenStatus() != KRequestPending ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::RunL() +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::RunL() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::RunL()" ) ); + switch ( iPhase ) + { + case ECreateList: + { + iPhase = ECreateListDone; + iStatus = KRequestPending; + SetActive(); + //iPinNRs is initialized here + CreateListL( iStatus ); + break; + } + + case ECreateListDone: + { + //Pin type is set here + + if ( iPinNRs ) // If PINs were found + { + TUid pintype = {WIM_PIN_G_UID}; // The first one is always PIN-G + TInt count = iPinNRs->Count(); + TUint32 status = 0; + + for ( TInt i = 0; i < count; i++ ) + { + CWimAuthenticationObject* me = + MakeAuthObjectL( iToken, + *( *iPinNRs )[i], + ( *iPinNRs )[i]->Label(), + pintype, + ( *iPinNRs )[i]->PinNumber(), + status ); + CleanupStack::PushL( me ); + User::LeaveIfError ( iAuthObjects.Append( me ) ); + CleanupStack::Pop( me ); + pintype.iUid = WIM_PIN_NR_UID; // The others are always PIN-NR + } + } + iPhase = EDoList; + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + break; + } + + case EDoList: + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::RunL(): EDoList" ) ); + DoListL( *iClientAuthObjects ); + User::RequestComplete( iClientStatus, KErrNone ); + break; + } + + default: + break; + } + + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::DoCancel() +// ----------------------------------------------------------------------------- +// +void CWimAuthenticationObjectList::DoCancel() + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::DoCancel()" ) ); + User::RequestComplete( iClientStatus, KErrCancel ); + } + +// ----------------------------------------------------------------------------- +// CWimAuthenticationObjectList::RunError() +// ----------------------------------------------------------------------------- +// +TInt CWimAuthenticationObjectList::RunError( TInt aError ) + { + _WIMTRACE ( _L( "CWimAuthenticationObjectList::RunError()" ) ); + User::RequestComplete( iClientStatus, aError ); + return KErrNone; + } + + +// End of File