--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/inc/debug.h Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,419 @@
+/*
+* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB
+*
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* EmbedDev AB - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+// dbg_dp.h
+// debug printouts
+
+/*************************************************
+
+ USAGE
+ DP("Hi there");
+ DP1("My name is %S", &name);
+ DPV1("My detailed info is %S", &detailedInfo);
+ DP_MSG(aMsg);
+ DP_MSG_COMPL(aMsg, r);
+ DP_EXC(aType);
+
+ CUSTOMISATION
+ With SUPPORT_DP_CLIENT_SERVER_V2 defined, a
+ proper opcode type (default TOpcode) needs to
+ be specified.
+
+ NOTE
+ This file may be included by many components
+ within one application and defining something
+ here will affect all such components. In such
+ cases it might be better to state a MACRO in
+ the intended component's MMP file.
+
+**************************************************/
+
+#ifndef ___DBG_DP_H
+#define ___DBG_DP_H
+
+// This file may be included butThese defines may be individual
+
+//#if defined (_DEBUG) && (__WINS__)
+//#if defined _DEBUG
+# define SUPPORT_DP_STANDARD
+# define SUPPORT_DP_FILE
+//#endif
+
+// #define SUPPORT_RDEBUG_PRINT
+// #define SUPPORT_DP_VERBOSE
+// #define SUPPORT_DP_THREAD_NAME
+// #define SUPPORT_DP_CLIENT_SERVER_V2
+// #define SUPPORT_DP_EXCEPTION
+// #define SUPPORT_DP_COMMDB
+
+// ------------------------------------------------- no need to modify
+
+#if defined (SUPPORT_RDEBUG_PRINT)\
+ || defined (SUPPORT_DP_VERBOSE)\
+ || defined(SUPPORT_DP_CLIENT_SERVER_V2)\
+ || defined(SUPPORT_DP_EXCEPTION)
+# define SUPPORT_DP_STANDARD
+#endif
+
+#if defined(SUPPORT_RDEBUG_PRINT)
+# include <e32svr.h> // RDebug
+#endif
+
+#if defined(SUPPORT_DP_FILE)
+# include <flogger.h>
+#endif
+
+#if defined(SUPPORT_DP_CLIENT_SERVER_V2)
+# include "dbg_cmn.h" // TOpcode
+#endif
+
+#if defined(SUPPORT_DP_COMMDB)
+# include <commdbconnpref.h> // TCommDbConnPref
+#endif
+
+namespace Dbg
+{
+
+// ------------------------------------------------- file output
+#ifdef SUPPORT_DP_FILE
+_LIT(KLogDir, "podcatcher");
+_LIT(KLogFile, "debug.log");
+# define DPF(a); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S %s"), &s, L##a);
+# define DPF1(a,b); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b);
+# define DPF2(a,b,c); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c);
+# define DPF3(a,b,c,d); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d);
+# define DPF4(a,b,c,d,e); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d,e);
+# define DPF5(a,b,c,d,e,f); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b,c,d,e,f);
+# define DPF6(a,b,c,d,e,f,g); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("%S " L##a), &s, b, c, d,e,f,g);
+# define HEXDUMP(aHeader, aMargin, aPtr, aLen); RFileLogger::HexDump(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, aHeader, aMargin, aPtr, aLen);
+# define DPDT(dt); RFileLogger::WriteFormat(Dbg::KLogDir, Dbg::KLogFile, EFileLoggingModeAppend, _L("DateTime: %d-%d-%d %d:%d:%d "), dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second() );
+
+#else
+# define DPF(a);
+# define DPF1(a,b);
+# define DPF2(a,b,c);
+# define DPF3(a,b,c,d);
+# define DPF4(a,b,c,d,e);
+# define DPF5(a,b,c,d,e,f);
+# define DPF6(a,b,c,d,e,f,g);
+# define HEXDUMP(aHeader, aMargin, aPtr, aLen);
+# define DPDT(dt);
+#endif
+// ------------------------------------------------- standard debugprint
+#ifdef SUPPORT_DP_STANDARD
+
+inline void FormatThreadName(TFullName& aName)
+{
+ const TChar KLeftBracket('[');
+ const TChar KScope(':');
+ TInt a = aName.LocateReverse(KLeftBracket);
+ if (a==KErrNotFound)
+ { return; }
+ TInt b = aName.Locate(KScope);
+ if (b==KErrNotFound || b<a)
+ { return; }
+ aName.Delete(a,b-a);
+}
+
+#ifdef SUPPORT_RDEBUG_PRINT
+# define DP(a);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S %s"), &s, L##a);\
+ DPF(a);\
+ }
+# define DP1(a,b);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b);\
+ DPF1(a,b);\
+ }
+# define DP2(a,b,c);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b,c);\
+ DPF2(a,b,c);\
+ }
+# define DP3(a,b,c,d);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b,c,d);\
+ DPF3(a,b,c,d);\
+ }
+# define DP4(a,b,c,d,e);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b,c,d,e);\
+ DPF4(a,b,c,d,e);\
+ }
+# define DP5(a,b,c,d,e,f);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b,c,d,e,f);\
+ DPF5(a,b,c,d,e,f);\
+ }
+# define DP6(a,b,c,d,e,f,g);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ RDebug::Print(_L("%S " L##a), &s, b,c,d,e,f,g);\
+ DPF6(a,b,c,d,e,f,g);\
+ }
+#else //SUPPORT_RDEBUG_PRINT
+# define DP(a);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF(a);\
+ }
+# define DP1(a,b);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF1(a,b);\
+ }
+# define DP2(a,b,c);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF2(a,b,c);\
+ }
+# define DP3(a,b,c,d);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF3(a,b,c,d);\
+ }
+# define DP4(a,b,c,d,e);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF4(a,b,c,d,e);\
+ }
+# define DP5(a,b,c,d,e,f);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF5(a,b,c,d,e,f);\
+ }
+# define DP6(a,b,c,d,e,f,g);\
+ {\
+ TFullName s = RThread().FullName();\
+ Dbg::FormatThreadName(s);\
+ DPF6(a,b,c,d,e,f,g);\
+ }
+#endif //SUPPORT_RDEBUG_PRINT
+# define ASSERT_DP(a, b); {if(!(a)){DP(b);}}
+# define ASSERT_DP1(a,b,c); {if(!(a)){DP1(b,c);}}
+# define ASSERT_DP2(a,b,c,d); {if(!(a)){DP2(b,c,d);}}
+# define ASSERT_DP3(a,b,c,d,e); {if(!(a)){DP3(b,c,d,e);}}
+# define ASSERT_DP4(a,b,c,d,e,f); {if(!(a)){DP4(b,c,d,e,f);}}
+# define ASSERT_DP5(a,b,c,d,e,f,g); {if(!(a)){DP5(b,c,d,e,f,g);}}
+# define ASSERT_DP6(a,b,c,d,e,f,g,h); {if(!(a)){DP6(b,c,d,e,f,g,h);}}
+// @brief stuff to get enum strings from enums
+# define ENUM_CASE(n,c)\
+ case c: { _LIT(KTxt##c, #c); n.Set(KTxt##c); break; }
+# define DEFAULT(n)\
+ default: { _LIT(KTxtUnknown, "Unknown"); n.Set(KTxtUnknown); break; }
+#else
+# define DP(a);
+# define DP1(a,b);;
+# define DP2(a,b,c);
+# define DP3(a,b,c,d);
+# define DP4(a,b,c,d,e);
+# define DP5(a,b,c,d,e,f);
+# define DP6(a,b,c,d,e,f,g);
+# define ASSERT_DP(a, b);
+# define ASSERT_DP1(a,b,c);
+# define ASSERT_DP2(a,b,c,d);
+# define ASSERT_DP3(a,b,c,d,e);
+# define ASSERT_DP4(a,b,c,d,e,f);
+# define ASSERT_DP5(a,b,c,d,e,f,g);
+# define ASSERT_DP6(a,b,c,d,e,f,g,h);
+# define ENUM_CASE(n,c)
+# define DEFAULT(n)
+#endif
+// ------------------------------------------------- detailed debugprint
+#ifdef SUPPORT_DP_VERBOSE
+# define DPV(a); { DP(a); }
+# define DPV1(a,b); { DP1(a,b); }
+# define DPV2(a,b,c); { DP2(a,b,c); }
+# define DPV3(a,b,c,d); { DP3(a,b,c,d); }
+# define DPV4(a,b,c,d,e); { DP4(a,b,c,d,e); }
+# define DPV5(a,b,c,d,e,f); { DP5(a,b,c,d,e,f); }
+# define DPV6(a,b,c,d,e,f,g); { DP6(a,b,c,d,e,f,g); }
+# define DPDTV(dt); { DPDT(dt); }
+#else
+# define DPV(a);
+# define DPV1(a,b);
+# define DPV2(a,b,c);
+# define DPV3(a,b,c,d);
+# define DPV4(a,b,c,d,e);
+# define DPV5(a,b,c,d,e,f);
+# define DPV6(a,b,c,d,e,f,g);
+# define DPDTV(dt);
+#endif
+// ------------------------------------------------- client/server V2
+#ifdef SUPPORT_DP_CLIENT_SERVER_V2
+
+// @brief Get client thread name from a message
+static void GetClientName(const RMessage2& aMsg, TFullName& aName)
+{
+ RThread thread;
+ aMsg.Client(thread);
+ aName = thread.FullName();
+ Dbg::FormatThreadName(aName);
+}
+
+// @brief Get server opcode from any message
+static TOpcode GetServerOpcode(const RMessage2& aMsg)
+{
+ return (TOpcode)aMsg.Function();
+}
+
+// @brief Get server opcode name from a server opcode
+static TPtrC GetServerOpcodeName(TOpcode aOpcode)
+{
+ TPtrC name;
+ switch(aOpcode)
+ {
+ // ENUM_CASE(name, EOpcodeOne);
+ // ENUM_CASE(name, EOpcodeTwo);
+ DEFAULT(name);
+ }
+ return name;
+}
+
+// @brief Print generic message.
+inline void PrintMsg(const RMessage2& aMsg)
+{
+ TFullName threadName;
+ GetClientName(aMsg, threadName);
+ TOpcode sOpcode = GetServerOpcode(aMsg);
+ TPtrC sOpcodeName = GetServerOpcodeName(sOpcode);
+ DP3("? %S %S(%d)", &threadName, &sOpcodeName, sOpcode);
+}
+
+// @brief Print generic message completion.
+inline void PrintMsgCompl(const RMessage2& aMsg, TInt aErr)
+{
+ TFullName threadName;
+ GetClientName(aMsg, threadName);
+ TOpcode sOpcode = GetServerOpcode(aMsg);
+ TPtrC sOpcodeName = GetServerOpcodeName(sOpcode);
+ DP4("! %S %S(%d) r=%d", &threadName, &sOpcodeName, sOpcode, aErr);
+}
+
+// m= message, r=error
+# define DP_MSG(m); PrintMsg(m);
+# define DP_MSG_COMPL(m,r); PrintMsgCompl(m,r);
+#else
+# define DP_MSG(m);
+# define DP_MSG_COMPL(m,r);
+#endif
+// ------------------------------------------------- exception debugprint
+#ifdef SUPPORT_DP_EXCEPTION
+
+// @brief Get an exception type
+static TPtrC GetExcName(TExcType aType)
+{
+ TPtrC name;
+ switch(aType)
+ {
+ ENUM_CASE(name, EExcGeneral);
+ ENUM_CASE(name, EExcIntegerDivideByZero);
+ ENUM_CASE(name, EExcSingleStep);
+ ENUM_CASE(name, EExcBreakPoint);
+ ENUM_CASE(name, EExcIntegerOverflow);
+ ENUM_CASE(name, EExcBoundsCheck);
+ ENUM_CASE(name, EExcInvalidOpCode);
+ ENUM_CASE(name, EExcDoubleFault);
+ ENUM_CASE(name, EExcStackFault);
+ ENUM_CASE(name, EExcAccessViolation);
+ ENUM_CASE(name, EExcPrivInstruction);
+ ENUM_CASE(name, EExcAlignment);
+ ENUM_CASE(name, EExcPageFault);
+ ENUM_CASE(name, EExcFloatDenormal);
+ ENUM_CASE(name, EExcFloatDivideByZero);
+ ENUM_CASE(name, EExcFloatInexactResult);
+ ENUM_CASE(name, EExcFloatInvalidOperation);
+ ENUM_CASE(name, EExcFloatOverflow);
+ ENUM_CASE(name, EExcFloatStackCheck);
+ ENUM_CASE(name, EExcFloatUnderflow);
+ ENUM_CASE(name, EExcAbort);
+ ENUM_CASE(name, EExcKill);
+ ENUM_CASE(name, EExcUserInterrupt);
+ ENUM_CASE(name, EExcDataAbort);
+ ENUM_CASE(name, EExcCodeAbort);
+ ENUM_CASE(name, EExcMaxNumber);
+ ENUM_CASE(name, EExcInvalidVector);
+ DEFAULT(name);
+ }
+ return name;
+}
+
+// @brief Print exception info.
+inline void PrintExc(TExcType aType)
+{
+ TPtrC excName = GetExcName(aType);
+ DP2("### Exception %S(%d) ###", &excName, aType);
+}
+
+# define DP_EXC(t); PrintExc(t);
+#else
+# define DP_EXC(t);
+#endif
+// -------------------------------------------------
+#ifdef SUPPORT_DP_COMMDB
+
+inline void LogIap(const TDesC* aName, const TCommDbConnPref& aPref)
+{
+ TUint32 iapId=aPref.IapId();
+ TUint32 netId=aPref.NetId();
+ TCommDbDialogPref dlgPref=aPref.DialogPreference();
+ TCommDbConnectionDirection dir=aPref.Direction();
+ TUint32 bearerSet=aPref.BearerSet();
+ if(aName==0)
+ {
+ UI_FLOG(Log::Printf(
+ _L("iapId=%u, netId=%u, dlgPref=%d, dir=%d, bearerSet=0x%02x"),
+ iapId, netId, dlgPref, dir, bearerSet));
+ }
+ else
+ {
+ UI_FLOG(Log::Printf(
+ _L("\"%S\", iapId=%u, netId=%u, dlgPref=%d, dir=%d, bearerSet=0x%02x"),
+ aName, iapId, netId, dlgPref, dir, bearerSet));
+ }
+}
+
+# define DP_COMMDBCONNPREF(a,b); LogIap(a,b);
+#else
+# define DP_COMMDBCONNPREF(a,b);
+#endif
+// -------------------------------------------------
+
+}
+#endif //___DBG_DP_H
+