diff -r b7e5ed8c1342 -r e71858845f73 systemswstubs/examplecommonisc/IscDriver/src/IscMainRcvBuffer.cpp --- a/systemswstubs/examplecommonisc/IscDriver/src/IscMainRcvBuffer.cpp Tue Sep 07 08:19:48 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,230 +0,0 @@ -/* -* Copyright (c) 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: An example implementation for ISC Driver Reference -* -*/ - - - -// INCLUDE FILES -#include -#include -#include "IscMainRcvBuffer.h" -#include "IscQueue.h" -#include "IscDevice.h" -#include "IscChannel.h" -#include "IscChannelContainer.h" -#include "IscTrace.h" - - -// EXTERNAL DATA STRUCTURES - -// EXTERNAL FUNCTION PROTOTYPES - -// CONSTANTS -DIscMainRcvBuffer* DIscMainRcvBuffer::iThisPointer = NULL; -const TInt KBufferCleanUpDfcPriority( 4 ); - -// MACROS - -// LOCAL CONSTANTS AND MACROS - -// MODULE DATA STRUCTURES - -// LOCAL FUNCTION PROTOTYPES - -// FORWARD DECLARATIONS - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// DIscMainRcvBuffer::DIscMainRcvBuffer -// C++ default constructor -// ( other items were commented in a header ). -// ----------------------------------------------------------------------------- -// -DIscMainRcvBuffer::DIscMainRcvBuffer( DIscDevice *aDevice, TUint16 aIscMainRcvBufferQueueSize ) - :iDevice ( aDevice ), - iDfc( NULL ), - iMainRcvBufferQueue( NULL ) - { - iIscMainRcvBufferQueueSize = aIscMainRcvBufferQueueSize; - iMainRcvBuffer = new TUint32*[iIscMainRcvBufferQueueSize]; - ASSERT_RESET_ALWAYS( iMainRcvBuffer, "IscDriver",EIscMemoryAllocationFailure ); - - for ( TInt i = 0; i < iIscMainRcvBufferQueueSize; i++ ) - { - iMainRcvBuffer[i] = NULL; - } - } - - -// ----------------------------------------------------------------------------- -// DIscMainRcvBuffer::DoCreate -// Second-phase constructor to complete construction. -// ( other items were commented in a header ). -// ----------------------------------------------------------------------------- -// -void DIscMainRcvBuffer::DoCreate() - { - if ( iThisPointer ) //Only one instance of this class is allowed - { - ASSERT_RESET_ALWAYS( 0,"IscDriver",EIscMainRcvBufferInitialize ); - } - - iDfc = new TDfc( BufferCleanUp, this, Kern::DfcQue0(), KBufferCleanUpDfcPriority ); - ASSERT_RESET_ALWAYS( iDfc, "IscDriver",EIscMemoryAllocationFailure ); - - iMainRcvBufferQueue = new DIscQueue( iMainRcvBuffer, iIscMainRcvBufferQueueSize ); - ASSERT_RESET_ALWAYS( iMainRcvBufferQueue, "IscDriver",EIscMemoryAllocationFailure ); - - //Store pointer of this instance that can be used from static functions - iThisPointer = this; - } - -//Destructor -DIscMainRcvBuffer::~DIscMainRcvBuffer() - { - delete iDfc; - delete iMainRcvBufferQueue; - iDfc = NULL; - iMainRcvBufferQueue = NULL; - iThisPointer = NULL; - iDevice = NULL; - } - -// ----------------------------------------------------------------------------- -// DIscMainRcvBuffer::MsgReceive -// Function that should be called to store incoming frame -// ( other items were commented in a header ). -// ----------------------------------------------------------------------------- -// -void DIscMainRcvBuffer::MsgReceive( TDesC8* aData ) - { - E_TRACE( ( _T( "IMRB:MR(0x%x)" ), aData ) ); - //Check that instance of this class is created - if ( !iThisPointer ) - { - // MainRcvBuffer not initialized -> panic - ASSERT_RESET_ALWAYS( 0,"IscDriver",EIscMainRcvBufferInitialize ); - } - - TInt r = iThisPointer->iMainRcvBufferQueue->Add( aData ); - ASSERT_RESET_ALWAYS( r == KErrNone, "IscDriver",EIscMainRcvBufferOverflow ); - iThisPointer->AddDfc(); - } - -// ----------------------------------------------------------------------------- -// DIscMainRcvBuffer::AddDfc -// Function for adding Dfc -// ( other items were commented in a header ). -// ----------------------------------------------------------------------------- -// -void DIscMainRcvBuffer::AddDfc() - { -#ifndef __WINS__ - if ( NKern::CurrentContext() == NKern::EInterrupt ) - { - iDfc->Add(); - } - else - { - iDfc->Enque(); - } -#else - // Have to do DoEnque since Enque() & Add() cannot be called from pure - // win32 thread context. And this call might come directly in win32 thread - // since the implementation of ISC Data Transmission API can do virtually - // anything in WINS - iDfc->DoEnque(); -#endif - } - -// ----------------------------------------------------------------------------- -// DIscMainRcvBuffer::BufferCleanUp -// Function to empty messages in main buffer -// ( other items were commented in a header ). -// ----------------------------------------------------------------------------- -// -void DIscMainRcvBuffer::BufferCleanUp( TAny* aPtr ) - { - C_TRACE( ( _T( "DIscMainRcvBuffer::BufferCleanUp(0x%x)" ), aPtr ) ); - - DIscMainRcvBuffer* Buffer = ( DIscMainRcvBuffer* )aPtr; - - - TUint16 rcvChannelId( KIscFrameReceiverNotFound ); - TAny* channelPtr = NULL; - DIscChannel* tempPtr = NULL; - TBool channelFound( EFalse ); - - TDesC8* ptr = NULL; - ptr = ( TDesC8* )Buffer->iMainRcvBufferQueue->RemoveFirst(); - - while ( ptr ) - { - Buffer->iDevice->iIscMultiplexerInterface->GetRcvChannelId( *ptr, rcvChannelId, channelPtr ); - - C_TRACE( ( _T( "DIscMainRcvBuffer::BufferCleanUp channelId (0x%x) channelPtr (0x%x)" ), rcvChannelId, channelPtr ) ); - if ( rcvChannelId >= KIscFirstChannel && rcvChannelId < KIscNumberOfUnits && channelPtr ) - { - channelFound = EFalse; - for ( TUint16 i( 0 ); ( i < KIscMaxNumberOfChannelSharers ) && ( !channelFound ); i++ ) - { - tempPtr = IscChannelContainer::Channel( rcvChannelId, i ); - if ( tempPtr == channelPtr ) - { - // correct channel found - ( ( DIscChannel* )channelPtr )->StoreFrame( ptr ); - channelFound = ETrue; - } - tempPtr = NULL; - } - if ( !channelFound ) - { - TRACE_ASSERT_ALWAYS; - // correct channel was not found -> release frame - Buffer->iDevice->ReleaseMemoryBlock( ( TDes8* ) ptr ); - } - } - else if ( rcvChannelId == KIscFrameReceiverNotFound ) - { - C_TRACE( ( _T( "DIscMainRcvBuffer::BufferCleanUp Frame Receiver not found!" ) ) ); - Buffer->iDevice->ReleaseMemoryBlock( ( TDes8* ) ptr ); - } - // Frame going to control channel - else if ( rcvChannelId == 0x00 ) - { - Buffer->iDevice->iIscMultiplexerInterface->HandleControlFrame( *ptr ); - } - else - { - TRACE_ASSERT_ALWAYS; - Buffer->iDevice->ReleaseMemoryBlock( ( TDes8* ) ptr ); - } - - // get the next frame from the queue - ptr = ( TDes8* )Buffer->iMainRcvBufferQueue->RemoveFirst(); - } - - IscChannelContainer::ChannelComplition( NULL ); - - C_TRACE( ( _T( "DIscMainRcvBuffer::BufferCleanUp - return 0x%x" ) ) ); - - } - -// ========================== OTHER EXPORTED FUNCTIONS ========================= - -// End of File