connectivitylayer/isce/isirouter_dll/src/isirouter.cpp
changeset 9 8486d82aef45
parent 7 fa67e03b87df
equal deleted inserted replaced
8:6295dc2169f3 9:8486d82aef45
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include <kernel.h>               // For Kern
    19 #include <kernel.h>               // For Kern
       
    20 #include <pn_const.h>             // For PN_OBJ_ROUTING_REQ
       
    21 #include <phonetisi.h>            // For ISI_HEADER_OFFSET_...
    20 #include "isirouter.h"            // For DISIRouter
    22 #include "isirouter.h"            // For DISIRouter
    21 #include "isiroutertrace.h"       // For C_TRACE, ASSERT_RESET.. and fault codes
    23 #include "isiroutertrace.h"       // For C_TRACE, ASSERT_RESET.. and fault codes
    22 #include "isidevice.h"            // For DLogicalDevice
    24 #include "isidevice.h"            // For DLogicalDevice
    23 #include "isihelpers.h"           // For SET_SENDER_DEV...
    25 #include "isihelpers.h"           // For SET_SENDER_DEV...
    24 #include "misirouterchannelif.h"  // For MISIRouterChannelIf
    26 //#include "misirouterobjectif.h"  // For MISIRouterObjectIf
    25 #include "isithreadcontainer.h"   // For DISIThreadContainer
    27 #include "isithreadcontainer.h"   // For DISIThreadContainer
    26 #include "isicltransceiver.h"     // For DISICLTransceiver
    28 #include "isicltransceiver.h"     // For DISICLTransceiver
    27 #include "misirouterobjectif.h"
    29 #include "misirouterobjectif.h"
    28 
    30 
    29 #define PN_DEV_OWN 0x6C //TODO take from real location in future
       
    30 
       
    31 const TInt KDfcPriority( 5 );
       
    32 const TUint32 KCommunicationManagerUID( 0x2002B3D0 );
    31 const TUint32 KCommunicationManagerUID( 0x2002B3D0 );
    33 const TUint32 KNameServiceUID( 0x2002A5A1 );
    32 const TUint32 KNameServiceUID( 0x2002A5A1 );
       
    33 const TUint32 KIsiShRouterServiceUID( 0x20026FE7 );
       
    34 const TUint32 KIsiShPipeHandlerUID( 0x2002E6E2 );
       
    35 
       
    36 #define ROUTER_OBJECT_IDENTIFIER 0xFA // Only internally agreed inside isi router
       
    37 #define PIPEHANDLER_OBJECT_IDENTIFIER 0xFB // Only internally agreed inside isi router
    34 
    38 
    35 DISIRouter* DISIRouter::iSelfPtr = NULL;
    39 DISIRouter* DISIRouter::iSelfPtr = NULL;
    36 
    40 
    37 // Faults
    41 // Faults
    38 enum TISIRouterFaults
    42 enum TISIRouterFaults
    43     EISIRouterNotUniqueUID,
    47     EISIRouterNotUniqueUID,
    44     EISIRouterNULLObjId,
    48     EISIRouterNULLObjId,
    45     EISIRouterNULLPtr,
    49     EISIRouterNULLPtr,
    46     EISIRouterNULLPtr1,
    50     EISIRouterNULLPtr1,
    47     EISIRouterNULLPtr2,
    51     EISIRouterNULLPtr2,
       
    52     EISIRouterNULLPtr3,
    48     EISIRouterNULLThreadPointer,
    53     EISIRouterNULLThreadPointer,
       
    54     EISIRouterRouterServiceNULLPtr,
       
    55     EISiShPipeHandlerNULLPtr,
       
    56     EISIRouterCommunicationManagerNULLPtr,
       
    57     EISIRouterNameServiceNULLPtr,
       
    58     EISIWrongObjectApiClient,
    49     };
    59     };
    50 
    60 
    51 
    61 const TInt KDfcPriority( 5 );
       
    62 
       
    63 // #define WITHOUT_WRAPPERS_IN_USE //  to be defined on when wrappers are not used anymore
       
    64 #ifndef WITHOUT_WRAPPERS_IN_USE
       
    65 #include <iscnokiadefinitions.h> // Only allowed to include when wrappers are used
       
    66 const TUint16 KFirstUserChannel( EIscNokiaUpdateApplication );
       
    67 const TUint16 KLastKernelChannel( EIscNokiaLastKernelChannel );
       
    68 #endif
    52 
    69 
    53 void DISIRouter::Connect(
    70 void DISIRouter::Connect(
    54         const TInt32 aUID,
    71         const TInt32 aUID,
    55         TUint8& aObjId, 
    72         TUint8& aObjId, 
    56         MISIRouterChannelIf* aCallback
    73         MISIRouterObjectIf* aCallback
    57         )
    74         )
    58     {
    75     {
    59    	C_TRACE( ( _T( "DISIRouter::Connect %d 0x%x 0x%x>" ), aUID, aObjId, aCallback ) );
    76     C_TRACE( ( _T( "DISIRouter::Connect 0x%x 0x%x 0x%x 0x%x>" ), aUID, aObjId, aCallback, this ) );
    60     ASSERT_RESET_ALWAYS( aCallback, ( EISIRouterNULLPtr | EDISIRouterTraceId << KClassIdentifierShift ) );
    77     ASSERT_RESET_ALWAYS( aCallback, ( EISIRouterNULLPtr | EDISIRouterTraceId << KClassIdentifierShift ) );
    61     TISIClient* tmp = new TISIClient();
    78     TISIClient* tmp = new TISIClient();
    62     ASSERT_RESET_ALWAYS( tmp, ( EISIRouterMemAllocFailure | EDISIRouterTraceId << KClassIdentifierShift ) );
    79     ASSERT_RESET_ALWAYS( tmp, ( EISIRouterMemAllocFailure | EDISIRouterTraceId << KClassIdentifierShift ) );
    63     tmp->iUID     = aUID;
    80     tmp->iUID = aUID;
    64     tmp->iChannel = aCallback;
    81     tmp->iChannel = aCallback;
    65     
    82     TUint8 staticObjId = ReserveStaticObjId( aUID );
    66     TUint8 staticObjId = ReceiveStaticObjId( aUID );
       
    67     NKern::FMWait( iClientTableFastMutex );
    83     NKern::FMWait( iClientTableFastMutex );
    68     CheckUIDUniqueness( aUID );
    84     TBool reserved = CheckUIDUniqueness( aUID );
    69     if( !staticObjId )
    85 #ifndef WITHOUT_WRAPPERS_IN_USE
    70         {
    86     if( reserved )
    71         tmp->iObjId = ReserveNewDynamicObjId();
    87         {
    72         ASSERT_RESET_ALWAYS( tmp->iObjId, ( EISIRouterNULLObjId | EDISIRouterTraceId << KClassIdentifierShift ) );
    88         NKern::FMSignal( iClientTableFastMutex );
       
    89         aObjId = 0xEE;
    73         }
    90         }
    74     else
    91     else
    75         {
    92         {
    76         tmp->iObjId = staticObjId;
    93 #endif //WITHOUT_WRAPPERS_IN_USE
    77         }
    94         if( KNotInitializedId == staticObjId )
    78     iClientTable[ tmp->iObjId ] = tmp;
    95             {
    79     NKern::FMSignal( iClientTableFastMutex );
    96             tmp->iObjId = ReserveNewDynamicObjId();
    80     aObjId = tmp->iObjId;
    97             ASSERT_RESET_ALWAYS( tmp->iObjId, ( EISIRouterNULLObjId | EDISIRouterTraceId << KClassIdentifierShift ) );
    81     C_TRACE( ( _T( "DISIRouter::Connect %d 0x%x 0x%x<" ), aUID, aObjId, aCallback ) );
    98             }
    82     }
    99         else
    83 
   100             {
    84 void DISIRouter::CheckUIDUniqueness( const TInt32 aUID )
   101             tmp->iObjId = staticObjId;//  check that dynamic allocation don't return statically reserved object identifiers
    85     {
   102             }
       
   103         iClientTable[ tmp->iObjId ] = tmp;
       
   104         NKern::FMSignal( iClientTableFastMutex );
       
   105         aObjId = tmp->iObjId;
       
   106 #ifndef WITHOUT_WRAPPERS_IN_USE
       
   107         }
       
   108 #endif
       
   109     C_TRACE( ( _T( "DISIRouter::Connect 0x%x 0x%x 0x%x<" ), aUID, aObjId, aCallback ) );
       
   110     }
       
   111 
       
   112 TBool DISIRouter::CheckUIDUniqueness( const TInt32 aUID )
       
   113     {
       
   114     TBool ret(EFalse);
    86     // No tracing with mutex
   115     // No tracing with mutex
    87     for( TInt i( KFirstAllowedObjId ); i < KMaxAmountOfObjId; i++ )
   116     for( TInt i( 0 ); i < KMaxAmountOfObjId; i++ )
    88         {
   117         {
    89   	    if( iClientTable[ i ]  && ( iClientTable[ i ]->iUID == aUID ) )
   118         if( iClientTable[ i ]  && ( iClientTable[ i ]->iUID == aUID ) )
    90     	      {
   119             {
    91     	      ASSERT_RESET_ALWAYS( 0, ( EISIRouterNotUniqueUID | EDISIRouterTraceId << KClassIdentifierShift ) );
   120 #ifndef WITHOUT_WRAPPERS_IN_USE
    92     	      }
   121             if( aUID <= KLastKernelChannel )
    93         }
   122                 {
    94     }
   123                 ret = ETrue;
    95 
   124                 }
    96 TUint8 DISIRouter::ReceiveStaticObjId( const TInt32 aUID )
   125             else
    97     {
   126                 {
    98     C_TRACE( ( _T( "DISIRouter::ReceiveStaticObjId 0x%x 0x%x>" ), aUID ) );
   127 #endif //WITHOUT_WRAPPERS_IN_USE
       
   128                 ASSERT_RESET_ALWAYS( 0, ( EISIRouterNotUniqueUID | EDISIRouterTraceId << KClassIdentifierShift ) );
       
   129 #ifndef WITHOUT_WRAPPERS_IN_USE
       
   130                 }
       
   131 #endif //WITHOUT_WRAPPERS_IN_USE
       
   132             }
       
   133         }
       
   134     return ret;
       
   135     }
       
   136 
       
   137 TUint8 DISIRouter::ReserveStaticObjId( const TInt32 aUID )
       
   138     {
       
   139     C_TRACE( ( _T( "DISIRouter::ReserveStaticObjId 0x%x 0x%x>" ), aUID ) );
    99     for( TUint8 i = 0; i < iStaticObjIdTable.Count(); i++ )
   140     for( TUint8 i = 0; i < iStaticObjIdTable.Count(); i++ )
   100         {
   141         {
   101         if( iStaticObjIdTable[ i ]->iUID == aUID )
   142         if( iStaticObjIdTable[ i ]->iUID == aUID )
   102             {
   143             {
   103             C_TRACE( ( _T( "DISIRouter::ReceiveStaticObjId 0x%x 0x%x 0x%x<" ), aUID, iStaticObjIdTable[i]->iUID, iStaticObjIdTable[i]->iObjId ) );
   144             C_TRACE( ( _T( "DISIRouter::ReserveStaticObjId 0x%x 0x%x 0x%x<" ), aUID, iStaticObjIdTable[i]->iUID, iStaticObjIdTable[i]->iObjId ) );
   104             return iStaticObjIdTable[i]->iObjId;
   145             return iStaticObjIdTable[i]->iObjId;
   105             }
   146             }
   106         }
   147         }
   107     return KNotInitializedId;
   148     return KNotInitializedId;
   108     }
   149     }
   109 
   150 
   110 TUint8 DISIRouter::ReserveNewDynamicObjId()
   151 TUint8 DISIRouter::ReserveNewDynamicObjId()
   111     {
   152     {
   112     // No tracing with mutex
   153     // No tracing with mutex
   113 	  for( TInt i( KFirstAllowedObjId ); i < KMaxAmountOfObjId; i++ )
   154 #ifdef WITHOUT_WRAPPERS_IN_USE    
   114         {
   155     TUint8 firstAllowedObjId = KFirstAllowedObjId;
   115     	  if( !iClientTable[ i ] )
   156 #else
   116     	      {
   157     TUint8 firstAllowedObjId = KLastKernelChannel;
   117     	      TBool reserved( EFalse );
   158 #endif
   118     	      for( TUint8 j = 0; j < iStaticObjIdTable.Count(); j++ )
   159 
   119     	          {
   160     for( TInt i(firstAllowedObjId); i < KMaxAmountOfObjId; i++ )
   120     	          if( j == iStaticObjIdTable[ j ]->iObjId )
   161         {
   121     	              {
   162         if( !iClientTable[ i ] )
   122     	              reserved = ETrue;
   163             {
   123     	              break;
   164             TBool reserved( EFalse );
   124     	              }
   165             for( TUint8 j = 0; j < iStaticObjIdTable.Count(); j++ )
   125     	          }
   166                 {
   126     	      if( !reserved )
   167                 if( j == iStaticObjIdTable[ j ]->iObjId )
   127     	          {
   168                     {
   128     	          return i;
   169                     reserved = ETrue;
   129     	          }
   170                     break;
   130     	      }
   171                     }
   131         }
   172                 }
   132 	  return KNotInitializedId;
   173             if( !reserved )
       
   174                 {
       
   175                 return i;
       
   176                 }
       
   177             }
       
   178         }
       
   179     return KNotInitializedId;
   133     }
   180     }
   134 
   181 
   135 void DISIRouter::Disconnect(
   182 void DISIRouter::Disconnect(
   136         const TUint8 aObjId
   183         const TUint8 aObjId
   137         )
   184         )
   138     {
   185     {
   139     C_TRACE( ( _T( "DISIRouter::Disconnect 0x%x>" ), aObjId ) );
   186     C_TRACE( ( _T( "DISIRouter::Disconnect 0x%x>" ), aObjId ) );
   140     TISIClient* tmp = iClientTable[ aObjId ];
   187     TISIClient* tmp = iClientTable[ aObjId ];
   141     NKern::FMWait( iClientTableFastMutex );
   188     NKern::FMWait( iClientTableFastMutex );
   142  	  iClientTable[ aObjId ] = NULL;
   189     iClientTable[ aObjId ] = NULL;
   143     NKern::FMSignal( iClientTableFastMutex );
   190     NKern::FMSignal( iClientTableFastMutex );
   144     //Must exist
   191     //Must exist
   145     delete tmp;
   192     delete tmp;
       
   193     tmp = NULL;
   146     C_TRACE( ( _T( "DISIRouter::Disconnect 0x%x<" ), aObjId ) );
   194     C_TRACE( ( _T( "DISIRouter::Disconnect 0x%x<" ), aObjId ) );
   147     }
   195     }
   148 
   196 
   149 TDfcQue* DISIRouter::GetDfcThread(
   197 TDfcQue* DISIRouter::GetDfcThread(
   150         const TISIDfcQThreadType aType
   198         const TISIDfcQThreadType aType
   151         )
   199         )
   152     {
   200     {
   153     C_TRACE( ( _T( "DISIRouter::GetDfcThread<>" ) ) );  
   201     C_TRACE( ( _T( "DISIRouter::GetDfcThread<>" ) ) );  
   154     Kern::Printf( "ISIRouter::GetDfcThread" );
   202     return iShClientThreadContainer->AllocateThread( aType );
   155     return iClientThreadContainer->AllocateThread( aType );
       
   156     }
   203     }
   157 
   204 
   158 void DISIRouter::FreeDfcThread( TDfcQue* aThread )
   205 void DISIRouter::FreeDfcThread( TDfcQue* aThread )
   159     {
   206     {
   160     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x>" ), aThread ) );
   207     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x>" ), aThread ) );
   161     Kern::Printf( "ISIRouter::FreeDfcThread" );
   208     iShClientThreadContainer->DeallocateThread( aThread );
   162     iClientThreadContainer->DeallocateThread( aThread );
       
   163     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x<" ), aThread ) );
   209     C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x<" ), aThread ) );
   164     }
   210     }
   165 
   211 
   166 MISIChannelRouterIf* MISIChannelRouterIf::GetIf()
   212 EXPORT_C MISIObjectRouterIf* MISIObjectRouterIf::GetIf()
   167     {
   213     {
   168     C_TRACE( ( _T( "MISIChannelRouterIf::GetIf<>" ) ) );
   214     C_TRACE( ( _T( "MISIObjectRouterIf::GetIf<>" ) ) );
   169     return DISIRouter::GetRouter();
   215     return DISIRouter::GetRouter();
   170     }
   216     }
   171 
   217 
   172 DISIRouter::DISIRouter(
   218 DISIRouter::DISIRouter(
   173         // None
   219         // None
   174         )
   220         )
   175     {
   221     {
   176     C_TRACE( ( _T( "DISIRouter::DISIRouter>" ) ) );
   222     C_TRACE( ( _T( "DISIRouter::DISIRouter>" ) ) );
   177     iClientThreadContainer = new DISIThreadContainer();
   223     iShClientThreadContainer = new DISIThreadContainer();
   178     ASSERT_RESET_ALWAYS( iClientThreadContainer, ( EISIRouterMemAllocFailure1 | EDISIRouterTraceId << KClassIdentifierShift ) );
   224     ASSERT_RESET_ALWAYS( iShClientThreadContainer, ( EISIRouterMemAllocFailure1 | EDISIRouterTraceId << KClassIdentifierShift ) );
   179     iInitThread = iClientThreadContainer->AllocateThread( MISIChannelRouterIf::EISIKernelMainThread );
   225     iInitThread = iShClientThreadContainer->AllocateThread( MISIObjectRouterIf::EISIKernelMainThread );
   180     ASSERT_RESET_ALWAYS( iInitThread, ( EISIRouterNULLThreadPointer | EDISIRouterTraceId << KClassIdentifierShift ) );
   226     ASSERT_RESET_ALWAYS( iInitThread, ( EISIRouterNULLThreadPointer | EDISIRouterTraceId << KClassIdentifierShift ) );
   181     iInitializeDfc = new TDfc( InitializeDfc, this, iInitThread, KDfcPriority );
   227     iInitializeDfc = new TDfc( InitializeDfc, this, iInitThread, KDfcPriority );
   182     ASSERT_RESET_ALWAYS( iInitializeDfc, ( EISIRouterMemAllocFailure2 | EDISIRouterTraceId << KClassIdentifierShift ) );
   228     ASSERT_RESET_ALWAYS( iInitializeDfc, ( EISIRouterMemAllocFailure2 | EDISIRouterTraceId << KClassIdentifierShift ) );
   183     iInitializeDfc->Enque();
   229     iInitializeDfc->Enque();
   184     C_TRACE( ( _T( "DISIRouter::DISIRouter<" ) ) );
   230     C_TRACE( ( _T( "DISIRouter::DISIRouter<" ) ) );
   196 
   242 
   197 void DISIRouter::Initialize(
   243 void DISIRouter::Initialize(
   198         // None
   244         // None
   199         )
   245         )
   200     {
   246     {
   201     C_TRACE( ( _T( "DISIRouter::Initialize>" ) ) );
   247     C_TRACE( ( _T( "DISIRouter::Initialize> this: 0x%x" ), this ) );
   202     
   248     iSelfPtr = this;
   203     iCLTransceiver = new DISICLTransceiver( this );
       
   204     ASSERT_RESET_ALWAYS( iCLTransceiver, ( EISIRouterNULLPtr1 | EDISIRouterTraceId << KClassIdentifierShift ) ); //TODO error codes
       
   205     iClientTableFastMutex = new NFastMutex();
   249     iClientTableFastMutex = new NFastMutex();
   206     ASSERT_RESET_ALWAYS( iClientTableFastMutex, ( EISIRouterNULLPtr2 | EDISIRouterTraceId << KClassIdentifierShift ) );
   250     ASSERT_RESET_ALWAYS( iClientTableFastMutex, ( EISIRouterNULLPtr2 | EDISIRouterTraceId << KClassIdentifierShift ) );
       
   251     for( TInt i( 0 ); i < KMaxAmountOfObjId; i++)
       
   252         {
       
   253         iClientTable[ i ] = NULL;
       
   254         }
       
   255     //  comment improve hex or des
       
   256     //  nameservice, communication manager, routerservice...
       
   257     //                                       UID  ObjId
       
   258     iStaticObjIdTable.Append( new TStaticId( 123, 0x70 ) ); //  for testing ISI API
       
   259     iStaticObjIdTable.Append( new TStaticId( 200, 0x71 ) ); //  for testing ISI API
       
   260     iStaticObjIdTable.Append( new TStaticId( 201, 0x72 ) ); //  for testing ISI API
       
   261     iStaticObjIdTable.Append( new TStaticId( 202, 0x73 ) ); //  for testing ISI API
       
   262     //
       
   263 #ifndef WITHOUT_WRAPPERS_IN_USE
       
   264     // Map all the kernel channels as they used to be
       
   265     for( TInt id( KFirstUserChannel ); id < KLastKernelChannel; id++ )
       
   266         {
       
   267         if ( ( id != KNotInitializedId ) &&
       
   268              ( id != PN_OBJ_EVENT_MULTICAST ) &&
       
   269              ( id != PN_OBJ_EVENT_MULTICAST ) &&
       
   270              ( id != ROUTER_OBJECT_IDENTIFIER ) &&
       
   271              ( id != PIPEHANDLER_OBJECT_IDENTIFIER ) ) 
       
   272             {        
       
   273             iStaticObjIdTable.Append( new TStaticId( id, id ) );
       
   274             }
       
   275         else
       
   276             {
       
   277             iStaticObjIdTable.Append( new TStaticId( id, 0xEE ) );
       
   278             }
       
   279         }
       
   280     // Map all the kernel channels as they used to be
       
   281 #endif // WITHOUT_WRAPPERS_IN_USE
       
   282     // ? vaikutus iShClientThreadContainer->DeallocateThread( iInitThread );
       
   283 
       
   284     iStaticObjIdTable.Append( new TStaticId( 0xD11BADA1, KNotInitializedId ) );// Make sure no one can get KNotInitializedId obj id
       
   285     iStaticObjIdTable.Append( new TStaticId( KCommunicationManagerUID, PN_OBJ_EVENT_MULTICAST ) );
       
   286     iStaticObjIdTable.Append( new TStaticId( KNameServiceUID, PN_OBJ_ROUTING_REQ ) );
       
   287     iStaticObjIdTable.Append( new TStaticId( KIsiShRouterServiceUID, ROUTER_OBJECT_IDENTIFIER ) );
       
   288     iStaticObjIdTable.Append( new TStaticId( KIsiShPipeHandlerUID, PIPEHANDLER_OBJECT_IDENTIFIER ) );
   207     
   289     
   208     for( TInt i( 0 ); i < KMaxAmountOfObjId; i++)
   290     iShCLTransceiver = new DISICLTransceiver( *this, iInitThread );
   209         {
   291     ASSERT_RESET_ALWAYS( iShCLTransceiver, ( EISIRouterNULLPtr1 | EDISIRouterTraceId << KClassIdentifierShift ) ); 
   210         iClientTable[ i ] = NULL;
       
   211         }
       
   212     //                                       UID  ObjId
       
   213     iStaticObjIdTable.Append( new TStaticId( 123, 15 ) ); //NokiaTSY etc...
       
   214     iStaticObjIdTable.Append( new TStaticId( 200, 34 ) );
       
   215     
   292     
   216     iSelfPtr = this;
       
   217     iClientThreadContainer->DeallocateThread( iInitThread );
       
   218     C_TRACE( ( _T( "DISIRouter::Initialize<" ) ) );
   293     C_TRACE( ( _T( "DISIRouter::Initialize<" ) ) );
   219     }
   294     }
   220 
   295 
   221 DISIRouter::~DISIRouter(
   296 DISIRouter::~DISIRouter(
   222         // None
   297         // None
   236             {
   311             {
   237             delete iClientTable[ i ];
   312             delete iClientTable[ i ];
   238             iClientTable[ i ] = NULL;
   313             iClientTable[ i ] = NULL;
   239             }
   314             }
   240         }
   315         }
   241     // All must exist
   316     // All must exist otherways reseted.
   242     iInitializeDfc->Cancel();
       
   243     delete iInitializeDfc;
   317     delete iInitializeDfc;
   244     iInitializeDfc = NULL;
   318     iInitializeDfc = NULL;
   245     delete iClientThreadContainer;
   319     delete iShClientThreadContainer;
   246     iClientThreadContainer = NULL;
   320     iShClientThreadContainer = NULL;
   247     delete iCLTransceiver;
   321     delete iShCLTransceiver;
   248     iCLTransceiver = NULL;
   322     iShCLTransceiver = NULL;
   249     delete iClientTableFastMutex;
   323     delete iClientTableFastMutex;
   250     iClientTableFastMutex = NULL;
   324     iClientTableFastMutex = NULL;
   251     C_TRACE( ( _T( "DISIRouter::~DISIRouter<" ) ) );
   325     C_TRACE( ( _T( "DISIRouter::~DISIRouter<" ) ) );
   252     }
   326     }
   253 
   327 
   255         TDes8& aMessage,
   329         TDes8& aMessage,
   256         const TUint8 aObjId
   330         const TUint8 aObjId
   257         )
   331         )
   258     {
   332     {
   259     C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x>" ), &aMessage, aObjId ) );
   333     C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x>" ), &aMessage, aObjId ) );
   260     Kern::Printf( "ISIRouter::Send" );
   334 
   261 
   335     if( ( ( aObjId == EIscNokiaUsbPhonetLink ) && ( GET_SENDER_DEV( aMessage.Ptr() ) == PN_DEV_PC ) ) ||
   262     if( ( aObjId != PN_OBJ_ROUTING_REQ ) 
   336         ( aObjId == PN_OBJ_ROUTING_REQ ) || 
   263      && ( aObjId != PN_OBJ_EVENT_MULTICAST ) )
   337         ( aObjId == PN_OBJ_EVENT_MULTICAST ) ||
   264         {
   338         ( aObjId == ROUTER_OBJECT_IDENTIFIER ) ||
   265         TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );
   339         ( aObjId == PIPEHANDLER_OBJECT_IDENTIFIER ) ) 
       
   340         {
       
   341         // No need to update sender dev and obj id
       
   342         C_TRACE( ( _T( "DISIRouter::Send message tx address not needed to updata 0x%x 0x%x>" ), aObjId, GET_SENDER_DEV( aMessage.Ptr() ) ) );
       
   343         }
       
   344     else
       
   345         {
       
   346         TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );        
   266         SET_SENDER_DEV( messageBlockPtr, PN_DEV_OWN );
   347         SET_SENDER_DEV( messageBlockPtr, PN_DEV_OWN );
   267         SET_SENDER_OBJ( messageBlockPtr, aObjId );
   348         SET_SENDER_OBJ( messageBlockPtr, aObjId );
   268         }
   349         }
   269     TInt error = iCLTransceiver->RouteISIMessage( aMessage );
   350     TInt error = iShCLTransceiver->RouteISIMessage( aMessage );
   270     C_TRACE( ( _T( "DISIRouter::Send 0x%x %d 0x%x<" ), &aMessage, aObjId ) );
   351     C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x<" ), &aMessage, aObjId ) );
   271     return error;
   352     return error;
   272     }
   353     }
   273 
   354 
   274 TBool DISIRouter::Receive( TDes8& aMessage, const TUint8 aObjId )
   355 TBool DISIRouter::Receive( TDes8& aMessage, const TUint8 aObjId )
   275     {
   356     {
   276     C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x>" ), &aMessage, aObjId ) );
   357     C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x>" ), &aMessage, aObjId ) );
   277     TBool error( EFalse );
   358     TBool error( EFalse );
   278     TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); 
   359     TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); 
   279     switch( GET_RECEIVER_OBJ( aMessage ) )
   360 
   280         {
   361     NKern::FMWait( iClientTableFastMutex );
   281         case PN_OBJ_ROUTING_REQ:
   362     if( iClientTable[ aObjId ] )
   282             {
   363         {
   283             C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_ROUTING_REQ: nameservice" ) ) );
   364         NKern::FMSignal( iClientTableFastMutex );
   284             //route with resource and nameservice
   365         ( iClientTable[ aObjId ]->iChannel )->Receive( aMessage ); //may not be safe, consider receive/delete sync
   285             iNameService->Receive( aMessage );
   366         C_TRACE( ( _T( "DISIRouter::Receive ok 0x%x 0x%x" ), &aMessage, aObjId ) );
   286             C_TRACE( ( _T( "DRouter::HandleIsiMessage to NAMESERVICE<" ) ) );
   367         error = ETrue;
   287             error = ETrue;
   368         }
   288             break;
   369     else
   289             }
   370         {
   290         case PN_OBJ_EVENT_MULTICAST:
   371         NKern::FMSignal( iClientTableFastMutex );
   291             {
   372         C_TRACE( ( _T( "DISIRouter::Receive failed 0x%x 0x%x" ), &aMessage, aObjId ) );
   292             C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_EVENT_MULTICAST: communication manager" ) ) );
   373         error = EFalse;
   293             iCommunicationManager->Receive( aMessage );
   374         }
   294             C_TRACE( ( _T( "DRouter::HandleIsiMessage to Communication Manager<" ) ) );
   375 
   295             error = ETrue;
   376     C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x %d<" ), &aMessage, aObjId, error ) );
   296             break;
   377     return error;
   297             }           
       
   298         default:
       
   299             {   //default regular channel
       
   300              NKern::FMWait( iClientTableFastMutex );
       
   301              if( iClientTable[ aObjId ] )
       
   302                 {
       
   303                 NKern::FMSignal( iClientTableFastMutex );
       
   304                 ( iClientTable[ aObjId ]->iChannel )->ReceiveMsg( aMessage ); //may not be safe, consider receive/delete sync
       
   305                 C_TRACE( ( _T( "DISIRouter::Receive ok 0x%x 0x%x>" ), &aMessage, aObjId ) );
       
   306                 error = ETrue;
       
   307 	              }
       
   308 	          else
       
   309 	              {
       
   310                 NKern::FMSignal( iClientTableFastMutex );
       
   311                 C_TRACE( ( _T( "DISIRouter::Receive failed 0x%x 0x%x<" ), &aMessage, aObjId ) );
       
   312                 error = EFalse;
       
   313                 }
       
   314             break;    
       
   315             }
       
   316          }   
       
   317      return error;
       
   318 
   378 
   319     }
   379     }
   320 
   380 
   321 DECLARE_STANDARD_EXTENSION()
   381 DECLARE_STANDARD_EXTENSION()
   322     {
   382     {
   323     Kern::Printf( "ISI Router extension>" );
   383     Kern::Printf( "ISI Router kext>" );
   324     // Create a container extension
   384     // Create a container extension
   325     DISIRouter* extension = new DISIRouter();
   385     DISIRouter* extension = new DISIRouter();
   326     TRACE_ASSERT( extension );
   386     TRACE_ASSERT( extension );
   327     Kern::Printf( "ISI Router extension<" );
   387     Kern::Printf( "ISI Router kext 0x%x<", extension );
   328     return extension ? KErrNone : KErrNoMemory;
   388     return extension ? KErrNone : KErrNoMemory;
   329     }
   389     }
   330 
   390 
   331 DECLARE_EXTENSION_LDD()
   391 DECLARE_EXTENSION_LDD()
   332     {
   392     {
   333     Kern::Printf( "ISI Router ldd>" );
   393     Kern::Printf( "ISI Router kextldd>" );
   334     DLogicalDevice* device = new DISIDevice;
   394     DLogicalDevice* device = new DISIDevice;
   335     TRACE_ASSERT( device );
   395     TRACE_ASSERT( device );
   336     Kern::Printf( "ISI Router ldd 0x%x<", device );
   396     Kern::Printf( "ISI Router kextldd 0x%x<", device );
   337     return( device );
   397     return device;
   338     }
   398     }
   339 
       
   340 //From objectapi
       
   341 EXPORT_C MISIObjectRouterIf* MISIObjectRouterIf::Connect( const TInt32 aUID, TUint8& aObjId, MISIRouterObjectIf* aCallback )
       
   342     {
       
   343     C_TRACE( ( _T( "MISIObjectRouterIf::Connect %d 0x%x 0x%x>" ), aUID, aObjId, aCallback ) );
       
   344     
       
   345     Kern::Printf( "ISIRouter::Connect" );
       
   346     if( aUID == KNameServiceUID )
       
   347         {
       
   348         C_TRACE( ( _T( "MISIObjectRouterIf was nameservice" ) ) );
       
   349         DISIRouter::iSelfPtr->iNameService = aCallback;
       
   350         aObjId = PN_OBJ_ROUTING_REQ; // 0x00
       
   351         }
       
   352     else if( aUID == KCommunicationManagerUID )
       
   353         {
       
   354         C_TRACE( ( _T( "MISIObjectRouterIf was communicationmanager" ) ) );
       
   355         DISIRouter::iSelfPtr->iCommunicationManager = aCallback;
       
   356         aObjId = PN_OBJ_EVENT_MULTICAST; // 0x20
       
   357         }
       
   358     else
       
   359         {
       
   360         C_TRACE( ( _T( "MISIObjectRouterIf unknown object api client" ) ) );
       
   361         }
       
   362     MISIObjectRouterIf* tmp =  DISIRouter::iSelfPtr;
       
   363     C_TRACE( ( _T( "MISIObjectRouterIf::Connect %d 0x%x 0x%x<" ), aUID, aObjId, aCallback ) );
       
   364     return tmp;
       
   365     }
       
   366