connectivitylayer/isce/isinameservice_dll/src/isinameservice.cpp
changeset 7 fa67e03b87df
parent 5 8ccc39f9d787
child 8 6295dc2169f3
equal deleted inserted replaced
6:942573423a60 7:fa67e03b87df
    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