diff -r e71858845f73 -r e1758cbb96ac systemswstubs/examplecommonisc/IscDriver/src/IscChannelContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemswstubs/examplecommonisc/IscDriver/src/IscChannelContainer.cpp Mon Oct 04 00:04:35 2010 +0300 @@ -0,0 +1,279 @@ +/* +* 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 "IscChannel.h" +#include "IscChannelContainer.h" +#include "IscTrace.h" + +#ifdef __WINS__ +#include +#endif + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS +const TInt KChannelComplitionDfcPriority( 2 ); + +// MACROS + +// LOCAL CONSTANTS AND MACROS +DIscChannel* IscChannelContainer::iIscChannels[KIscNumberOfUnits][KIscMaxNumberOfChannelSharers]; +TDfc* IscChannelContainer::iDfc = NULL; + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +#ifdef __WINS__ +CRITICAL_SECTION g_IscCriticalSection; +#endif + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// IscChannelContainer::SetChannel +// Set pointer to channel +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt IscChannelContainer::SetChannel( + DIscChannel* aChannel, + const TUint16 aUnit ) + { + C_TRACE( ( _T( "IscChannelContainer::SetChannel(0x%x, 0x%x)" ), aChannel, aUnit ) ); + TInt error( KErrNoMemory ); + + //check values + if ( aUnit < KIscNumberOfUnits ) + { + for ( TInt i( 0 ); i < KIscMaxNumberOfChannelSharers; i++ ) + { + if ( !iIscChannels[aUnit][i] ) + { + iIscChannels[aUnit][i] = aChannel; + error = KErrNone; + break; + } + } + } + else + { + ASSERT_RESET_ALWAYS( 0, "IscDriver",EIscPanicSetChannel ); + } + + C_TRACE( ( _T( "IscChannelContainer::SetChannel - return 0x%x" ), error ) ); + return error; + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::Channel +// Return pointer to channel +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +DIscChannel* IscChannelContainer::Channel( + const TUint16 aChannel, + const TUint16 aChannelSharingIndex ) + { + TRACE_ASSERT( aChannel < KIscNumberOfUnits ); + TRACE_ASSERT( aChannelSharingIndex < KIscMaxNumberOfChannelSharers ); + return( iIscChannels[ aChannel ][ aChannelSharingIndex ] ); + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::RemoveChannel +// +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +TInt IscChannelContainer::RemoveChannel + ( + DIscChannel* aChannel + ) + { + + TRACE_ASSERT( aChannel ); + C_TRACE( ( _T( "IscChannelContainer::RemoveChannel(0x%x)" ), aChannel ) ); + TUint16 channelNumber = aChannel->GetChannelNumber(); + + TInt error( KErrNotFound ); + for ( TInt i( KErrNone ); ( i < KIscMaxNumberOfChannelSharers ) && ( KErrNone != error ); i++ ) + { + if ( iIscChannels[channelNumber][i] == aChannel ) + { + iIscChannels[channelNumber][i] = NULL; + error = KErrNone; + } + } + + C_TRACE( ( _T( "IscChannelContainer::RemoveChannel - return %d" ), error ) ); + return error; + + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::ChannelComplition +// Goes through channels and open ones are emptied +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +void IscChannelContainer::ChannelComplition( + TAny* /*a*/ ) + { + C_TRACE( ( _T( "IscChannelContainer::ChannelComplition()" ) ) ); +#ifdef __WINS__ + EnterCriticalSection( &g_IscCriticalSection ); +#endif + + DIscChannel* channelPtr = NULL; + + for ( TUint16 channel( KIscFirstChannel ) ; channel < KIscNumberOfUnits; channel++ ) + { + for ( TUint16 i( 0 ); i < KIscMaxNumberOfChannelSharers; i++ ) + { + channelPtr = iIscChannels[channel][i]; + if ( channelPtr ) + { + channelPtr->EmptyBuffers(); + } + } + } +#ifdef __WINS__ + LeaveCriticalSection( &g_IscCriticalSection ); +#endif + + C_TRACE( ( _T( "IscChannelContainer::ChannelComplition - return 0x%x" ), KErrNone ) ); + + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::AddDfc +// Adds ChannelComplition Dfc +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +void IscChannelContainer::AddDfc() + { + C_TRACE( ( _T( "IscChannelContainer::AddDfc()" ) ) ); + + if ( NKern::CurrentContext() == NKern::EInterrupt ) + { + iDfc->Add(); + } + else + { + iDfc->Enque(); + } + + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::Initialize +// Allocates Dfc function dynamically and formats data tables. +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +void IscChannelContainer::Initialize() + { + C_TRACE( ( _T( "IscChannelContainer::Initialize()" ) ) ); + + if ( !iDfc ) + { + iDfc = new TDfc( IscChannelContainer::ChannelComplition, NULL, Kern::DfcQue0(), + KChannelComplitionDfcPriority ); + ASSERT_RESET_ALWAYS( iDfc, "IscDriver",EIscMemoryAllocationFailure ); + } + + for ( TUint16 channel( 0 ); channel < KIscNumberOfUnits; channel++ ) + { + for ( TUint16 i( 0 ); i < KIscMaxNumberOfChannelSharers; i++ ) + { + iIscChannels[channel][i] = NULL; + } + } + +#ifdef __WINS__ + InitializeCriticalSection( &g_IscCriticalSection ); +#endif + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::DeActivate +// Deallocates Dfc function +// ( other items were commented in a header ). +// ----------------------------------------------------------------------------- +// +void IscChannelContainer::DeActivate() + { + if ( iDfc ) + { + delete iDfc; + iDfc = NULL; + } +#ifdef __WINS__ + DeleteCriticalSection( &g_IscCriticalSection ); +#endif + + } + +// ----------------------------------------------------------------------------- +// IscChannelContainer::ValidateChannel +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt IscChannelContainer::ValidateChannel( + DIscChannel* aChannelPtr ) + { + C_TRACE( ( _T( "IscChannelContainer::ValidateChannel(0x%x)" ), aChannelPtr ) ); + TInt error( KErrNotFound ); + if( !aChannelPtr ) + { + C_TRACE( ( _T( "IscChannelContainer::ValidateChannel aChannelPtr was NULL" ) ) ); + error = KErrArgument; + } + else + { + for ( TUint16 channelNumber( 0 ); channelNumber < KIscNumberOfUnits ; channelNumber++ ) + { + for ( TInt i( KErrNone ); i < KIscMaxNumberOfChannelSharers ; i++ ) + { + if ( iIscChannels[channelNumber][i] == aChannelPtr ) + { + error = KErrNone; + break; + } + } + } + } + + C_TRACE( ( _T( "IscChannelContainer::ValidateChannel - return %d" ), error ) ); + return error; + + } + +// End of File