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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Utility functions for ISI messaging
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
/*
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
NOTE these following values are lifted from s60 env
hgs
parents:
diff changeset
    20
for example pn_const.h is in epoc32\internal
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
but this just includes another version accordinng to variant
hgs
parents:
diff changeset
    23
these are
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
icpr82
hgs
parents:
diff changeset
    26
icpr91
hgs
parents:
diff changeset
    27
icpr92
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
The same is true for  phonetisi.h
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
The #defined values ARE THE SAME for all these variants - thats not to say they wont change in future
hgs
parents:
diff changeset
    32
*/
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
#define ISI_HEADER_OFFSET_MEDIA          0
hgs
parents:
diff changeset
    35
#define ISI_HEADER_OFFSET_RECEIVERDEVICE 1
hgs
parents:
diff changeset
    36
#define ISI_HEADER_OFFSET_SENDERDEVICE   2
hgs
parents:
diff changeset
    37
#define ISI_HEADER_OFFSET_RESOURCEID     3
hgs
parents:
diff changeset
    38
#define ISI_HEADER_OFFSET_LENGTH         4
hgs
parents:
diff changeset
    39
#define ISI_HEADER_OFFSET_RECEIVEROBJECT 6
hgs
parents:
diff changeset
    40
#define ISI_HEADER_OFFSET_SENDEROBJECT   7
hgs
parents:
diff changeset
    41
#define ISI_HEADER_OFFSET_TRANSID        8
hgs
parents:
diff changeset
    42
#define ISI_HEADER_OFFSET_MESSAGEID      9
hgs
parents:
diff changeset
    43
#define ISI_HEADER_OFFSET_SUBMESSAGEID  10
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
#define ISI_HEADER_SIZE                  8
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// For extended resourc id handling
hgs
parents:
diff changeset
    48
#define ISI_HEADER_OFFSET_TYPE          10
hgs
parents:
diff changeset
    49
#define ISI_HEADER_OFFSET_SUBTYPE       11
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
#define PN_HEADER_SIZE                  0x06 /* 6, Note data[0]/[1] excluded */
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
#include "TraceCoreMessageUtils.h"
hgs
parents:
diff changeset
    55
#include "TraceCoreSubscriber.h"
hgs
parents:
diff changeset
    56
#include "TraceCoreOstHeader.h"
hgs
parents:
diff changeset
    57
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    58
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    59
#include "TraceCoreMessageUtilsTraces.h"
hgs
parents:
diff changeset
    60
#endif
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
/*
hgs
parents:
diff changeset
    63
 * ISI header remainder length, 2 + 2 filler bytes
hgs
parents:
diff changeset
    64
 */
hgs
parents:
diff changeset
    65
#ifdef __ISI_SUPPORTED__
hgs
parents:
diff changeset
    66
const TInt KIsiHeaderRemainder = 4;
hgs
parents:
diff changeset
    67
#endif
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*
hgs
parents:
diff changeset
    70
 * Shift one byte
hgs
parents:
diff changeset
    71
 */
hgs
parents:
diff changeset
    72
const TInt KByteShift = 8;
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
/*
hgs
parents:
diff changeset
    75
 * Byte mask value
hgs
parents:
diff changeset
    76
 */
hgs
parents:
diff changeset
    77
const TInt KByteMask = 0xFF;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
/**
hgs
parents:
diff changeset
    81
 * Merges the header and data into a single buffer
hgs
parents:
diff changeset
    82
 *
hgs
parents:
diff changeset
    83
 * @param aMsg Message to be sent.
hgs
parents:
diff changeset
    84
 * @param aMsgBlock The message block where data is merged
hgs
parents:
diff changeset
    85
 * @return Symbian error code
hgs
parents:
diff changeset
    86
 */
hgs
parents:
diff changeset
    87
