diff -r 000000000000 -r 164170e6151a wim/Scard/inc/ScardAccessControl.h --- /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* 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