diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecore/btrace_handler/src/TraceCoreMessageUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecore/btrace_handler/src/TraceCoreMessageUtils.cpp Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,223 @@ +// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// Utility functions for ISI messaging +// + +/* + +NOTE these following values are lifted from s60 env +for example pn_const.h is in epoc32\internal + +but this just includes another version accordinng to variant +these are + +icpr82 +icpr91 +icpr92 + +The same is true for phonetisi.h + +The #defined values ARE THE SAME for all these variants - thats not to say they wont change in future +*/ + +#define ISI_HEADER_OFFSET_MEDIA 0 +#define ISI_HEADER_OFFSET_RECEIVERDEVICE 1 +#define ISI_HEADER_OFFSET_SENDERDEVICE 2 +#define ISI_HEADER_OFFSET_RESOURCEID 3 +#define ISI_HEADER_OFFSET_LENGTH 4 +#define ISI_HEADER_OFFSET_RECEIVEROBJECT 6 +#define ISI_HEADER_OFFSET_SENDEROBJECT 7 +#define ISI_HEADER_OFFSET_TRANSID 8 +#define ISI_HEADER_OFFSET_MESSAGEID 9 +#define ISI_HEADER_OFFSET_SUBMESSAGEID 10 + +#define ISI_HEADER_SIZE 8 + +// For extended resourc id handling +#define ISI_HEADER_OFFSET_TYPE 10 +#define ISI_HEADER_OFFSET_SUBTYPE 11 + + +#define PN_HEADER_SIZE 0x06 /* 6, Note data[0]/[1] excluded */ + +#include "TraceCoreMessageUtils.h" +#include "TraceCoreSubscriber.h" +#include "TraceCoreOstHeader.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "TraceCoreMessageUtilsTraces.h" +#endif + +/* + * ISI header remainder length, 2 + 2 filler bytes + */ +#ifdef __ISI_SUPPORTED__ +const TInt KIsiHeaderRemainder = 4; +#endif + +/* + * Shift one byte + */ +const TInt KByteShift = 8; + +/* + * Byte mask value + */ +const TInt KByteMask = 0xFF; + + +/** + * Merges the header and data into a single buffer + * + * @param aMsg Message to be sent. + * @param aMsgBlock The message block where data is merged + * @return Symbian error code + */ +TInt TTraceCoreMessageUtils::MergeHeaderAndData( const TTraceMessage& aMsg, TDes8& aTarget ) + { + TInt ret(KErrNotSupported); + if ( aMsg.iMsgFormat == EMessageHeaderFormatProprietary ) + { +#ifdef __ISI_SUPPORTED__ + // Merge header and data + aTarget.Copy( *aMsg.iHeader ); + aTarget.Append( *aMsg.iData ); + + // Flip receiver and sender devices + TUint8 tmp = aTarget[ ISI_HEADER_OFFSET_RECEIVERDEVICE ]; + aTarget[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] = aTarget[ ISI_HEADER_OFFSET_SENDERDEVICE ]; + aTarget[ ISI_HEADER_OFFSET_SENDERDEVICE ] = tmp; + + // Flip receiver and sender objects + tmp = aTarget[ ISI_HEADER_OFFSET_RECEIVEROBJECT ]; + aTarget[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] = aTarget[ ISI_HEADER_OFFSET_SENDEROBJECT ]; + aTarget[ ISI_HEADER_OFFSET_SENDEROBJECT ] = tmp; + + // Assign message length + TInt length = aMsg.iHeader->Length() + aMsg.iData->Length() - PN_HEADER_SIZE; + +#ifndef __WINS__ + aTarget[ ISI_HEADER_OFFSET_LENGTH ] = length & 0xFF; // CodForChk_Dis_Magic + aTarget[ ISI_HEADER_OFFSET_LENGTH + 1 ] = ( length >> 8 ) & 0xFF; // CodForChk_Dis_Magic +#else + aTarget[ ISI_HEADER_OFFSET_LENGTH + 1 ] = length & 0xFF; // CodForChk_Dis_Magic + aTarget[ ISI_HEADER_OFFSET_LENGTH] = ( length >> 8 ) & 0xFF; // CodForChk_Dis_Magic +#endif + + // Assign new message ID + aTarget[ ISI_HEADER_OFFSET_MESSAGEID ] = aMsg.iMessageId; + ret = KErrNone; +#endif // __ISI_SUPPORTED__ + } + else + if (aMsg.iMsgFormat == EMessageHeaderFormatOst) + { + // Merge header and data + aTarget.Copy( *aMsg.iHeader); + aTarget.Append( *aMsg.iData); + + + // Assign message length + TUint16 length = aMsg.iHeader->Length() + aMsg.iData->Length() + - OstHeader::OstBaseProtocol::KOstBaseHeaderSize; + + aTarget[ OstHeader::OstBaseProtocol::KOstHeaderLengthOffset ] = (length >> KByteShift ) & KByteMask; + aTarget[ OstHeader::OstBaseProtocol::KOstHeaderLengthOffset + 1 ] = length & KByteMask; + + // Assign new message ID + aTarget[ OstHeader::OstBaseProtocol::KOstHeaderProtocolIdOffset ] = aMsg.iMessageId; + ret = KErrNone; + } + return ret; + } + + +/** + * Get the message length + * + * @param aMsg Message to be sent. + * @return length or -1 if not valid + */ +TInt TTraceCoreMessageUtils::GetMessageLength( const TTraceMessage& aMsg ) + { + TInt msgLength = -1; + if ( aMsg.iMsgFormat == EMessageHeaderFormatProprietary ) + { +#ifdef __ISI_SUPPORTED__ + // Get message length + msgLength = aMsg.iData->Length(); + if ( aMsg.iHeader != NULL ) + { + TInt hdrLen( aMsg.iHeader->Length() ); + // Message header length must be valid + if ( hdrLen == ( ISI_HEADER_SIZE + KIsiHeaderRemainder ) ) + { + msgLength += hdrLen; + } + else + { + OstTrace1( TRACE_IMPORTANT , TTRACECOREISAUTILS_GETMESSAGELENGTH_INVALID_HEADER_LENGTH, "TTraceCoreIsaUtils::GetMessageLength - ISI header length was not valid. Len:%d", hdrLen ); + msgLength = -1; + } + } + else + { + // If message length is not enough for valid ISI message, an error is returned + if ( msgLength < ( ISI_HEADER_SIZE + KIsiHeaderRemainder ) ) + { + OstTrace1( TRACE_IMPORTANT , TTRACECOREISAUTILS_GETMESSAGELENGTH_MESSAGE_TOO_SHORT, "TTraceCoreIsaUtils::GetMessageLength - Message is too short. Len:%d", msgLength ); + msgLength = -1; + } + } +#endif // __ISI_SUPPORTED__ + } + else + if (aMsg.iMsgFormat == EMessageHeaderFormatOst) + { + // Get message length + msgLength = aMsg.iData->Length(); + if (aMsg.iHeader != NULL) + { + TInt hdrLen(aMsg.iHeader->Length() ); + + // Message header length must be valid + if (hdrLen == ( OstHeader::OstBaseProtocol::KOstBaseHeaderSize )) + { + msgLength += hdrLen; + } + else + { + msgLength = -1; + } + } + else + { +#ifdef __ISI_SUPPORTED__ + // If message length is not enough for valid ISI message, an error is returned + if (msgLength < ( ISI_HEADER_SIZE + KIsiHeaderRemainder )) + { + msgLength = -1; + } +#endif // __ISI_SUPPORTED__ + } + + } + else + { + OstTrace0( TRACE_IMPORTANT , TRACECOREMESSAGEUTILS_GETMESSAGELENGTH_NOT_SUPPORTED, "TraceCoreMessageUtils::GetMessageLength - Format not supported"); + msgLength = -1; + } + OstTrace1( TRACE_FLOW, TRACECOREMESSAGEUTILS_GETMESSAGELENGTH_EXIT, "< TraceCoreMessageUtils::GetMessageLength. Len:%d", msgLength ); + return msgLength; + }