connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp
changeset 9 8486d82aef45
parent 0 63b37f68c1ce
equal deleted inserted replaced
8:6295dc2169f3 9:8486d82aef45
    20 #include <nk_priv.h>              // For __ASSERT_NO_FAST_MUTEX
    20 #include <nk_priv.h>              // For __ASSERT_NO_FAST_MUTEX
    21 #include <kern_priv.h>            // For __ASSERT_CRITICAL
    21 #include <kern_priv.h>            // For __ASSERT_CRITICAL
    22 #include <dfcs.h>                 // For TDfc
    22 #include <dfcs.h>                 // For TDfc
    23 #include "isikernelchannel.h"     // For DISIKernelChannel
    23 #include "isikernelchannel.h"     // For DISIKernelChannel
    24 #include "isiroutertrace.h"       // For C_TRACE, ASSERT_RESET.. and fault codes
    24 #include "isiroutertrace.h"       // For C_TRACE, ASSERT_RESET.. and fault codes
    25 #include "misichannelrouterif.h"  // For MISIChannelRouterIf
    25 #include "misiobjectrouterif.h"  // For MISIObjectRouterIf
    26 #include "memapi.h"               // For MemApi
    26 #include "memapi.h"               // For MemApi
    27 #include "isimsgqueue.h"          // For DISIMsgQueue
    27 #include "isimsgqueue.h"          // For DISIMsgQueue
    28 
    28 
    29 // CONST
    29 // CONST
    30 const TInt KFirstParam( 0 );
    30 const TInt KFirstParam( 0 );
    65 
    65 
    66 
    66 
    67 DISIKernelChannel::DISIKernelChannel( 
    67 DISIKernelChannel::DISIKernelChannel( 
    68         const TUint16& aObjId
    68         const TUint16& aObjId
    69         ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio )
    69         ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio )
       
    70         , iObjId(KNotInitializedId)
       
    71         , iUID( KNotInitializedUID )
    70     {
    72     {
    71     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) );
    73     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) );
    72     iRouterIf = MISIChannelRouterIf::GetIf();
    74     iRouterIf = MISIObjectRouterIf::GetIf();
    73     ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) );
    75     ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) );
    74     iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest );
    76     iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest );
    75     iRx = new DISIMsgQueue( KISILddRxQueueSize );
    77     iRx = new DISIMsgQueue( KISILddRxQueueSize );
    76     iCompletionThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIUserRequestCompletionThread );
    78     iCompletionThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIUserRequestCompletionThread );
    77     iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio );
    79     iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio );
    78     ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) );
    80     ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) );
    79     iMainThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIKernelMainThread );
    81     iMainThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIKernelMainThread );
    80     iKernelChMsgQue.SetDfcQ( iMainThread );
    82     iKernelChMsgQue.SetDfcQ( iMainThread );
    81     iKernelChMsgQue.Receive();
    83     iKernelChMsgQue.Receive();
    82     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) );
    84     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) );
    83     }
    85     }
    84 
    86 
    95     // Only modified in constructor, if not created already reseted.
    97     // Only modified in constructor, if not created already reseted.
    96     delete iRx;
    98     delete iRx;
    97     iRx = NULL;
    99     iRx = NULL;
    98     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iEmptyRxDfc 0x%x" ), iEmptyRxDfc ) );
   100     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iEmptyRxDfc 0x%x" ), iEmptyRxDfc ) );
    99     // Only modified in constructor, if not created already reseted.
   101     // Only modified in constructor, if not created already reseted.
   100     iEmptyRxDfc->Cancel();
   102     if ( iEmptyRxDfc )
   101     delete iEmptyRxDfc;
   103         {
   102     iEmptyRxDfc = NULL;
   104         iEmptyRxDfc->Cancel();
       
   105         delete iEmptyRxDfc;
       
   106         iEmptyRxDfc = NULL;
       
   107         }
   103     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iRequests 0x%x" ), iEmptyRxDfc ) );
   108     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iRequests 0x%x" ), iEmptyRxDfc ) );
   104     iPtrPtrToRxBuf = NULL;
   109     iPtrPtrToRxBuf = NULL;
   105     iRouterIf = NULL;
   110     iRouterIf = NULL;
   106     // Only modified in constructor, if not created already reseted.
   111     // Only modified in constructor, if not created already reseted.
   107     delete iRequests;
   112     delete iRequests;
   269         }
   274         }
   270     C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest 0x%x 0x%x 0x%x<" ), this, &aMsg, iObjId ) );
   275     C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest 0x%x 0x%x 0x%x<" ), this, &aMsg, iObjId ) );
   271     }
   276     }
   272 
   277 
   273 // Called in 1...N transceivers thread context
   278 // Called in 1...N transceivers thread context
   274 void DISIKernelChannel::ReceiveMsg(
   279 void DISIKernelChannel::Receive(
   275         const TDesC8& aMessage
   280         const TDesC8& aMessage
   276         )
   281         )
   277     {
   282     {
   278     C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) );
   283     C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) );
   279     ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) );
   284     ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) );
   280     iRx->Add( aMessage );
   285     iRx->Add( aMessage );
   281     iEmptyRxDfc->Enque();
   286     iEmptyRxDfc->Enque();
   282     C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) );
   287     C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) );
   283     }
   288     }
   284 
   289 
   285 // From MISIRouterChannelIf end
   290 // From MISIRouterChannelIf end
       
   291 
       
   292 // Internal start
       
   293 
       
   294 void DISIKernelChannel::EmptyRxDfc(
       
   295         TAny* aPtr // self
       
   296         )
       
   297     {
       
   298     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) );
       
   299     DISIKernelChannel& chTmp = *reinterpret_cast<DISIKernelChannel*>( aPtr );
       
   300     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x" ), &chTmp, chTmp.iObjId ) );
       
   301     if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 )
       
   302         {
       
   303         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) );
       
   304         TDes8*& tmpWrite = *chTmp.iPtrPtrToRxBuf;
       
   305         tmpWrite = &chTmp.iRx->Get();
       
   306         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x 0x%x clientRx 0x%x " ), &chTmp, chTmp.iPtrPtrToRxBuf, &chTmp.iPtrPtrToRxBuf, *chTmp.iPtrPtrToRxBuf ) );
       
   307         chTmp.EnqueChannelRequestCompleteDfc( EISIAsyncReceive, KErrNone );
       
   308         }
       
   309     else
       
   310         {
       
   311         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x no receive active or no message" ), &chTmp ) );
       
   312         }
       
   313     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x<" ), &chTmp, chTmp.iObjId ) );
       
   314     }
       
   315 
       
   316 void DISIKernelChannel::DoCancel(
       
   317         TInt aRequest,
       
   318         TInt aMask )
       
   319     {
       
   320     C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x>" ), this, iObjId ) );
       
   321     ASSERT_RESET_ALWAYS( EISILastAsyncRequest > ( aMask&aRequest ), EISIKernelChannelOverTheLimits | EDISIKernelChannelId << KClassIdentifierShift );
       
   322     if( iRequests->IsPending( aMask&aRequest ) )
       
   323         {
       
   324         switch( aMask&aRequest )
       
   325             {
       
   326             case EISIAsyncReceive:
       
   327                 {
       
   328                 C_TRACE( ( _T( "DISIKernelChannel::DoCancel EIADAsyncReceive 0x%x ptrs 0x%x 0x%x" ), this, iPtrPtrToRxBuf, &iPtrPtrToRxBuf ) );
       
   329                 iPtrPtrToRxBuf = NULL;
       
   330                 break;
       
   331                 }
       
   332             default:
       
   333                 {
       
   334                 ASSERT_RESET_ALWAYS( 0, EISIKernelChannelWrongRequest | EDISIKernelChannelId << KClassIdentifierShift );
       
   335                 break;
       
   336                 }
       
   337             }
       
   338         EnqueChannelRequestCompleteDfc( aMask&aRequest, KErrCancel );
       
   339         }
       
   340     else
       
   341         {
       
   342         C_TRACE( ( _T( "DISIKernelChannel::DoCancel nothing to cancel 0x%x" ), this ) );
       
   343         }
       
   344     C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x<" ), this, iObjId ) );
       
   345     }
       
   346 
       
   347 TInt DISIKernelChannel::HandleSyncRequest(
       
   348         TThreadMessage& aMsg
       
   349         )
       
   350     {
       
   351     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x 0x%x>" ), this, &aMsg, iObjId ) );
       
   352     TThreadMessage& m = ( aMsg );
       
   353     TInt request( m.iValue );
       
   354     ASSERT_RESET_ALWAYS( m.iArg, ( EISIKernelChannelNullParam4 | EDISIKernelChannelId << KClassIdentifierShift ) );
       
   355     TInt returnValue( KErrNone );
       
   356     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x handling %d" ), this, request ) );
       
   357     TUint32* tablePtr = reinterpret_cast<TUint32*>( m.Ptr0() );
       
   358  
       
   359     switch( request )
       
   360         {
       
   361         case EISIConnect:
       
   362             {
       
   363             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) );
       
   364             iUID = tablePtr[ KFirstParam ];
       
   365             TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] );
       
   366             C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) );
       
   367             iRouterIf->Connect( iUID, iObjId, this );
       
   368             *objIdPtr = iObjId;
       
   369             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) );
       
   370             break;
       
   371             }
       
   372         case EISIDisconnect:
       
   373             {
       
   374             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) );
       
   375             Disconnect();
       
   376             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) );
       
   377             returnValue = KErrNone;
       
   378             break;
       
   379             }
       
   380         case EISIAllocateBlock:
       
   381             {
       
   382             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) );
       
   383             const TInt size = *reinterpret_cast<TInt*>( tablePtr[ KFirstParam ] );
       
   384             TDes8*& block = *(reinterpret_cast<TDes8**>( tablePtr[ KSecondParam ] ));
       
   385             C_TRACE( ( _T( "DISIKernelChannel:: EISIAllocateBlock 0x%x block 0x%x %d" ), this, block, size ) );
       
   386             block = ( &MemApi::AllocBlock( size ) );
       
   387             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) );
       
   388             break;
       
   389             }
       
   390         case EISIDeallocateBlock:
       
   391             {
       
   392             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) );
       
   393             TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] );
       
   394             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x block 0x%x" ), this, &block ) );
       
   395             // Needed to ensure that right channel is deleting the right block. (Could it be done otherways too?)
       
   396             if( iPtrPtrToRxBuf )
       
   397                 {
       
   398                 if ( &block == *iPtrPtrToRxBuf )
       
   399                     {
       
   400                     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest release 0x%x 0x%x clientRx 0x%x"), iPtrPtrToRxBuf, &iPtrPtrToRxBuf, *iPtrPtrToRxBuf ) );
       
   401                     iPtrPtrToRxBuf = NULL;
       
   402                     }
       
   403                 }
       
   404             MemApi::DeallocBlock( block );
       
   405             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) );
       
   406             break;
       
   407             }
       
   408         case EISISend:
       
   409             {
       
   410             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) );
       
   411             TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] );
       
   412             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x block 0x%x" ), this, &block ) );
       
   413             returnValue = iRouterIf->Send( block, iObjId );
       
   414             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) );
       
   415             break;
       
   416             }
       
   417         default:
       
   418             {
       
   419             ASSERT_RESET_ALWAYS( 0, ( EISIKernelChannelWrongRequest3 | EDISIKernelChannelId << KClassIdentifierShift ) );
       
   420             break;
       
   421             }
       
   422         }
       
   423     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x %d 0x%x<" ), this, &aMsg, returnValue, iObjId ) );
       
   424     return returnValue;
       
   425     }
       
   426 
       
   427 void DISIKernelChannel::Disconnect(
       
   428         // None
       
   429         )
       
   430     {
       
   431     C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x>" ), this, iObjId ) );
       
   432     ResetQueues();
       
   433     for( TInt i( EISILastSyncRequest ); i < EISILastAsyncRequest; ++i )
       
   434         {
       
   435         C_TRACE( ( _T( "DISIKernelChannel::CancelRequests req to cancel %d" ), i ) );
       
   436         DoCancel( KMaxTInt, i );
       
   437         }
       
   438     iRouterIf->Disconnect( iObjId );
       
   439     iRouterIf->FreeDfcThread( iMainThread );
       
   440     iRouterIf->FreeDfcThread( iCompletionThread );
       
   441     C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x<" ), this, iObjId ) );
       
   442     }
       
   443 
       
   444 void DISIKernelChannel::ResetQueues(
       
   445         // None
       
   446         )
       
   447     {
       
   448     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) );
       
   449     //  assert router ext thread context
       
   450     if( iRx )
       
   451         {
       
   452         C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) );
       
   453         while( iRx->Count() )
       
   454             {
       
   455             MemApi::DeallocBlock( iRx->Get() );
       
   456             }
       
   457         }
       
   458     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) );
       
   459     }
   286 
   460 
   287 DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests(
   461 DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests(
   288         const TInt aSize
   462         const TInt aSize
   289         )
   463         )
   290     {
   464     {
   359         }
   533         }
   360     NKern::FMSignal( iRequestLock );
   534     NKern::FMSignal( iRequestLock );
   361     C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) );
   535     C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) );
   362     }
   536     }
   363 
   537 
   364 void DISIKernelChannel::EmptyRxDfc(
   538 // Internal end
   365         TAny* aPtr // self
       
   366         )
       
   367     {
       
   368     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) );
       
   369     DISIKernelChannel& chTmp = *reinterpret_cast<DISIKernelChannel*>( aPtr );
       
   370     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x>" ), &chTmp, chTmp.iObjId ) );
       
   371     if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 )
       
   372         {
       
   373         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) );
       
   374         TDes8*& tmpWrite = *chTmp.iPtrPtrToRxBuf;
       
   375         tmpWrite = &chTmp.iRx->Get();
       
   376         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x 0x%x clientRx 0x%x " ), &chTmp, chTmp.iPtrPtrToRxBuf, &chTmp.iPtrPtrToRxBuf, *chTmp.iPtrPtrToRxBuf ) );
       
   377         chTmp.EnqueChannelRequestCompleteDfc( EISIAsyncReceive, KErrNone );
       
   378         }
       
   379     else
       
   380         {
       
   381         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x no receive active or no message" ), &chTmp ) );
       
   382         }
       
   383     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x<" ), &chTmp, chTmp.iObjId ) );
       
   384     }
       
   385 
       
   386 void DISIKernelChannel::DoCancel(
       
   387         TInt aRequest,
       
   388         TInt aMask )
       
   389     {
       
   390     C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x>" ), this, iObjId ) );
       
   391     ASSERT_RESET_ALWAYS( EISILastAsyncRequest > ( aMask&aRequest ), EISIKernelChannelOverTheLimits | EDISIKernelChannelId << KClassIdentifierShift );
       
   392     if( iRequests->IsPending( aMask&aRequest ) )
       
   393         {
       
   394         switch( aMask&aRequest )
       
   395             {
       
   396             case EISIAsyncReceive:
       
   397                 {
       
   398                 C_TRACE( ( _T( "DISIKernelChannel::DoCancel EIADAsyncReceive 0x%x ptrs 0x%x 0x%x" ), this, iPtrPtrToRxBuf, &iPtrPtrToRxBuf ) );
       
   399                 iPtrPtrToRxBuf = NULL;
       
   400                 break;
       
   401                 }
       
   402             default:
       
   403                 {
       
   404                 ASSERT_RESET_ALWAYS( 0, EISIKernelChannelWrongRequest | EDISIKernelChannelId << KClassIdentifierShift );
       
   405                 break;
       
   406                 }
       
   407             }
       
   408         EnqueChannelRequestCompleteDfc( aMask&aRequest, KErrCancel );
       
   409         }
       
   410     else
       
   411         {
       
   412         C_TRACE( ( _T( "DISIKernelChannel::DoCancel nothing to cancel 0x%x" ), this ) );
       
   413         }
       
   414     C_TRACE( ( _T( "DISIKernelChannel::DoCancel 0x%x 0x%x<" ), this, iObjId ) );
       
   415     }
       
   416 
       
   417 TInt DISIKernelChannel::HandleSyncRequest(
       
   418         TThreadMessage& aMsg
       
   419         )
       
   420     {
       
   421     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x 0x%x>" ), this, &aMsg, iObjId ) );
       
   422     TThreadMessage& m = ( aMsg );
       
   423     TInt request( m.iValue );
       
   424     ASSERT_RESET_ALWAYS( m.iArg, ( EISIKernelChannelNullParam4 | EDISIKernelChannelId << KClassIdentifierShift ) );
       
   425     TInt returnValue( KErrNone );
       
   426     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x handling %d" ), this, request ) );
       
   427     TUint32* tablePtr = reinterpret_cast<TUint32*>( m.Ptr0() );
       
   428  
       
   429     switch( request )
       
   430         {
       
   431         case EISIConnect:
       
   432             {
       
   433             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) );
       
   434             iUID = tablePtr[ KFirstParam ];
       
   435             TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] ); //TODO vasta tempobjid
       
   436             C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) );
       
   437             iRouterIf->Connect( iUID, iObjId, this );
       
   438             *objIdPtr = iObjId;
       
   439             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) );
       
   440             break;
       
   441             }
       
   442         case EISIDisconnect:
       
   443             {
       
   444             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) );
       
   445             Disconnect();
       
   446             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDisconnect 0x%x" ), this ) );
       
   447             returnValue = KErrNone;
       
   448             break;
       
   449             }
       
   450         case EISIAllocateBlock:
       
   451             {
       
   452             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) );
       
   453             const TInt size = *reinterpret_cast<TInt*>( tablePtr[ KFirstParam ] );
       
   454             TDes8*& block = *(reinterpret_cast<TDes8**>( tablePtr[ KSecondParam ] ));
       
   455             C_TRACE( ( _T( "DISIKernelChannel:: EISIAllocateBlock 0x%x block 0x%x %d" ), this, block, size ) );
       
   456             block = ( &MemApi::AllocBlock( size ) );
       
   457             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x" ), this ) );
       
   458             break;
       
   459             }
       
   460         case EISIDeallocateBlock:
       
   461             {
       
   462             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) );
       
   463             TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] );
       
   464             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIAllocateBlock 0x%x block 0x%x" ), this, &block ) );
       
   465             // Needed to ensure that right channel is deleting the right block. (Could it be done otherways too?)
       
   466             if( iPtrPtrToRxBuf )
       
   467                 {
       
   468                 if ( &block == *iPtrPtrToRxBuf )
       
   469                     {
       
   470                     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest release 0x%x 0x%x clientRx 0x%x"), iPtrPtrToRxBuf, &iPtrPtrToRxBuf, *iPtrPtrToRxBuf ) );
       
   471                     iPtrPtrToRxBuf = NULL;
       
   472                     }
       
   473                 }
       
   474             MemApi::DeallocBlock( block );
       
   475             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIDeallocateBlock 0x%x" ), this ) );
       
   476             break;
       
   477             }
       
   478         case EISISend:
       
   479             {
       
   480             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) );
       
   481             TDes8& block = *reinterpret_cast<TDes8*>( tablePtr[ KFirstParam ] );
       
   482             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x block 0x%x" ), this, &block ) );
       
   483             returnValue = iRouterIf->Send( block, iObjId );
       
   484             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISISend 0x%x" ), this ) );
       
   485             break;
       
   486             }
       
   487         default:
       
   488             {
       
   489             ASSERT_RESET_ALWAYS( 0, ( EISIKernelChannelWrongRequest3 | EDISIKernelChannelId << KClassIdentifierShift ) );
       
   490             break;
       
   491             }
       
   492         }
       
   493     C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest 0x%x 0x%x %d 0x%x<" ), this, &aMsg, returnValue, iObjId ) );
       
   494     return returnValue;
       
   495     }
       
   496 
       
   497 void DISIKernelChannel::Disconnect(
       
   498         // None
       
   499         )
       
   500     {
       
   501     C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x>" ), this, iObjId ) );
       
   502     ResetQueues();
       
   503     for( TInt i( EISILastSyncRequest ); i < EISILastAsyncRequest; ++i )
       
   504         {
       
   505         C_TRACE( ( _T( "DISIKernelChannel::CancelRequests req to cancel %d" ), i ) );
       
   506         DoCancel( KMaxTInt, i );
       
   507         }
       
   508     iRouterIf->Disconnect( iObjId );
       
   509     iRouterIf->FreeDfcThread( iMainThread );
       
   510     iRouterIf->FreeDfcThread( iCompletionThread );
       
   511     C_TRACE( ( _T( "DISIKernelChannel::Disconnect 0x%x 0x%x<" ), this, iObjId ) );
       
   512     }
       
   513 
       
   514 void DISIKernelChannel::ResetQueues(
       
   515         // None
       
   516         )
       
   517     {
       
   518     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) );
       
   519     // TODO: assert router ext thread context
       
   520     if( iRx )
       
   521         {
       
   522         C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) );
       
   523         while( iRx->Count() )
       
   524             {
       
   525             MemApi::DeallocBlock( iRx->Get() );
       
   526             }
       
   527         }
       
   528     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) );
       
   529     }
       
   530 
   539 
   531 // End of file.
   540 // End of file.
   532 
   541