diff -r 57d4cdd99204 -r edfc90759b9f imgeditor_plat/image_editor_debug_utilities_api/inc/imageeditordebugutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgeditor_plat/image_editor_debug_utilities_api/inc/imageeditordebugutils.h Fri Jan 29 13:53:17 2010 +0200 @@ -0,0 +1,360 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "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: +* Ixonos Plc +* +* Description: +* Simple RFileLogger based set of log writer macros. +* +*/ + + + +// Instructions: +// +// 1. Add the following line into your MMP file +// LIBRARY flogger.lib +// +// 2. Add the following lines to a .cpp file to be debugged +// (note that the #define must be before the #include) +// +// #define ENABLE_DEBUGLOG +// #include "imageeditordebugutils.h" +// +// 3a. Call LOG_INIT to create the log file, overwriting possibly +// existing old log file. +// +// 3b. Alternatively, you can skip the step 3a, in which case the +// the output is appended to the possibly existing old file. +// +// 4. Use the macros to write to the log file. For example +// LOG("Started processing") +// +// 5. To enable the logs, manually create the logging +// directory "C:\Logs\ImageEditor" on the device. +// + +#ifndef __DEBUGUTILS_H__ +#define __DEBUGUTILS_H__ + +// Two alternative implementations: +// - using RFileLogger (system component) +// - using ClogFile (implemented in this project) +//#define _FLOGGER_IMPLEMENTATION_ +#define _FLOGGER_IMPLEMENTATION_ + +#ifdef _FLOGGER_IMPLEMENTATION_ +#include +#else +#include <../logfile.h> +#include +#include +#endif +#include + +/** Default log file */ +_LIT(KImageEditorLogFile,"ImageEditor.log"); + +/** Log directory */ +_LIT(KLogDir, "ImageEditor"); + +/** Log file names */ +_LIT(KJpegRotatorLogFile,"JpegRotator.log"); +_LIT(KJpegRotatorTimingLogFile,"JpegRotatorTiming.log"); + +/** Maximum length for a log line */ +const TInt KMaxLogLineLength = 256; + +/** + * Overflow handler. Too long lines are truncated. + * + * @code + * ?good_class_usage_example(s) + * @endcode + * + * @lib - + * @since S60 v5.0 + */ +class TLogFileDes16OverflowHandler : public TDes16Overflow + { + virtual void Overflow(TDes16& /*aDes*/) + { + // do nothing + } + }; + + +#ifdef ENABLE_DEBUGLOG + +#ifdef _FLOGGER_IMPLEMENTATION_ + + +// Initializes the log file, overwrites existing +// Log files are always created in C:\Logs. The first argument to CreateLog() +// is a directory name relative to this C:\Logs directory. +#define LOG_INIT(aLogFile) \ + {\ + RFileLogger logger;\ + logger.Connect();\ + logger.CreateLog(KLogDir,aLogFile,EFileLoggingModeOverwrite);\ + logger.Write(KLogDir,aLogFile,EFileLoggingModeAppend,_L("*** Log file created ***"));\ + logger.CloseLog();\ + logger.Close();\ + } + +// Logs a simple text, e.g. +// LOG(_L("logfile.txt"),"Something happens here") +#define LOG(aLogFile,aText) \ + {\ + RFileLogger::Write(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText));\ + RDebug::Print(_L(aText));\ + } + +// Logs a Descriptor +#define LOGDES(aLogFile,aDes) \ + {\ + RFileLogger::Write(KLogDir,aLogFile,EFileLoggingModeAppend,aDes);\ + RDebug::Print(aDes);\ + } + +// Logs a number with string format, e.g. +// LOGFMT(KLogFile,"Result=%d",err) +// LOGFMT(KLogFile, "FileName: %S", &aFileName ); +#define LOGFMT(aLogFile,aText,aParam) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam);\ + RDebug::Print(_L(aText), aParam);\ + } + +// Logs text and two 2 parameters +#define LOGFMT2(aLogFile,aText,aParam1,aParam2) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2);\ + RDebug::Print(_L(aText), aParam1,aParam2);\ + } + +// Logs text and two 3 parameters +#define LOGFMT3(aLogFile,aText,aParam1,aParam2,aParam3) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2,aParam3);\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3);\ + } + +// Logs text and two 4 parameters +#define LOGFMT4(aLogFile,aText,aParam1,aParam2,aParam3,aParam4) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2,aParam3,aParam4);\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4);\ + } + +// Logs a hex dump +#define LOGHEXDUMP(aLogFile,aHeader,aMargin,aPtr,aLen) \ + RFileLogger::HexDump(KLogDir,aLogFile, EFileLoggingModeAppend, _S(aHeader), _S(aMargin), aPtr, aLen); + +// Logs the memory allocated on the current thread's default heap +#define LOG_HEAP_USAGE(aLogFile) \ + {\ + TInt allocSize;\ + User::Heap().AllocSize(allocSize);\ + _LIT(KText,"* Memory allocated on the thread's default heap: %d *");\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,KText,allocSize);\ + RDebug::Print(KText,allocSize);\ + } + +#else // _FLOGGER_IMPLEMENTATION_ + +_LIT(KLogsFolder, "C:\\Logs\\"); +_LIT(KBackslash, "\\"); + +#define LOG_INIT(aLogFile)\ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + RFile file;\ + file.Replace(fs, fileNameAndPath, EFileShareAny|EFileWrite);\ + file.Close();\ + CLogFile::StaticLog(fileNameAndPath,_L("*** Log file created ***\n"));\ + }\ + fs.Close();\ + } + +#define LOG(aLogFile,aText) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + CLogFile::StaticLog(fileNameAndPath,_L(aText));\ + }\ + fs.Close();\ + RDebug::Print(_L(aText));\ + } + +#define LOGDES(aLogFile,aDes) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + CLogFile::StaticLog(fileNameAndPath,aDes);\ + }\ + fs.Close();\ + RDebug::Print(aDes);\ + } + +#define LOGFMT(aLogFile,aText,aParam) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + _LIT(KText,aText);\ + TLogFileDes16OverflowHandler ofh;\ + TBuf buf;\ + buf.AppendFormat(KText,&ofh,aParam);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam);\ + } + +// With 2 parameters +#define LOGFMT2(aLogFile,aText,aParam1,aParam2) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + _LIT(KText,aText);\ + TLogFileDes16OverflowHandler ofh;\ + TBuf buf;\ + buf.AppendFormat(KText,&ofh,aParam1,aParam2);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam1,aParam2);\ + } + +// With 3 parameters +#define LOGFMT3(aLogFile,aText,aParam1,aParam2,aParam3) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + _LIT(KText,aText);\ + TLogFileDes16OverflowHandler ofh;\ + TBuf buf;\ + buf.AppendFormat(KText,&ofh,aParam1,aParam2,aParam3);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3);\ + } + +// With 4 parameters +#define LOGFMT4(aLogFile,aText,aParam1,aParam2,aParam3,aParam4) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + _LIT(KText,aText);\ + TLogFileDes16OverflowHandler ofh;\ + TBuf buf;\ + buf.AppendFormat(KText,&ofh,aParam1,aParam2,aParam3,aParam4);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4);\ + } + +// Not implemented +#define LOGHEXDUMP(aLogFile,aHeader,aMargin,aPtr,aLen) + +// Log the memory allocated on the current thread's default heap +#define LOG_HEAP_USAGE(aLogFile) \ + {\ + TFileName path(KLogsFolder);\ + path.Append(KLogDir);\ + path.Append(KBackslash);\ + TFileName fileNameAndPath(path);\ + fileNameAndPath.Append(aLogFile);\ + RFs fs;\ + fs.Connect();\ + TInt allocSize;\ + User::Heap().AllocSize(allocSize);\ + _LIT(KText,"* Memory allocated on the thread's default heap: %d *");\ + if(BaflUtils::FolderExists(fs,path))\ + {\ + TLogFileDes16OverflowHandler ofh;\ + TBuf buf;\ + buf.AppendFormat(KText,&ofh,allocSize);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(KText, allocSize);\ + } + +#endif // _FLOGGER_IMPLEMENTATION_ + +#else // ENABLE_DEBUGLOG + +#define LOG_INIT(aLogFile) +#define LOG(aLogFile,aText) +#define LOGDES(aLogFile,aDes) +#define LOGFMT(aLogFile,aText,aParam) +#define LOGFMT2(aLogFile,aText,aParam1,aParam2) +#define LOGFMT3(aLogFile,aText,aParam1,aParam2,aParam3) +#define LOGFMT4(aLogFile,aText,aParam1,aParam2,aParam3,aParam4) +#define LOGHEXDUMP(aLogFile,aHeader,aMargin,aPtr,aLen) + +#endif // ENABLE_DEBUGLOG + +#endif // __DEBUGUTILS_H__