connectivitylayer/isce/isirouter_dll/src/isicltransceiver.cpp
changeset 5 8ccc39f9d787
parent 0 63b37f68c1ce
child 7 fa67e03b87df
equal deleted inserted replaced
4:510c70acdbf6 5:8ccc39f9d787
     8 *
     8 *
     9 * Initial Contributors:
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
    13 * 
    13 *
    14 * Description: 
    14 * Description:
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 
    19 
    73             }
    73             }
    74         }
    74         }
    75     delete []iLinksArray;
    75     delete []iLinksArray;
    76     C_TRACE( ( _T( "DISICLTransceiver::~DISICLTransceiver<" ) ) );
    76     C_TRACE( ( _T( "DISICLTransceiver::~DISICLTransceiver<" ) ) );
    77     }
    77     }
    78     
    78 
    79 void DISICLTransceiver::SendCommIsaEntityNotReachableResp( TDes8& aMessage )
    79 TInt DISICLTransceiver::SendCommIsaEntityNotReachableResp( TDes8& aMessage )
    80     {
    80     {
    81     C_TRACE( ( _T( "DISICLTransceiver::SendCommIsaEntityNotReachableResp 0x%x>" ), &aMessage ) );
    81     C_TRACE( ( _T( "DISICLTransceiver::SendCommIsaEntityNotReachableResp 0x%x>" ), &aMessage ) );
    82     const TUint8* msgTmpPtr( aMessage.Ptr() );
    82     const TUint8* msgTmpPtr( aMessage.Ptr() );
       
    83     TInt error = KErrAlreadyExists;
       
    84 
    83     // To avoid COMM_ISA_ENTITY_NOT_REACHABLE_RESP loop
    85     // To avoid COMM_ISA_ENTITY_NOT_REACHABLE_RESP loop
    84     if( msgTmpPtr[ ISI_HEADER_OFFSET_MESSAGEID ] != COMMON_MESSAGE &&
    86     if( msgTmpPtr[ ISI_HEADER_OFFSET_MESSAGEID ] != COMMON_MESSAGE &&
    85         msgTmpPtr[ ISI_HEADER_OFFSET_SUBMESSAGEID ] != COMM_ISA_ENTITY_NOT_REACHABLE_RESP )
    87         msgTmpPtr[ ISI_HEADER_OFFSET_SUBMESSAGEID ] != COMM_ISA_ENTITY_NOT_REACHABLE_RESP )
    86         {
    88         {
    87         // Make channel opening request followinfg COMM specification: 000.026
    89         // Make channel opening request followinfg COMM specification: 000.026
    88         // Length is sixteen bytes.
    90         // Length is sixteen bytes.
    89 		    TUint8 length( 16 );
    91 		    TUint8 length( 16 );
    90 		    TDes8& tempPtr = MemApi::AllocBlock( ISI_HEADER_SIZE + SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP );
    92 		    TDes8& tempPtr = MemApi::AllocBlock( ISI_HEADER_SIZE + SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP );
    91 		    ASSERT_RESET_ALWAYS( &tempPtr, ( EISICLTransceiverMemAllocFailure1 | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
    93 		    ASSERT_RESET_ALWAYS( &tempPtr, ( EISICLTransceiverMemAllocFailure1 | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
    92   	    ASSERT_RESET_ALWAYS( ISI_HEADER_SIZE + SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP > ISI_HEADER_OFFSET_MESSAGEID, ( EISICLTransceiverOverTheLimits | EDISICLTransceiverTraceId << KClassIdentifierShift ) );    
    94   	    ASSERT_RESET_ALWAYS( ISI_HEADER_SIZE + SIZE_COMMON_MESSAGE_COMM_ISA_ENTITY_NOT_REACHABLE_RESP > ISI_HEADER_OFFSET_MESSAGEID, ( EISICLTransceiverOverTheLimits | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
    93   	    TUint8* ptr = const_cast<TUint8*>( tempPtr.Ptr() );
    95   	    TUint8* ptr = const_cast<TUint8*>( tempPtr.Ptr() );
    94   	    // We start to append from transaction id.
    96   	    // We start to append from transaction id.
    95   	    tempPtr.SetLength( ISI_HEADER_OFFSET_TRANSID );
    97   	    tempPtr.SetLength( ISI_HEADER_OFFSET_TRANSID );
    96   	    // Get the header until messageid from prev. message.
    98   	    // Get the header until messageid from prev. message.
    97 		    // Just turn receiver and sender device and object vice versa.
    99 		    // Just turn receiver and sender device and object vice versa.
   115 		    // Filler
   117 		    // Filler
   116 		    tempPtr.Append( 0x00 );
   118 		    tempPtr.Append( 0x00 );
   117 		    // Filler
   119 		    // Filler
   118 		    tempPtr.Append( 0x00 );
   120 		    tempPtr.Append( 0x00 );
   119 		    // Filler
   121 		    // Filler
   120         tempPtr.Append( 0x00 );
   122             tempPtr.Append( 0x00 );
   121 		    RouteISIMessage( tempPtr );
   123 		    RouteISIMessage( tempPtr );
   122 		    }
   124             error = RouteISIMessage( tempPtr );
       
   125    		    }
   123 		else
   126 		else
   124 		    {
   127 		    {
   125 		    C_TRACE( ( _T( "DISICLTransceiver Not sending another CommIsaEntityNotReachableResp" ) ) );
   128 		    C_TRACE( ( _T( "DISICLTransceiver Not sending another CommIsaEntityNotReachableResp" ) ) );
   126 		    }
   129 		    }
   127     C_TRACE( ( _T( "DISICLTransceiver::SendCommIsaEntityNotReachableResp 0x%x<" ), &aMessage ) );
   130     C_TRACE( ( _T( "DISICLTransceiver::SendCommIsaEntityNotReachableResp 0x%x<" ), &aMessage ) );
   128     }
   131     return error;
   129 
   132     }
   130 void DISICLTransceiver::RouteISIMessage( TDes8& aMessage )
   133 
   131     {
   134 TInt DISICLTransceiver::RouteISIMessage( TDes8& aMessage )
   132 	  C_TRACE( ( _T( "DISICLTransceiver::RouteISIMessage 0x%x>" ), &aMessage ) );
   135     {
   133 	  TInt error( ValidateISIMessage( aMessage ) ); //TODO what to do with error?
   136 	 C_TRACE( ( _T( "DISICLTransceiver::RouteISIMessage 0x%x>" ), &aMessage ) );
   134 	 	TBool sendOk( EFalse );
   137 	TInt error( ValidateISIMessage( aMessage ) );
   135 	 	TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );
   138     TBool sendOk( EFalse );
   136 	  switch( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] )
   139 	TUint8* messageBlockPtr( const_cast<TUint8*>( aMessage.Ptr() ) );
       
   140     switch( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] )
   137         {
   141         {
   138         case PN_DEV_APE:
   142         case PN_DEV_APE:
   139             {
   143             {
   140             C_TRACE( ( _T( "DISIRouter msg to PN_DEV_APE" ) ) );
   144             C_TRACE( ( _T( "DISIRouter msg to PN_DEV_APE" ) ) );
   141             if( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] == PN_OBJ_ROUTING_REQ )
   145             if( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] == PN_OBJ_ROUTING_REQ )
   152             {
   156             {
   153             C_TRACE( ( _T( "DISIRouter msg to other device" ) ) );
   157             C_TRACE( ( _T( "DISIRouter msg to other device" ) ) );
   154             TUint8 linkId = MapDeviceToMedia( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] );
   158             TUint8 linkId = MapDeviceToMedia( messageBlockPtr[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] );
   155 	          ASSERT_RESET_ALWAYS( linkId < EISIAmountOfMedias, ( EISICLTransceiverNotSupportedMedia | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
   159 	          ASSERT_RESET_ALWAYS( linkId < EISIAmountOfMedias, ( EISICLTransceiverNotSupportedMedia | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
   156             MISIRouterLinkIf* link = iLinksArray[ linkId ];
   160             MISIRouterLinkIf* link = iLinksArray[ linkId ];
   157             ASSERT_RESET_ALWAYS( link, ( EISICLTransceiverNULLPtr | EDISICLTransceiverTraceId << KClassIdentifierShift ) );  
   161             ASSERT_RESET_ALWAYS( link, ( EISICLTransceiverNULLPtr | EDISICLTransceiverTraceId << KClassIdentifierShift ) );
   158             sendOk = link->Send( aMessage );
   162             sendOk = link->Send( aMessage );
   159             C_TRACE( ( _T( "DISIRouter link sendOk %d" ), sendOk ) );
   163             C_TRACE( ( _T( "DISIRouter link sendOk %d" ), sendOk ) );
   160             break;
   164             break;
   161             }
   165             }
   162         }
   166         }
   163     if( !sendOk )
   167     if( !sendOk )
   164         {
   168         {
   165         SendCommIsaEntityNotReachableResp( aMessage );
   169         SendCommIsaEntityNotReachableResp( aMessage );
   166         MemApi::DeallocBlock( aMessage );
   170         MemApi::DeallocBlock( aMessage );
   167         }   
   171         }
   168 	  C_TRACE( ( _T( "DISICLTransceiver::RouteISIMessage 0x%x<" ), &aMessage ) );
   172 	  C_TRACE( ( _T( "DISICLTransceiver::RouteISIMessage 0x%x<" ), &aMessage ) );
       
   173     return error;
   169     }
   174     }
   170 
   175 
   171 // KErrBadDescriptor, if message length too small
   176 // KErrBadDescriptor, if message length too small
   172 // KErrUnderFlow, if message length too big.
   177 // KErrUnderFlow, if message length too big.
   173 // KErrCouldNotConnect, if receiver object is out of scope.
   178 // KErrCouldNotConnect, if receiver object is out of scope.
   187     msgOk = ( ( msgOk == KErrNone && isiMsgLength > descLength ) ? KErrUnderflow : msgOk );
   192     msgOk = ( ( msgOk == KErrNone && isiMsgLength > descLength ) ? KErrUnderflow : msgOk );
   188     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   193     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   189     // If the ISI message length is bigger that the largest supported.
   194     // If the ISI message length is bigger that the largest supported.
   190     msgOk = ( ( msgOk == KErrNone && isiMsgLength > KMaxISIMsgSize ) ? KErrUnderflow : msgOk );
   195     msgOk = ( ( msgOk == KErrNone && isiMsgLength > KMaxISIMsgSize ) ? KErrUnderflow : msgOk );
   191     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   196     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   192     // If the ISI message length with PN_HEADER_SIZE is less or equal than ISI_HEADER_OFFSET_MESSAGEID. 
   197     // If the ISI message length with PN_HEADER_SIZE is less or equal than ISI_HEADER_OFFSET_MESSAGEID.
   193     msgOk = ( ( msgOk == KErrNone && isiMsgLength <= ISI_HEADER_OFFSET_MESSAGEID ) ? KErrUnderflow : msgOk );
   198     msgOk = ( ( msgOk == KErrNone && isiMsgLength <= ISI_HEADER_OFFSET_MESSAGEID ) ? KErrUnderflow : msgOk );
   194     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   199     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   195     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   200     TRACE_ASSERT_INFO( msgOk == KErrNone, msgOk );
   196     TRACE_ASSERT_INFO( msgOk == KErrNone, isiMsgLength );
   201     TRACE_ASSERT_INFO( msgOk == KErrNone, isiMsgLength );
   197     TRACE_ASSERT_INFO( msgOk == KErrNone, descLength );
   202     TRACE_ASSERT_INFO( msgOk == KErrNone, descLength );