systemswstubs/examplecommonisc/IscDriver/src/IscChannelContainer.cpp
changeset 46 e1758cbb96ac
parent 0 0ce1b5ce9557
--- /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 <kernel.h>
+#include <IscDefinitions.h>
+#include "IscChannel.h"
+#include "IscChannelContainer.h"
+#include "IscTrace.h"
+
+#ifdef __WINS__
+#include <windows.h>
+#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