tracesrv/tracecore/btrace_handler/src/TraceCoreMessageUtils.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041

// 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;
    }