22 #include "isidevice.h" // For DLogicalDevice |
22 #include "isidevice.h" // For DLogicalDevice |
23 #include "isihelpers.h" // For SET_SENDER_DEV... |
23 #include "isihelpers.h" // For SET_SENDER_DEV... |
24 #include "misirouterchannelif.h" // For MISIRouterChannelIf |
24 #include "misirouterchannelif.h" // For MISIRouterChannelIf |
25 #include "isithreadcontainer.h" // For DISIThreadContainer |
25 #include "isithreadcontainer.h" // For DISIThreadContainer |
26 #include "isicltransceiver.h" // For DISICLTransceiver |
26 #include "isicltransceiver.h" // For DISICLTransceiver |
27 |
27 #include "misirouterobjectif.h" |
28 #define PN_DEV_APE 0x14 //TODO take from real location in future |
28 |
|
29 #define PN_DEV_OWN 0x6C //TODO take from real location in future |
|
30 |
|
31 const TInt KDfcPriority( 5 ); |
|
32 const TUint32 KCommunicationManagerUID( 0x2002B3D0 ); |
|
33 const TUint32 KNameServiceUID( 0x2002A5A1 ); |
29 |
34 |
30 DISIRouter* DISIRouter::iSelfPtr = NULL; |
35 DISIRouter* DISIRouter::iSelfPtr = NULL; |
31 |
36 |
32 // Faults |
37 // Faults |
33 enum TISIRouterFaults |
38 enum TISIRouterFaults |
144 TDfcQue* DISIRouter::GetDfcThread( |
149 TDfcQue* DISIRouter::GetDfcThread( |
145 const TISIDfcQThreadType aType |
150 const TISIDfcQThreadType aType |
146 ) |
151 ) |
147 { |
152 { |
148 C_TRACE( ( _T( "DISIRouter::GetDfcThread<>" ) ) ); |
153 C_TRACE( ( _T( "DISIRouter::GetDfcThread<>" ) ) ); |
|
154 Kern::Printf( "ISIRouter::GetDfcThread" ); |
149 return iClientThreadContainer->AllocateThread( aType ); |
155 return iClientThreadContainer->AllocateThread( aType ); |
150 } |
156 } |
151 |
157 |
152 void DISIRouter::FreeDfcThread( TDfcQue* aThread ) |
158 void DISIRouter::FreeDfcThread( TDfcQue* aThread ) |
153 { |
159 { |
154 C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x>" ), aThread ) ); |
160 C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x>" ), aThread ) ); |
|
161 Kern::Printf( "ISIRouter::FreeDfcThread" ); |
155 iClientThreadContainer->DeallocateThread( aThread ); |
162 iClientThreadContainer->DeallocateThread( aThread ); |
156 C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x<" ), aThread ) ); |
163 C_TRACE( ( _T( "DISIRouter::FreeDfcThread 0x%x<" ), aThread ) ); |
157 } |
164 } |
158 |
165 |
159 MISIChannelRouterIf* MISIChannelRouterIf::GetIf() |
166 MISIChannelRouterIf* MISIChannelRouterIf::GetIf() |
248 TDes8& aMessage, |
255 TDes8& aMessage, |
249 const TUint8 aObjId |
256 const TUint8 aObjId |
250 ) |
257 ) |
251 { |
258 { |
252 C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x>" ), &aMessage, aObjId ) ); |
259 C_TRACE( ( _T( "DISIRouter::Send 0x%x 0x%x>" ), &aMessage, aObjId ) ); |
253 TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); |
260 Kern::Printf( "ISIRouter::Send" ); |
254 SET_SENDER_DEV( messageBlockPtr, PN_DEV_APE ); |
261 |
255 SET_SENDER_OBJ( messageBlockPtr, aObjId ); |
262 if( ( aObjId != PN_OBJ_ROUTING_REQ ) |
256 iCLTransceiver->RouteISIMessage( aMessage ); |
263 && ( aObjId != PN_OBJ_EVENT_MULTICAST ) ) |
|
264 { |
|
265 TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); |
|
266 SET_SENDER_DEV( messageBlockPtr, PN_DEV_OWN ); |
|
267 SET_SENDER_OBJ( messageBlockPtr, aObjId ); |
|
268 } |
|
269 TInt error = iCLTransceiver->RouteISIMessage( aMessage ); |
257 C_TRACE( ( _T( "DISIRouter::Send 0x%x %d 0x%x<" ), &aMessage, aObjId ) ); |
270 C_TRACE( ( _T( "DISIRouter::Send 0x%x %d 0x%x<" ), &aMessage, aObjId ) ); |
258 return KErrNone; |
271 return error; |
259 } |
272 } |
260 |
273 |
261 TBool DISIRouter::Receive( TDes8& aMessage, const TUint8 aObjId ) |
274 TBool DISIRouter::Receive( TDes8& aMessage, const TUint8 aObjId ) |
262 { |
275 { |
263 C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x>" ), &aMessage, aObjId ) ); |
276 C_TRACE( ( _T( "DISIRouter::Receive 0x%x 0x%x>" ), &aMessage, aObjId ) ); |
264 NKern::FMWait( iClientTableFastMutex ); |
277 TBool error( EFalse ); |
265 if( iClientTable[ aObjId ] ) |
278 TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) ); |
266 { |
279 switch( GET_RECEIVER_OBJ( aMessage ) ) |
267 NKern::FMSignal( iClientTableFastMutex ); |
280 { |
268 ( iClientTable[ aObjId ]->iChannel )->ReceiveMsg( aMessage ); //may not be safe, consider receive/delete sync |
281 case PN_OBJ_ROUTING_REQ: |
269 C_TRACE( ( _T( "DISIRouter::Receive ok 0x%x 0x%x>" ), &aMessage, aObjId ) ); |
282 { |
270 return ETrue; |
283 C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_ROUTING_REQ: nameservice" ) ) ); |
271 } |
284 //route with resource and nameservice |
272 NKern::FMSignal( iClientTableFastMutex ); |
285 iNameService->Receive( aMessage ); |
273 C_TRACE( ( _T( "DISIRouter::Receive failed 0x%x 0x%x<" ), &aMessage, aObjId ) ); |
286 C_TRACE( ( _T( "DRouter::HandleIsiMessage to NAMESERVICE<" ) ) ); |
274 return EFalse; |
287 error = ETrue; |
|
288 break; |
|
289 } |
|
290 case PN_OBJ_EVENT_MULTICAST: |
|
291 { |
|
292 C_TRACE( ( _T( "DISIRouter msg to PN_OBJ_EVENT_MULTICAST: communication manager" ) ) ); |
|
293 iCommunicationManager->Receive( aMessage ); |
|
294 C_TRACE( ( _T( "DRouter::HandleIsiMessage to Communication Manager<" ) ) ); |
|
295 error = ETrue; |
|
296 break; |
|
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 |
275 } |
319 } |
276 |
320 |
277 DECLARE_STANDARD_EXTENSION() |
321 DECLARE_STANDARD_EXTENSION() |
278 { |
322 { |
279 Kern::Printf( "ISI Router extension>" ); |
323 Kern::Printf( "ISI Router extension>" ); |
291 TRACE_ASSERT( device ); |
335 TRACE_ASSERT( device ); |
292 Kern::Printf( "ISI Router ldd 0x%x<", device ); |
336 Kern::Printf( "ISI Router ldd 0x%x<", device ); |
293 return( device ); |
337 return( device ); |
294 } |
338 } |
295 |
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 |