connectivitylayer/isce/isaaccessextension_dll/src/isakernelapi.cpp
author mikaruus
Tue, 19 Oct 2010 13:16:20 +0300
changeset 9 8486d82aef45
parent 0 63b37f68c1ce
permissions -rw-r--r--
modemadaptation release 2010wk40

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*
*/



// INCLUDE FILES
#include <kern_priv.h>               // For __ASSERT_CRITICAL published partner

#include <isakernelapi.h>
#include "iadtrace.h"                // FOR ASSERT..
#include "isakernelchannel.h"        // FOR DISAKernelChannel
#include "iadnokiadefinitions.h"     // For checking allowed kernel channels.
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "isakernelapiTraces.h"
#endif

// EXTERNAL DATA STRUCTURES
// None

// EXTERNAL FUNCTION PROTOTYPES  
// None

// CONSTANTS
const TInt KFirstParam( 0 );
const TInt KSecondParam( 1 );
const TInt KThirdParam( 2 );
const TInt KFourthParam( 3 );
const TInt KOneParam( 1 );
const TInt KTwoParams( 2 );
const TInt KThreeParams( 3 );
const TInt KFourParams( 4 );

// MACROS
// None

// LOCAL CONSTANTS AND MACROS
// None

// MODULE DATA STRUCTURES
// None

// LOCAL FUNCTION PROTOTYPES
// None

// FORWARD DECLARATIONS
// None

// ============================= LOCAL FUNCTIONS ===============================
// None

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// DIsaKernelAPI::NewF
// -----------------------------------------------------------------------------
//
EXPORT_C DIsaKernelAPI* DIsaKernelAPI::NewF(
        // None
        )
    {
    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_NEWF_ENTRY, ">DIsaKernelAPI::NewF" );

    C_TRACE((_T("DIsaKernelAPI::CreateNew ->")));
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // ASSERT IN CRITICAL SECTION // TODO: All where allocation from kernel heap (new)
    ASSERT_CONTEXT_ALWAYS( NKern::EThread, 0xff );
    __ASSERT_CRITICAL;// From kern_priv.h published partner
    DIsaKernelAPI* tmp = new DIsaKernelAPI();
    ASSERT_RESET_ALWAYS( tmp, EIADMemoryAllocationFailure | EIADFaultIdentifier5 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::CreateNew 0x%x <-" ), tmp ) );
    
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_NEWF_EXIT, "<DIsaKernelAPI::NewF;return=%x", tmp );
    return tmp;
    }

// -----------------------------------------------------------------------------
// DIsaKernelAPI::DIsaKernelAPI
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
EXPORT_C DIsaKernelAPI::DIsaKernelAPI(
        // None
        )
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DISAKERNELAPI_ENTRY, ">DIsaKernelAPI::DIsaKernelAPI;this=%x", (TUint)this );

    C_TRACE((_T("DIsaKernelAPI::DIsaKernelAPI ->")));
    // TODO: change this do more fancy, factory or derivation?
    iKernelChannel = new DISAKernelChannel();
    ASSERT_RESET_ALWAYS( iKernelChannel, EIADMemoryAllocationFailure | EIADFaultIdentifier6 << KFaultIdentifierShift );
    C_TRACE((_T("DIsaKernelAPI::DIsaKernelAPI 0x%x <-"), this ));

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DISAKERNELAPI_EXIT, "<DIsaKernelAPI::DIsaKernelAPI;this=%x", this );
    }

// -----------------------------------------------------------------------------
// DIsaKernelAPI::~DIsaKernelAPI
// Destructor
// -----------------------------------------------------------------------------
//
EXPORT_C DIsaKernelAPI::~DIsaKernelAPI(
        // None
        )
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DISAKERNELAPI_DES_ENTRY, ">DIsaKernelAPI::~DIsaKernelAPI;this=%x", this );

    C_TRACE((_T("DIsaKernelAPI::~DIsaKernelAPI 0x%x ->"), this ));
    Close();
    if( iKernelChannel )
        {
        C_TRACE( ( _T( "DIsaKernelAPI::~DIsaKernelAPI delete iKernelChannel.." ) ) );
        OstTrace0( TRACE_NORMAL, DISAKERNELAPI_DISAKERNELAPI_DELETE, "DIsaKernelAPI::~DIsaKernelAPI delete iKernelChannel" );
        
        delete iKernelChannel;
        C_TRACE( ( _T( "DIsaKernelAPI::~DIsaKernelAPI deleted ..iKernelChannel" ) ) );
        iKernelChannel = NULL;
        }
    C_TRACE((_T("DIsaKernelAPI::~DIsaKernelAPI <-")));

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DISAKERNELAPI_DES_EXIT, "<DIsaKernelAPI::~DIsaKernelAPI;this=%x", this );
    }

