diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecore/btrace_handler/src/TraceCoreOstLddIf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecore/btrace_handler/src/TraceCoreOstLddIf.cpp Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,313 @@ +// 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: +// Trace Core +// + +#include "TraceCore.h" +#include "TraceCoreOstLddIf.h" +#include "TraceCoreDebug.h" +#include "TraceCoreMediaIfCallback.h" +#include "TraceCoreSubscriber.h" +#include "TraceCoreMessageUtils.h" +#include "TraceCoreOstHeader.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "TraceCoreOstLddIfTraces.h" +#endif + +/** + * Default DFC queue priority + */ +const TUint8 KDefaultDfcPriority = 3; + +/** + * Prints a message + * + * @param aMsg Reference to a message. + */ +static void DebugPrintMsg( const TDesC8& /*aMsg*/ ) + { + // Message structure print + } + +static DTraceCoreOstLddIf* TraceCoreOstLddIf = NULL; + +/** + * Constructor + */ +DTraceCoreOstLddIf::DTraceCoreOstLddIf() +: DTraceCoreMediaIf( KMediaIfSendSupported | KMediaIfSendTraceSupported ) +, iReceiveDfc( DTraceCoreOstLddIf::ReceiveDfc, this, DTraceCore::GetActivationQ(), KDefaultDfcPriority ) +, iStatus( 0 ) +, iTraceCoreOstConnectionRegistered( EFalse ) +, iTraceCoreOstConnection( NULL ) + { + // No implementation in constructor + } + + +/** + * Destructor + */ +DTraceCoreOstLddIf::~DTraceCoreOstLddIf() + { + iCallback = NULL; + } + + +/** + * Initializes the OstLddIf + * + * @param aCallBack Callback to TraceCore + */ +TInt DTraceCoreOstLddIf::Init( MTraceCoreMediaIfCallback& aCallback ) + { + iCallback = &aCallback; + TraceCoreOstLddIf = this; + return KErrNone; + } + + +/** + * Handle incoming messages from OstConnection + * + * @param aPtr Pointer to DTraceCoreOstLddIf class. + */ +void DTraceCoreOstLddIf::ReceiveDfc( TAny* aPtr ) + { + DTraceCoreOstLddIf* TraceCoreOstLddIf = static_cast< DTraceCoreOstLddIf* >( aPtr ); + __ASSERT_DEBUG( TraceCoreOstLddIf != NULL, Kern::Fault( "DTraceCoreOstLddIf::ReceiveDfc - NULL", KErrGeneral ) ); + TraceCoreOstLddIf->ReceiveDfc(); + } + + +/** + * Processes incoming OST messages + */ +void DTraceCoreOstLddIf::ReceiveDfc() + { + // Determine the message we received + if ( iReceiveBuffer.Length() > OstHeader::OstBaseProtocol::KOstHeaderLengthOffset ) + { + DebugPrintMsg ( iReceiveBuffer ); + if ( iCallback != NULL ) + { + NotifyCallback(); + } + } + } + + +/** + * Notifies the callback with the incoming message + * + * @return one of symbian error codes + */ +void DTraceCoreOstLddIf::NotifyCallback() + { + // Header length is header size + remainders + TInt headerLength = OstHeader::OstBaseProtocol::KOstBaseHeaderSize; + + // Check message ID + TTraceMessage traceMsg; + traceMsg.iMessageId = iReceiveBuffer[ OstHeader::OstBaseProtocol::KOstHeaderProtocolIdOffset ]; + + // If message ID is TraceCore Protocol, the header is longer and the message ID might be in different place + if (traceMsg.iMessageId == OstConstants::OstBaseProtocol::KOstTraceCoreProtocol) + { + headerLength += OstHeader::OstTraceCoreProtocol::KHeaderSize; + + // Subscriber protocol + if (iReceiveBuffer[ OstHeader::OstBaseProtocol::KOstBaseHeaderSize + + OstHeader::OstTraceCoreProtocol::KProtocolIdOffset ] == + OstHeader::OstTraceCoreProtocol::KSubscriberProtocol) + { + traceMsg.iMessageId = iReceiveBuffer[ OstHeader::OstBaseProtocol::KOstBaseHeaderSize + + OstHeader::OstTraceCoreProtocol::KSubscriberIdOffset ]; + } + } + + if ( iReceiveBuffer.Length() < headerLength ) + { + headerLength = iReceiveBuffer.Length(); + } + + // Create TraceMessage + TPtrC header( iReceiveBuffer.Ptr(), headerLength ); + TPtrC data( NULL, 0 ); + if ( iReceiveBuffer.Length() > headerLength ) { + data.Set( iReceiveBuffer.Ptr() + headerLength, iReceiveBuffer.Length() - headerLength ); + } + + traceMsg.iMsgFormat = EMessageHeaderFormatOst; + traceMsg.iHeader = &header; + traceMsg.iData = &data; + + // Set Sender media to be same as receiver + iCallback->SetSenderMedia(this); + + iCallback->MessageReceived( traceMsg ); + } + + +/** + * Sends messages to USB OstConnection + * + * @param aMsg Message to be sent. + * @return KErrNone if send successful + */ +TInt DTraceCoreOstLddIf::Send( TTraceMessage& aMsg ) + { + TInt ret = KErrArgument; + if ( aMsg.iData != NULL ) + { + ret = TTraceCoreMessageUtils::GetMessageLength( aMsg ); + if ( ret > 0 ) + { + // First send the phone formatted start character + // Send trace data and end trace + SendData( aMsg ); + if ( aMsg.iHeader != NULL ) + { + DebugPrintMsg( iSendBuffer ); + } + else + { + DebugPrintMsg( *aMsg.iData ); + } + } + else + { + ret = KErrArgument; + } + } + + return ret; + } + + +/** + * Sends message to TraceCoreOstLdd + * + * @param aMsg Message to be sent. + */ +void DTraceCoreOstLddIf::SendData( TTraceMessage& aMsg ) + { + if ( aMsg.iHeader != NULL ) + { + // Utility function is used to merge the data + TInt ret = TTraceCoreMessageUtils::MergeHeaderAndData( aMsg, iSendBuffer ); + + if ( ret == KErrNone ) + { + if(iTraceCoreOstConnection) + { + iTraceCoreOstConnection->TxMessage( iSendBuffer ); + } + } + } + else + { + // Header doesn't exists, all data is in data part + } + } + + +/** + * Similar to send, except does not generate traces, since they would loop back to this function + * + * @param aMsg Message to be sent. + * @return KErrNone if send successful + */ +TInt DTraceCoreOstLddIf::SendTrace(const TDesC8& aMsg) + { + TInt ret(KErrNone); + + if ( iTraceCoreOstConnection && iTraceCoreOstConnectionRegistered ) + { + iTraceCoreOstConnection->TxMessage(aMsg); + } + else + { + ret = KErrGeneral; + } + + return ret; + } + + +/** + * GetSet + * + * @param aFunc Function choosed (@see ETraceCoreOstLddIfGetSet) + * @return TDfc* if aFunc is EGetDfc, TDes8* EGetBuf and 0 with ESetWriter. + */ +EXPORT_C TUint32 DTraceCoreOstLddIf::GetSet(TTraceCoreOstLddIfGetSet aFunc, TUint32 aParam) + { + OstTraceExt2( TRACE_FLOW, DTRACECOREOSTLDDIF_GETSET_ENTRY, "> DTraceCoreOstLddIf::GetSet aFunc:%d, aParam:%d", aFunc, aParam ); + + TUint32 ret(0); + switch(aFunc) + { + case EGetDfc: + { + TraceCoreOstLddIf->iTraceCoreOstConnectionRegistered = ETrue; + ret = reinterpret_cast(&(TraceCoreOstLddIf->iReceiveDfc)); + break; + } + case EGetBuf: + { + ret = reinterpret_cast(&(TraceCoreOstLddIf->iReceiveBuffer)); + break; + } + case ESetWriter: + { + // Set Writer to XTI if parameter is 0, otherwise USB + DTraceCore* traceCore = DTraceCore::GetInstance(); + if ( traceCore != NULL ) + { + // TraceSwitch uses 0 for XTI writer and 1 to OST writer + // So it is not mapping one to one to enum found in TraceCoreWriter.h + // for example to EWriterTypeXTI = 1 + // See TraceCoreWriter.h + if(aParam==0) + { + traceCore->SwitchToWriter(EWriterTypeXTI); + } + else if(aParam==1) + { + traceCore->SwitchToWriter(EWriterTypeUSBPhonet); + } + // For other writers (>2) we use same as the enum + else if(aParam > EWriterTypeUSBPhonet) + { + traceCore->SwitchToWriter((TWriterType) aParam); + } + } + break; + } + case ERegister: + { + TraceCoreOstLddIf->iTraceCoreOstConnection = (MTraceCoreOstConnectionIf*)aParam; + break; + } + default: + __ASSERT_DEBUG( EFalse, Kern::Fault( "DTraceCoreOstLddIf::GetSet: Default case!", KErrArgument ) ); + break; + } + + return ret; + } + +// End of File