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 ); |