EXPORT_C TDes8& DIsaKernelAPI::AllocateMsgBlock(
        const TInt aSize
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_ALLOCATEMSGBLOCK_ENTRY, ">DIsaKernelAPI::AllocateMsgBlock;aSize=%d;this=%x", aSize, (TUint)this );
    
    C_TRACE( ( _T( "DIsaKernelAPI::AllocateMsgBlock %d ->"), aSize ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TDes8* temp = NULL;
    C_TRACE( ( _T( "DIsaKernelAPI::AllocateMsgBlock %d 0x%x TBR"), aSize, temp ) );
    TInt size( aSize );
    TAny* params[ KTwoParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &size );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &temp );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAllocateBlock;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier1 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::AllocateMsgBlock %d 0x%x <-"), aSize, temp ) );

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_ALLOCATEMSGBLOCK_EXIT, "<DIsaKernelAPI::AllocateMsgBlock;temp=%x", temp);
    return *temp;
    }


EXPORT_C TDes8& DIsaKernelAPI::AllocateDataMsgBlock(
        const TInt aSize
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_ALLOCATEDATAMSGBLOCK_ENTRY, ">DIsaKernelAPI::AllocateDataMsgBlock;aSize=%d;this=%x", aSize, (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::AllocateDataMsgBlock %d ->"), aSize ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TDes8* temp = NULL;
    C_TRACE( ( _T( "DIsaKernelAPI::AllocateDataMsgBlock %d 0x%x TBR"), aSize, temp ) );
    TInt size( aSize );
    TAny* params[ KTwoParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &size );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &temp );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAllocateDataBlock;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier2 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::AllocateDataMsgBlock %d 0x%x <-"), aSize, temp ) );
    
    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_ALLOCATEDATAMSGBLOCK_EXIT, "<DIsaKernelAPI::AllocateDataMsgBlock");
    return *temp;
    }


