--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/systemswstubs/examplecommonisc/IscDriver/src/IscMainRcvBuffer.cpp Thu Jan 14 07:14:53 2010 +0200
@@ -0,0 +1,230 @@
+/*
+* 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 <IscDefinitions.h>
+#include <IscMultiplexerBase.h>
+#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