TInt TTraceCoreMessageUtils::MergeHeaderAndData( const TTraceMessage& aMsg, TDes8& aTarget )
hgs
parents:
diff changeset
    88
	{
hgs
parents:
diff changeset
    89
    TInt ret(KErrNotSupported);
hgs
parents:
diff changeset
    90
    if ( aMsg.iMsgFormat == EMessageHeaderFormatProprietary )
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
#ifdef __ISI_SUPPORTED__
hgs
parents:
diff changeset
    93
        // Merge header and data
hgs
parents:
diff changeset
    94
        aTarget.Copy( *aMsg.iHeader );
hgs
parents:
diff changeset
    95
        aTarget.Append( *aMsg.iData );
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
        // Flip receiver and sender devices
hgs
parents:
diff changeset
    98
        TUint8 tmp = aTarget[ ISI_HEADER_OFFSET_RECEIVERDEVICE ];
hgs
parents:
diff changeset
    99
        aTarget[ ISI_HEADER_OFFSET_RECEIVERDEVICE ] = aTarget[ ISI_HEADER_OFFSET_SENDERDEVICE ];
hgs
parents:
diff changeset
   100
        aTarget[ ISI_HEADER_OFFSET_SENDERDEVICE ] = tmp;
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
        // Flip receiver and sender objects
hgs
parents:
diff changeset
   103
        tmp = aTarget[ ISI_HEADER_OFFSET_RECEIVEROBJECT ];
hgs
parents:
diff changeset
   104
        aTarget[ ISI_HEADER_OFFSET_RECEIVEROBJECT ] = aTarget[ ISI_HEADER_OFFSET_SENDEROBJECT ];
hgs
parents:
diff changeset
   105
        aTarget[ ISI_HEADER_OFFSET_SENDEROBJECT ] = tmp;
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
        // Assign message length
hgs
parents:
diff changeset
   108
        TInt length = aMsg.iHeader->Length() + aMsg.iData->Length() - PN_HEADER_SIZE;
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
#ifndef __WINS__
hgs
parents:
diff changeset
   111
        aTarget[ ISI_HEADER_OFFSET_LENGTH ] = length & 0xFF; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   112
        aTarget[ ISI_HEADER_OFFSET_LENGTH + 1 ] = ( length >> 8 ) & 0xFF; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   113
#else
hgs
parents:
diff changeset
   114
        aTarget[ ISI_HEADER_OFFSET_LENGTH + 1 ] = length & 0xFF; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   115
        aTarget[ ISI_HEADER_OFFSET_LENGTH] = ( length >> 8 ) & 0xFF; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   116
#endif
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
        // Assign new message ID
hgs
parents:
diff changeset
   119
        aTarget[ ISI_HEADER_OFFSET_MESSAGEID ] = aMsg.iMessageId;
hgs
parents:
diff changeset
   120
        ret = KErrNone;
hgs
parents:
diff changeset
   121
#endif  // __ISI_SUPPORTED__
hgs
parents:
diff changeset
   122
        }
hgs
parents:
diff changeset
   123
    else
hgs
parents:
diff changeset
   124
        if (aMsg.iMsgFormat == EMessageHeaderFormatOst)
hgs
parents:
diff changeset
   125
            {
hgs
parents:
diff changeset
   126
            // Merge header and data
hgs
parents:
diff changeset
   127
            aTarget.Copy( *aMsg.iHeader);
hgs
parents:
diff changeset
   128
            aTarget.Append( *aMsg.iData);
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
            // Assign message length
hgs
parents:
diff changeset
   132
            TUint16 length = aMsg.iHeader->Length() + aMsg.iData->Length()
hgs
parents:
diff changeset
   133
                    - OstHeader::OstBaseProtocol::KOstBaseHeaderSize;
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
            aTarget[ OstHeader::OstBaseProtocol::KOstHeaderLengthOffset ] = (length >> KByteShift ) & KByteMask;
hgs
parents:
diff changeset
   136
            aTarget[ OstHeader::OstBaseProtocol::KOstHeaderLengthOffset + 1 ] = length & KByteMask;
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
            // Assign new message ID
hgs
parents:
diff changeset
   139
            aTarget[ OstHeader::OstBaseProtocol::KOstHeaderProtocolIdOffset ] = aMsg.iMessageId;
hgs
parents:
diff changeset
   140
            ret = KErrNone;
hgs
parents:
diff changeset
   141
            }
hgs
parents:
diff changeset
   142
    return ret;
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
/**
hgs
parents:
diff changeset
   147
 * Get the message length
hgs
parents:
diff changeset
   148
 *
hgs
parents:
diff changeset
   149
 * @param aMsg Message to be sent.
hgs
parents:
diff changeset
   150
 * @return length or -1 if not valid
hgs
parents:
diff changeset
   151
 */
hgs
parents:
diff changeset
   152