EXPORT_C void DIsaKernelAPI::Close(
        // None
        )
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_CLOSE_ENTRY, ">DIsaKernelAPI::Close;this=%x", (TUint)this );
// todo ichannelnumber??

    C_TRACE( ( _T( "DIsaKernelAPI::Close 0x%x ->" ), this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    __ASSERT_CRITICAL;// From kern_priv.h published partner
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADClose;
    m.iArg[ KFirstParam ] = NULL;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier3 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::Close 0x%x <-" ), this ) );

    OstTrace0( TRACE_NORMAL, DUP1_DISAKERNELAPI_CLOSE_EXIT, "<DIsaKernelAPI::Close" );
    }

EXPORT_C void DIsaKernelAPI::DataReceive(
        TDes8*& aDataMsgBlock,
        TInt&   aDfcStatus,
        const   TDfc& aDataReceiveDfc
        )
    {
    OstTraceExt4( TRACE_NORMAL, DISAKERNELAPI_DATARECEIVE_ENTRY, ">DIsaKernelAPI::DataReceive;aDataMsgBlock=%x;aDfcStatus=%d;aDataReceiveDfc=%x;this=%x", ( TUint )( aDataMsgBlock ), aDfcStatus, ( TUint )&( aDataReceiveDfc ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::DataReceive 0x%x 0x%x ->"), aDataMsgBlock, &aDataReceiveDfc ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    ASSERT_RESET_ALWAYS( !aDataMsgBlock, EIADWrongParameter | ( TUint8 )( iKernelChannel->GetChannelNumber() ) << KChannelNumberShift | EIADFaultIdentifier5 << KFaultIdentifierShift );
    aDfcStatus = KRequestPending;
    TAny* params[ KThreeParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aDfcStatus );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &const_cast<TDfc&>( aDataReceiveDfc ) );
    params[ KThirdParam ] = reinterpret_cast<TAny*>( &aDataMsgBlock );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAsyncDataReceive;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier4 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::DataReceive 0x%x 0x%x <-"), aDataMsgBlock, &aDataReceiveDfc ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_DATARECEIVE, "<DIsaKernelAPI::DataReceive" );
    }


EXPORT_C void DIsaKernelAPI::DataReceiveCancel(
        // None
        )
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DATARECEIVECANCEL_ENTRY, ">DIsaKernelAPI::DataReceiveCancel;this=%x", (TUint)this );

     C_TRACE( ( _T( "DIsaKernelAPI::DataReceiveCancel 0x%x ->"), this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = KMaxTInt;
    m.iArg[ KFirstParam ] = reinterpret_cast<TAny*>( EIADAsyncDataReceive );
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier5 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::DataReceiveCancel 0x%x <-"), this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_DATARECEIVECANCEL_EXIT, "<DIsaKernelAPI::DataReceiveCancel");
    }


EXPORT_C TInt DIsaKernelAPI::DataSend(
        TDes8& aMsg
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_DATASEND_ENTRY, ">DIsaKernelAPI::DataSend;aMsg=%x;this=%x", ( TUint )&( aMsg ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::DataSend 0x%x ->"), &aMsg ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aMsg );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADDataSend;
    m.iArg[ KFirstParam ] = params;
    TInt retValue( iKernelChannel->HandleRequest( m ) );
    C_TRACE( ( _T( "DIsaKernelAPI::DataSend 0x%x %d <-"), &aMsg, retValue ) );

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DATASEND, "<DIsaKernelAPI::DataSend;retValue=%d", retValue);
    return retValue;	
    }

EXPORT_C void DIsaKernelAPI::DeAllocateMsgBlock(
        TDes8& aMsgBlock
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_DEALLOCATEMSGBLOCK_ENTRY, ">DIsaKernelAPI::DeAllocateMsgBlock;aMsgBlock=%x;this=%x", ( TUint )&( aMsgBlock ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::DeAllocateMsgBlock 0x%x ->"), &aMsgBlock ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aMsgBlock );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADDeAllocateBlock;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier6 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::DeAllocateMsgBlock 0x%x <-"), &aMsgBlock ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_DEALLOCATEMSGBLOCK_EXIT, "<DIsaKernelAPI::DeAllocateMsgBlock" );
    }


EXPORT_C void DIsaKernelAPI::DeAllocateDataMsgBlock(
        TDes8& aMsgBlock
        )
    {
OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_DEALLOCATEDATAMSGBLOCK_ENTRY, ">DIsaKernelAPI::DeAllocateDataMsgBlock;aMsgBlock=%x;this=%x", ( TUint )&( aMsgBlock ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::DeAllocateDataMsgBlock 0x%x ->"), &aMsgBlock ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aMsgBlock );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADDeAllocateDataBlock;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier7 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::DeAllocateDataMsgBlock 0x%x <-"), &aMsgBlock ) );

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_DEALLOCATEDATAMSGBLOCK_EXIT, "<DIsaKernelAPI::DeAllocateDataMsgBlock;aMsgBlock=%x", ( TUint )&( aMsgBlock ) );
    }

