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