diff -r 000000000000 -r 164170e6151a wim/Scard/src/ScardAccessControlRegistry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/Scard/src/ScardAccessControlRegistry.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2003 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: Handles the creation and destruction of individual access +* controllers +* +*/ + + + +// INCLUDE FILES +#include "ScardAccessControlRegistry.h" +#include "ScardAccessControl.h" +#include "WimTrace.h" + +#ifdef _DEBUG // for logging +#include "ScardLogs.h" +#include +#endif +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::CScardAccessControlRegistry +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CScardAccessControlRegistry::CScardAccessControlRegistry() + { + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CScardAccessControlRegistry::ConstructL( CScardServer* aServer ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::ConstructL|Begin")); + iAccessControllers = new( ELeave ) CArrayFixFlat( 1 ); + iServer = aServer; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CScardAccessControlRegistry* CScardAccessControlRegistry::NewL( + CScardServer* aServer ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::NewL|Begin")); + CScardAccessControlRegistry* self = + new( ELeave ) CScardAccessControlRegistry; + + CleanupStack::PushL( self ); + self->ConstructL( aServer ); + CleanupStack::Pop( self ); + + return self; + } + + +// Destructor +CScardAccessControlRegistry::~CScardAccessControlRegistry() + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::~CScardAccessControlRegistry|Begin")); + while ( iAccessControllers->Count() ) + { + RemoveAccessController( 0 ); + } + delete iAccessControllers; + } + + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::ControllerRetired +// An access controller has been disconnected +// ----------------------------------------------------------------------------- +// +void CScardAccessControlRegistry::ControllerRetired( + CScardAccessControl* aControl ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::ControllerRetired|Begin")); + for ( TInt i( 0 ); i < iAccessControllers->Count(); i++ ) + { + if ( iAccessControllers->At( i ) == aControl ) + { + iAccessControllers->Delete( i ); + return; + } + } + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::RemoveAccessController +// Remove Access controller from registry +// ----------------------------------------------------------------------------- +// +void CScardAccessControlRegistry::RemoveAccessController( + const TInt aIndex ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::RemoveAccessController|Begin")); + __ASSERT_ALWAYS( aIndex < iAccessControllers->Count(), + User::Panic( _L( "Registry corruption" ), + KScServerPanicInternalError ) ); + + // we allocated the controller, so we must also delete it.. + delete ( (*iAccessControllers)[aIndex] ); + + // ...and remove it from the registy as well + //Check first it is not removed yet... + if ( aIndex < iAccessControllers->Count() ) + { + iAccessControllers->Delete( aIndex ); + } + return; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::Reader +// Get reader object by Reader ID +// ----------------------------------------------------------------------------- +// +MScardReader* CScardAccessControlRegistry::Reader( + const TReaderID aReaderID) const + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::Reader|Begin")); + for ( TInt i( 0 ); i < iAccessControllers->Count(); i++ ) + { + if ( (*iAccessControllers)[i]->ReaderID() == aReaderID ) + { + return (*iAccessControllers)[i]->Reader(); + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::FindAccessController +// Returns the access controller for given reader. +// Returns NULL if access controlled is not created +// ----------------------------------------------------------------------------- +// +CScardAccessControl* CScardAccessControlRegistry::FindAccessController( + const TReaderID aReaderID ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::FindAccessController|Begin")); + for ( TInt i( 0 ); i < iAccessControllers->Count(); i++ ) + { + if ( (*iAccessControllers)[i]->ReaderID() == aReaderID ) + { + return (*iAccessControllers)[i]; + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::ReaderHandlerLoaded +// Check if this reader has a controller loaded +// ----------------------------------------------------------------------------- +// +TBool CScardAccessControlRegistry::ReaderHandlerLoaded( + const TReaderID aReaderID ) const + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::ReaderHandlerLoaded|Begin")); + for ( TInt i( 0 ); i < iAccessControllers->Count(); i++ ) + { + if ( (*iAccessControllers)[i]->ReaderID() == aReaderID ) + { + return ETrue; + } + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::Server +// Returns the server +// ----------------------------------------------------------------------------- +// +CScardServer* CScardAccessControlRegistry::Server() + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::Server|Begin")); + return iServer; + } + +// ----------------------------------------------------------------------------- +// CScardAccessControlRegistry::AccessController +// Creates access controller if necessary +// ----------------------------------------------------------------------------- +// +CScardAccessControl* CScardAccessControlRegistry::AccessController( + const TReaderID aReaderID ) + { + _WIMTRACE(_L("WIM|Scard|CScardAccessControlRegistry::AccessController|Begin")); +#ifdef _DEBUG + RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName, + EFileLoggingModeAppend, + _L( "CScardAccessControlRegistry::GetAccessController entered.\n" ) ); +#endif + // If a controller is already made for the reader, just return it + CScardAccessControl* ctrl = FindAccessController( aReaderID ); + if ( ctrl ) + { +#ifdef _DEBUG + RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName, + EFileLoggingModeAppend, + _L( "CScardAccessControlRegistry::GetAccessController access\ + controller found.\n" ) ); +#endif + return ctrl; + } + + // If we're here, the controller has not yet been made, so create it +#ifdef _DEBUG + RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName, + EFileLoggingModeAppend, + _L( "CScardAccessControlRegistry::GetAccessController create new access\ + controller.\n" ) ); +#endif + TRAPD( err, ctrl = CScardAccessControl::NewL( aReaderID, this ) ); + if ( !ctrl || err ) + { +#ifdef _DEBUG + RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName, + EFileLoggingModeAppend, + _L( "CScardAccessControlRegistry::GetAccessController access\ + controller creation failed: %d.\n" ), err ); +#endif + return NULL; + } + + TRAP( err, iAccessControllers->AppendL( ctrl ) ); + if ( err ) + { + return NULL; + } + + return ctrl; + } + +// End of File