connectivitylayer/isce/isirouter_dll/src/isirouter.cpp
changeset 7 fa67e03b87df
parent 0 63b37f68c1ce
child 9 8486d82aef45
--- a/connectivitylayer/isce/isirouter_dll/src/isirouter.cpp	Fri Jan 22 10:04:04 2010 +0200
+++ b/connectivitylayer/isce/isirouter_dll/src/isirouter.cpp	Wed Feb 17 13:58:55 2010 +0200
@@ -24,8 +24,13 @@
 #include "misirouterchannelif.h"  // For MISIRouterChannelIf
 #include "isithreadcontainer.h"   // For DISIThreadContainer
 #include "isicltransceiver.h"     // For DISICLTransceiver
+#include "misirouterobjectif.h"
 
-#define PN_DEV_APE 0x14 //TODO take from real location in future
+#define PN_DEV_OWN 0x6C //TODO take from real location in future
+
+const TInt KDfcPriority( 5 );
+const TUint32 KCommunicationManagerUID( 0x2002B3D0 );
+const TUint32 KNameServiceUID( 0x2002A5A1 );
 
 DISIRouter* DISIRouter::iSelfPtr = NULL;
 
@@ -43,7 +48,7 @@
     EISIRouterNULLThreadPointer,
     };
 
-const TInt KDfcPriority( 5 );
+
 
 void DISIRouter::Connect(
         const TInt32 aUID,
@@ -146,12 +151,14 @@
         )
     {
     C_TRACE( ( _T( "DISIRouter::GetDfcThread<>" ) ) );  
+    Kern::Printf( "ISIRouter::GetDfcThread" );
     return iClientThreadContainer->AllocateThread( aType );
     }
 
 void DISIRouter::FreeDfcThread( TDfcQue* aThread )
     {
     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x>" ), aThread ) );
+    Kern::Printf( "ISIRouter::FreeDfcThread" );
     iClientThreadContainer->DeallocateThread( aThread );
     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x<" ), aThread ) );
     }
@@ -250,28 +257,65 @@
         )
     {
     C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x>" ), &aMessage, aObjId ) );
-    TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );
-    SET_SENDER_DEV( messageBlockPtr, PN_DEV_APE );
-    SET_SENDER_OBJ( messageBlockPtr, aObjId );
-    iCLTransceiver->RouteISIMessage( aMessage );
+    Kern::Printf( "ISIRouter::Send" );
+
+    if( ( aObjId != PN_OBJ_ROUTING_REQ ) 
+     && ( aObjId != PN_OBJ_EVENT_MULTICAST ) )
+        {
+        TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );
+        SET_SENDER_DEV( messageBlockPtr, PN_DEV_OWN );
+        SET_SENDER_OBJ( messageBlockPtr, aObjId );
+        }
+    TInt error = iCLTransceiver->RouteISIMessage( aMessage );
     C_TRACE( ( _T( "DISIRouter::Send 0x%x %d 0x%x<" ), &aMessage, aObjId ) );
-    return KErrNone;
+    return error;
     }
 
 TBool DISIRouter::Receive( TDes8& aMessage, const TUint8 aObjId )
     {
     C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x>" ), &aMessage, aObjId ) );
-    NKern::FMWait( iClientTableFastMutex );
-    if( iClientTable[ aObjId ] )
+    TBool error( EFalse );
+    TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); 
+    switch( GET_RECEIVER_OBJ( aMessage ) )
         {
-        NKern::FMSignal( iClientTableFastMutex );
-        ( iClientTable[ aObjId ]->iChannel )->ReceiveMsg( aMessage ); //may not be safe, consider receive/delete sync
-        C_TRACE( ( _T( "DISIRouter::Receive ok 0x%x 0x%x>" ), &aMessage, aObjId ) );
-        return ETrue;
-    	  }
-    NKern::FMSignal( iClientTableFastMutex );
-    C_TRACE( ( _T( "DISIRouter::Receive failed 0x%x 0x%x<" ), &aMessage, aObjId ) );
-    return EFalse;
+        case PN_OBJ_ROUTING_REQ:
+            {
+            C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_ROUTING_REQ: nameservice" ) ) );
+            //route with resource and nameservice
+            iNameService->Receive( aMessage );
+            C_TRACE( ( _T( "DRouter::HandleIsiMessage to NAMESERVICE<" ) ) );
+            error = ETrue;
+            break;
+            }
+        case PN_OBJ_EVENT_MULTICAST:
+            {
+            C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_EVENT_MULTICAST: communication manager" ) ) );
+            iCommunicationManager->Receive( aMessage );
+            C_TRACE( ( _T( "DRouter::HandleIsiMessage to Communication Manager<" ) ) );
+            error = ETrue;
+            break;
+            }           
+        default:
+            {   //default regular channel
+             NKern::FMWait( iClientTableFastMutex );
+             if( iClientTable[ aObjId ] )
+                {
+                NKern::FMSignal( iClientTableFastMutex );
+                ( iClientTable[ aObjId ]->iChannel )->ReceiveMsg( aMessage ); //may not be safe, consider receive/delete sync
+                C_TRACE( ( _T( "DISIRouter::Receive ok 0x%x 0x%x>" ), &aMessage, aObjId ) );
+                error = ETrue;
+	              }
+	          else
+	              {
+                NKern::FMSignal( iClientTableFastMutex );
+                C_TRACE( ( _T( "DISIRouter::Receive failed 0x%x 0x%x<" ), &aMessage, aObjId ) );
+                error = EFalse;
+                }
+            break;    
+            }
+         }   
+     return error;
+
     }
 
 DECLARE_STANDARD_EXTENSION()
@@ -293,3 +337,30 @@
     return( device );
     }
 
+//From objectapi
+EXPORT_C MISIObjectRouterIf* MISIObjectRouterIf::Connect( const TInt32 aUID, TUint8& aObjId, MISIRouterObjectIf* aCallback )
+    {
+    C_TRACE( ( _T( "MISIObjectRouterIf::Connect %d 0x%x 0x%x>" ), aUID, aObjId, aCallback ) );
+    
+    Kern::Printf( "ISIRouter::Connect" );
+    if( aUID == KNameServiceUID )
+        {
+        C_TRACE( ( _T( "MISIObjectRouterIf was nameservice" ) ) );
+        DISIRouter::iSelfPtr->iNameService = aCallback;
+        aObjId = PN_OBJ_ROUTING_REQ; // 0x00
+        }
+    else if( aUID == KCommunicationManagerUID )
+        {
+        C_TRACE( ( _T( "MISIObjectRouterIf was communicationmanager" ) ) );
+        DISIRouter::iSelfPtr->iCommunicationManager = aCallback;
+        aObjId = PN_OBJ_EVENT_MULTICAST; // 0x20
+        }
+    else
+        {
+        C_TRACE( ( _T( "MISIObjectRouterIf unknown object api client" ) ) );
+        }
+    MISIObjectRouterIf* tmp =  DISIRouter::iSelfPtr;
+    C_TRACE( ( _T( "MISIObjectRouterIf::Connect %d 0x%x 0x%x<" ), aUID, aObjId, aCallback ) );
+    return tmp;
+    }
+