wim/Scard/inc/ScardAccessControl.h
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/Scard/inc/ScardAccessControl.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,329 @@
+/*
+* 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:  This object is the one responsible for trafficing between
+*               the Smart Card reader and the sessions.
+*
+*/
+
+
+
+#ifndef CSCARDACCESSCONTROL_H
+#define CSCARDACCESSCONTROL_H
+
+//  INCLUDES
+#include "ScardDefs.h"
+#include "ScardChannelManager.h" // required by inline functions
+
+// FORWARD DECLARATIONS
+class CScardSession;
+class MScardReader;
+class CScardMessageRegistry;
+class CScardAccessControl;
+class CScardAccessControlRegistry;
+class CScardCommandTimer;
+class CScardChannelManager;
+
+// CLASS DECLARATION
+
+/**
+*  Handles traffic between the Smart Card reader and the sessions.
+*  
+*  @lib Scard.lib
+*  @since Series60 2.1
+*/
+class CScardAccessControl : public CActive
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        * @param aReaderID Reader ID
+        * @param aControl Pointer to AccessControlRegistry
+        */
+        static CScardAccessControl* NewL(
+            const TReaderID aReaderID, 
+            CScardAccessControlRegistry* aControl );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CScardAccessControl();
+    
+    public: // New functions
+        
+        /**
+        * Attach a new session to the reader.
+        * @param aSession session
+        * @param aSessionID session ID
+        * @return Pointer to reader.
+        */
+        MScardReader* AttachSessionToReaderL( CScardSession* aSession, 
+                                              TInt &aSessionID );
+
+        /**
+        * Is this session attached to this reader.
+        * @param aSession session
+        * @return true if session is attached.
+        */
+        TBool IsAttached( CScardSession* aSession ) const;
+
+        /**
+        * Detach a connection between reader and session.
+        * @param aSessionID session ID
+        * @return void
+        */
+        void DetachSessionFromReader( const TInt aSessionID );
+    
+        /**
+        * Initialise reader by calling Open.
+        * @param aSessionID session ID
+        * @param aMessage message
+        * @return EFalse if succesful, ETrue if reader is already open.
+        */
+        TBool InitialiseReader( const TInt aSessionID, 
+                                const RMessage2& aMessage );
+    
+        /**
+        * Is the reader available for data transmit
+        * @param aSessionID session ID
+        * @param aChannel channel
+        * @return ETrue if reader is ready for data transmission.
+        */
+        TBool ReaderIsReady( const TInt aSessionID, 
+                             const TInt8 aChannel ) const;
+    
+        /**
+        * Set access control in a state that enables communication with the 
+        * reader. Also sets control object active, and gives iStatus back to 
+        * caller.
+        * @param aSessionID session ID
+        * @param aMessage message
+        * @param aTimeOut time-out in microseconds (0 = no time-out).
+        * @param aChannel Logical channel
+        * @param aAdditionalParameter proprietary parameter sent to reader.
+        * @return ETrue if reader is ready for data transmission.
+        */
+        TRequestStatus& InitiateCommunication(
+            const TInt aSessionID, 
+            const RMessage2& aMessage, 
+            const TInt32 aTimeOut, 
+            const TInt8 aChannel,
+            const TUint8 aAdditionalParameter = 0x00 );
+    
+        /**
+        * Free reader's reservation.
+        * @param aSessionId session ID
+        * @param aChannel channel
+        */
+        void FreeChannelL( const TInt aSessionID, const TInt8 aChannel );
+
+        /**
+        * Stack the given command for completion later.
+        * @param aMessage message
+        * @param aSessionID session ID
+        * @param aTimeOut time-out in milliseconds (0 = no time-out).
+        * @param aChannel channel
+        */
+        void QueueExecution( const RMessage2& aMessage,
+                             const TInt aSessionID, 
+                             const TInt32 aTimeOut,
+                             const TInt8 aChannel, 
+                             const TInt8 aParameter = 0 );
+
+        /**
+        * Stack the given command for completion later with slightly higher 
+        * priority.
+        * @param aMessage message
+        * @param aSessionID session ID
+        * @param aTimeOut time-out in milliseconds (0 = no time-out).
+        * @param aChannel channel
+        */
+        void QueueChannelOperation( const RMessage2& aMessage, 
+                                    const TInt aSessionID,
+                                    const TInt32 aTimeOut, 
+                                    const TInt8 aChannel );
+
+        /**
+        * Remove operations for the session from the stack.
+        * @param aSessionID session ID
+        */
+        void DequeueOperations( const TInt aSessionID );
+
+        /**
+        * Handle a card event.
+        * @param aEvent card event
+        * @param aATR ATR-bytes
+        */
+        void CardEvent( const TScardServiceStatus aEvent, 
+                        const TScardATR& aATR );
+
+        /**
+        * Cancel everything from the session.
+        * @param aSessionID session ID
+        */
+        void CancelTransmissionsL( const TInt aSessionID );
+
+        /**
+        * Cancel an operation because the commands timer has run out.
+        * @param aTimer command timer
+        */
+        inline void CancelByTimeOut( CScardCommandTimer* aTimer );
+
+        /**
+        * ID of the reader this object controls.
+        * @return reader ID
+        */
+        inline const TReaderID ReaderID() const;
+
+        /**
+        * The reader object this object control.
+        * @return pointer to reader object.
+        */
+        inline MScardReader* Reader() const;
+
+        /**
+        * Give a session access rigths to the channel.
+        * @param aChannel channel
+        * @param aSessionID session ID
+        * @return ETrue on success.
+        */
+        inline const TBool AddSessionToChannelL( const TInt8 aChannel, 
+                                                 const TInt aSessionID );
+
+        /**
+        * Remove the session from the channel.
+        * @param aChannel channel
+        * @param aSessionID session ID
+        * @return ETrue on success.
+        */
+        inline const TBool RemoveSessionFromChannelL( const TInt8 aChannel, 
+                                                      const TInt aSessionID );
+
+        /**
+        * Has a channel been opened yet.
+        * @param aChannel channel
+        * @return ETrue if channel has been opened.
+        */
+        inline const TBool ChannelOpenedYet( const TInt8 aChannel );
+
+        /**
+        * Getter for channel status.
+        * @return channel status
+        */
+        inline TUint16 ChannelStatus();
+
+        /**
+        * Is the channel number legal, and is the session on the channel.
+        * @param aChannel channel number
+        * @param aSessionID session id
+        */
+        inline void ValidateChannelL( const TInt8 aChannel, 
+                                      const TInt aSessionID );
+
+        /**
+        * Get next unreserved logical channel.
+        * @return number of next unreserved logical channel
+        */
+        inline const TInt8 UnreservedLogicalChannel() const;
+
+
+    private: // Functions from base classes
+
+        /**
+        * From CActive cancel the request.
+        */
+        void DoCancel();
+
+        /**
+        * From CActive complete the request.
+        */
+        void RunL();
+
+    private:
+
+        /**
+        * C++ default constructor.
+        * @param aReaderID Reader ID
+        * @param aControl Pointer to AccessControlRegistry
+        */
+        CScardAccessControl( const TReaderID aReaderID, 
+                             CScardAccessControlRegistry* aControl );
+    
+        /**
+        * By default Symbian OS constructor is private.
+        */
+        void ConstructL();
+    
+        /**
+        * Get a pointer to the session with ID aSessionID.
+        * @param aSessionID Session ID
+        * @return Pointer to session
+        */
+        CScardSession* SessionBase( const TInt aSessionID );
+
+        /**
+        * Handles next message.
+        * @param aHandle Handle of message
+        */
+        inline void HandleNextMessageL( const TMessageHandle& aHandle );
+
+    private:    // Data
+
+        // Reader session struct
+        struct TReaderSession
+            {
+            CScardSession* SessionBase;
+            TInt SessionID;
+            };
+
+        // Life modes
+        enum TLifeMode
+            {
+            ECanBeDeleted,
+            ECanNotDelete,
+            EDestroyASAP
+            };
+
+        //  Container for the client sessions
+        CArrayFixFlat<TReaderSession>* iSessionRegistry;
+    
+        // state variables for the reader
+        TBool           iReaderActive;
+        TBool           iIsCreated;
+        TBool           iIsOpen;
+        TInt            iNextSessionID;
+
+        //  the actual reader object parameters
+        MScardReader* iReader;
+        TReaderID     iReaderID;
+
+        //  Owner of this object
+        CScardAccessControlRegistry* iControlRegistry;
+
+        //  Internal channel manager
+        CScardChannelManager* iManager;
+    
+        //  ATR bytes of the SC in the reader this object controls
+        TScardATR iATR;
+
+        // Life mode
+        TLifeMode iLifeMode;
+        
+    };
+
+#include "ScardAccessControl.inl"
+
+#endif  // CSCARDACCESSCONTROL_H
+
+// End of File