wim/Scard/inc/ScardChannelManager.h
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/Scard/inc/ScardChannelManager.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,225 @@
+/*
+* 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 individual channels on a singular SC 
+*               (which equals one SC reader handler) Can be queried
+*               for information about channels, controls traffic etc.
+*
+*/
+
+
+
+#ifndef CSCARDCHANNELMANAGER_H
+#define CSCARDCHANNELMANAGER_H
+
+// INCLUDES
+#include "ScardServerBase.h"
+#include "ScardDefs.h"
+
+// FORWARD DECLARATIONS
+class CScardAccessControl;
+class CScardMessageStack;
+class CScardCommandTimer;
+
+// CLASS DECLARATION
+
+/**
+*  Scard channel manager.
+*  Handles individual channels on a singular Smart card
+*  @lib Scard.lib
+*  @since Series60 2.1
+*/
+class CScardChannelManager : public CBase
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CScardChannelManager* NewL();
+
+        /**
+        * Destructor.
+        */
+        virtual ~CScardChannelManager();
+
+    public: // New functions
+
+        /**
+        * Give the session the right to use the channel
+        * @param aChannel Channel to be added
+        * @param aSessionID Session ID
+        * @return Always returns ETrue
+        */
+        TBool AddSessionToChannelL( const TInt8 aChannel, 
+                                    const TInt aSessionID );
+
+        /**
+        * Remove session from the given channel
+        * @param aChannel Channel
+        * @param aSessionID Session ID to be removed
+        * @return Always returns EFalse
+        */
+        TBool RemoveSessionL( const TInt8 aChannel, 
+                              const TInt aSessionID );
+
+        /**
+        * Does the session have permission to the channel
+        * @param aChannel Channel
+        * @param aSessionID SessionID
+        * @return ETrue if session is on channel, otherwise EFalse
+        */
+        TBool SessionIsOnChannel( const TInt8 aChannel, 
+                                  const TInt aSessionID ) const;
+
+        /**
+        * This function returns an int16 that spesifies which channels have
+        * been opened and which of them are reserved
+        * @return Two-byte parameter telling:
+        *   b0 - Channel 0 open (should always be set)
+        *   b1 - Channel 0 reserved
+        *   b2 - Channel 1 open
+        *   b3 - Channel 1 reserved
+        *   ...
+        *   b7 - Channel 3 open
+        *   b8 - Channel 3 reserved
+        *                
+        *   b9-b15 Maximum number of channels available (at the moment always 4)
+        */
+        TUint16 ChannelStatus();
+
+        /**
+        * Is the channel reserved? Return ID of session reserving the channel
+        * @param aChannel Channel
+        * @return Reserver session ID of the channel
+        */
+        TInt ChannelReservedL( const TInt8 aChannel ) const;
+
+        /**
+        * Remove the exclusive access from one channel.
+        * @param aChannel Channel
+        * @param aSessionID Session ID
+        * @return void
+        */
+        void FreeChannelL( const TInt8 aChannel,
+                           const TInt aSessionID );
+
+        /**
+        * Remove any exclusive accesses.
+        * @param aChannel Channel
+        * @return void
+        */
+        void FreeChannels( const TInt aSessionID );
+
+        /**
+        * Is the session on the channel, and is the channel number legal.
+        * @param aChannel Channel
+        * @param aSessionID SessionID
+        * @return void
+        */
+        void ValidateChannelL( const TInt8 aChannel,
+                               const TInt aSessionID );
+
+        /**
+        * Get the number of the next unreserved logical channel.
+        * @param aChannel Channel
+        * @return Number of next unreserved channel
+        */
+        TInt8 UnreservedLogicalChannel() const;
+
+        /**
+        * Has the channel been opened yet.
+        * @param aChannel Channel
+        * @return ETrue if channel already reserved, otherwise EFalse
+        */
+        TBool ChannelOpenedYet( const TInt8 aChannel );
+
+        /**
+        * Cancels the message.
+        * @param aTimer Pointer to command timer
+        * @return void
+        */
+        void CancelByTimeOut( CScardCommandTimer* aTimer );
+
+        /**
+        * Cancels all the messages for given session.
+        * @param aSessionID SessionID
+        * @return void
+        */
+        void CancelAll( const TInt aSessionID );
+
+        /**
+        * Puts message on bottom of message stack.
+        * @param aMessage Message to be pushed to bottow of stack
+        * @return void
+        */
+        void PushMessageToBottomL( const TMessageHandle& aMessage );
+        
+        /**
+        * Puts message on top of message stack.
+        * @param aMessage Message to be pushed
+        * @return void
+        */
+        void PushMessageToTopL( const TMessageHandle& aMessage );
+
+        /**
+        * Get message from top of the message stack.
+        * @return TMessageHandle
+        */
+        const TMessageHandle MessageFromTop();
+        
+        /**
+        * Get next message
+        * @return TMessageHandle
+        */
+        const TMessageHandle NextMessageL();
+        
+        /**
+        * NextMessageFromFree
+        * @param aChannel Channel
+        * @return TMessageHandle
+        */
+        const TMessageHandle NextMessageFromFree( const TInt8 aChannel );
+
+        /**
+        * Handle channels when card is removed.
+        * @return void
+        */
+        void CardRemoved();
+    
+    private:
+        
+        /**
+        * C++ default constructor.
+        */
+        CScardChannelManager();
+        
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    private:
+        // The messages
+        CScardMessageStack* iMessageStack;
+    
+        // The sessions that are joined/channel
+        CArrayPtrFlat< CArrayFixFlat<TInt> >* iChannels;
+
+        //  IDs of sessions that are currently reserving the channels
+        TInt iReserverID[KMaxChannels];
+    };
+
+#endif      // CSCARDCHANNELMANAGER_H
+
+// End of File