--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/Scard/src/ScardReaderRegistry.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,348 @@
+/*
+* 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: Registry of Smart Card readers
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "ScardReaderRegistry.h"
+#include "ScardReaderLauncher.h"
+#include "ScardServer.h"
+#include "ScardAccessControlRegistry.h"
+#include "WimTrace.h"
+
+#ifdef _DEBUG // for logging
+#include "ScardLogs.h"
+#include <flogger.h>
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// TLauncherStruct::TLauncherStruct
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+TLauncherStruct::TLauncherStruct()
+ : iGroupID( 0 ),
+ iReaderID( 0 ),
+ iLauncher( NULL )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::CScardReaderRegistry
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CScardReaderRegistry::CScardReaderRegistry( CScardServer* aServer )
+ : iServer( aServer ),
+ iLaunchersInUse( NULL )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::CScardReaderRegistry|Begin"));
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CScardReaderRegistry::ConstructL()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::ConstructL|Begin"));
+ iLaunchersInUse = new( ELeave ) CArrayFixFlat<TLauncherStruct>( 1 );
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CScardReaderRegistry* CScardReaderRegistry::NewL(
+ CScardServer *aServer )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::NewL|Begin"));
+ CScardReaderRegistry* self = new( ELeave ) CScardReaderRegistry( aServer );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+
+// Destructor
+CScardReaderRegistry::~CScardReaderRegistry()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::~CScardReaderRegistry|Begin"));
+ // remove all currently used readers
+ while ( iLaunchersInUse->Count() )
+ {
+ delete (*iLaunchersInUse)[0].iLauncher;
+ (*iLaunchersInUse)[0].iLibrary.Close();
+ (*iLaunchersInUse)[0].iSession.Close();
+ iLaunchersInUse->Delete( 0 );
+ }
+
+ delete iLaunchersInUse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::ReaderID
+// Get ID for name
+// -----------------------------------------------------------------------------
+//
+TReaderID CScardReaderRegistry::ReaderID(
+ const TScardReaderName& aReaderName )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::ReaderID|Begin"));
+ TReaderID readerID( 0 );
+
+ TScardReaderName readerName( KReaderName ); //Only supported is "SwimReader"
+
+ if ( aReaderName.Compare( readerName ) ) //Compare names
+ {
+ readerID = 0; //Not equal
+ }
+ else
+ {
+ readerID = KReaderID;
+ }
+
+ return readerID;
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::CloseReaderL
+// Unload the reader module with given ID. Also unloads the launcher
+// module if it's no longer needed
+// -----------------------------------------------------------------------------
+//
+void CScardReaderRegistry::CloseReader( const TReaderID aReaderID )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::CloseReaderL|Begin"));
+ // first retrieve the launcher structure
+ TLauncherStruct launcher;
+ TInt index( 0 );
+ for ( ; index < iLaunchersInUse->Count(); index++ )
+ {
+ if ( iLaunchersInUse->At( index ).iReaderID == aReaderID )
+ {
+ launcher = iLaunchersInUse->At( index );
+ break;
+ }
+ }
+
+ // Couldn't find it!! (So assume it's closed ok)
+ if ( index >= iLaunchersInUse->Count() )
+ {
+ return;
+ }
+
+ // Instuct the launcher to cleanup the reader..
+ launcher.iLauncher->DeleteReader( aReaderID );
+
+ // ..and never mind any error codes, just close the library...
+ delete launcher.iLauncher;
+ launcher.iLibrary.Close();
+ launcher.iSession.Close();
+
+ // Finally remove the launcher from our records
+ iLaunchersInUse->Delete( index );
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::IsSupported
+// Is the given reader supported
+// -----------------------------------------------------------------------------
+//
+TBool CScardReaderRegistry::IsSupported(
+ const TScardReaderName& aReaderName )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::IsSupported|Begin"));
+ TScardReaderName readerName( KReaderName ); //Only supported is "SwimReader"
+
+ if ( aReaderName.Compare( readerName ) ) //Compare names
+ {
+ return EFalse;
+ }
+ else
+ {
+ return ETrue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::ListOpenReaders
+// List all open readers
+// -----------------------------------------------------------------------------
+//
+void CScardReaderRegistry::ListOpenReadersL(
+ CArrayFix<CScardAccessControl*>* aACList )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::ListOpenReadersL|Begin"));
+ CScardAccessControl* ac =
+ iServer->AccessRegistry()->FindAccessController( KReaderID );
+ if ( ac )
+ {
+ aACList->AppendL( ac );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::ListClosedReaders
+// List closed readers
+// -----------------------------------------------------------------------------
+//
+void CScardReaderRegistry::ListClosedReadersL( CArrayFix<TReaderID>* aIDList )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::ListClosedReadersL|Begin"));
+ // See if it has already an access controller (aka it's been opened already)
+ CScardAccessControl* ac =
+ iServer->AccessRegistry()->FindAccessController( KReaderID );
+ if ( !ac )
+ {
+ aIDList->AppendL( KReaderID );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::FriendlyName
+// Get friendly name of reader
+// -----------------------------------------------------------------------------
+//
+const TScardReaderName CScardReaderRegistry::FriendlyName(
+ const TReaderID aReaderID )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::FriendlyName|Begin"));
+ TScardReaderName name;
+ if ( aReaderID == KReaderID ) //Only supported is 1
+ {
+ name.Copy( KReaderName );
+ }
+ return name;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::LoadReaderL
+// Load reader
+// -----------------------------------------------------------------------------
+//
+MScardReader* CScardReaderRegistry::LoadReaderL( const TReaderID aReaderID )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::LoadReaderL|Begin"));
+ TGroupID groupID( 0 );
+ if ( aReaderID == KReaderID )
+ {
+ groupID = KGroupID;
+ }
+
+ // load the group launcher's module
+#ifdef _DEBUG
+ RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,
+ EFileLoggingModeAppend,
+ _L("CScardReaderRegistry::LoadReaderL loading launcher module...\n") );
+#endif
+ MScardReaderLauncher* launcher = NULL;
+
+ launcher = LoadFactoryModuleL( groupID, aReaderID );
+
+ MScardReader* reader = NULL;
+
+ // create the reader
+#ifdef _DEBUG
+ RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,
+ EFileLoggingModeAppend,
+ _L( "CScardReaderRegistry::LoadReaderL creating reader...\n" ) );
+#endif
+ reader = (/*(CSwimReaderLauncher*)*/launcher)->CreateReaderL( aReaderID );
+
+ return reader;
+ }
+
+// -----------------------------------------------------------------------------
+// CScardReaderRegistry::LoadFactoryModuleL
+// Load factory module (SwimReader.dll)
+// -----------------------------------------------------------------------------
+//
+MScardReaderLauncher* CScardReaderRegistry::LoadFactoryModuleL(
+ const TGroupID aGroupID,
+ const TReaderID aReaderID )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardReaderRegistry::LoadFactoryModuleL|Begin"));
+ //Check ID's, only supported ID's in Series 60 are
+ // KGroupID and KReaderID
+ if ( aGroupID != KGroupID || aReaderID != KReaderID )
+ {
+ User::Leave( KErrArgument );
+ }
+ TLauncherStruct launcher;
+ launcher.iGroupID = KGroupID; //This is always 1
+ launcher.iReaderID = KReaderID; //This is always 1
+ launcher.iSession.Connect();
+
+ User::LeaveIfError( launcher.iLibrary.Load( KSwimReaderDLL ) );
+
+ // Create the actual CScardReaderLauncher object
+#ifdef _DEBUG
+ RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,
+ EFileLoggingModeAppend,
+ _L( "CScardReaderRegistry::LoadFactoryModuleL creating\
+ CScardReaderLauncher object...\n" ) );
+#endif
+ TLibraryFunction entry = launcher.iLibrary.Lookup( 1 );
+
+ if ( entry ) // entry found
+ {
+ launcher.iLauncher = reinterpret_cast< MScardReaderLauncher* >
+ ( entry() );
+ }
+ else
+ {
+ //delete launcher.iLauncher; // (?) why delete
+ launcher.iLibrary.Close();
+ launcher.iSession.Close();
+ User::Leave( KErrNotFound );
+ }
+
+ // Initialise the launcher and append it to the list
+#ifdef _DEBUG
+ RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,
+ EFileLoggingModeAppend,
+ _L( "CScardReaderRegistry::LoadFactoryModuleL initialising\
+ launcher...\n" ) );
+#endif
+ TRAPD( initialisationError, launcher.iLauncher->ConstructL(
+ iServer->ReaderService() ) );
+ if ( initialisationError )
+ {
+ delete launcher.iLauncher;
+ launcher.iLibrary.Close();
+ launcher.iSession.Close();
+ User::Leave( initialisationError );
+ }
+
+ iLaunchersInUse->AppendL( launcher );
+ return launcher.iLauncher;
+ }
+
+// End of File