wim/Scard/src/ScardAccessControlRegistry.cpp
changeset 0 164170e6151a
--- /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    <flogger.h> 
+#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<CScardAccessControl*>( 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