systemswstubs/examplecommonisc/IscDriver/inc/IscChannel.h
changeset 46 e1758cbb96ac
parent 0 0ce1b5ce9557
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/systemswstubs/examplecommonisc/IscDriver/inc/IscChannel.h	Mon Oct 04 00:04:35 2010 +0300
@@ -0,0 +1,325 @@
+/*
+* Copyright (c) 2002-2005 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:
+*
+*/
+
+
+#ifndef DISCCHANNEL_H
+#define DISCCHANNEL_H
+
+//  INCLUDES
+#include <kernel.h>
+#include <IscMultiplexerBase.h> // TIscFrameInfo
+
+// CONSTANTS
+const TInt KMajorVersionNumber = 1;
+const TInt KMinorVersionNumber = 0;
+const TInt KBuildVersionNumber = 1;
+
+const TUint8 KBehaviormask = 15; //bits 00001111
+
+// MACROS
+
+const TInt KIscEmptyMyBuffersDfcPriority( 4 );
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+class DIscDevice;
+class DIscQueue;
+class IscChannelContainer;
+
+/**
+*  Handles all interraction with the user-side
+*
+*  @lib IscDriver.LIB
+*  @since 2.8
+*/
+class DIscChannel : public DLogicalChannel
+    {
+
+    public:  // Constructors and destructor
+       
+        /**
+        * C++ default constructor.
+        * @param pointer to owner device
+        */
+        IMPORT_C DIscChannel( DLogicalDevice* aDevice );
+       
+        /**
+        * Destructor.
+        */
+        ~DIscChannel();
+
+    public: // Functions from base classes
+        
+        /**
+        * Secondary initialization of channel.
+        * @since 2.8
+        * @param  TInt aUnit Channel number
+        * @param const TDesC8* anInfo pointer to a descriptor containing extra 
+        *                             information for the device. 
+        * @param const TVersion& aVer reference containing the version being 
+        *                             requested by the thread which is opening this channel 
+        * @return virtual TInt KErrNone if succesful. KErrAlreadyExist if channel already open
+        */
+        virtual TInt DoCreate( TInt aUnit, const TDesC8* anInfo, const TVersion& aVer );
+
+        /**
+        * Message handling ( kernel server context ).
+        * @since 2.8
+        * @param aMsg Thread message to get parameters from user side
+        * @return void 
+        */
+        virtual void HandleMsg( TMessageBase* aMsg );
+
+        /**
+        * Message handling ( user thread context ).
+        * @since 2.8
+        * @param aReqNo request number called from IscApi
+        * @param a1 pointer array to get parameters from user side
+        * @param a2 not used in ISC
+        * @return TInt KErrNone if succesful
+        */
+        TInt Request( TInt aReqNo, TAny* a1, TAny* a2 );
+
+    public: // New functions
+        /**
+        * Function to complete clients pending asynchronous request
+        * @since 2.8
+        * @param  TInt aOperation asynchronous operation to complete
+        * @param TInt aCompleteStatus status of request to be completed
+        * @return void 
+        */
+        void CompleteRequest( TInt aOperation, TInt aCompleteStatus );
+
+        /**
+        * Stores the incoming frame to channels receive queue
+        * @since 2.8
+        * @param TDesC8* aData pointer to storable frame
+        * @return void 
+        */
+        void StoreFrame( TDesC8* aData );
+
+        /**
+        * Goes through channel's queue and delivers possible frame to client
+        * @since 2.8
+        * @return void 
+        */
+        void EmptyBuffers();
+        
+        /**
+        * Notify user side client that uplink flow control is on/off
+        * @since 2.8
+        * @param const TInt aFlowControlStatus EIscFlowControlOn / EIscFlowControlOff
+        * @return void 
+        */
+        void NotifyFlowControl( const TInt aFlowControlStatus );
+
+        /**
+        * Notify user side client that status of connection between Symbian side and the Domestic OS has changed
+        * @since 2.8
+        * @param const TInt aConnectionStatus  EIscConnectionOk / EIscConnectionNotOk
+        * @return void 
+        */
+        void NotifyConnectionStatus( const TInt aConnectionStatus );
+    
+        /**
+        * Check if asynchronous request is active
+        * @since 2.8
+        * @param const TUint16 aReqNumber Number of request
+        * @return TInt KRequestPending if request active. Otherwise KErrNone
+        */
+        TInt IsPending( const TUint16 aReqNumber );
+
+        /**
+        * Copy data from user buffer to kernel side buffer by multiplexer
+        * @since 2.8
+        * @param aUserBuffer pointer to source descriptor
+        * @param aKernelBuffer pointer to destination descriptor
+        * @param aOffset Offset of the source buffer
+        * @return KErrNone if successful
+        */
+        TInt CopyFromUserBuffer( const TDesC8& aUserBuffer,
+                                 TDes8& aKernelBuffer,
+                                 TInt aOffset );
+
+        /**
+        * Writes data/frames to clients buffer
+        * @since 2.8
+        * @param aDest pointer to destination descriptor
+        * @param aSrc pointer to source descriptor
+        * @param aOffset Offset on where to start writing to target descriptor
+        * @return TInt 
+        */
+        TInt ThreadWrite( TAny* aDest, const TDesC8* aSrc, TInt aOffset );
+
+        /**
+        * Delete send frames / receive queue for channel in question
+        * @since 2.8
+        * @return void 
+        */
+        void ResetBuffers();
+
+        /**
+        * Returns the channel number.
+        * @since 3.0
+        * @return TUint16, the number of the channel.
+        */
+        inline TUint16 GetChannelNumber(){return iChannelNumber;};
+
+        /**
+        * Returns a reference to user side thread of this channel.
+        * @since 3.0
+        * @param None
+        * @return DThread*, user side thread ownership is not given.
+        */
+        inline DThread* GetDThread()
+        	{
+        	return iThread;	
+        	};
+
+    protected: 
+      
+		// None
+
+    private:
+
+        /**
+        * Call from user side comes to this function
+        * @since 2.8
+        * @param  TInt aFunction request number
+        * @param TAny* a1 pointer to array including info about request
+        * @param TAny* a2 not used
+        * @return TInt KErrNone if succesful
+        */
+        TInt HandleRequest( TInt aFunction, TAny* a1, TAny* a2 );
+        
+        /**
+        * Handles channel destruction.
+        * @since 2.8
+        * @param void
+        * @return void 
+        */        
+        void ChannelDestruction();
+        
+        /**
+        * Handles asynchronous client requests
+        * @since 2.8
+        * @param  TInt aFunction request number
+        * @param TAny* a1 pointer to array including info about request
+        * @return void 
+        */
+        void HandleAsyncRequest( TInt aFunction, TAny* a1 );
+
+        /**
+        * Handles synchronous client requests
+        * @since 2.8
+        * @param  TInt aFunction
+        * @param TAny* a1 pointer to array including info about request
+        * @return TInt 
+        */
+        TInt HandleSyncRequest( TInt aFunction, TAny* a1 );
+
+        /**
+        * Cancels active request
+        * @since 2.8
+        * @param  TInt aFunction request number
+        * @param TAny* a1 not used
+        * @return TInt 
+        */
+        TInt HandleCancelRequest( TInt aFunction, TAny* a1 );
+        
+        /**
+        * Copies several data frames to clients buffer if needed before compliting receive request
+        * @since 2.8
+        * @param  TDes8* aPtr pointer to frame
+        * @param TIscFrameInfo& aInfo info needed in frame combining
+        * @return void 
+        */
+        void HandleConcatenatedDataFrame( TDes8* aPtr, TIscFrameInfo& aInfo );
+
+        /**
+        * Copies several frames to clients buffer if needed before compliting receive request
+        * @since 2.8
+        * @param  TDes8* aPtr pointer to frame
+        * @param TIscFrameInfo& aInfo info needed in frame combining
+        * @return void 
+        */
+        void HandleConcatenatedFrame( TDes8* aPtr, TIscFrameInfo& aInfo );
+
+        /**
+        * Initialization complete dfc
+        * @since 2.8
+        * @param TAny* aPtr pointer to channel
+        * @return static void.
+        */
+        static void InitializeComplete( TAny* aPtr );
+        
+        /**
+        * Completes the multiplexer initialization
+        * @since 2.8
+        * @return void 
+        */
+        void DoMultiplexerInitialize();
+
+    private:    // Data
+
+        TDfc*       iInitializeDfc;
+        TPtr8*      iDataTransmissionIniData;
+        TPtr8*      iMultiplexerIniData;
+        TUint8*     iMultiplexerBuffer;
+        TUint8*     iDataTransmissionBuffer;
+        DIscDevice* iIscDevice;
+        TPtr8*      iIscConnectionStatusPtr;
+        TPtr8*      iIscFlowControlStatusPtr;
+        //Store of Isc requests
+        TRequestStatus* iIscRequests[ EIscAsyncLast ];
+        // Pointers to client message buffers
+        TPtr8*      iReceiveBufPtr;
+        TPtr8*      iDataReceiveBufPtr;
+        TPtr8*      iNeededBufLen;
+        TPtr8*      iNeededDataBufLen;
+        TUint16     iChannelNumber;
+        TBool       iChannelOpen;
+        // Queue for incoming frames
+        TUint32**   iFrameRx;
+        DIscQueue*  iFrameRxQueue;
+
+        // Queue for incoming data frames
+        TUint32**   iDataFrameRx;
+        DIscQueue*  iDataFrameRxQueue;
+          
+        TInt        iULFlowControlStatus;
+        TInt        iDLFlowControlStatus;
+        // Stores the last notified uplink flowcontrol status.
+        TInt        iLastNotifiedULFlowstatus;
+
+        TUint16     iIscChannelHighWaterMark;
+        TUint16     iIscChannelLowWaterMark;
+        TBool       iOverFlow;
+        TBool       iClientPanic;
+        TInt        iDataTransmissionErrorCode;
+
+        DThread*    iThread;
+
+    };
+
+#endif      // DISCCHANNEL_H   
+            
+// End of File