wim/Scard/src/ScardReaderRegistry.cpp
changeset 0 164170e6151a
child 39 61986511a9c8
--- /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