connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp
changeset 9 8486d82aef45
parent 0 63b37f68c1ce
--- a/connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp	Wed Apr 21 14:29:55 2010 +0300
+++ b/connectivitylayer/isce/isirouter_dll/src/isikernelchannel.cpp	Tue Oct 19 13:16:20 2010 +0300
@@ -22,7 +22,7 @@
 #include <dfcs.h>                 // For TDfc
 #include "isikernelchannel.h"     // For DISIKernelChannel
 #include "isiroutertrace.h"       // For C_TRACE, ASSERT_RESET.. and fault codes
-#include "misichannelrouterif.h"  // For MISIChannelRouterIf
+#include "misiobjectrouterif.h"  // For MISIObjectRouterIf
 #include "memapi.h"               // For MemApi
 #include "isimsgqueue.h"          // For DISIMsgQueue
 
@@ -67,16 +67,18 @@
 DISIKernelChannel::DISIKernelChannel( 
         const TUint16& aObjId
         ) : iKernelChMsgQue( MsgQDfc, this, NULL, KISIKernelChannelMsgQueDfcPrio )
+        , iObjId(KNotInitializedId)
+        , iUID( KNotInitializedUID )
     {
     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x>" ), this ) );
-    iRouterIf = MISIChannelRouterIf::GetIf();
+    iRouterIf = MISIObjectRouterIf::GetIf();
     ASSERT_RESET_ALWAYS( iRouterIf, ( EISIKernelChannelMemAllocFailure | EDISIKernelChannelId << KClassIdentifierShift ) );
     iRequests = new DISIKernelAsyncRequests( EISILastAsyncRequest );
     iRx = new DISIMsgQueue( KISILddRxQueueSize );
-    iCompletionThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIUserRequestCompletionThread );
+    iCompletionThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIUserRequestCompletionThread );
     iEmptyRxDfc = new TDfc( EmptyRxDfc, this, iCompletionThread, KISIKernelEmptyRxQueuePrio );
     ASSERT_RESET_ALWAYS( ( iEmptyRxDfc && iRequests && iRx ), ( EISIKernelChannelMemAllocFailure1 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    iMainThread = iRouterIf->GetDfcThread( MISIChannelRouterIf::EISIKernelMainThread );
+    iMainThread = iRouterIf->GetDfcThread( MISIObjectRouterIf::EISIKernelMainThread );
     iKernelChMsgQue.SetDfcQ( iMainThread );
     iKernelChMsgQue.Receive();
     C_TRACE( ( _T( "DISIKernelChannel::DISIKernelChannel 0x%x<" ), this ) );
@@ -97,9 +99,12 @@
     iRx = NULL;
     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iEmptyRxDfc 0x%x" ), iEmptyRxDfc ) );
     // Only modified in constructor, if not created already reseted.
-    iEmptyRxDfc->Cancel();
-    delete iEmptyRxDfc;
-    iEmptyRxDfc = NULL;
+    if ( iEmptyRxDfc )
+        {
+        iEmptyRxDfc->Cancel();
+        delete iEmptyRxDfc;
+        iEmptyRxDfc = NULL;
+        }
     C_TRACE( ( _T( "DISIKernelChannel::~DISIKernelChannel iRequests 0x%x" ), iEmptyRxDfc ) );
     iPtrPtrToRxBuf = NULL;
     iRouterIf = NULL;
@@ -271,95 +276,20 @@
     }
 
 // Called in 1...N transceivers thread context
-void DISIKernelChannel::ReceiveMsg(
+void DISIKernelChannel::Receive(
         const TDesC8& aMessage
         )
     {
-    C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) );
+    C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x>" ), this, &aMessage, iObjId ) );
     ASSERT_THREAD_CONTEXT_ALWAYS( ( EISIKernelChannelNotThreadContext1 | EDISIKernelChannelId << KClassIdentifierShift ) );
     iRx->Add( aMessage );
     iEmptyRxDfc->Enque();
-    C_TRACE( ( _T( "DISIKernelChannel::ReceiveMsg 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) );
+    C_TRACE( ( _T( "DISIKernelChannel::Receive 0x%x 0x%x 0x%x<" ), this, &aMessage, iObjId ) );
     }
 
 // From MISIRouterChannelIf end
 
-DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests(
-        const TInt aSize
-        )
-    {
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests size %d>" ), aSize ) );
-    iRequestLock = new NFastMutex();
-    iDfcFunctionList = new TDfc*[ aSize ];
-    iRequestStatusList = new TRequestStatus*[ aSize ];
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests<" ) ) );
-    }
-
-DISIKernelChannel::DISIKernelAsyncRequests::~DISIKernelAsyncRequests()
-    {
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests>" ) ) );
-    // Delete space reserved for the array not the contents of the array, so mem behind pointers that are not owned are not deleted.
-    delete iDfcFunctionList;
-    delete iRequestStatusList;
-    // Deletes lock
-    delete iRequestLock;
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests<" ) ) );
-    }
-
-void DISIKernelChannel::DISIKernelAsyncRequests::SetPending(
-        const TUint aRequest,
-        TDfc* aDfc,
-        TRequestStatus* aStatus
-        )
-    {
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x>" ), aRequest, aDfc, aStatus ) );
-    ASSERT_RESET_ALWAYS( aDfc, ( EISIKernelChannelNullParam5 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    ASSERT_RESET_ALWAYS( aStatus, ( EISIKernelChannelNullParam6 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits2 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    // Note asserts must be done before holding the lock.
-    NKern::FMWait( iRequestLock );
-    iDfcFunctionList[ aRequest ] = aDfc;
-    iRequestStatusList[ aRequest ] = aStatus;
-    *iRequestStatusList[ aRequest ] = KRequestPending;
-    NKern::FMSignal( iRequestLock );
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x<" ), aRequest, aDfc, aStatus ) );
-    }
-
-TBool DISIKernelChannel::DISIKernelAsyncRequests::IsPending(
-        const TUint aRequest
-        )
-    {
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d>" ), aRequest ) );
-    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits3 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    TBool ret( EFalse );
-    NKern::FMWait( iRequestLock );
-    ret = ( iDfcFunctionList[ aRequest ] && iRequestStatusList[ aRequest ] ) ? ETrue : EFalse;
-    NKern::FMSignal( iRequestLock );
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d %d<" ), aRequest, ret ) );
-    return ret;
-    }
-
-void DISIKernelChannel::DISIKernelAsyncRequests::Complete(
-        const TUint aRequest,
-        const TInt aStatusToComplete
-        )
-    {
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d>" ), aRequest ) );
-    // Check that request is legal.
-    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits4 | EDISIKernelChannelId << KClassIdentifierShift ) );
-    NKern::FMWait( iRequestLock );
-    TDfc* completeDfc = iDfcFunctionList[ aRequest ];
-    if( ( completeDfc && iRequestStatusList[ aRequest ] ) )
-        {
-        // Writing straight to clients pointer. There is a risk that malfunctioning client can mess up it's own pointer, if used out side of rx dfc, but what can you do..
-        *iRequestStatusList[ aRequest ] = aStatusToComplete;
-        ASSERT_RESET_ALWAYS( !completeDfc->Queued(), ( EISIKernelChannelDfcAlreadyQueued | EDISIKernelChannelId << KClassIdentifierShift ) );
-        completeDfc->Enque();
-        iDfcFunctionList[ aRequest ] = NULL;
-        }
-    NKern::FMSignal( iRequestLock );
-    C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) );
-    }
+// Internal start
 
 void DISIKernelChannel::EmptyRxDfc(
         TAny* aPtr // self
@@ -367,7 +297,7 @@
     {
     C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc>" ) ) );
     DISIKernelChannel& chTmp = *reinterpret_cast<DISIKernelChannel*>( aPtr );
-    C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x>" ), &chTmp, chTmp.iObjId ) );
+    C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x 0x%x" ), &chTmp, chTmp.iObjId ) );
     if( chTmp.iRequests->IsPending( EISIAsyncReceive ) && chTmp.iRx->Count() > 0 )
         {
         C_TRACE( ( _T( "DISIKernelChannel::EmptyRxDfc 0x%x writing to kernel client" ), &chTmp ) );
@@ -432,7 +362,7 @@
             {
             C_TRACE( ( _T( "DISIKernelChannel::HandleSyncRequest EISIConnect 0x%x" ), this ) );
             iUID = tablePtr[ KFirstParam ];
-            TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] ); //TODO vasta tempobjid
+            TUint8* objIdPtr = reinterpret_cast<TUint8*>( tablePtr[ KSecondParam ] );
             C_TRACE( ( _T( "DISIKernelChannel::HandleDfcRequest EISINokiaKernelOpen 0x%x" ), this ) );
             iRouterIf->Connect( iUID, iObjId, this );
             *objIdPtr = iObjId;
@@ -516,7 +446,7 @@
         )
     {
     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x>" ), this, iObjId ) );
-    // TODO: assert router ext thread context
+    //  assert router ext thread context
     if( iRx )
         {
         C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x iRx 0x%x" ), this, iRx ) );
@@ -528,5 +458,84 @@
     C_TRACE( ( _T( "DISIKernelChannel::ResetQueues 0x%x 0x%x<" ), this, iObjId ) );
     }
 
+DISIKernelChannel::DISIKernelAsyncRequests::DISIKernelAsyncRequests(
+        const TInt aSize
+        )
+    {
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests size %d>" ), aSize ) );
+    iRequestLock = new NFastMutex();
+    iDfcFunctionList = new TDfc*[ aSize ];
+    iRequestStatusList = new TRequestStatus*[ aSize ];
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::DISIKernelAsyncRequests<" ) ) );
+    }
+
+DISIKernelChannel::DISIKernelAsyncRequests::~DISIKernelAsyncRequests()
+    {
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests>" ) ) );
+    // Delete space reserved for the array not the contents of the array, so mem behind pointers that are not owned are not deleted.
+    delete iDfcFunctionList;
+    delete iRequestStatusList;
+    // Deletes lock
+    delete iRequestLock;
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::~DISIKernelAsyncRequests<" ) ) );
+    }
+
+void DISIKernelChannel::DISIKernelAsyncRequests::SetPending(
+        const TUint aRequest,
+        TDfc* aDfc,
+        TRequestStatus* aStatus
+        )
+    {
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x>" ), aRequest, aDfc, aStatus ) );
+    ASSERT_RESET_ALWAYS( aDfc, ( EISIKernelChannelNullParam5 | EDISIKernelChannelId << KClassIdentifierShift ) );
+    ASSERT_RESET_ALWAYS( aStatus, ( EISIKernelChannelNullParam6 | EDISIKernelChannelId << KClassIdentifierShift ) );
+    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits2 | EDISIKernelChannelId << KClassIdentifierShift ) );
+    // Note asserts must be done before holding the lock.
+    NKern::FMWait( iRequestLock );
+    iDfcFunctionList[ aRequest ] = aDfc;
+    iRequestStatusList[ aRequest ] = aStatus;
+    *iRequestStatusList[ aRequest ] = KRequestPending;
+    NKern::FMSignal( iRequestLock );
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::SetPending %d 0x%x 0x%x<" ), aRequest, aDfc, aStatus ) );
+    }
+
+TBool DISIKernelChannel::DISIKernelAsyncRequests::IsPending(
+        const TUint aRequest
+        )
+    {
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d>" ), aRequest ) );
+    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits3 | EDISIKernelChannelId << KClassIdentifierShift ) );
+    TBool ret( EFalse );
+    NKern::FMWait( iRequestLock );
+    ret = ( iDfcFunctionList[ aRequest ] && iRequestStatusList[ aRequest ] ) ? ETrue : EFalse;
+    NKern::FMSignal( iRequestLock );
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::IsPending %d %d<" ), aRequest, ret ) );
+    return ret;
+    }
+
+void DISIKernelChannel::DISIKernelAsyncRequests::Complete(
+        const TUint aRequest,
+        const TInt aStatusToComplete
+        )
+    {
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d>" ), aRequest ) );
+    // Check that request is legal.
+    ASSERT_RESET_ALWAYS( ( EISILastAsyncRequest > aRequest && EISIAsyncReceive <= aRequest ), ( EISIKernelChannelOverTheLimits4 | EDISIKernelChannelId << KClassIdentifierShift ) );
+    NKern::FMWait( iRequestLock );
+    TDfc* completeDfc = iDfcFunctionList[ aRequest ];
+    if( ( completeDfc && iRequestStatusList[ aRequest ] ) )
+        {
+        // Writing straight to clients pointer. There is a risk that malfunctioning client can mess up it's own pointer, if used out side of rx dfc, but what can you do..
+        *iRequestStatusList[ aRequest ] = aStatusToComplete;
+        ASSERT_RESET_ALWAYS( !completeDfc->Queued(), ( EISIKernelChannelDfcAlreadyQueued | EDISIKernelChannelId << KClassIdentifierShift ) );
+        completeDfc->Enque();
+        iDfcFunctionList[ aRequest ] = NULL;
+        }
+    NKern::FMSignal( iRequestLock );
+    C_TRACE( ( _T( "DISIKernelAsyncRequests::Complete %d<" ), aRequest ) );
+    }
+
+// Internal end
+
 // End of file.