diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecore/btrace_handler/src/TraceCoreInternalMessageHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecore/btrace_handler/src/TraceCoreInternalMessageHandler.cpp Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,333 @@ +// 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: +// TraceCore configuration message subscriber +// + +#include "TraceCoreInternalMessageHandler.h" +#include "TraceCoreConstants.h" +#include "TraceCoreDebug.h" +#include "TraceCore.h" +#include "TraceCoreMessageSender.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "TraceCoreInternalMessageHandlerTraces.h" +#endif + + + +/** + * TraceCore protocol id + */ +const TInt KOSTTraceCoreProtocolId = 0x91; + +/** + * Version for version query + */ +const TInt KOSTVersionForVersionQuery = 0x00; + +/** + * Version / System protocol id + */ +const TInt KOSTVersionSystemProtocolId= 0x00; + +/** + * Version align request + */ +const TInt KOSTAlignVersionRequest = 0x00; + +/** + * Version align response + */ +const TInt KOSTAlignVersionResponse = 0x01; + +/** + * Version unsupported version error + * const TInt KOSTUnsupportedVersionError = 0xFD; + */ + +/** + * Version MessageSyntaxError + * const TInt KOSTMessageSyntaxError = 0xFE; + */ + +/** + * Version UnknownMessageError + * const TInt KOSTUnknownMessageError = 0xFF; + */ + +/** + * Version MessageSyntaxError + */ +const TInt KOSTNoMatchingVersion = 0xFE; + +/** + * Version UnknownMessageError + * const TInt KOSTUnknownError = 0xFF; + */ + +/** + * Higest supported version + */ +const TInt KOstHigestSupportedVersion = 0x01; + +/** + * Version protocol's transaction id offset after length + * offset related to data after header(4bytes) + * (4) 0 transaction id + * (5) 1 Message id + * (6) 2 Result + * (7) 3 Filler + */ +const TInt KOstVersionProtocolTransactionIdOffset = 0x00; + +/** + * Version protocol's message id offset after length + * offset related to data after header(4bytes) + */ +const TInt KOstVersionProtocolMessageIdOffset = 0x01; + +/** + * Version protocol's Result offset after length + * offset related to data after header(4bytes) + * used only in response + */ +const TInt KOstVersionProtocolResultRespOffset = 0x02; + +/** + * Version protocol's Filler offset after length + * offset related to data after header(4bytes) + * used only in response + */ +const TInt KOstVersionProtocolFillerRespOffset = 0x03; + +/** + * Version protocol's Versions field offset after length + * offset related to data after header(4bytes) + * used only in request + */ +const TInt KOstVersionProtocolVersionsRequestOffset = 0x02; + +/** + * Version protocol's Supported Version field offset after length + * offset related to data after header(4bytes) + * used only in response + */ +const TInt KOstVersionProtocolSupportedVersionsRespOffset = 0x04; + +/** + * KAlignVersionResponseDataLength + */ +const TInt KAlignVersionResponseDataLength = 0x05; + +/** + * Offset to message ID within configuration request + * const TInt KMessageIDOffset = 0; + */ + +/** + * Media selection request length + */ +const TInt KPingReqLength = 1; + +/** + * Data length of response + */ +const TInt KResponseDataLength = 4; + + +/** + * Offset to response message + */ +const TInt KRespMessageIdOffset = 0; + +/** + * Offset to response code + */ +const TInt KRespCodeOffset = 1; + +/** + * Offset to fillers + */ +const TInt KFillerOffset = 2; + +/** + * Filler byte value + */ +const TUint8 KFiller = 0; + + +/** + * Constructor + */ +DTraceCoreInternalMessageHandler::DTraceCoreInternalMessageHandler() + { + } + + +/** + * Destructor + */ +DTraceCoreInternalMessageHandler::~DTraceCoreInternalMessageHandler() + { + } + + +/** + * Init configuration + */ +TInt DTraceCoreInternalMessageHandler::Init() + { + // Subscribe OST + TInt err = Subscribe( KOSTTraceCoreProtocolId, EMessageHeaderFormatOst ); + if(err == KErrNone) + { + err = Subscribe( KOSTVersionSystemProtocolId, EMessageHeaderFormatOst ); + } + TC_TRACE( ETraceLevelFlow, Kern::Printf( "< DTraceCoreInternalMessageHandler::Init - ret: %d", err ) ); + return err; + } + + +/** + * Callback when a trace activation message is received + * + * @param aMsg Reference to message + */ +void DTraceCoreInternalMessageHandler::MessageReceived( TTraceMessage &aMsg ) + { + OstTrace1( TRACE_FLOW, DTraceCoreInternalMessageHandler_MESSAGERECEIVED_ENTRY, "> DTraceCoreInternalMessageHandler::MessageReceived - %d", aMsg.iMessageId); + TInt aVersion( ( *aMsg.iHeader )[ 0 ] ); + + if (aVersion > KOSTVersionForVersionQuery) + { + // Add version check later and return KOSTUnsupportedVersionError if version not supported + + //Check that there is enough data + if ( aMsg.iData->Length() >= KPingReqLength ) + { + TInt messageID( ( *aMsg.iData )[ 0 ] ); + + // Select media request message + if ( messageID == 0x00 /* ping subprotocolId 0x00 in side TraceCore protocol 0x91 */ ) + { + SendResponse( aMsg, messageID ); + } + } + } + else + { + // Version query + HandleOstVersionQuery( aMsg, 0 ); + } + } + + +/** + * Sends a response message + * + * @param aMsg the incoming message + * @param aResult the result code + */ +void DTraceCoreInternalMessageHandler::SendResponse( TTraceMessage& aMsg, TInt aMessageId ) + { + OstTrace1( TRACE_FLOW, DTraceCoreInternalMessageHandler_SENDRESPONSE_ENTRY, "> DTraceCoreInternalMessageHandler::SendResponse - Msg.id %d", aMsg.iMessageId); + TUint8 respCode; + if ( aMessageId == 0x00 ) + { + respCode = 0x01; + } + else + { + respCode = 0x02; + } + + TTraceMessage resp; + TBuf8< KResponseDataLength > respData; + respData.SetLength( KResponseDataLength ); + respData[ KRespMessageIdOffset ] = aMessageId; + respData[ KRespCodeOffset ] = respCode; + for ( TInt i = KFillerOffset; i < KResponseDataLength; i++ ) + { + respData[ i ] = KFiller; + } + // The original header from the request is set back to the message + // -> Media API takes care of formatting the header + resp.iHeader = aMsg.iHeader; + resp.iData = &respData; + resp.iMessageId = KOSTTraceCoreProtocolId; + resp.iMsgFormat = aMsg.iMsgFormat; + iMessageSender->SendMessage( resp ); + } + +/** + * Handle version query + * + * @param aMsg the incoming message + * @param aResult the result code + */ +void DTraceCoreInternalMessageHandler::HandleOstVersionQuery( TTraceMessage& aMsg, TInt /*aMessageId*/ ) + { + OstTrace1( TRACE_NORMAL, DTraceCoreInternalMessageHandler_HandleOstVersionQuery_entry, "DTraceCoreInternalMessageHandler::HandleOstVersionQuery Msg.id - %d", aMsg.iMessageId); + // Check if align request (should be! not other request under version protocol) + TInt higestSupportedVersion( 0x00 ); // 0x00 is sent if no supported version + TInt messageId( ( *aMsg.iData )[ KOstVersionProtocolMessageIdOffset ] ); + + if( messageId == KOSTAlignVersionRequest) + { + // Read the list of supported versions in sender side and compare to phone side version + TInt versions = aMsg.iData->Length() - 2; + for( TInt i = 0; i < versions ; i++ ) + { + TInt version( ( *aMsg.iData )[ KOstVersionProtocolVersionsRequestOffset+i ] ); + + // Compare versions to supported version + // (When more version supported, create list and compare to it) + if ( version == KOstHigestSupportedVersion ) + { + // Supported version found + higestSupportedVersion = version; + } + } + + TUint8 respResult = KOSTNoMatchingVersion; + + if ( higestSupportedVersion != 0x00) + { + // Supported version found + respResult = 0x00; // Succeed + } + + TTraceMessage resp; + TBuf8< KAlignVersionResponseDataLength > respData; + respData.SetLength( KAlignVersionResponseDataLength ); // AlignVersionResponseDataLength + respData[ KOstVersionProtocolTransactionIdOffset ] = 0x00; + respData[ KOstVersionProtocolMessageIdOffset ] = KOSTAlignVersionResponse; + respData[ KOstVersionProtocolResultRespOffset ] = respResult; + respData[ KOstVersionProtocolFillerRespOffset ] = 0x00; // Filler + respData[ KOstVersionProtocolSupportedVersionsRespOffset ] = higestSupportedVersion; + + // The original header from the request is set back to the message + // -> Media API takes care of formatting the header + resp.iHeader = aMsg.iHeader; + resp.iData = &respData; + resp.iMessageId = KOSTVersionSystemProtocolId; + resp.iMsgFormat = aMsg.iMsgFormat; + + iMessageSender->SendMessage( resp ); + + } +} + +// End of File