22 #include "isinameservicetrace.h" // For C_TRACE, ASSERT_RESET.. and fault codes |
22 #include "isinameservicetrace.h" // For C_TRACE, ASSERT_RESET.. and fault codes |
23 #include "memapi.h" // For MemApi |
23 #include "memapi.h" // For MemApi |
24 #include <phonetisi.h> // For ISI_HEADER_SIZE |
24 #include <phonetisi.h> // For ISI_HEADER_SIZE |
25 #include <pn_const.h> // For PN_NAMESERVICE |
25 #include <pn_const.h> // For PN_NAMESERVICE |
26 #include <nsisi.h> // For PN |
26 #include <nsisi.h> // For PN |
27 #include "misiobjectrouterif.h" // For MISIObjectRouterIf |
27 |
|
28 #ifdef INTERNAL_FLAG_ISI_ROUTER_IN_USE |
|
29 #include "isihelpers.h" // For SET_RECEIVER_OBJ... |
|
30 #else |
28 #include "iadhelpers.h" // For SET_RECEIVER_OBJ... |
31 #include "iadhelpers.h" // For SET_RECEIVER_OBJ... |
|
32 #endif |
29 #include "namerecords.h" // For DNameRecords |
33 #include "namerecords.h" // For DNameRecords |
30 #include <iscnokiadefinitions.h> // For THIS_DEVICE |
34 #include <iscnokiadefinitions.h> // For THIS_DEVICE |
31 #include <commisi.h> // For SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP |
35 #include <commisi.h> // For SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP |
32 // Faults |
36 // Faults |
33 enum TISINameServiceFaults |
37 enum TISINameServiceFaults |
94 |
98 |
95 |
99 |
96 const TUint32 KNameServiceUID( 0x2002A5A1 ); |
100 const TUint32 KNameServiceUID( 0x2002A5A1 ); |
97 const TUint8 KFiller( 0 ); |
101 const TUint8 KFiller( 0 ); |
98 |
102 |
|
103 DISINameService* DISINameService::iThisptr = NULL; |
99 DMutex* DISINameService::iNameServiceMutex = NULL; |
104 DMutex* DISINameService::iNameServiceMutex = NULL; |
100 _LIT8( KNameServiceMutex, "KNameServiceMutex" ); |
105 _LIT8( KNameServiceMutex, "KNameServiceMutex" ); |
101 |
106 |
102 |
107 |
103 DISINameService::DISINameService( |
108 DISINameService::DISINameService( |
175 } |
180 } |
176 } |
181 } |
177 Kern::MutexSignal( *iNameServiceMutex ); |
182 Kern::MutexSignal( *iNameServiceMutex ); |
178 C_TRACE( ( _T( "DISINameService::DISINameService<" ) ) ); |
183 C_TRACE( ( _T( "DISINameService::DISINameService<" ) ) ); |
179 } |
184 } |
180 |
|
181 void DISINameService::HandleNameQueryResp( const TDesC8& aMessage, const TUint8* msgPtr ) |
185 void DISINameService::HandleNameQueryResp( const TDesC8& aMessage, const TUint8* msgPtr ) |
182 { |
186 { |
183 C_TRACE( ( _T( "DISINameService::HandleNameQueryResp>" ) ) ); |
187 C_TRACE( ( _T( "DISINameService::HandleNameQueryResp>" ) ) ); |
184 TUint32 name = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_QUERY_REQ_OFFSET_NAME ] ); |
188 TUint32 name = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_QUERY_REQ_OFFSET_NAME ] ); |
185 TUint32 mask = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_QUERY_REQ_OFFSET_BITMASK ] ); |
189 TUint32 mask = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_QUERY_REQ_OFFSET_BITMASK ] ); |
186 |
|
187 RArray <TNameTable*> nameTable; |
190 RArray <TNameTable*> nameTable; |
188 TInt32 count = iNameRecords->NameQuery( name, mask, &nameTable ); |
191 TInt32 count = iNameRecords->NameQuery( name, mask, &nameTable ); |
189 |
|
190 TUint16 msgLength = ( SIZE_PNS_NAME_QUERY_RESP + ( count * SIZE_PN_NAME_SRV_ITEM_STR ) ); |
192 TUint16 msgLength = ( SIZE_PNS_NAME_QUERY_RESP + ( count * SIZE_PN_NAME_SRV_ITEM_STR ) ); |
191 TDes8& respMsg = MemApi::AllocBlock( msgLength ); |
193 TDes8& respMsg = MemApi::AllocBlock( msgLength ); |
192 respMsg.SetLength( msgLength ); |
194 respMsg.SetLength( msgLength ); |
193 TUint8* respPtr = const_cast<TUint8*>( respMsg.Ptr() ); |
195 TUint8* respPtr = const_cast<TUint8*>( respMsg.Ptr() ); |
194 |
196 |
310 switch( msgPtr[ ISI_HEADER_OFFSET_MESSAGEID ] ) |
312 switch( msgPtr[ ISI_HEADER_OFFSET_MESSAGEID ] ) |
311 { |
313 { |
312 case PNS_NAME_QUERY_REQ: |
314 case PNS_NAME_QUERY_REQ: |
313 { |
315 { |
314 C_TRACE( ( _T( "DISINameService PNS_NAME_QUERY_REQ>" ) ) ); |
316 C_TRACE( ( _T( "DISINameService PNS_NAME_QUERY_REQ>" ) ) ); |
315 // if( msgPtr[ ISI_HEADER_OFFSET_SENDERDEVICE ] == THIS_DEVICE ) |
317 HandleNameQueryResp( aMessage, msgPtr ); |
316 // { |
|
317 C_TRACE( ( _T( "DISINameService PNS_NAME_QUERY_RESP>" ) ) ); |
|
318 HandleNameQueryResp( aMessage, msgPtr ); |
|
319 // } |
|
320 // else |
|
321 // { |
|
322 // C_TRACE( ( _T( "DISINameService::HandlePNSNameMessage PNS_NAME_QUERY_REQ from other device, ignore" ) ) ); |
|
323 // } |
|
324 C_TRACE( ( _T( "DISINameService PNS_NAME_QUERY_REQ<" ) ) ); |
318 C_TRACE( ( _T( "DISINameService PNS_NAME_QUERY_REQ<" ) ) ); |
325 break; |
319 break; |
326 } |
320 } |
327 case PNS_NAME_ADD_REQ: |
321 case PNS_NAME_ADD_REQ: |
328 { |
322 { |
349 TUint32 name = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY ] ); |
343 TUint32 name = GETB32( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY ] ); |
350 TUint16 phonetAddr = GETB16( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY + PN_NAME_SRV_ITEM_STR_OFFSET_DEV ] ); |
344 TUint16 phonetAddr = GETB16( &msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY + PN_NAME_SRV_ITEM_STR_OFFSET_DEV ] ); |
351 TUint8 flags = msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY + PN_NAME_SRV_ITEM_STR_OFFSET_FLAGS ]; |
345 TUint8 flags = msgPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_REQ_OFFSET_NAMEENTRY + PN_NAME_SRV_ITEM_STR_OFFSET_FLAGS ]; |
352 err = iNameRecords->AddName( name, phonetAddr, flags ); |
346 err = iNameRecords->AddName( name, phonetAddr, flags ); |
353 respPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ] = err; |
347 respPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ] = err; |
354 for( TInt i( 0 ); i < respMsg.Length(); i++ ) |
|
355 { |
|
356 C_TRACE( ( _T( "PNS_NAME_ADD_RESP index[ %d ] data 0x%x"), i, respMsg.Ptr()[i] ) ); |
|
357 } |
|
358 iRouter->Send( respMsg, iObjId ); |
348 iRouter->Send( respMsg, iObjId ); |
359 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_RESP from this device<" ) ) ); |
349 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_RESP from this device<" ) ) ); |
360 if( err == PN_NAME_OK ) |
350 if( err == PN_NAME_OK ) |
361 { |
351 { |
362 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_IND>" ) ) ); |
352 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_IND>" ) ) ); |
363 RArray <TNameTable*>* nameTable = NULL; |
353 msgLength = ( SIZE_PNS_NAME_ADD_IND + ( SIZE_PN_NAME_SRV_ITEM_STR ) ); |
364 nameTable = iNameRecords->GetNameTable(); |
|
365 msgLength = ( SIZE_PNS_NAME_ADD_IND + ( SIZE_PN_NAME_SRV_ITEM_STR * nameTable->Count() ) ); |
|
366 TDes8& indMsg = MemApi::AllocBlock( msgLength ); |
354 TDes8& indMsg = MemApi::AllocBlock( msgLength ); |
367 indMsg.SetLength( msgLength ); |
355 indMsg.SetLength( msgLength ); |
368 TUint8* indPtr = const_cast<TUint8*>( indMsg.Ptr() ); |
356 TUint8* indPtr = const_cast<TUint8*>( indMsg.Ptr() ); |
369 indPtr[ ISI_HEADER_OFFSET_MEDIA ] = PN_MEDIA_ROUTING_REQ; |
357 indPtr[ ISI_HEADER_OFFSET_MEDIA ] = PN_MEDIA_ROUTING_REQ; |
370 SET_RECEIVER_DEV( indPtr, msgPtr[ ISI_HEADER_OFFSET_SENDERDEVICE ] ); |
358 SET_RECEIVER_DEV( indPtr, msgPtr[ ISI_HEADER_OFFSET_SENDERDEVICE ] ); |
383 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_RESERVED2 ] = KFiller; |
371 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_RESERVED2 ] = KFiller; |
384 PUTB32( &indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_NAME ], name ); |
372 PUTB32( &indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_NAME ], name ); |
385 PUTB16( &indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_DEV ], phonetAddr ); |
373 PUTB16( &indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_DEV ], phonetAddr ); |
386 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_FLAGS ] = flags; |
374 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_FLAGS ] = flags; |
387 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_RESERVED ] = KFiller; |
375 indPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_IND_OFFSET_NAMEENTRYTBL + PN_NAME_SRV_ITEM_STR_OFFSET_RESERVED ] = KFiller; |
388 for( TInt i( 0 ); i < indMsg.Length(); i++ ) |
|
389 { |
|
390 C_TRACE( ( _T( "PNS_NAME_ADD_IND index[ %d ] data 0x%x"), i, indMsg.Ptr()[i] ) ); |
|
391 } |
|
392 iRouter->Send( indMsg, iObjId ); |
376 iRouter->Send( indMsg, iObjId ); |
393 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_IND<" ) ) ); |
377 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_IND<" ) ) ); |
394 } |
378 } |
395 } |
379 } |
396 else |
380 else |
397 { |
381 { |
398 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_REQ from other device>" ) ) ); |
382 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_REQ from other device>" ) ) ); |
399 respPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ] = PN_NAME_NOT_ALLOWED; |
383 respPtr[ ISI_HEADER_SIZE + PNS_NAME_ADD_RESP_OFFSET_REASON ] = PN_NAME_NOT_ALLOWED; |
400 for( TInt i( 0 ); i < respMsg.Length(); i++ ) |
|
401 { |
|
402 C_TRACE( ( _T( "PNS_NAME_ADD_RESP index[ %d ] data 0x%x"), i, respMsg.Ptr()[i] ) ); |
|
403 } |
|
404 iRouter->Send( respMsg, iObjId ); |
384 iRouter->Send( respMsg, iObjId ); |
405 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_RESP from other device<" ) ) ); |
385 C_TRACE( ( _T( "DISINameService PNS_NAME_ADD_RESP from other device<" ) ) ); |
406 } |
386 } |
407 TDes8* block = reinterpret_cast<TDes8*>( const_cast<TDesC8*>(&aMessage) ); |
387 TDes8* block = reinterpret_cast<TDes8*>( const_cast<TDesC8*>(&aMessage) ); |
408 MemApi::DeallocBlock( *block ); |
388 MemApi::DeallocBlock( *block ); |
424 } |
404 } |
425 C_TRACE( ( _T( "DISINameService::HandlePNSNameMessage<" ) ) ); |
405 C_TRACE( ( _T( "DISINameService::HandlePNSNameMessage<" ) ) ); |
426 } |
406 } |
427 |
407 |
428 |
408 |
429 EXPORT_C TBool DISINameService::IsValidResource( |
409 EXPORT_C TBool MISICommunicationManagerIf::IsValidResource( |
430 const TDesC8& aMessage |
410 const TDesC8& aMessage |
431 ) |
411 ) |
432 { |
412 { |
433 TInt err( Kern::MutexWait( *iNameServiceMutex ) ); |
413 C_TRACE( ( _T( "DISINameService::IsValidResource 0x%x>" ), &aMessage ) ); |
|
414 TInt err( Kern::MutexWait( *DISINameService::iThisptr->iNameServiceMutex ) ); |
434 ASSERT_RESET_ALWAYS( ( KErrNone == err ), ( EISINameServiceMutexWaitFailed | EDISINameServiceTraceId << KClassIdentifierShift ) ); |
415 ASSERT_RESET_ALWAYS( ( KErrNone == err ), ( EISINameServiceMutexWaitFailed | EDISINameServiceTraceId << KClassIdentifierShift ) ); |
435 C_TRACE( ( _T( "DISINameService::IsValidResource 0x%x>" ), &aMessage ) ); |
416 TUint8* msgPtr = const_cast<TUint8*>( aMessage.Ptr() ); |
436 C_TRACE( ( _T( "DISINameService::IsValidResource 0x%x<" ), &aMessage ) ); |
417 TUint16 phonetAddress( 0 ); |
437 Kern::MutexSignal( *iNameServiceMutex ); |
418 DISINameService::iThisptr->iNameRecords->LookupPhonetAddress( msgPtr[ ISI_HEADER_OFFSET_RESOURCEID ], &phonetAddress ); |
438 return ETrue; |
419 Kern::MutexSignal( *DISINameService::iThisptr->iNameServiceMutex ); |
|
420 if( phonetAddress == GET_SENDER_OBJ( aMessage ) ) |
|
421 { |
|
422 C_TRACE( ( _T( "DISINameService::IsValidResource phonetAddress found 0x%x" ), phonetAddress ) ); |
|
423 return ETrue; |
|
424 } |
|
425 else |
|
426 { |
|
427 C_TRACE( ( _T( "DISINameService::IsValidResource phonetAddress not found 0x%x" ), phonetAddress ) ); |
|
428 return EFalse; |
|
429 } |
439 } |
430 } |
440 |
431 |
441 |
432 |
442 DECLARE_STANDARD_EXTENSION() |
433 DECLARE_STANDARD_EXTENSION() |
443 { |
434 { |
444 Kern::Printf( "ISI Name Service extension>" ); |
435 Kern::Printf( "ISI Name Service extension>" ); |
445 // Create a container extension |
436 // Create a container extension |
446 DISINameService* extension = new DISINameService(); |
437 DISINameService* extension = new DISINameService(); |
447 TRACE_ASSERT( extension ); |
438 TRACE_ASSERT( extension ); |
|
439 DISINameService::iThisptr = static_cast< DISINameService* >( extension ); |
448 Kern::Printf( "ISI Name Service extension<" ); |
440 Kern::Printf( "ISI Name Service extension<" ); |
449 return extension ? KErrNone : KErrNoMemory; |
441 return extension ? KErrNone : KErrNoMemory; |
450 } |
442 } |
451 |
443 |
452 void DISINameService::BuildAndSendCommIsaEntityNotReachableResp( |
444 void DISINameService::BuildAndSendCommIsaEntityNotReachableResp( |
492 //send data to router for handling |
484 //send data to router for handling |
493 iRouter->Send( tempPtr, iObjId); |
485 iRouter->Send( tempPtr, iObjId); |
494 |
486 |
495 TDes8* block = reinterpret_cast<TDes8*>( const_cast<TDesC8*>(&aMsg) ); |
487 TDes8* block = reinterpret_cast<TDes8*>( const_cast<TDesC8*>(&aMsg) ); |
496 MemApi::DeallocBlock( *block ); |
488 MemApi::DeallocBlock( *block ); |
497 |
|
498 C_TRACE( ( _T( "DISINameService::SendCommIsaEntityNotReachableResp 0x%x <-" ), &aMsg ) ); |
489 C_TRACE( ( _T( "DISINameService::SendCommIsaEntityNotReachableResp 0x%x <-" ), &aMsg ) ); |
499 } |
490 } |
500 |
491 |
501 |
492 |