bluetoothengine/bteng/inc/debug.h
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bteng/inc/debug.h	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,190 @@
+/*
+* Copyright (c) 2006 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:  This file defines logging macros for bteng
+*
+*/
+
+
+
+#ifndef BTENG_DEBUG_H
+#define BTENG_DEBUG_H
+
+
+#include "prjconfig.h"
+#include <bttypes.h>
+#ifdef PRJ_ENABLE_TRACE
+
+#ifdef PRJ_FILE_TRACE
+#include <flogger.h>
+#else   //PRJ_FILE_TRACE
+#include <e32debug.h>
+#endif  PRJ_FILE_TRACE
+
+
+/**
+ * Tracing levels definitions.
+ * This enables tracing of different levels of information.
+ */
+_LIT( KBTEngLogFile, "btenglog.txt" );  // Log file
+_LIT( KBTEngLogDir, "bt" );             // Log file location
+
+
+// Print options:
+#define KPRINTERROR	 0x00000001         // Print error
+#define KPRINTFTRACE 0x00000002         // Print function trace
+const TInt KBTEngDebugMask = 0x00000001 | 0x00000002;
+
+
+/**
+ * Handlers below are used for formatting debug prints,
+ * to trucate rather than panic the caller.
+ */
+NONSHARABLE_CLASS( TBTEngOverflowTruncate8 ) : public TDes8Overflow
+    {
+public:
+    void Overflow( TDes8& /*aDes*/ ) {}
+    };
+
+
+NONSHARABLE_CLASS( TBTEngOverflowTruncate16 ) : public TDes16Overflow
+    {
+public:
+    void Overflow( TDes16& /*aDes*/ ) {}
+    };
+
+
+inline void DebugPrint( TRefByValue<const TDesC8> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat( KBTEngLogDir, KBTEngLogFile, EFileLoggingModeAppend, aFmt, list);
+#ifdef MEMTRACE
+    TInt size;
+    User::Heap().AllocSize( size );
+    RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, _L( "[BTEng]\t Memory usage: %d; high: %d" ), size, User::Heap().Size() );
+#endif  // MEMTRACE
+#else   // PRJ_FILE_TRACE
+    TBuf8<0x100> logString;
+    TBTEngOverflowTruncate8 overflow;
+    logString.AppendFormatList( aFmt, list, &overflow );
+    TBuf16<0x100> buf16;
+    buf16.Copy( logString );
+    TRefByValue<const TDesC16> tmpFmt( _L( "%S" ) );
+    RDebug::Print( tmpFmt, &buf16 );
+#endif  // PRJ_FILE_TRACE
+    }
+
+
+inline void DebugPrint( TRefByValue<const TDesC16> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+#ifdef PRJ_FILE_TRACE
+    RFileLogger::WriteFormat( KBTEngLogDir, KBTEngLogFile, EFileLoggingModeAppend, aFmt, list );
+#ifdef MEMTRACE
+    TInt size;
+    User::Heap().AllocSize( size );
+    RFileLogger::WriteFormat( KLogDir, KLogFile, EFileLoggingModeAppend, _L( "[BTEng]\t Memory usage: %d; high: %d" ), size, User::Heap().Size() );
+#endif  // MEMTRACE
+#else   // PRJ_FILE_TRACE
+    TBuf16<0x100> logString;
+    TBTEngOverflowTruncate16 overflow;
+    logString.AppendFormatList( aFmt, list, &overflow );
+    RDebug::Print( logString );
+#endif   // PRJ_FILE_TRACE
+    }
+
+
+inline TBuf8<0x100> DebugFormat( TRefByValue<const TDesC16> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    TBuf<0x100> buf;
+    TBTEngOverflowTruncate16 overflow;
+    buf.AppendFormatList( aFmt, list, &overflow );
+    TBuf8<0x100> buf8;
+    buf8.Copy( buf );
+    return buf8;
+    }
+
+
+inline void DebugPrintToHex( const TDesC8& aDes )
+    {
+    for( TInt i = 0; i < aDes.Length(); ++i )
+        {
+        DebugPrint( _L( "[BTENG]\t %02x" ), aDes[i] );
+        }
+    }
+
+inline void DebugPrintBDAddr(const TBTDevAddr& aAddr)
+    {
+    TBuf<16> addrdes;
+    aAddr.GetReadable(addrdes);
+    DebugPrint(_L("[BTENG]\t BD addr %S") , &addrdes);   
+    }
+
+_LIT( KTracePrefix, "[BTENG]\t " );
+_LIT8( KFuncEntryFormat8, "[BTENG]\t %S >>" );
+_LIT8( KFuncEntryArgFormat8, "[BTENG]\t %S >> %S" );
+_LIT8( KFuncExitFormat8, "[BTENG]\t %S <<" );
+_LIT8( KFuncExitResFormat8, "[BTENG]\t %S << %S" );
+
+
+#define TRACE_INFO( a ) { if( KBTEngDebugMask & KPRINTFTRACE ) DebugPrint a; }
+
+#define TRACE_ERROR( a ) { if( KBTEngDebugMask & KPRINTERROR ) DebugPrint a; }
+
+#define TRACE_FUNC_ENTRY { if( KBTEngDebugMask & KPRINTFTRACE ) { \
+                                TPtrC8 ptr( (TUint8*) __PRETTY_FUNCTION__ ); \
+                                DebugPrint( KFuncEntryFormat8, &ptr ); } }
+
+
+#define TRACE_FUNC_EXIT { if( KBTEngDebugMask & KPRINTFTRACE ) { \
+                                TPtrC8 ptr( (TUint8*) __PRETTY_FUNCTION__ ); \
+                                DebugPrint( KFuncExitFormat8, &ptr ); } }
+
+
+#define TRACE_FUNC_ARG( a ) { if( KBTEngDebugMask & KPRINTFTRACE ) { \
+                                TPtrC8 func( (TUint8*) __PRETTY_FUNCTION__ ); \
+                                TPtrC8 arg( DebugFormat a ); \
+                                DebugPrint( KFuncEntryArgFormat8, &func, &arg ); } }
+
+
+#define TRACE_FUNC_RES( a ) { if( KBTEngDebugMask & KPRINTFTRACE ) { \
+                                TPtrC8 func( (TUint8*) __PRETTY_FUNCTION__ ); \
+                                TPtrC8 res( DebugFormat a ); \
+                                DebugPrint( KFuncExitResFormat8, &func, &res ); } }
+
+#define TRACE_BDADDR( a ) { if( KBTEngDebugMask & KPRINTFTRACE ) DebugPrintBDAddr(a); }
+
+#else // PRJ_ENABLE_TRACE
+
+#define TRACE_INFO( a )
+
+#define TRACE_ERROR( a )
+
+#define TRACE_FUNC_ENTRY
+
+#define TRACE_FUNC_EXIT
+
+#define TRACE_FUNC_ARG( a )
+
+#define TRACE_FUNC_RES( a )
+
+#define TRACE_BDADDR( a )
+
+#endif // PRJ_ENABLE_TRACE
+
+#endif // BTENG_DEBUG_H