--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/inc/debug.h Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,254 @@
+// Copyright (c) 1999-2009 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:
+// Central place for nice debug-type macros & functions
+//
+//
+
+#ifndef BT_DEBUG_H
+#define BT_DEBUG_H
+
+#ifdef __USING_POLICING_ESOCK__
+#undef __USING_POLICING_ESOCK__
+#endif
+//#define __USING_POLICING_ESOCK__
+
+#include <e32std.h>
+#include <f32file.h>
+#include <comms-infras/commsdebugutility.h>
+
+#ifdef __FLOG_ACTIVE // = commsdbg logging on
+//#define BLOGGING__ //removed for MCL submission
+#define __FLOGGING__
+#endif // __FLOG_ACTIVE
+
+// Borrowed from comms-framework - experimental ASSERT variants that
+// breakpt at the scene of the crime.
+#ifdef _DEBUG
+#if defined (__WINS__)
+#undef __ASSERT_DEBUG
+inline void About_To_Panic_Thread() { __DEBUGGER() }
+#define __ASSERT_DEBUG(c,p) (void)((c)||(About_To_Panic_Thread(),p,0))
+#undef __ASSERT_ALWAYS
+#define __ASSERT_ALWAYS(c,p) (void)((c)||(About_To_Panic_Thread(),p,0))
+#endif
+#endif
+
+
+class CBlogger;
+class CDeltaTimer;
+class CDebugControlInterface;
+class CAvdtpLogEngine;
+class CAvctpLogEngine;
+
+struct SBtTls
+ {
+public:
+ CDeltaTimer* iTimer; // always needed: not owned
+ TUint iPort; // the serial port we are on - for logging only
+ CBlogger* iBlogger; // for logging only
+ CDebugControlInterface* iDebugCtrlIF;
+ CAvdtpLogEngine* iAvdtpLogEngine;
+ CAvctpLogEngine* iAvctpLogEngine;
+ };
+
+#define BTTLS static_cast<SBtTls*>(Dll::Tls())
+
+#ifdef __USING_POLICING_ESOCK__
+#else
+enum TCapabilityRequestType
+ {
+ //Socket Capability
+ ESetOptCheck,
+ EGetOptCheck,
+ EIoctlCheck,
+ EBindCheck,
+ EListenCheck,
+ EConnectionCheck,
+ EWriteCheck,
+ EReceiveCheck,
+ EGetLocalNameCheck,
+ EGetRemoteNameCheck,
+
+ //HostResolver
+ EHRGetByNameCheck,
+ EHRGetByAddressCheck,
+ EHRSetHostNameCheck,
+ EHRGetHostNameCheck,
+
+ // NetDataBase
+ ENDQueryCheck,
+ ENDAddCheck,
+ ENDRemoveCheck,
+
+ // ServiceResolver
+ ESRGetByNameCheck,
+ ESRGetByNumberCheck,
+ ESRRegisterServiceCheck,
+ ESRRemoveServiceCheck,
+
+ //Cconnection
+ EReadCommdbCheck,
+ EControlCheck
+ };
+
+#endif
+
+
+static const TInt KL2CAPDebugOptionMask = 0xFFFF; //< SetOpt for debugging modes in L2CAP
+static const TUint KL2CAPDebugSendRequestsTwice = 1; //< Send L2CAP requests twice
+static const TUint KL2CAPDebugInvalidL2CAPLengthInConnect= 3; //< Set the L2CAP length wrong
+static const TUint KL2CAPDebugInvalidL2CAPLengthInData=4;//< Set the L2CAP length wrong
+
+#ifndef LOGGER_H
+
+_LIT(KLogFile,"btlog0.txt");
+const TInt KLogIndexOffset=5;
+_LIT(KLogDirFullName,"c:\\logs\\bt\\");
+_LIT(KLogDir,"BT");
+
+//#define COMMENT SLASH(/)
+#define COMMENT
+//#define SLASH(s) /##s
+#ifndef BLOGGING__
+// define empty blogging macro stubs
+#define BLOGGER COMMENT
+#define BLOG(layer,verbosity,type,blog_call,cbloggette_type) COMMENT
+//------- Blogging for BT Qual ------------
+#define LLQBLOG(type,blog_call) COMMENT
+#define L2QBLOG(type,blog_call) COMMENT
+#define RFQBLOG(type,blog_call) COMMENT
+//------- Loud Blogging Calls -------------
+#define LLLBLOG(type,blog_call) COMMENT
+#define L2LBLOG(type,blog_call) COMMENT
+#define RFLBLOG(type,blog_call) COMMENT
+//------- Generic Blogging calls ----------
+#define LLBLOG(verbosity,type,blog_call) COMMENT
+#define L2BLOG(verbosity,type,blog_call) COMMENT
+#define RFBLOG(verbosity,type,blog_call) COMMENT
+#else // define blogging calls
+#define BLOGGER BTTLS->iBlogger
+#define BLOG(layer,verbosity,type,blog_call,cbloggette_type) \
+ { \
+ CBlogger* pBlog = BLOGGER; \
+ CBloggette* pBloggette;\
+ if((pBlog->LoggingMask(layer,verbosity))&(type)) \
+ { \
+ pBloggette=(pBlog->GetLayerBloggette(layer)); \
+ (STATIC_CAST(cbloggette_type*,pBloggette))->blog_call; \
+ } \
+ }
+// the blog_call should look like Log(KMyFormatingLit,var1,var2,varbla);
+// or L2BLOG(KVerbose,Log(KL2ConnLit, connH, addr));
+// or L2BLOG(KVerbose,ConnLog(connH,addr));
+//------- Blogging for BT Qual ------------
+#define LLQBLOG(type,blog_call) BLOG(KBlogLayerLinkLayer,KBlogVerbosityBTQualLevel,type,blog_call, CLLBloggette)
+#define L2QBLOG(type,blog_call) BLOG(KBlogLayerL2CAP,KBlogVerbosityBTQualLevel,type,blog_call, CL2Bloggette)
+#define RFQBLOG(type,blog_call) BLOG(KBlogLayerRFComm,KBlogVerbosityBTQualLevel,type,blog_call, CRFBloggette)
+//------- Loud Blogging Calls -------------
+#define LLLBLOG(type,blog_call) BLOG(KBlogLayerLinkLayer,KBlogVerbosityLoud,type,blog_call,CLLBloggette)
+#define L2LBLOG(type,blog_call) BLOG(KBlogLayerL2CAP,KBlogVerbosityLoud,type,blog_call, CL2Bloggette)
+#define RFLBLOG(type,blog_call) BLOG(KBlogLayerRFComm,KBlogVerbosityLoud,type,blog_call, CRFBloggette)
+//------- Generic Blogging calls ----------
+#define LLBLOG(verbosity,type,blog_call) BLOG(KBlogLayerLinkLayer,verbosity,type,blog_call,CLLBloggette)
+#define L2BLOG(verbosity,type,blog_call) BLOG(KBlogLayerL2CAP,verbosity,type,blog_call,CL2Bloggette)
+#define RFBLOG(verbosity,type,blog_call) BLOG(KBlogLayerRFComm,verbosity,type,blog_call,CRFBloggette)
+#endif
+
+inline void __BTDEBUGGER()
+// needed to call __DEBUGGER inside an __ASSERT
+ {
+ __DEBUGGER()
+ }
+
+#ifdef __FLOGGING__
+#define FLOG(a) {FPrint(a);}
+#define FTRACE(a) {a;}
+
+inline void FPrint(const TRefByValue<const TDesC> aFmt, ...)
+ {
+ VA_LIST list;
+ VA_START(list,aFmt);
+ TBuf<32> logFile(KLogFile);
+#ifdef BLOGGING__
+ // the Blogger holds the flogging file index since it is pointed by the TLS
+ CBlogger* pBlog = BLOGGER;
+ logFile[KLogIndexOffset]=TText('0'+(TInt)pBlog->GetFloggerInfo());
+#else
+ logFile[KLogIndexOffset]=TText('0'+BTTLS->iPort);
+#endif
+ RFileLogger::WriteFormat(KLogDir, logFile, EFileLoggingModeAppend, aFmt, list);
+#ifdef MEMTRACE
+ TInt size;
+ User::Heap().AllocSize(size);
+
+ RFileLogger::WriteFormat(KLogDir, logFile, EFileLoggingModeAppend, _L("Mem usage: %d high: %d"), size, User::Heap().Size());
+#endif
+ }
+
+inline void FHex(const TUint8* aPtr, TInt aLen)
+ {
+ TBuf<32> logFile(KLogFile);
+ logFile[KLogIndexOffset]=TText('0'+BTTLS->iPort);
+ RFileLogger::HexDump(KLogDir, logFile, EFileLoggingModeAppend, 0, 0, aPtr, aLen);
+ }
+
+inline void FHex(const TDesC8& aDes)
+ {
+ FHex(aDes.Ptr(), aDes.Length());
+ }
+
+
+#define SCO_LOG(a) FPrint(a);
+#define SCO_LOG_2(a, b) FPrint(a, b);
+#define SCO_LOG_3(a, b, c) FPrint(a, b, c);
+#define SCO_LOG_4(a, b, c, d) FPrint(a, b, c, d);
+#define SCO_LOG_5(a, b, c, d, e) FPrint(a, b, c, d, e);
+#define SCO_LOG_6(a, b, c, d, e, f) FPrint(a, b, c, d, e, f);
+#define SCO_LOG_ADDR(string, addr) { TBuf<20> addrbuf; addrbuf.Format(_L("%02x:%02x:%02x:%02x:%02x:%02x"), addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); SCO_LOG_2(string, &addrbuf); }
+
+#else // i.e. __FLOGGING__ undefined
+#define FLOG(a)
+#define FTRACE(a)
+
+#define SCO_LOG(a)
+#define SCO_LOG_2(a, b)
+#define SCO_LOG_3(a, b, c)
+#define SCO_LOG_4(a, b, c, d)
+#define SCO_LOG_5(a, b, c, d, e)
+#define SCO_LOG_6(a, b, c, d, e, f)
+#define SCO_LOG_ADDR(string, addr)
+
+
+inline void FPrint(const TRefByValue<const TDesC> /*aFmt*/,...)
+ {
+#ifdef _DEBUG // to quell linker warnings
+ RFileLogger dummy;
+#endif
+ }
+
+inline void FHex(const TUint8* /*aPtr*/, TInt /*aLen*/)
+ {
+ }
+
+inline void FHex(const TDesC8& /*aDes*/)
+ {
+ }
+
+#endif // __FLOGGING__
+
+#endif // #ifndef LOGGER_H
+
+#define __PANIC_UNEXPECTED_CALL __ASSERT_DEBUG(NULL, User::Invariant());
+
+#endif // __BT_DEBUG_H__