EXPORT_C void DIsaKernelAPI::NotifyFlowChange(
        TDfc& aNotifyFlowDfc,
        TInt& aDfcStatus
        )
    {
    OstTraceExt3( TRACE_NORMAL, DISAKERNELAPI_NOTIFYFLOWCHANGE_ENTRY, ">DIsaKernelAPI::NotifyFlowChange;aNotifyFlowDfc>=%x;aDfcStatus=%d;this=%x", ( TUint )&( aNotifyFlowDfc ), aDfcStatus, (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::NotifyFlowChange 0x%x %d 0x%x 0x%x ->" ), &aDfcStatus, aDfcStatus, &aNotifyFlowDfc, this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    aDfcStatus = KRequestPending;
    TAny* params[ KTwoParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aDfcStatus );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &aNotifyFlowDfc );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAsyncNotifyFlowControlStatus;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier8 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::NotifyFlowChange 0x%x %d 0x%x 0x%x <-" ), &aDfcStatus, aDfcStatus, &aNotifyFlowDfc, this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_NOTIFYFLOWCHANGE_EXIT, "<DIsaKernelAPI::NotifyFlowChange");
    }


EXPORT_C void DIsaKernelAPI::NotifyFlowChangeCancel(
        // None
        )
    {
OstTrace1( TRACE_NORMAL, DISAKERNELAPI_NOTIFYFLOWCHANGECANCEL_ENTRY, ">DIsaKernelAPI::NotifyFlowChangeCancel;this=%x", (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::NotifyFlowChangeCancel 0x%x ->"), this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = KMaxTInt;
    m.iArg[ KFirstParam ] = reinterpret_cast<TAny*>( EIADAsyncNotifyFlowControlStatus );
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier9 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::NotifyFlowChangeCancel 0x%x <-"), this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_NOTIFYFLOWCHANGECANCEL_EXIT, "<DIsaKernelAPI::NotifyFlowChangeCancel" );
    }

EXPORT_C void DIsaKernelAPI::NotifyStateChange(
        TDfc& aNotifyStateDfc,
        TInt& aDfcStatus
        )
    {
    OstTraceExt3( TRACE_NORMAL, DISAKERNELAPI_NOTIFYSTATECHANGE_ENTRY, ">DIsaKernelAPI::NotifyStateChange;aNotifyStateDfc=%x;aDfcStatus=%d;this=%x", ( TUint )&( aNotifyStateDfc ), aDfcStatus, (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::NotifyStateChange 0x%x %d 0x%x 0x%x ->" ), &aDfcStatus, aDfcStatus, &aNotifyStateDfc, this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // TODO using of m.iArg 
    aDfcStatus = KRequestPending;
    TAny* params[ KTwoParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aDfcStatus );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &aNotifyStateDfc );

    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAsyncNotifyConnectionStatus;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier10 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::NotifyStateChange 0x%x %d 0x%x 0x%x <-" ), &aDfcStatus, aDfcStatus, &aNotifyStateDfc, this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_NOTIFYSTATECHANGE_EXIT, "<DIsaKernelAPI::NotifyStateChange" );
    }

EXPORT_C void DIsaKernelAPI::NotifyStateChangeCancel(
        // None
        ) const
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_NOTIFYSTATECHANGECANCEL_ENTRY, ">DIsaKernelAPI::NotifyStateChangeCancel;this=%x", (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::NotifyStateChangeCancel 0x%x ->"), this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = KMaxTInt;
    m.iArg[ KFirstParam ] = reinterpret_cast<TAny*>( EIADAsyncNotifyConnectionStatus );
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier11 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::NotifyStateChangeCancel 0x%x <-"), this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_NOTIFYSTATECHANGECANCEL_EXIT, "<DIsaKernelAPI::NotifyStateChangeCancel" );
    }

// KErrNone : succesfully opened
// KErrInUse : same object tries to open channel again
// KErrAlreadyExists: other object tries to open channelid that is opened by another object
EXPORT_C void DIsaKernelAPI::Open(
        const TUint16 aChannelNumber,
        TInt& aDfcStatus,
        TDfc& aOpenDfc,
        const TUint32 aResource // 32-bit resource id support
        )
    {
    OstTraceExt5( TRACE_NORMAL, DISAKERNELAPI_OPEN_ENTRY, ">DIsaKernelAPI::Open;aChannelNumber=%hu;aDfcStatus=%d;aOpenDfc=%x;aResource=%u;this=%x", aChannelNumber, aDfcStatus, ( TUint )&( aOpenDfc ), ( TUint )( aResource ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::Open 0x%x 0x%x 0x%x %d 0x%x 0x%x ->" ), this, aChannelNumber, &aDfcStatus, aDfcStatus, &aOpenDfc, aResource ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    ASSERT_CONTEXT_ALWAYS( NKern::EThread, aChannelNumber );
    ASSERT_RESET_ALWAYS( ( EIADNokiaLastUserChannel <= aChannelNumber && aChannelNumber < EIADSizeOfChannels ), EIADWrongParameter | aChannelNumber << KChannelNumberShift | EIADFaultIdentifier4 << KFaultIdentifierShift );
    // TODO: reading of params with kumemget? and the before giving to channel
    aDfcStatus = KRequestPending;
    // TODO using of m.iArg 
    TAny* params[ KFourParams ];
    aDfcStatus = KRequestPending;
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aDfcStatus );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &aOpenDfc );
    params[ KThirdParam ] = reinterpret_cast<TAny*>( aChannelNumber );
    TBuf8<4> channelInfo;
    channelInfo.Append( aResource >> 24 );
    channelInfo.Append( aResource >> 16 );
    channelInfo.Append( aResource >> 8 );
    channelInfo.Append( aResource );
    params[ KFourthParam ] = reinterpret_cast<TAny*>( &channelInfo );

    C_TRACE( ( _T( "0x%x 0x%x 0x%x 0x%x TBR" ), channelInfo[ 0 ], channelInfo[ 1 ], channelInfo[ 2 ], channelInfo[ 3 ] ) );

    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAsyncOpen;
    m.iArg[ KFirstParam ] = params;

    C_TRACE( ( _T( "TBR****TBR m.iArg[ 0 ]=0x%x m.iArg[ 1 ]=0x%x m.iArg[ 2 ]=0x%x m.iArg[ 3 ]=0x%x" ), m.iArg[ 0 ], m.iArg[ 1 ], m.iArg[ 2 ], m.iArg[ 3 ] ) );
    TUint32* tablePtr = reinterpret_cast<TUint32*>( m.Ptr0() );
    C_TRACE( ( _T( "TBR****TBR tablePtr[ 0 ]=0x%x tablePtr[ 1 ]=0x%x tablePtr[ 2 ]=0x%x tablePtr[ 3 ]=0x%x" ), tablePtr[ 0 ], tablePtr[ 1 ], tablePtr[ 2 ], tablePtr[ 3 ] ) );

    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | (TUint8)aChannelNumber << KChannelNumberShift | EIADFaultIdentifier12 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::Open 0x%x <-" ), this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_OPEN_EXIT, "<DIsaKernelAPI::Open");
    }

EXPORT_C void DIsaKernelAPI::OpenCancel(
        // None
        )
    {
OstTrace1( TRACE_NORMAL, DISAKERNELAPI_OPENCANCEL_ENTRY, ">DIsaKernelAPI::OpenCancel;this=%x", (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::OpenCancel ->") ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = KMaxTInt;
    m.iArg[ KFirstParam ] = reinterpret_cast<TAny*>( EIADAsyncOpen );
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | iKernelChannel->GetChannelNumber() << KChannelNumberShift | EIADFaultIdentifier13 << KFaultIdentifierShift );
    C_TRACE( ( _T( "DIsaKernelAPI::OpenCancel <-") ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_OPENCANCEL_EXIT, "<DIsaKernelAPI::OpenCancel" );
    }

EXPORT_C void DIsaKernelAPI::Receive(
        TDes8*& aMsgBlock,
        TInt&   aDfcStatus,
        const   TDfc& aReceiveDfc
        )
    {
    OstTraceExt4( TRACE_NORMAL, DISAKERNELAPI_RECEIVE_ENTRY, ">DIsaKernelAPI::Receive;aMsgBlock=%x;aDfcStatus=%d;aReceiveDfc=%x;this=%x", ( TUint )( aMsgBlock ), aDfcStatus, ( TUint )&( aReceiveDfc ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::Receive 0x%x 0x%x ->"), aMsgBlock, &aReceiveDfc ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    ASSERT_RESET_ALWAYS( !aMsgBlock, EIADWrongParameter | ( TUint8 )( iKernelChannel->GetChannelNumber() ) << KChannelNumberShift | EIADFaultIdentifier7 << KFaultIdentifierShift );
    aDfcStatus = KRequestPending;
    TAny* params[ KThreeParams ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aDfcStatus );
    params[ KSecondParam ] = reinterpret_cast<TAny*>( &const_cast<TDfc&>( aReceiveDfc ) );
    params[ KThirdParam ] = reinterpret_cast<TAny*>( &aMsgBlock );
    
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADAsyncReceive;
    m.iArg[ KFirstParam ] = params;
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier14 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::Receive 0x%x 0x%x <-"), aMsgBlock, &aReceiveDfc ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_RECEIVE_EXIT, "<DIsaKernelAPI::Receive" );
    }

EXPORT_C void DIsaKernelAPI::ReceiveCancel(
        // None
        )
    {
    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_RECEIVECANCEL_ENTRY, ">DIsaKernelAPI::ReceiveCancel;this=%x", (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::ReceiveCancel 0x%x ->"), this ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = KMaxTInt;
    m.iArg[ KFirstParam ] = reinterpret_cast<TAny*>( EIADAsyncReceive );
    ASSERT_RESET_ALWAYS( ( KErrNone == iKernelChannel->HandleRequest( m ) ), EIADWrongKernelResponse | EIADFaultIdentifier15 << KFaultIdentifierShift  );
    C_TRACE( ( _T( "DIsaKernelAPI::ReceiveCancel 0x%x <-"), this ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_RECEIVECANCEL_EXIT, "<DIsaKernelAPI::ReceiveCancel" );
    }

EXPORT_C TInt DIsaKernelAPI::Send(
        TDes8& aMsg
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_SEND_ENTRY, ">DIsaKernelAPI::Send;aMsg=%x;this=%x", ( TUint )&( aMsg ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::Send 0x%x ->"), &aMsg ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aMsg );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADSend;
    m.iArg[ KFirstParam ] = params;
    TInt retValue( iKernelChannel->HandleRequest( m ) );
    C_TRACE( ( _T( "DIsaKernelAPI::Send 0x%x %d <-"), &aMsg, retValue ) );

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_SEND_EXIT, "<DIsaKernelAPI::Send;retValue=%d", retValue );
    return retValue;
    }

EXPORT_C TInt DIsaKernelAPI::SendIndication(
        TDes8& aMsg
        )
    {
    OstTraceExt2( TRACE_NORMAL, DISAKERNELAPI_SENDINDICATION_ENTRY, ">DIsaKernelAPI::SendIndication;aMsg=%x;this=%x", ( TUint )&( aMsg ), (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::SendIndication 0x%x ->"), &aMsg ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( &aMsg );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = EIADSendIndication;
    m.iArg[ KFirstParam ] = params;
    TInt retValue( iKernelChannel->HandleRequest( m ) );
    C_TRACE( ( _T( "DIsaKernelAPI::SendIndication 0x%x %d <-"), &aMsg, retValue ) );

    OstTrace0( TRACE_NORMAL, DISAKERNELAPI_SENDINDICATION_EXIT, "<DIsaKernelAPI::SendIndication" );
    return retValue;
    }

// KErrBadDescriptor, subscription length zero (0) or order length wrong: !32bit% 5 and !8bit%2 
// KErrUnderFlow, too long subscription
EXPORT_C TInt DIsaKernelAPI::SubscribeIndications(
        const TDesC8&   aIndications,
        const TBool     aThirtyTwoBit
        )
    {
    OstTraceExt3( TRACE_NORMAL, DISAKERNELAPI_SUBSCRIBEINDICATIONS_ENTRY, ">DIsaKernelAPI::SubscribeIndications;aIndications=%x;aThirtyTwoBit=%d;this=%x", ( TUint )&( aIndications ), aThirtyTwoBit, (TUint)this );

    C_TRACE( ( _T( "DIsaKernelAPI::SubscribeIndications 0x%x %d ->"), &aIndications, aThirtyTwoBit ) );
    // TODO: ASSERT KERNEL CONTEXT
    // TODO: OTHER ASSERTS
    TAny* params[ KOneParam ];
    params[ KFirstParam ] = reinterpret_cast<TAny*>( const_cast<TDesC8*>( &aIndications ) );
    // Get's the current thread's thread message.
    TThreadMessage& m = Kern::Message();
    m.iValue = ( aThirtyTwoBit ? EIADSubscribeIndications32Bit : EIADSubscribeIndications );
    m.iArg[ KFirstParam ] = params;
    TInt retValue( iKernelChannel->HandleRequest( m ) );
    C_TRACE( ( _T( "DIsaKernelAPI::SubscribeIndications 0x%x %d %d <-"), &aIndications, aThirtyTwoBit, retValue ) );

    OstTrace1( TRACE_NORMAL, DISAKERNELAPI_SUBSCRIBEINDICATIONS_EXIT, "<DIsaKernelAPI::SubscribeIndications;retValue=%d", retValue );
    return retValue;
    }

// End of file