tracesrv/tracecore/btrace_handler/src/TraceCoreOstLddIf.cpp
changeset 56 aa2539c91954
--- /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<TUint32>(&(TraceCoreOstLddIf->iReceiveDfc));
+            break;
+            }
+        case EGetBuf:
+            {
+            ret = reinterpret_cast<TUint32>(&(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