diff -r 000000000000 -r 63b37f68c1ce connectivitylayer/isimessage/isimessagekernel_dll/src/isikernel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitylayer/isimessage/isimessagekernel_dll/src/isikernel.cpp Fri Nov 06 17:28:23 2009 +0000 @@ -0,0 +1,1101 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include "isikernel.h" +#include "kernelisimessage_trace.h" +#include +#include "osttracedefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "isikerneltraces.h" +#endif + + + +// LOCAL CONSTANTS AND MACROS + +const TInt KMessageHeaderLength ( 6 ); +const TUint16 KSixteenBitZero ( 0x0000 ); +const TUint32 KThirtytwoBitZero ( 0x00000000 ); +const TInt KMinSbLength ( 4 ); +const TUint8 KPaddingByte ( 0x00 ); + +#define IS_DEV_HOST( dev ) ( ( dev & 0xF0 ) == 0 ) +#define GET_RECEIVER_DEV( msg ) ( msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] & 0xFC ) +#define GET_SENDER_DEV( msg ) ( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] & 0xFC ) +#define GET_RECEIVER_OBJ( msg ) IS_DEV_HOST( msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] ) ? \ + ( ( TUint16 )msg[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] + ( ( msg [ ISI_HEADER_OFFSET_RECEIVERDEVICE ] & 0x0F ) << 8 ) ) : \ + ( ( TUint16 )msg[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] + ( ( msg [ ISI_HEADER_OFFSET_RECEIVERDEVICE ] & 0x03 ) << 8 ) ) +#define GET_SENDER_OBJ( msg ) IS_DEV_HOST( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] ) ? \ + ( ( TUint16 )msg[ ISI_HEADER_OFFSET_SENDEROBJECT ] + ( ( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] & 0x0F ) << 8 ) ) : \ + ( ( TUint16 )msg[ ISI_HEADER_OFFSET_SENDEROBJECT ] + ( ( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] & 0x03 ) << 8 ) ) +#define SET_RECEIVER_DEV( msg, dev ) ( msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE] = ( ( msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] & 0x03 ) | ( ( dev ) & 0xFC ) ) ) +#define SET_SENDER_DEV( msg, dev ) ( msg[ ISI_HEADER_OFFSET_SENDERDEVICE] = ( ( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] & 0x03 ) | ( ( dev ) & 0xFC ) ) ) +#define SET_RECEIVER_OBJ( msg, o ) msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] = ( IS_DEV_HOST( msg[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] ) ) ? \ + GET_RECEIVER_DEV( msg ) | ( ( ( o ) >> 8 ) & 0x0F ) : GET_RECEIVER_DEV( msg ) | ( ( ( o ) >> 8 ) & 0x03 ), \ + msg[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] = ( TUint8 )( ( o ) & 0x00FF ) +#define SET_SENDER_OBJ( msg, o ) msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] = ( IS_DEV_HOST( msg[ ISI_HEADER_OFFSET_SENDERDEVICE ] ) ) ? \ + GET_SENDER_DEV( msg ) | ( ( ( o ) >> 8 ) & 0x0F ) : GET_SENDER_DEV( msg ) | ( ( ( o ) >> 8 ) & 0x03 ), \ + msg[ ISI_HEADER_OFFSET_SENDEROBJECT ] = ( TUint8 )( ( o ) & 0x00FF ) + + + +// ----------------------------------------------------------------------------- +// TIsiKernel::operator= +// ----------------------------------------------------------------------------- + EXPORT_C TIsiKernel& TIsiKernel::operator= + ( + const TIsiKernel& + ) + { + + COMPONENT_TRACE( ( _T( "TIsiKernel::operator=" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNEL_OPERATOR, "TIsiKernel::operator=" ); + return ( *this ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernel::TIsiKernel +// Constructor. +// ----------------------------------------------------------------------------- + +EXPORT_C TIsiKernel::TIsiKernel() + { + + COMPONENT_TRACE( ( _T( "TIsiKernel::TIsiKernel()" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNEL_TISIKERNEL, "TIsiKernel::TIsiKernel constructor" ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::FindSubBlockOffsetById +// ----------------------------------------------------------------------------- +EXPORT_C TInt TIsiKernelReceiveC::FindSubBlockOffsetById + ( + const TUint aSbStartOffset, + const TUint aSubblockId, + const TSubBlockType aType, + TUint &aSubBlockOffset + ) const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetById entering, (sbStart 0x%x, sbId 0x%x, aType %d )" ), aSbStartOffset, aSubblockId, aType ) ); + OstTraceExt3( TRACE_NORMAL, TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYID, "TIsiKernelReceiveC::FindSubBlockOffsetById - enter;sbStart=%u;sbId=%u;aType=%x;", aSbStartOffset, aSubblockId, ( TUint )&( aType ) ); + + TInt finder_offset( aSbStartOffset ); + TInt length( iBuffer.Length() ); + + // Message has to be divisible by four, when it has any subblocks + TRACE_ASSERT ( length % 4 == 0 ); //Invalid length + TRACE_ASSERT ( finder_offset % 4 == 0 ); //Invalid offset + + TUint subblock_id( 0 ); + TUint subblock_len( 0 ); + TBool found( EFalse ); + TInt retval( KErrNotFound ); + + if( ( length - KMinSbLength ) < finder_offset ) + { + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetById used with msg which doesn't contains any subblocks, (retval %d)" ), retval ) ); + OstTrace1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYID, "TIsiKernelReceiveC::FindSubBlockOffsetById used with msg which doesn't contains any subblocks;retval=%d", retval ); + } + else + { + do + { + switch( aType ) + { + case EIsiSubBlockTypeId8Len8: + { + subblock_id = this->Get8bit( finder_offset ); + subblock_len = this->Get8bit( finder_offset + 1 ); + break; + } + case EIsiSubBlockTypeId8Len16: + { + subblock_id = this->Get8bit( finder_offset ); + subblock_len = this->Get16bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId16Len8: + { + subblock_id = this->Get16bit( finder_offset ); + subblock_len = this->Get8bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId16Len16: + { + subblock_id = this->Get16bit( finder_offset ); + subblock_len = this->Get16bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId8Len32: + { + subblock_id = this->Get8bit( finder_offset ); + subblock_len = this->Get32bit( finder_offset + 4 ); + break; + } + default: + { + ASSERT_RESET_ALWAYS( 0, "KernelIsiMessage: OFFSET Invalid", EKernelIsiMessageInvalidSubBlockType ); + break; + } + } + + if ( subblock_len == 0 ) + { + OstTrace0( TRACE_NORMAL, DUP2_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYID, "TIsiKernelReceiveC::FindSubBlockOffsetById has found corrupted data, sb_len = 0 ->stop searching!" ); + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetById has found corrupted data, sb_len = 0 ->stop searching!" ) ) ); + found = ETrue; + retval = KErrNotFound; + } + + if ( aSubblockId == subblock_id ) + { + found = ETrue; + aSubBlockOffset = finder_offset; + retval = KErrNone; + } + else + { + finder_offset+= subblock_len; + } + } while ( !found && ( finder_offset + KMinSbLength <= length ) ); + } + + OstTrace0( TRACE_NORMAL, DUP3_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYID, "TIsiKernelReceiveC::FindSubBlockOffsetById returning" ); + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetById - return, aSubBlockOffset = 0x%x" ), finder_offset ) ); + + return retval; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::FindSubBlockOffsetByIndex +// ----------------------------------------------------------------------------- +EXPORT_C TInt TIsiKernelReceiveC::FindSubBlockOffsetByIndex + ( + const TUint aSbStartOffset, + const TUint aSubblockIndex, + const TSubBlockType aType, + TUint &aSubBlockOffset + ) const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetByIndex entering, (sbStart 0x%x, sbIndex 0x%x, aType %d )" ), aSbStartOffset, aSubblockIndex, aType ) ); + OstTraceExt3( TRACE_NORMAL, TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYINDEX, "TIsiKernelReceiveC::FindSubBlockOffsetByIndex - enter;aSbStartOffset=%u;aSubblockIndex=%u;aType=%x;", aSbStartOffset, aSubblockIndex, ( TUint )&( aType )); + + TInt finder_offset( aSbStartOffset ); + TInt length( iBuffer.Length() ); + + // Message has to be divisible by four, when it has any subblocks + TRACE_ASSERT ( length % 4 == 0 ); //Invalid length + TRACE_ASSERT ( finder_offset % 4 == 0 ); // Invalid offset + + TUint subblock_len ( 0 ); + TUint index ( 0 ); + TBool found ( EFalse ); + TInt retval( KErrNotFound ); + + if( ( length - KMinSbLength ) < finder_offset ) + { + OstTrace1( TRACE_NORMAL, DUP2_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYINDEX, "TIsiKernelReceiveC::FindSubBlockOffsetByIndex used with msg which doesn't contains any subblocks;retval=%d", retval ); + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetByIndex used with msg which doesn't contains any subblocks, (retval %d)" ), retval ) ); + } + else + { + do + { + index++; + switch( aType ) + { + case EIsiSubBlockTypeId8Len8: + { + subblock_len = this->Get8bit( finder_offset + 1 ); + break; + } + case EIsiSubBlockTypeId8Len16: + { + subblock_len = this->Get16bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId16Len8: + { + subblock_len = this->Get8bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId16Len16: + { + subblock_len = this->Get16bit( finder_offset + 2 ); + break; + } + case EIsiSubBlockTypeId8Len32: + { + subblock_len = this->Get32bit( finder_offset + 4 ); + break; + } + default: + { + ASSERT_RESET_ALWAYS( 0, "KernelIsiMessage: OFFSET Invalid", EKernelIsiMessageInvalidSubBlockType ); + break; + } + } + + if ( subblock_len == 0 ) + { + OstTrace0( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYINDEX, "TIsiKernelReceiveC::FindSubBlockOffsetByIndex has found corrupted data, sb_len = 0 ->stop searching!" ); + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetByIndex has found corrupted data, sb_len = 0 ->stop searching" ) ) ); + found = ETrue; + retval = KErrNotFound; + } + + if( index == aSubblockIndex ) + { + found = ETrue; + aSubBlockOffset = finder_offset; + retval = KErrNone; + } + else + { + finder_offset+=subblock_len; + } + } while( !found && ( index <= aSubblockIndex ) && (finder_offset + KMinSbLength <= length ) ); + } + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::FindSubblockOffsetByIndex - return, aSubBlockOffset = 0x%x" ), finder_offset ) ); + OstTrace1( TRACE_NORMAL, DUP3_TISIKERNELRECEIVEC_FINDSUBBLOCKOFFSETBYINDEX, "TIsiKernelReceiveC::FindSubBlockOffsetByIndex - return;finder_offset=%d", finder_offset ); + + return retval; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::Get16bit +// ----------------------------------------------------------------------------- +EXPORT_C TUint16 TIsiKernelReceiveC::Get16bit + ( + const TUint aOffset + ) const + { + + OstTrace1( TRACE_NORMAL, TISIKERNELRECEIVEC_GET16BIT, "TIsiKernelReceiveC::Get16bit - enter;aOffset=%u", aOffset ); + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get16bit entering, aOffset 0x%x" ), aOffset ) ); + + ASSERT_RESET_ALWAYS( ((iBuffer.Length() - 1) > aOffset), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + TRACE_ASSERT ( aOffset % 2 == 0 ); //Invalid offset + + TUint16 retval( KSixteenBitZero ); + TUint16 byte1( KSixteenBitZero ); + TUint16 byte2( KSixteenBitZero ); + + byte1 = iBuffer[ aOffset ]; + byte2 = iBuffer[ aOffset + 1 ]; + retval = TUint16( ( byte1 << 8 ) | byte2 ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get16bit - return, Return 16bit value = 0x%x" ), retval ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GET16BIT, "TIsiKernelReceiveC::Get16bit - return; retval=%hu", retval ); + + return retval; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::Get32bit +// ----------------------------------------------------------------------------- +EXPORT_C TUint32 TIsiKernelReceiveC::Get32bit + ( + const TUint aOffset + ) const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get32bit entering, aOffset = 0x%x" ) , aOffset ) ); + OstTrace1( TRACE_NORMAL, TISIKERNELRECEIVEC_GET32BIT, "TIsiKernelReceiveC::Get32bit - enter;aOffset=%u", aOffset ); + + ASSERT_RESET_ALWAYS( ( (iBuffer.Length() - 3) > aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + TRACE_ASSERT ( aOffset % 4 == 0 ); // Invalid offset + + TUint32 retval( KThirtytwoBitZero ); + TUint32 byte1( KThirtytwoBitZero ); + TUint32 byte2( KThirtytwoBitZero ); + TUint32 byte3( KThirtytwoBitZero ); + TUint32 byte4( KThirtytwoBitZero ); + + byte1 = iBuffer[ aOffset ]; + byte2 = iBuffer[ aOffset + 1 ]; + byte3 = iBuffer[ aOffset + 2 ]; + byte4 = iBuffer[ aOffset + 3 ]; + + retval = TUint32( byte1 << 24 ); + retval = TUint32( retval | ( byte2 << 16 )); + retval = TUint32( retval | ( byte3 << 8 )); + retval = TUint32( retval | byte4 ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get32bit - return, Return 32bit value = 0x%x" ), retval ) ); + OstTrace1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GET32BIT, "TIsiKernelReceiveC::Get32bit - return;retval=%d", retval ); + + return retval; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::Get8bit +// ----------------------------------------------------------------------------- +EXPORT_C TUint8 TIsiKernelReceiveC::Get8bit + ( + const TUint aOffset + ) const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get8bit entering, aOffset = 0x%x" ) , aOffset ) ); + OstTrace1( TRACE_NORMAL, TISIKERNELRECEIVEC_GET8BIT, "TIsiKernelReceiveC::Get8bit - enter;aOffset=%u", aOffset ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() > aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::Get8bit - return, return value = 0x%x" ) , iBuffer[aOffset] ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GET8BIT, "TIsiKernelReceiveC::Get8bit - return 8bit value=%hhu", iBuffer[aOffset] ); + + return iBuffer[ aOffset ]; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetData +// ----------------------------------------------------------------------------- +EXPORT_C const TPtrC8 TIsiKernelReceiveC::GetData + ( + const TUint aOffset, + const TInt aLength + ) const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetData entering, aOffset = 0x%x" ), aOffset ) ); + OstTraceExt2( TRACE_NORMAL, TISIKERNELRECEIVEC_GETDATA, "TIsiKernelReceiveC::GetData - enter;aOffset=%u;aLength=%d", aOffset, aLength ); + + ASSERT_RESET_ALWAYS( ( ( iBuffer.Length() - aLength ) >= aOffset), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= aLength ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + TRACE_ASSERT ( aLength > 0 ); // Invalid length, should be >0 + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetData - return, offset = 0x%x, length = 0x%x" ), aOffset, aLength ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETDATA, "TIsiKernelReceiveC::GetData - return;offset=%u;data length=%d", aOffset, aLength ); + + return TPtrC8( iBuffer.Mid( aOffset, aLength ) ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::TIsiKernelReceiveC +// ----------------------------------------------------------------------------- +EXPORT_C TIsiKernelReceiveC::TIsiKernelReceiveC + ( + const TDesC8& aBuf + ) + :TIsiKernel(), + iBuffer( aBuf ) + { + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::TIsiKernelReceiveC constructor" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_TISIKERNELRECEIVEC, "TIsiKernelReceiveC::TIsiKernelReceiveC constructor" ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetBuffer +// ----------------------------------------------------------------------------- +EXPORT_C const TPtrC8 TIsiKernelReceiveC::GetBuffer + () const + { + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetBuffer" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETBUFFER, "TIsiKernelReceiveC::GetBuffer" ); + + return iBuffer; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetReceiverDevice +// ----------------------------------------------------------------------------- +EXPORT_C TUint8 TIsiKernelReceiveC::GetReceiverDevice + () const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetReceiverDevice - entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETRECEIVERDEVICE, "TIsiKernelReceiveC::GetReceiverDevice - enter" ); + + ASSERT_RESET_ALWAYS( (iBuffer.Length() > ISI_HEADER_OFFSET_MESSAGEID), "KernelIsiMessage: Invalid buffer length", EKernelIsiMessageInvalidOffset ); + + TUint8 receiverDevice = GET_RECEIVER_DEV(iBuffer); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetReceiverDevice - return, receiverDevice = 0x%x" ), receiverDevice ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETRECEIVERDEVICE, "TIsiKernelReceiveC::GetReceiverDevice - return;receiverDevice=%hhu", receiverDevice ); + + return receiverDevice; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetSenderDevice +// ----------------------------------------------------------------------------- +EXPORT_C TUint8 TIsiKernelReceiveC::GetSenderDevice + () const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetSenderDevice - entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETSENDERDEVICE, "TIsiKernelReceiveC::GetSenderDevice - enter" ); + + + ASSERT_RESET_ALWAYS( (iBuffer.Length() > ISI_HEADER_OFFSET_MESSAGEID), "KernelIsiMessage: Invalid buffer length", EKernelIsiMessageInvalidOffset ); + + TUint8 senderDevice = GET_SENDER_DEV(iBuffer); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetSenderDevice - return, senderDevice = 0x%x" ), senderDevice ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETSENDERDEVICE, "TIsiKernelReceiveC::GetSenderDevice - return;senderDevice=%hhu", senderDevice ); + + return senderDevice; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetReceiverObject +// ----------------------------------------------------------------------------- +EXPORT_C TUint16 TIsiKernelReceiveC::GetReceiverObject + () const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetReceiverObject - entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETRECEIVEROBJECT, "TIsiKernelReceiveC::GetReceiverObject - enter" ); + + ASSERT_RESET_ALWAYS( (iBuffer.Length() > ISI_HEADER_OFFSET_MESSAGEID), "KernelIsiMessage: Invalid buffer length", EKernelIsiMessageInvalidOffset ); + + TUint16 receiverObject = static_castGET_RECEIVER_OBJ(iBuffer); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetReceiverObject - return, receiverObject = 0x%x" ), receiverObject ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETRECEIVEROBJECT, "TIsiKernelReceiveC::GetReceiverObject - return;receiverObject=%hu", receiverObject ); + + return receiverObject; + + } + + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetSenderObject +// ----------------------------------------------------------------------------- +EXPORT_C TUint16 TIsiKernelReceiveC::GetSenderObject + () const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetSenderObject - entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETSENDEROBJECT, "TIsiKernelReceiveC::GetSenderObject - enter" ); + + ASSERT_RESET_ALWAYS( (iBuffer.Length() > ISI_HEADER_OFFSET_MESSAGEID), "KernelIsiMessage: Invalid buffer length", EKernelIsiMessageInvalidOffset ); + + TUint16 senderObject = static_castGET_SENDER_OBJ( iBuffer ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetSenderObject - return, senderObject = 0x%x" ), senderObject ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETSENDEROBJECT, "TIsiKernelReceiveC::GetSenderObject - return;senderObject=%hhu", senderObject ); + + return senderObject; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelReceiveC::GetExtendedResourceId +// ----------------------------------------------------------------------------- +EXPORT_C TUint32 TIsiKernelReceiveC::GetExtendedResourceId + () const + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetExtendedResourceId - entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELRECEIVEC_GETEXTENDEDRESOURCEID, "TIsiKernelReceiveC::GetExtendedResourceId - enter" ); + + TUint32 extendedResourceId(0x00000000); + + //Check that extended resource id available and not reading over the buffer + ASSERT_RESET_ALWAYS( (iBuffer[ISI_HEADER_OFFSET_RESOURCEID] == PN_PREFIX), "KernelIsiMessage: Invalid buffer", EKernelIsiMessageInvalidResourceId ); + ASSERT_RESET_ALWAYS( (iBuffer.Length() > ISI_HEADER_OFFSET_MESSAGEID), "KernelIsiMessage: Invalid buffer", EKernelIsiMessageInvalidResourceId ); + + TUint8 temp(iBuffer[ ISI_HEADER_OFFSET_SUBTYPE ]); + TUint32 subType = static_cast( temp << 16 ); + TUint32 type = static_cast( iBuffer[ ISI_HEADER_OFFSET_TYPE ] << 8 ); + + extendedResourceId = static_cast(PN_PREFIX) | subType | type ; + + COMPONENT_TRACE( ( _T ( "TIsiKernelReceiveC::GetExtendedResourceId - return, extendedResourceId = 0x%x" ), extendedResourceId ) ); + OstTrace1( TRACE_NORMAL, DUP1_TISIKERNELRECEIVEC_GETEXTENDEDRESOURCEID, "TIsiKernelReceiveC::GetExtendedResourceId - return;extendedResourceId=%u", extendedResourceId ); + + return extendedResourceId; + + } + +//------------------------------------------------------------------------------- +// TIsiKernelSend::Complete +// ----------------------------------------------------------------------------- +EXPORT_C TDes8& TIsiKernelSend::Complete + ( + // None + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Complete entering" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELSEND_COMPLETE, "TIsiKernelSend::Complete - enter" ); + + // Set msg length in hex. + TUint16 length( TUint16( iBuffer.Length() - KMessageHeaderLength ) ); + TUint16 calcFinalLength( TUint16( iFinalLength - KMessageHeaderLength ) ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Complete, length: 0x%x, calcfinallength: 0x%x" ), length, calcFinalLength ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELSEND_COMPLETE, "TIsiKernelSend::Complete;length=%hu;calcFinalLength=%hu", length, calcFinalLength ); + + #if defined( __WINS__ ) || defined( __WINSCW__ ) + { + if( iFinalLength == 0 ) // TIsiKernelSend alternative constructor used + { + iBuffer[ ISI_HEADER_OFFSET_LENGTH ] = static_cast( (length & 0xff00) >> 8); //BE + iBuffer[ ISI_HEADER_OFFSET_LENGTH + 1 ] = static_cast(length & 0x00ff); //BE + } + else + { + iBuffer[ ISI_HEADER_OFFSET_LENGTH ] = static_cast( (calcFinalLength & 0xff00 ) >> 8); //BE + iBuffer[ ISI_HEADER_OFFSET_LENGTH + 1 ] = static_cast(calcFinalLength & 0x00ff); //BE + iBuffer.SetLength( iFinalLength ); + } + } + + #else + { + if( iFinalLength == 0 ) // TIsiKernelSend alternative constructor used + { + iBuffer[ ISI_HEADER_OFFSET_LENGTH +1 ] = static_cast( (length & 0xff00) >> 8); //LE + iBuffer[ ISI_HEADER_OFFSET_LENGTH ] = static_cast(length & 0x00ff); //LE + } + else + { + iBuffer[ ISI_HEADER_OFFSET_LENGTH +1 ] = static_cast( (calcFinalLength & 0xff00) >> 8); //LE + iBuffer[ ISI_HEADER_OFFSET_LENGTH ] = static_cast(calcFinalLength & 0x00ff); //LE + iBuffer.SetLength( iFinalLength ); + } + OstTraceExt2( TRACE_NORMAL, DUP2_TISIKERNELSEND_COMPLETE, "TIsiKernelSend::Complete;byte2=%hhu;byte1=%hhu", iBuffer[5], iBuffer[4] ); + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Complete, byte2: 0x%x, byte1: 0x%x" ), iBuffer[5], iBuffer[4] ) ); + } + #endif + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Complete - return, buffer length = 0x%x, iFinalLength = 0x%x" ), length, iFinalLength ) ); + OstTraceExt2( TRACE_NORMAL, DUP3_TISIKERNELSEND_COMPLETE, "TIsiKernelSend::Complete - return;buffer length=%hu;iFinalLength=%u", length, iFinalLength ); + + return iBuffer; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::CopyData +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::CopyData + ( + const TUint aOffset, + const TDesC8& aData + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::CopyData entering, offset = 0x%x" ), aOffset ) ); + OstTraceExt2( TRACE_NORMAL, TISIKERNELSEND_COPYDATA, "TIsiKernelSend::CopyData - enter;aOffset=%u;aData=%x", aOffset, ( TUint )&( aData ) ); + + TInt length( aData.Length() ); + + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= aOffset + length ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= aOffset ) iBuffer.SetLength( aOffset + length ); + + ASSERT_RESET_ALWAYS( ( ( iBuffer.Length() - length ) >= aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= length ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + TRACE_ASSERT ( length > 0); // Length should be > 0 + + // Add byte by byte starting from offset place until the whole data is set. + for( TInt i( 0 ); i < length; i++ ) + { + iBuffer[aOffset + i] = aData.Ptr()[ i ]; + } + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::CopyData - return, offset = 0x%x, data length = 0x%x " ), aOffset, length ) ); + OstTraceExt2( TRACE_NORMAL, DUP2_TISIKERNELSEND_COPYDATA, "TIsiKernelSend::CopyData - return;aOffset=%hhu;data length=%hhd", aOffset, length ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::TIsiKernelSend +// ----------------------------------------------------------------------------- +EXPORT_C TIsiKernelSend::TIsiKernelSend + ( + TDes8& aBuf, + const TUint aLength + ) + :TIsiKernel(), + iBuffer( aBuf ), + iFinalLength( aLength ) // this should be same as msg length + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::TIsiKernelSend entering, aLength = 0x%x " ), aLength ) ) ; + OstTrace1( TRACE_NORMAL, TISIKERNELSEND_TISIKERNELSEND, "TIsiKernelSend::TIsiKernelSend - enter;aLength=%u", aLength ); + + // Length check + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= aLength ), "KernelIsiMessage: invalid offset in constructor", EKernelIsiMessageInvalidOffset); + + // Set the message to contain zeros to it's length. + iBuffer.FillZ( aLength ); + + // Set the length to zero. + iBuffer.Zero(); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::TIsiKernelSend - return. iFinalLength = 0x%x" ), iFinalLength ) ) ; + OstTrace1( TRACE_NORMAL, DUP1_TISIKERNELSEND_TISIKERNELSEND, "TIsiKernelSend::TIsiKernelSend - return;iFinalLength=%u", iFinalLength ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::TIsiKernelSend alternative constructor +// ----------------------------------------------------------------------------- +EXPORT_C TIsiKernelSend::TIsiKernelSend + ( + TDes8& aBuf + ) + :TIsiKernel(), + iBuffer( aBuf ), + iFinalLength( 0 ) + { + + OstTrace0( TRACE_NORMAL, DUP2_TISIKERNELSEND_TISIKERNELSEND, "TIsiKernelSend::TIsiKernelSend constructor without length - enter" ); + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::TIsiKernelSend constructor without length, entering" ) ) ); + + // Set the message to contain zeros to it's max length. + iBuffer.FillZ( iBuffer.MaxLength() ); + + // Set the length to zero. + iBuffer.Zero(); + + OstTrace1( TRACE_NORMAL, DUP3_TISIKERNELSEND_TISIKERNELSEND, "TIsiKernelSend::TIsiKernelSend constructor without length - return;iFinalLength=%u", iFinalLength ); + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::TIsiKernelSend constructor without length - return. iFinalLength = 0x%x" ), iFinalLength ) ) ; + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::Set16bit +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::Set16bit + ( + const TUint aOffset, + const TUint16 aData + ) + { + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set16bit entering - offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, TISIKERNELSEND_SET16BIT, "TIsiKernelSend::Set16bit - enter;aOffset=%u;aData=%hu", aOffset, aData ); + + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= aOffset + 2 ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= aOffset ) iBuffer.SetLength( aOffset + 2 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() -1 >= aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + TRACE_ASSERT ( aOffset % 2 == 0 ); // Invalid offset + + iBuffer[ aOffset ] = static_cast( (aData & 0xff00) >> 8); + iBuffer[ aOffset + 1 ] = static_cast(aData & 0x00ff); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set16bit - return, offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELSEND_SET16BIT, "TIsiKernelSend::Set16bit - return;aOffset=%u;aData=%hu", aOffset, aData ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::Set32bit +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::Set32bit + ( + const TUint aOffset, + const TUint32 aData + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set32bit entering - offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, TISIKERNELSEND_SET32BIT, "TIsiKernelSend::Set32bit - enter;aOffset=%u;aData=%u", aOffset, ( TUint )( aData ) ); + + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= aOffset + 4 ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= aOffset ) iBuffer.SetLength( aOffset + 4 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() -3 >= aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + TRACE_ASSERT ( aOffset % 4 == 0 ); // Invalid offset + + iBuffer[ aOffset ] = static_cast( (aData & 0xff000000) >> 24); + iBuffer[ aOffset + 1 ] = static_cast( (aData & 0x00ff0000) >> 16); + iBuffer[ aOffset + 2 ] = static_cast( (aData & 0x0000ff00) >> 8); + iBuffer[ aOffset + 3 ] = static_cast(aData & 0x000000ff); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set32bit - return, offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELSEND_SET32BIT, "TIsiKernelSend::Set32bit - return;aOffset=%u;aData=%u", aOffset, ( TUint )( aData ) ); + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::Set8bit +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::Set8bit + ( + const TUint aOffset, + const TUint8 aData + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set8bit entering - offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, TISIKERNELSEND_SET8BIT, "TIsiKernelSend::Set8bit - enter;aOffset=%u;aData=%hhu", aOffset, aData ); + + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= aOffset + 1 ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= aOffset ) iBuffer.SetLength( aOffset + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= aOffset ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + iBuffer[ aOffset ] = aData; + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::Set8bit - return, offset = 0x%x, aData = 0x%x" ), aOffset, aData ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELSEND_SET8BIT, "TIsiKernelSend::Set8bit - return;aOffset=%u;aData=%hhu", aOffset, aData ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::SetReceiverDevice +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::SetReceiverDevice + ( + const TUint8 aReceiverDevice + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetReceiverDevice entering - receiverDevice = 0x%x" ), aReceiverDevice ) ); + OstTraceExt1( TRACE_NORMAL, TISIKERNELSEND_SETRECEIVERDEVICE, "TIsiKernelSend::SetReceiverDevice - enter;aReceiverDevice=%hhu", aReceiverDevice ); + + //Check buffer length and given value + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= ISI_HEADER_OFFSET_MESSAGEID ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= ISI_HEADER_OFFSET_RECEIVERDEVICE ) iBuffer.SetLength( ISI_HEADER_OFFSET_RECEIVERDEVICE + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= ISI_HEADER_OFFSET_RECEIVERDEVICE ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + iBuffer[ISI_HEADER_OFFSET_RECEIVERDEVICE] = SET_RECEIVER_DEV(iBuffer, aReceiverDevice); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetReceiverDevice return - set receiverDevice = 0x%x "), iBuffer[ISI_HEADER_OFFSET_RECEIVERDEVICE] ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELSEND_SETRECEIVERDEVICE, "TIsiKernelSend::SetReceiverDevice - return;aReceiverDevice=%hhu", iBuffer[ISI_HEADER_OFFSET_RECEIVERDEVICE] ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::SetSenderDevice +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::SetSenderDevice + ( + const TUint8 aSenderDevice + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetSenderDevice entering - senderDevice = 0x%x" ), aSenderDevice ) ); + OstTraceExt1( TRACE_NORMAL, TISIKERNELSEND_SETSENDERDEVICE, "TIsiKernelSend::SetSenderDevice - enter;aSenderDevice=%hhu", aSenderDevice ); + + //Check buffer length and given value + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= ISI_HEADER_OFFSET_MESSAGEID ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + if( iBuffer.Length() <= ISI_HEADER_OFFSET_SENDERDEVICE ) iBuffer.SetLength( ISI_HEADER_OFFSET_SENDERDEVICE + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= ISI_HEADER_OFFSET_SENDERDEVICE ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + iBuffer[ISI_HEADER_OFFSET_SENDERDEVICE] = SET_SENDER_DEV( iBuffer, aSenderDevice ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetSenderDevice return - senderDevice = 0x%x "), iBuffer[ISI_HEADER_OFFSET_SENDERDEVICE] ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELSEND_SETSENDERDEVICE, "TIsiKernelSend::SetSenderDevice - return;aSenderDevice=%hhu", iBuffer[ISI_HEADER_OFFSET_SENDERDEVICE] ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::SetReceiverObject +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::SetReceiverObject + ( + const TUint16 aReceiverObject + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetReceiverObject entering- receiverObject= 0x%x" ), aReceiverObject ) ); + OstTraceExt1( TRACE_NORMAL, TISIKERNELSEND_SETRECEIVEROBJECT, "TIsiKernelSend::SetReceiverObject - enter;aReceiverObject=%hu", aReceiverObject ); + + // Check buffer length and given value + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= ISI_HEADER_OFFSET_MESSAGEID ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( aReceiverObject < 0x3FF ), "KernelIsiMessage: Invalid Receiverobject", KErrOverflow ); + + if( iBuffer.Length() <= ISI_HEADER_OFFSET_RECEIVEROBJECT ) iBuffer.SetLength( ISI_HEADER_OFFSET_RECEIVEROBJECT + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= ISI_HEADER_OFFSET_RECEIVEROBJECT ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + SET_RECEIVER_OBJ(iBuffer, aReceiverObject); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetReceiverObject - set receiverDevice = 0x%x "), iBuffer[ISI_HEADER_OFFSET_RECEIVERDEVICE] ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELSEND_SETRECEIVEROBJECT, "TIsiKernelSend::SetReceiverObject;receiverDevice=%hhu", iBuffer[ISI_HEADER_OFFSET_RECEIVERDEVICE] ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetReceiverObject return - receiverObject = 0x%x "), iBuffer[ISI_HEADER_OFFSET_RECEIVEROBJECT] ) ); + OstTraceExt1( TRACE_NORMAL, DUP2_TISIKERNELSEND_SETRECEIVEROBJECT, "TIsiKernelSend::SetReceiverObject - return;receiverObject=%hhu", iBuffer[ISI_HEADER_OFFSET_RECEIVEROBJECT] ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::SetSenderObject +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::SetSenderObject + ( + const TUint16 aSenderObject + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetSenderObject entering- senderObject= 0x%x" ), aSenderObject ) ); + OstTraceExt1( TRACE_NORMAL, TISIKERNELSEND_SETSENDEROBJECT, "TIsiKernelSend::SetSenderObject - enter;aSenderObject=%hu", aSenderObject ); + + // Check buffer length and given value + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= ISI_HEADER_OFFSET_MESSAGEID ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( aSenderObject < 0x3FF ), "KernelIsiMessage: Invalid SenderObject ", KErrOverflow ); + + if( iBuffer.Length() <= ISI_HEADER_OFFSET_SENDEROBJECT ) iBuffer.SetLength( ISI_HEADER_OFFSET_SENDEROBJECT + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= ISI_HEADER_OFFSET_SENDEROBJECT ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + SET_SENDER_OBJ(iBuffer, aSenderObject); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetSenderObject - senderDevice = 0x%x" ), iBuffer[ISI_HEADER_OFFSET_SENDERDEVICE] ) ); + OstTraceExt1( TRACE_NORMAL, DUP1_TISIKERNELSEND_SETSENDEROBJECT, "TIsiKernelSend::SetSenderObject;senderDevice=%hu", iBuffer[ISI_HEADER_OFFSET_SENDERDEVICE] ); + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetSenderObject return - senderObject = 0x%x" ), iBuffer[ISI_HEADER_OFFSET_SENDEROBJECT] ) ); + OstTraceExt1( TRACE_NORMAL, DUP2_TISIKERNELSEND_SETSENDEROBJECT, "TIsiKernelSend::SetSenderObject - return;senderObject=%hu", iBuffer[ISI_HEADER_OFFSET_SENDEROBJECT] ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSend::SetExtendedResourceId +// ----------------------------------------------------------------------------- +EXPORT_C void TIsiKernelSend::SetExtendedResourceId + ( + const TUint32 aExtendedResourceId + ) + { + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetExtendedResourceId entering - extendedResourceId = 0x%x" ), aExtendedResourceId ) ); + OstTrace1( TRACE_NORMAL, TISIKERNELSEND_SETEXTENDEDRESOURCEID, "TIsiKernelSend::SetExtendedResourceId - enter;aExtendedResourceId=%u", ( TUint )( aExtendedResourceId ) ); + + TUint8 prefix( aExtendedResourceId & 0xFF ); + + //Check that extended resource id available and not reading over the buffer + ASSERT_RESET_ALWAYS( ( iBuffer.MaxLength() >= ISI_HEADER_OFFSET_SUBTYPE + 1 ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( aExtendedResourceId < 0xFFFFFF ), "KernelIsiMessage: Invalid ExtendedResourceId ", KErrOverflow ); + ASSERT_RESET_ALWAYS( ( prefix == PN_PREFIX ), "KernelIsiMessage: Invalid Pefix ", KErrOverflow ); + + if( iBuffer.Length() <= ISI_HEADER_OFFSET_SUBTYPE ) iBuffer.SetLength( ISI_HEADER_OFFSET_SUBTYPE + 1 ); + + ASSERT_RESET_ALWAYS( ( iBuffer.Length() >= ISI_HEADER_OFFSET_SUBTYPE ), "KernelIsiMessage: OFFSET Invalid", KErrOverflow ); + + TUint8 type = (( aExtendedResourceId >> 8 ) & 0xFF ); + TUint8 subType = (( aExtendedResourceId >> 16 ) & 0xFF ); + + iBuffer[ ISI_HEADER_OFFSET_TYPE ] = type; + iBuffer[ ISI_HEADER_OFFSET_SUBTYPE ] = subType; + iBuffer[ ISI_HEADER_OFFSET_RESOURCEID ] = prefix; + + COMPONENT_TRACE( ( _T ( "TIsiKernelSend::SetExtendedResourceId return- type = 0x%x, subtype = 0x%x, prefix = 0x%x" ), type, subType, prefix ) ); + OstTraceExt3( TRACE_NORMAL, DUP1_TISIKERNELSEND_SETEXTENDEDRESOURCEID, "TIsiKernelSend::SetExtendedResourceId - return;type=%hhu;subType=%hhu;prefix=%hhu", type, subType, prefix ); + + } + +// ----------------------------------------------------------------------------- +// TIsiSubBlock::TIsiSubBlock +// ----------------------------------------------------------------------------- +EXPORT_C TIsiKernelSubBlock::TIsiKernelSubBlock + ( + TDes8& aMsg, + TUint16 aSbId, + const TSubBlockType aType + ): iSubBlockStart( aMsg.Length() ), + iMsg(aMsg), + iSubBlockType(aType) + { + COMPONENT_TRACE( ( _T ( "TIsiKernelSubBlock::TIsiKernelSubBlock entering - sbId = 0x%x, subBlockType = %d" ), aSbId, aType ) ); + OstTraceExt2( TRACE_NORMAL, DUP1_TISIKERNELSUBBLOCK_TISIKERNELSUBBLOCK, "TIsiKernelSubBlock::TIsiKernelSubBlock - enter;aSbId=%hu;subblockType=%x", aSbId, ( TUint )&( aType ) ); + + + TUint8 byte1(0x00); + TUint8 byte2(0x00); + + switch( iSubBlockType ) + { + case EIsiSubBlockTypeId8Len8: + { + iMsg.Append( aSbId ); //sbId 8 bit + iMsg.Append( 0x00); // length 8 bit + break; + } + case EIsiSubBlockTypeId8Len16: + { + iMsg.Append( aSbId ); + iMsg.Append( 0x00 ); //filler + iMsg.Append( 0x00 ); // length 16 bit + iMsg.Append( 0x00 ); // length 16 bit + break; + } + case EIsiSubBlockTypeId16Len8: + { + byte1 = TUint8( ( aSbId & 0xff00 ) >> 8 ); + byte2 = TUint8( aSbId & 0x00ff ); + iMsg.Append(byte1); // sbId 16 bit + iMsg.Append(byte2); // sbId 16 bit + iMsg.Append(0x00); // lenght 8 bit + break; + } + case EIsiSubBlockTypeId16Len16: + { + byte1 = TUint8( ( aSbId & 0xff00 ) >> 8 ); + byte2 = TUint8( aSbId & 0x00ff ); + iMsg.Append(byte1); // sbId 16 bit + iMsg.Append(byte2); // sbId 16 bit + iMsg.Append(0x00); // lenght 16 bit + iMsg.Append(0x00); // length 16 bit + break; + } + case EIsiSubBlockTypeId8Len32: + { + iMsg.Append(aSbId); // sbId 8 bit + iMsg.Append(0x00); // filler + iMsg.Append(0x00); // filler + iMsg.Append(0x00); // filler + iMsg.Append(0x00); // length 32 bit + iMsg.Append(0x00); // length 32 bit + iMsg.Append(0x00); // length 32 bit + iMsg.Append(0x00); // length 32 bit + break; + } + default: + { + ASSERT_RESET_ALWAYS( 0, "KernelIsiMessage: Invalid subblock type", EKernelIsiMessageInvalidValue); + break; + } + } + + COMPONENT_TRACE( ( _T ( "TIsiKernelSubBlock::TIsiKernelSubBlock - return" ) ) ); + OstTrace0( TRACE_NORMAL, DUP2_TISIKERNELSUBBLOCK_TISIKERNELSUBBLOCK, "TIsiKernelSubBlock::TIsiKernelSubBlock - return" ); + + } + +// ----------------------------------------------------------------------------- +// TIsiKernelSubBlock::CompleteSubBlock +// ----------------------------------------------------------------------------- +EXPORT_C TDes8& TIsiKernelSubBlock::CompleteSubBlock + ( + ) + { + COMPONENT_TRACE( ( _T ( "TIsiKernelSubBlock::CompleteSubBlock" ) ) ); + OstTrace0( TRACE_NORMAL, TISIKERNELSUBBLOCK_COMPLETESUBBLOCK, "TIsiKernelSubBlock::CompleteSubBlock - enter" ); + + TUint8 byte1( 0x00 ); + TUint8 byte2( 0x00 ); + TUint8 byte3( 0x00 ); + TUint8 byte4( 0x00 ); + TUint16 length16(0x0000); + TUint32 length32(0x00000000); + + // Make sb length divisible by 4 + while( (iMsg.Length() -iSubBlockStart ) % 4 ) + { + iMsg.Append( KPaddingByte ); + } + + // Update subblock length + switch( iSubBlockType ) + { + case EIsiSubBlockTypeId8Len8: + { + iMsg[iSubBlockStart+1] = TUint8( iMsg.Length()-iSubBlockStart ); + break; + } + case EIsiSubBlockTypeId8Len16: + { + length16 = TUint16( iMsg.Length()-iSubBlockStart ); + byte1 = TUint8( ( length16 & 0xff00 ) >> 8 ); + byte2 = TUint8( length16 & 0x00ff ); + iMsg[iSubBlockStart+2] = byte1; + iMsg[iSubBlockStart+3] = byte2; + break; + } + case EIsiSubBlockTypeId16Len8: + { + iMsg[iSubBlockStart+2] = TUint8( iMsg.Length()-iSubBlockStart ); + break; + } + case EIsiSubBlockTypeId16Len16: + { + length16 = TUint16( iMsg.Length()-iSubBlockStart ); + byte1 = TUint8( ( length16 & 0xff00 ) >> 8 ); + byte2 = TUint8( length16 & 0x00ff ); + iMsg[iSubBlockStart+2] = byte1; + iMsg[iSubBlockStart+3] = byte2; + break; + } + case EIsiSubBlockTypeId8Len32: + { + length32 = TUint32( iMsg.Length()-iSubBlockStart ); + byte1 = TUint8( ( length32 & 0xff000000 ) >> 24 ); + byte2 = TUint8( ( length32 & 0x00ff0000 ) >> 16 ); + byte3 = TUint8( ( length32 & 0x0000ff00 ) >> 8 ); + byte4 = TUint8( length32 & 0x000000ff ); + iMsg[iSubBlockStart+4] = byte1; + iMsg[iSubBlockStart+5] = byte2; + iMsg[iSubBlockStart+6] = byte3; + iMsg[iSubBlockStart+7] = byte4; + break; + } + default: + { + ASSERT_RESET_ALWAYS( 0, "KernelIsiMessage: Invalid subblock type", EKernelIsiMessageInvalidValue); + break; + } + } + + COMPONENT_TRACE( ( _T ( "TIsiKernelSubBlock::CompleteSubBlock - return" ) ) ); + OstTrace0( TRACE_NORMAL, DUP1_TISIKERNELSUBBLOCK_COMPLETESUBBLOCK, "TIsiKernelSubBlock::CompleteSubBlock - return" ); + + return iMsg; + + } + +// --------------------------------------------------------- +// DECLARE_STANDARD_EXTENSION +// +// The entrypoint of KernelIsiMessage +// +// --------------------------------------------------------- +DECLARE_STANDARD_EXTENSION() + { + COMPONENT_TRACE( ( _T( "KERNELISIMESSAGE ENTERING" ) ) ); + OstTrace0( TRACE_NORMAL, _DECLARE_STANDARD_EXTENSION, "KernelIsiMessage entering::DECLARE_STANDARD_EXTENSION" ); + + COMPONENT_TRACE( ( _T( "KERNELISIMESSAGE RETURN" ) ) ); + OstTrace0( TRACE_NORMAL, DUP1__DECLARE_STANDARD_EXTENSION, "KernelIsiMessage returning::DECLARE_STANDARD_EXTENSION" ); + + return KErrNone; + } + +//end of file