TInt TTraceCoreMessageUtils::GetMessageLength( const TTraceMessage& aMsg )
hgs
parents:
diff changeset
   153
    {
hgs
parents:
diff changeset
   154
    TInt msgLength = -1;
hgs
parents:
diff changeset
   155
    if ( aMsg.iMsgFormat == EMessageHeaderFormatProprietary )
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
#ifdef __ISI_SUPPORTED__
hgs
parents:
diff changeset
   158
        // Get message length
hgs
parents:
diff changeset
   159
        msgLength = aMsg.iData->Length();
hgs
parents:
diff changeset
   160
        if ( aMsg.iHeader != NULL )
hgs
parents:
diff changeset
   161
            {
hgs
parents:
diff changeset
   162
            TInt hdrLen( aMsg.iHeader->Length() );
hgs
parents:
diff changeset
   163
            // Message header length must be valid
hgs
parents:
diff changeset
   164
            if ( hdrLen == ( ISI_HEADER_SIZE + KIsiHeaderRemainder ) )
hgs
parents:
diff changeset
   165
                {
hgs
parents:
diff changeset
   166
                msgLength += hdrLen;
hgs
parents:
diff changeset
   167
                }
hgs
parents:
diff changeset
   168
            else
hgs
parents:
diff changeset
   169
                {
hgs
parents:
diff changeset
   170
                OstTrace1( TRACE_IMPORTANT , TTRACECOREISAUTILS_GETMESSAGELENGTH_INVALID_HEADER_LENGTH, "TTraceCoreIsaUtils::GetMessageLength - ISI header length was not valid. Len:%d", hdrLen );
hgs
parents:
diff changeset
   171
                msgLength = -1;
hgs
parents:
diff changeset
   172
                }
hgs
parents:
diff changeset
   173
            }
hgs
parents:
diff changeset
   174
        else
hgs
parents:
diff changeset
   175
            {
hgs
parents:
diff changeset
   176
            // If message length is not enough for valid ISI message, an error is returned
hgs
parents:
diff changeset
   177
            if ( msgLength < ( ISI_HEADER_SIZE + KIsiHeaderRemainder ) )
hgs
parents:
diff changeset
   178
                {
hgs
parents:
diff changeset
   179
                OstTrace1( TRACE_IMPORTANT , TTRACECOREISAUTILS_GETMESSAGELENGTH_MESSAGE_TOO_SHORT, "TTraceCoreIsaUtils::GetMessageLength - Message is too short. Len:%d", msgLength );
hgs
parents:
diff changeset
   180
                msgLength = -1;
hgs
parents:
diff changeset
   181
                }
hgs
parents:
diff changeset
   182
            }
hgs
parents:
diff changeset
   183
#endif // __ISI_SUPPORTED__
hgs
parents:
diff changeset
   184
        }
hgs
parents:
diff changeset
   185
    else
hgs
parents:
diff changeset
   186
        if (aMsg.iMsgFormat == EMessageHeaderFormatOst)
hgs
parents:
diff changeset
   187
            {
hgs
parents:
diff changeset
   188
            // Get message length
hgs
parents:
diff changeset
   189
            msgLength = aMsg.iData->Length();
hgs
parents:
diff changeset
   190
            if (aMsg.iHeader != NULL)
hgs
parents:
diff changeset
   191
                {
hgs
parents:
diff changeset
   192
                TInt hdrLen(aMsg.iHeader->Length() );
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
                // Message header length must be valid
hgs
parents:
diff changeset
   195
                if (hdrLen == ( OstHeader::OstBaseProtocol::KOstBaseHeaderSize ))
hgs
parents:
diff changeset
   196
                    {
hgs
parents:
diff changeset
   197
                    msgLength += hdrLen;
hgs
parents:
diff changeset
   198
                    }
hgs
parents:
diff changeset
   199
                else
hgs
parents:
diff changeset
   200
                    {
hgs
parents:
diff changeset
   201
                    msgLength = -1;
hgs
parents:
diff changeset
   202
                    }
hgs
parents:
diff changeset
   203
                }
hgs
parents:
diff changeset
   204
            else
hgs
parents:
diff changeset
   205
                {
hgs
parents:
diff changeset
   206
#ifdef __ISI_SUPPORTED__
hgs
parents:
diff changeset
   207
                // If message length is not enough for valid ISI message, an error is returned
hgs
parents:
diff changeset
   208
                if (msgLength < ( ISI_HEADER_SIZE + KIsiHeaderRemainder ))
hgs
parents:
diff changeset
   209
                    {
hgs
parents:
diff changeset
   210
                    msgLength = -1;
hgs
parents:
diff changeset
   211
                    }
hgs
parents:
diff changeset
   212
#endif // __ISI_SUPPORTED__
hgs
parents:
diff changeset
   213
                }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
            }
hgs
parents:
diff changeset
   216
        else
hgs
parents:
diff changeset
   217
			{
hgs
parents:
diff changeset
   218
			OstTrace0( TRACE_IMPORTANT , TRACECOREMESSAGEUTILS_GETMESSAGELENGTH_NOT_SUPPORTED, "TraceCoreMessageUtils::GetMessageLength - Format not supported");
hgs
parents:
diff changeset
   219
			msgLength = -1;
hgs
parents:
diff changeset
   220
			}
hgs
parents:
diff changeset
   221
    OstTrace1( TRACE_FLOW, TRACECOREMESSAGEUTILS_GETMESSAGELENGTH_EXIT, "< TraceCoreMessageUtils::GetMessageLength. Len:%d", msgLength );
hgs
parents:
diff changeset
   222
    return msgLength;
hgs
parents:
diff changeset
   223
    }