diff -r d189ee25cf9d -r 3533d4323edc emailservices/emaildebug/inc/emailtrace.h --- a/emailservices/emaildebug/inc/emailtrace.h Tue Aug 31 15:04:17 2010 +0300 +++ b/emailservices/emaildebug/inc/emailtrace.h Wed Sep 01 12:28:57 2010 +0100 @@ -1,220 +1,384 @@ /* - * Copyright (c) 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: - * - */ +* Copyright (c) 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: Header file describing trace utilities for commonemail +* +*/ #ifndef EMAILTRACE_H #define EMAILTRACE_H -#include -#include -#include -#include -#include +#include "emailtraceconfig.hrh" -/* - * The macros NM_COMMENT_TRACES, NM_ERROR_TRACES, and NM_FUNCTION_TRACES - * control which debug messages are printed. The trace logging is controlled - * with the NM_LOG_TO_FILE macro, whereas the NM_LOG_DIRECTORY macro defines - * which directory is to be used to store the log files. The print_trace() - * helper function implements printing. Log files are named according to - * process and thread IDs. If NM_LOG_TO_FILE is zero or a log file cannot be - * opened, the messages are printed to qDebug(). The DSC2STR() function can - * be used to convert Symbian descriptors to QString objects. - */ -#if defined(DEBUG) || defined(_DEBUG) || NM_COMMENT_TRACES || NM_ERROR_TRACES || NM_FUNCTION_TRACES - -#ifndef NM_COMMENT_TRACES -#define NM_COMMENT_TRACES 0 -#endif - -#ifndef NM_ERROR_TRACES -#define NM_ERROR_TRACES 0 +#ifdef TRACE_INTO_FILE +#include "cmaillogger.h" +#include // RFileLogger +#else +#include // RDebug #endif -#ifndef NM_FUNCTION_TRACES -#define NM_FUNCTION_TRACES 0 -#endif - -#if NM_COMMENT_TRACES || NM_ERROR_TRACES || NM_FUNCTION_TRACES - -#define NM_LOG_TO_FILE 1 -#define NM_LOG_DIRECTORY "c:/data/logs/" +/** +* Constants +*/ +#if defined(TRACE_INTO_FILE) -inline void print_trace(const QString& msg) -{ - static QFile file(NM_LOG_DIRECTORY+ - QString("nmail_p%1_t%2.log"). - arg(QCoreApplication::applicationPid()). - arg(QThread::currentThreadId())); - if (NM_LOG_TO_FILE && !file.isOpen()) { - file.open(QIODevice::Append | QIODevice::Text); - } - QDateTime dt = QDateTime::currentDateTime (); - if (file.isWritable()) { - QDebug(&file).nospace() << dt.toString(Qt::ISODate) << " " << msg << '\n'; - } else { - qDebug().nospace() << "[Nmail] " << msg; - } -} + _LIT( KEmailDir, "email" ); + _LIT( KEmailTraceFile, "email.txt" ); #endif -inline QString DSC2STR(const TDesC& dsc) -{ - return QString::fromRawData(reinterpret_cast(dsc.Ptr()), - dsc.Length()); -} - +#if defined(TRACE_FILE_LIMIT_SIZE) + #define CMAIL_LOG_CLOSE CmailLogger::Close(); + #define CMAILLOGBUFFERSIZE 120 #else - -#define DSC2STR(dsc) + #define CMAIL_LOG_CLOSE +#endif -#endif /* DEBUG */ +//----------------------------------------------------------------------------- +// Error trace macros +//----------------------------------------------------------------------------- +// -/* - * The function NM_COMMENT() prints a debug message. The INFO macros and the - * NMLOG macro are provided for legacy compatibility. They are deprecated and - * should not be used. If sprintf() type of formatting is desired, consider - * using QString::arg() or QTextStream. - */ -#if NM_COMMENT_TRACES +#ifdef ERROR_TRACE + + /** + * Error trace definitions. Does not automatically log the error code! + */ + #if defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) -inline void NM_COMMENT(const QString& msg) -{ - print_trace("COMMENT : " + msg); -} -#define INFO(msg) NM_COMMENT(msg) -#define INFO_1(msg,arg1)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1);\ - NM_COMMENT(__msg);\ -} while (0) -#define INFO_2(msg,arg1,arg2)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1,arg2);\ - NM_COMMENT(__msg);\ -} while (0) -#define INFO_3(msg,arg1,arg2,arg3)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1,arg2,arg3);\ - NM_COMMENT(__msg);\ -} while (0) -#define NMLOG(msg) NM_COMMENT(msg) + #define ERROR( aErr, aMsg )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::Write( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg );\ + }\ + } + #define ERROR_1( aErr, aMsg, aP1 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1 );\ + }\ + } + #define ERROR_2( aErr, aMsg, aP1, aP2 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1, aP2 );\ + }\ + } + #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1, aP2, aP3 );\ + }\ + } + #define ERROR_GEN( aMsg ) ERROR( KErrGeneral, aMsg ) + #define ERROR_GEN_1( aMsg, aP1 ) ERROR_1( KErrGeneral, aMsg, aP1 ) + #endif + #if defined(TRACE_INTO_FILE) && defined(TRACE_FILE_LIMIT_SIZE) + + #define ERROR( aErr, aMsg )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT8( KMsg, aMsg );TBuf8 buf=KMsg(); if ( KMsg().Size() < buf.MaxSize() ) { CmailLogger::Write( buf ); }}\ + } + + #define ERROR_1( aErr, aMsg, aP1 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8(); if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1 ); CmailLogger::Write( buf ); } }\ + } + #define ERROR_2( aErr, aMsg, aP1, aP2 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8(); if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1, aP2 ); CmailLogger::Write( buf ); }} \ + } + #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8(); if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1, aP2, aP3 ); CmailLogger::Write( buf ); }}\ + } + #endif + #if !defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) -#else - -#define NM_COMMENT(msg) -#define INFO(msg) -#define INFO_1(msg,arg1) -#define INFO_2(msg,arg1,arg2) -#define INFO_3(msg,arg1,arg2,arg3) -#define NMLOG(msg) + #define ERROR( aErr, aMsg )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg );\ + }\ + } + #define ERROR_1( aErr, aMsg, aP1 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1 );\ + }\ + } + #define ERROR_2( aErr, aMsg, aP1, aP2 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1, aP2 );\ + }\ + } + #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\ + {\ + if( aErr != KErrNone )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1, aP2, aP3 );\ + }\ + } + #define ERROR_GEN( aMsg ) ERROR( KErrGeneral, aMsg ) + #define ERROR_GEN_1( aMsg, aP1 ) ERROR_1( KErrGeneral, aMsg, aP1 ) -#endif /* NM_COMMENT_TRACES */ + #endif//TRACE_INTO_FILE + +#else//ERROR_TRACE not defined + + #define ERROR( aErr, aMsg ) + #define ERROR_1( aErr, aMsg, aP1 ) + #define ERROR_2( aErr, aMsg, aP1, aP2 ) + #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 ) + #define ERROR_GEN( aMsg ) + #define ERROR_GEN_1( aMsg, aP1 ) -/* - * The function NM_ERROR() prints its second argument if the first argument - * is non-zero. The ERROR macros are provided for legacy compatibility. They - * are deprecated and should not be used. If sprintf() type of formatting is - * desired, consider using QString::arg() or QTextStream. - */ -#if NM_ERROR_TRACES +#endif//ERROR_TRACE + + +//----------------------------------------------------------------------------- +// Info trace macros +//----------------------------------------------------------------------------- +// +#if defined(INFO_TRACE) + + /** + * Info log message definitions. + */ + #if defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) -inline void NM_ERROR(int err, const QString& msg) -{ - if (err) { - print_trace("ERROR : " + msg); - } -} -#define ERROR(err,msg) NM_ERROR(err,msg) -#define ERROR_1(err,msg,arg1)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1);\ - NM_ERROR(err,__msg);\ -} while (0) -#define ERROR_2(err,msg,arg1,arg2)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1,arg2);\ - NM_ERROR(err,__msg);\ -} while(0) -#define ERROR_3(err,msg,arg1,arg2,arg3)\ -do {\ - QString __msg;\ - __msg.sprintf(msg,arg1,arg2,arg3);\ - NM_ERROR(err,__msg);\ -} while(0) -#define ERROR_GEN(msg) ERROR(KErrGeneral,msg) -#define ERROR_GEN_1(msg,arg1) ERROR_1(KErrGeneral,msg,arg1) + #define INFO( aMsg )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::Write( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg );\ + } + #define INFO_1( aMsg, aP1 )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1 );\ + } + #define INFO_2( aMsg, aP1, aP2 )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1, aP2 );\ + } + #define INFO_3( aMsg, aP1, aP2, aP3 )\ + {\ + _LIT( KMsg, aMsg );\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1, aP2, aP3 );\ + } + #endif // // TRACE_INTO_FILE && TRACE_FILE_LIMIT_SIZE + + #if defined(TRACE_INTO_FILE) && defined(TRACE_FILE_LIMIT_SIZE) + #define CMAIL_LOG_INIT + + #define INFO( aMsg )\ + {\ + _LIT8( KMsg, aMsg );\ + CmailLogger::Write( KMsg );\ + } + #define INFO_1( aMsg, aP1 )\ + { _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8();\ + if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1 ); }\ + CmailLogger::Write( buf ); } + #define INFO_2( aMsg, aP1, aP2 )\ + { _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8();\ + if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1,aP2 ); }\ + CmailLogger::Write( buf ); } + #define INFO_3( aMsg, aP1, aP2, aP3 )\ + { _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8();\ + if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1,aP2,aP3 ); }\ + CmailLogger::Write( buf ); } + #endif // TRACE_INTO_FILE && TRACE_FILE_LIMIT_SIZE + #if !defined(TRACE_INTO_FILE) -#else + #define INFO( aMsg )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg );\ + } + #define INFO_1( aMsg, aP1 )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1 );\ + } + #define INFO_2( aMsg, aP1, aP2 )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1, aP2 );\ + } + #define INFO_3( aMsg, aP1, aP2, aP3 )\ + {\ + _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aP1, aP2, aP3 );\ + } -#define NM_ERROR(err,msg) -#define ERROR(err,msg) -#define ERROR_1(err,msg,arg1) -#define ERROR_2(err,msg,arg1,arg2) -#define ERROR_3(err,msg,arg1,arg2,arg3) -#define ERROR_GEN(msg) -#define ERROR_GEN_1(msg,arg1) + #endif//TRACE_INTO_FILE + +#else//INFO_TRACE not defined + + #define CMAIL_LOG_INIT + #define CMAIL_LOG_CLOSE + #define INFO( aMsg ) + #define INFO_1( aMsg, aP1 ) + #define INFO_2( aMsg, aP1, aP2 ) + #define INFO_3( aMsg, aP1, aP2, aP3 ) -#endif /* NM_ERROR_TRACES */ +#endif//INFO_TRACE + +//----------------------------------------------------------------------------- +// Function trace macros +//----------------------------------------------------------------------------- +// + +#if defined (FUNC_TRACE) + + // Constants + _LIT8( KEllipse, "(" ); -/* - * The macro NM_FUNCTION, when used inside a function body, enables tracing - * for a function. If used, it should be placed on the first line of the - * function body. ENTER and RETURN messages are printed when entering into - * and returning from a function, respectively. In case of an exception, - * UNWIND (for stack unwinding) is printed instead of RETURN. The FUNC_LOG - * macro is provided for legacy compatibility. It is deprecated and should - * not be used. - */ -#if NM_FUNCTION_TRACES + // + // Function logging definitions. + // + + + #if defined(TRACE_FILE_LIMIT_SIZE) + #define FUNC( aMsg, aP1 )\ + {\ + _LIT8( KMsg, aMsg );TBuf8 buf=KNullDesC8(); if ( KMsg().Size() < buf.MaxSize() ) { buf.Format( KMsg, aP1 ); }CmailLogger::Write( buf ); } + #endif + #if defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) + #define FUNC( aMsg, aP1 )\ + {\ + _LIT8( KMsg, aMsg ); RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KMsg, aP1 );\ + } + #endif + #if !defined(TRACE_INTO_FILE) + #define FUNC( aMsg, aP1 )\ + {\ + RDebug::Printf( aMsg, aP1 );\ + }\ + + #endif//TRACE_INTO_FILE + + /** + * Function trace helper class. + */ + class TFuncLog + { + public: + inline TFuncLog( const char* aFunc ): iFunc( (TUint8*)aFunc ) + { + TInt pos = iFunc.Find( KEllipse ); + if( pos != KErrNotFound ) + { + iFunc.Set( iFunc.Left( iFunc.Find( KEllipse ) ) ); + } + #if defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) + + //"CMAIL" string is added in the beginning of every trace + //line for filtering purposes + FUNC( "CMAIL %S <", &iFunc ); + #endif + #if defined(TRACE_INTO_FILE) && defined(TRACE_FILE_LIMIT_SIZE) + TBuf8 buf(iFunc); + buf.Append(_L("<")); + CmailLogger::Write( buf ); + #endif + #if !defined(TRACE_INTO_FILE) + + FUNC( "CMAIL %s <", iFunc.Ptr() ); -class __ftracer -{ -public: - __ftracer(const QString& _fn) - : fn(_fn) - { - print_trace("ENTER : " + fn); - } - ~__ftracer() - { - if (std::uncaught_exception()) { - print_trace("UNWIND : " + fn); - } else { - print_trace("RETURN : " + fn); - } - } -private: - QString fn; -}; + #endif//TRACE_INTO_FILE + } + inline ~TFuncLog() + { + #if defined(TRACE_INTO_FILE) && !defined(TRACE_FILE_LIMIT_SIZE) + FUNC( "CMAIL %S >", &iFunc ); + #endif + #if defined(TRACE_INTO_FILE) && defined(TRACE_FILE_LIMIT_SIZE) + TBuf8 buf(iFunc); + buf.Append(_L(">")); + CmailLogger::Write( buf ); + #endif + #if !defined(TRACE_INTO_FILE) + + FUNC( "CMAIL %s >", iFunc.Ptr() ); + #endif//TRACE_INTO_FILE + } + TPtrC8 iFunc; + }; + + #define FUNC_LOG TFuncLog _fl( __PRETTY_FUNCTION__ ); +#else//FUNC_TRACE not defined + + #define FUNC_LOG + +#endif//FUNC_TRACE + +//----------------------------------------------------------------------------- +// Timestamp trace macros +//----------------------------------------------------------------------------- +// +#if defined(TIMESTAMP_TRAC) -#define NM_FUNCTION __ftracer __ft(__PRETTY_FUNCTION__) -#define FUNC_LOG NM_FUNCTION + #if defined(TRACE_INTO_FILE) -#else + #define TIMESTAMP( aCaption )\ + {\ + TTime t;\ + t.HomeTime();\ + TDateTime dt = t.DateTime();\ + _LIT( KMsg, aCaption );\ + _LIT( KFormat, "[TIMESTAMP] %d:%02d:%02d.%06d us %S");\ + RFileLogger::WriteFormat( KEmailDir, KEmailTraceFile, EFileLoggingModeAppend, KFormat,\ + dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond(), &KMsg );\ + } + + #else//TRACE_INTO_FILE not defined -#define NM_FUNCTION -#define FUNC_LOG + #define TIMESTAMP( aCaption )\ + {\ + TTime t;\ + t.HomeTime();\ + TDateTime dt = t.DateTime();\ + _LIT( KMsg, aCaption );\ + _LIT( KFormat, "[TIMESTAMP] %d:%02d:%02d.%06d us %S");\ + RDebug::Print( KFormat,\ + dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond(), &KMsg );\ + } -#endif /* NM_FUNCTION_TRACES */ + #endif//TRACE_INTO_FILE + +#else//TIMESTAMP_TRACE not defined -#endif /* EMAILTRACE_H */ + #define TIMESTAMP( aCaption ) + +#endif//TIMESTAMP_TRACE + +#endif // EMAILTRACE_H