wim/Scard/src/ScardConnectionRegistry.cpp
changeset 0 164170e6151a
child 20 63339781d179
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/Scard/src/ScardConnectionRegistry.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,277 @@
+/*
+* 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:  Keeps track, creates and destroys connector objects
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "ScardConnectionRegistry.h"
+#include    "ScardServer.h"
+#include    "ScardConnector.h"
+#include    "ScardServerBase.h"
+#include    "WimTrace.h"
+
+#ifdef _DEBUG // for logging
+#include    "ScardLogs.h"
+#include    <flogger.h> 
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::CScardConnectionRegistry
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CScardConnectionRegistry::CScardConnectionRegistry()
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::CScardConnectionRegistry|Begin"));
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CScardConnectionRegistry::ConstructL( CScardServer* aServer )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::ConstructL|Begin"));
+    iServer = aServer;
+    iConnectors = new( ELeave ) CArrayFixFlat<TConnectionHandle>( 1 );
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CScardConnectionRegistry* CScardConnectionRegistry::NewL(
+    CScardServer* aServer )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::NewL|Begin"));
+    CScardConnectionRegistry* self = new( ELeave ) CScardConnectionRegistry();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aServer );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+    
+// Destructor
+CScardConnectionRegistry::~CScardConnectionRegistry()
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::~CScardConnectionRegistry|Begin"));
+    while ( iConnectors->Count() )
+        {
+        TConnectionHandle& handle = iConnectors->At( 0 );
+        delete handle.iConnector;
+        iConnectors->Delete( 0 );
+        }
+    delete iConnectors;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::ConnectToReaderL
+// Connect to reader
+// -----------------------------------------------------------------------------
+//
+void CScardConnectionRegistry::ConnectToReaderL(
+    CScardSession* aClient, 
+    const RMessage2& aMessage )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::ConnectToReaderL|Begin"));
+#ifdef _DEBUG
+    RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+        EFileLoggingModeAppend, 
+        _L( "CScardConnectionRegistry::ConnectToReaderL entered.\n" ) );
+#endif
+    TConnectionHandle handle;
+    handle.iClient = aClient;
+    CScardConnector* conn = NULL;
+    RThread thread;
+    
+    TInt err1 = thread.Open( KScardServerName );
+    
+    if ( err1 != KErrNone )
+        {
+        _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::ConnectToReaderL|Thread open failed"));
+        }
+
+    TRAPD( err, conn = CScardConnector::NewL( this, thread, aMessage ) );
+    if ( err )
+        {
+#ifdef _DEBUG
+        RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName, 
+            EFileLoggingModeAppend, 
+            _L( "CScardConnectionRegistry::ConnectToReaderL: creating connector\
+            failed: %d \n" ), err );
+#endif
+        aMessage.Complete( err );
+        return;
+        }
+    CleanupStack::PushL( conn );
+    handle.iConnector = conn;
+    iConnectors->AppendL( handle );
+    conn->ConnectToReaderL();
+    CleanupStack::Pop(conn);
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::ReconnectToReader
+// Find the connector managing the session, and instruct it to reconnect.
+// If the connector is not found, panic will occur.
+// -----------------------------------------------------------------------------
+//
+/*
+void CScardConnectionRegistry::ReconnectToReaderL(
+    CScardSession* aClient, 
+    const RMessage& aMessage )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::ReconnectToReader|Begin"));
+    for ( TInt i( 0 ); i < iConnectors->Count(); i++ )
+        {
+        if ( iConnectors->At( i ).iClient == aClient )
+            {
+            //  The session needs to be detached from the previous reader 
+            //  (it wasn't the one we wanted after all)
+            aClient->DisconnectFromReader();
+
+            //  Now tell the connector to start reconnecting
+            iConnectors->At( i ).iConnector->ReconnectToReaderL( aMessage );
+            return;
+            }
+        }
+    User::Panic( _L( "Connector registry failure" ), 
+        KScServerPanicInternalError );
+    }
+*/
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::CancelConnection
+// Cancel connection
+// -----------------------------------------------------------------------------
+//
+void CScardConnectionRegistry::CancelConnection( CScardSession* aSession )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::CancelConnection|Begin"));
+    for ( TInt i( 0 ); i < iConnectors->Count(); i++ )
+        {
+        if ( iConnectors->At( i ).iClient == aSession )
+            {
+            iConnectors->At( i ).iConnector->Cancel();
+            return;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::ConnectDone
+// Connection has been established. Complete client message.
+// -----------------------------------------------------------------------------
+//
+void CScardConnectionRegistry::ConnectDone(
+    CScardConnector* aConnector,
+    const TReaderID& aReaderID, 
+    const TInt& aErrorCode )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::ConnectDone|Begin"));
+#ifdef _DEBUG
+    RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+        EFileLoggingModeAppend, 
+        _L( "CScardConnectionRegistry::ConnectDone to reader %d with status\
+        %d.\n" ), aReaderID, aErrorCode );
+#endif
+    for ( TInt i( 0 ); i < iConnectors->Count(); i++ )
+        {
+#ifdef _DEBUG
+        RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+            EFileLoggingModeAppend, 
+            _L( "CScardConnectionRegistry::ConnectDone finding correct\
+            connector out of %d.\n" ), iConnectors->Count() );
+#endif
+        TConnectionHandle& connection = iConnectors->At( i );
+        if ( connection.iConnector == aConnector )
+            {
+#ifdef _DEBUG
+            RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+                EFileLoggingModeAppend, 
+                _L( "CScardConnectionRegistry::ConnectDone connector\
+                found.\n" ) );
+#endif
+            connection.iClient->ConnectionDone( aReaderID, 
+                connection.iConnector->Message(), aErrorCode );
+            connection.iConnector->Message().Complete( aErrorCode );
+            return;
+            }
+        }
+    User::Panic( _L( "Registry failure" ), KScServerPanicInternalError );
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::RemoveConnector
+// Remove connector.
+// -----------------------------------------------------------------------------
+//
+void CScardConnectionRegistry::RemoveConnector( CScardConnector* aConnector )
+    {
+    _WIMTRACE(_L("WIM|Scard|CScardConnectionRegistry::RemoveConnector|Begin"));
+#ifdef _DEBUG
+    RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+        EFileLoggingModeAppend, 
+        _L( "CScardConnectionRegistry::RemoveConnector.\n" ) );
+#endif
+    for ( TInt i( 0 ); i < iConnectors->Count(); i++ )
+        {
+        if ( iConnectors->At( i ).iConnector == aConnector )
+            {
+#ifdef _DEBUG
+            RFileLogger::WriteFormat( KScardLogDir, KScardLogFileName,     
+                EFileLoggingModeAppend, 
+                _L( "CScardConnectionRegistry::RemoveConnector connector\
+                found.\n" ) );
+#endif
+            iConnectors->Delete( i );
+            return;
+            }
+        }
+    User::Panic( _L( "Registry failure" ), KScServerPanicInternalError );
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::Server
+// Return pointer to Scard server object
+// -----------------------------------------------------------------------------
+//
+CScardServer* CScardConnectionRegistry::Server() const
+    {
+    return iServer;
+    }
+
+// -----------------------------------------------------------------------------
+// CScardConnectionRegistry::Connection
+// Return connection handle
+// -----------------------------------------------------------------------------
+//
+TConnectionHandle& CScardConnectionRegistry::Connection( TInt aLocation ) const
+    { 
+    return iConnectors->At( aLocation ); 
+    }
+
+//  End of File