--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/taskswitcher/contextengine/trace/tslogutils.h Tue Jan 26 11:48:23 2010 +0200
@@ -0,0 +1,211 @@
+/*
+* Copyright (c) 2008 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: Logging behavior
+*
+*/
+
+
+#ifndef TSLOGUTILS_H
+#define TSLOGUTILS_H
+
+/**
+ * NOTE: This file contains the logic related to logging. Change only if you
+ * know what you're doing.
+ */
+
+
+
+
+
+
+
+
+
+
+#ifdef _DEBUG
+
+#include <e32debug.h>
+#include <e32std.h>
+
+static const TUint TSLOGERR = 2; /**< Used to create an error message */
+
+// These macros are real macros, that should be used. For temporary purposes, these
+// are left out and the logging is done by simple entry logging
+#define _TSLOG_UNCONTROLLED_INPUT_MSG L"%s%d[%x:%x:%x]>%s UNCONTROLLED ENTRY!"
+#define _TSLOG_MULTIPLE_ENTRY_MSG L"%s%d[%x:%x:%x]%s ADDITIONAL ENTRY!"
+#define _TSLOG_UNCONTROLLER_EXIT_MSG L"%s%d[%x:%x:%x]<%s UNCONTROLLED EXIT!"
+#define _TSLOG_MULTIPLE_EXIT_MSG L"%s%d[%x:%x:%x]%s ADDITIONAL EXIT!"
+#define _TSLOG_TRAP_HARNESS_ENTRY L"_D%d[%x:%x:%x]TraceFramework: Entering trap harness"
+#define _TSLOG_TRAP_HARNESS_EXIT L"_D%d[%x:%x:%x]TraceFramework: Exiting trap harness"
+#define _TSLOG_TRAP_HARNESS_LEAVE L"_D%d[%x:%x:%x]TraceFramework: ---------- LEAVE OCCURRED !!! ---------- "
+#define _TSLOG_API_PREFIX L"_A"
+#define _TSLOG_LOCAL_PREFIX L"_L"
+
+/**
+* @file
+* trace_utils.h contains definitions needed for advanced tracing features.
+* Tracing can be customized using the following compile time flags:
+* - <b>_DEBUG</b>
+* - With this flag undefined, all traces are disabled
+* - <b>__KERNEL_MODE__</b>
+* - if kernel mode flag is defined, kernel macro variants are used (no unicode or shared heap related stuff, faster)
+* - <b>DISABLE_SYNTAX_CHECK</b>
+* - If this flag is defined, runtime syntax checking features are disabled from traces
+*/
+#ifndef DISABLE_SYNTAX_CHECK
+ #define _MARK_ENTRY() _dc.inOk=ETrue
+ #define _DOINCHK() _dc.DoInChk()
+ #define _CHK_MULTIIN() _dc.ChkMultiIn()
+ #define _CHK_MULTIOUT() _dc.ChkMultiOut()
+ #define _MARK_EXIT() _dc.outOk=ETrue
+#else
+ #define _MARK_ENTRY()
+ #define _DOINCHK()
+ #define _CHK_MULTIIN()
+ #define _CHK_MULTIOUT()
+ #define _MARK_EXIT()
+#endif // DISABLE_SYNTAX_CHECK
+
+/** For tracing */
+#ifdef _TSLOG_RDEBUG
+ #define _IT(a) (TPtrC((const TText *)(a)))
+ #define _TSLOGPRINTER RDebug::Print
+
+/** For filedebug */
+#else // _TSLOG_RDEBUG
+
+ /** Includes */
+ #include <e32base.h>
+ #include <e32std.h>
+ #include <e32def.h>
+ #include <e32svr.h>
+
+// both of headers defines KLogBufferSize
+#ifndef __COMMSDEBUGUTILITY_H__
+ #include <flogger.h>
+#endif
+
+ #define _IT(a) KTsLogPath, KTsLogFile, EFileLoggingModeAppend, (TPtrC((const TText *)(a)))
+ #define _TSLOGPRINTER RFileLogger::WriteFormat
+#endif // _TSLOG_RDEBUG
+
+class _TTsLogContext
+ {
+ public:
+ _TTsLogContext(
+ const TText* _fn,
+ const TUint _id,
+ const TUint _vis,
+ const TUint _addr,
+ const TUint _thdId,
+ const TUint _category=0 )
+ :
+ iFn(_fn),
+ iId(_id),
+ iApi((TBool)_vis),
+ iAddr(_addr),
+ iThdId(_thdId),
+ iVis((_vis == 0 ? (TText*)_TSLOG_API_PREFIX : (TText*)_TSLOG_LOCAL_PREFIX)),
+ iCategory(_category)
+ #ifndef DISABLE_SYNTAX_CHECK
+ ,outOk(EFalse), inOk(EFalse)
+ #endif
+ {
+ }
+ ~_TTsLogContext()
+ {
+ #ifndef DISABLE_SYNTAX_CHECK
+ do
+ {
+ DoInChk();
+ if (!outOk)
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLER_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+ }
+ } while (0);
+ #endif // DISABLE_SYNTAX_CHECK
+ }
+
+ const TText* iFn;
+ const TUint iId;
+ const TText* iVis;
+ const TUint iAddr;
+ const TInt iThdId;
+ const TBool iApi;
+ const TUint iCategory;
+
+ #ifndef DISABLE_SYNTAX_CHECK
+ inline void DoInChk()
+ {
+ if (!inOk)
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLED_INPUT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+ inOk = ETrue;
+ }
+ }
+
+ inline void ChkMultiIn()
+ {
+ if (inOk)
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_ENTRY_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+ }
+ }
+
+ inline void ChkMultiOut()
+ {
+ if (outOk)
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+ }
+ }
+
+ TBool inOk;
+ TBool outOk;
+ #endif // DISABLE_SYNTAX_CHECK
+ };
+
+class _TTsLogTrapHandler: public TTrapHandler
+ {
+ public:
+
+ _TTsLogTrapHandler(_TTsLogContext& _context) : _dc( _context )
+ {
+ RThread me;
+ iThdId = (TInt)me.Id();
+ }
+ void Trap()
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_ENTRY), 0, TSLOGERR, iThdId, this);
+ oldHandler->Trap();
+ }
+ void UnTrap()
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_EXIT), 0, TSLOGERR, iThdId, this);
+ oldHandler->UnTrap();
+ }
+ void Leave(TInt aValue)
+ {
+ _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_LEAVE), 0, TSLOGERR, iThdId, this);
+ oldHandler->Leave(aValue);
+ }
+ TTrapHandler* oldHandler;
+ private:
+ _TTsLogContext& _dc;
+ TInt iThdId;
+ };
+
+#endif // _DEBUG
+
+#endif // TSLOGUTILS_H