diff -r 000000000000 -r 951a5db380a0 videditor/VideoEditorCommon/inc/VideoEditorDebugUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videditor/VideoEditorCommon/inc/VideoEditorDebugUtils.h Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,426 @@ +/* +* 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. Put the following line into you MMP file +// LIBRARY flogger.lib +// +// 2. Define DEBUG_ON to enable logs in UDEB builds. +// Alternatively, define DEBUG_ON_ALWAYS to enable logs +// always (NOTE: do not use in productions code) +// - in mmp file: macro DEBUG_ON +// - in cpp file: #define DEBUG_ON +// +// 3a. Call LOG_RESET 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\VideoEditor" 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 _CLOGFILE_IMPLEMENTATION_ + +#ifdef _FLOGGER_IMPLEMENTATION_ +#include +#else +#include "logfile.h" +#include +#include +#endif +#include + +// Default log files +_LIT(KVideoEditorLogFile,"VideoEditor.log"); +_LIT(KVideoProviderLogFile,"VideoProvider.log"); + +// Log directory +_LIT(KLogDir, "VideoEditor"); + +// Maximum length for a log line. +const TInt KMaxLogLineLength = 256; + +// Overflow handler. Too log lines are truncated. +class TLogFileDes16OverflowHandler : public TDes16Overflow + { + virtual void Overflow(TDes16& /*aDes*/) + { + // do nothing + } + }; + +_LIT(KLogsFolder, "C:\\Logs\\"); +_LIT(KBackslash, "\\"); + + +// The log is enabled in debug builds only, unless +// DEBUG_ON_ALWAYS is defined to always enable it. +#ifdef _DEBUG + #ifdef DEBUG_ON + #define _ENABLED_ + #endif +#else + #ifdef DEBUG_ON_ALWAYS + #define _ENABLED_ + #endif +#endif + +#ifdef _ENABLED_ + +#define DEBUGLOG_ARG(x) x + +#ifdef _FLOGGER_IMPLEMENTATION_ + +// Initialize the log file, overwrite existing +// Logs file are always created in C:\Logs. The first argument to CreateLog() +// is a directory name relative to this C:\Logs directory. +#define LOG_RESET(aLogFile) \ + {\ + RFileLogger logger;\ + logger.Connect();\ + logger.CreateLog(KLogDir,aLogFile,EFileLoggingModeOverwrite);\ + logger.Write(KLogDir,aLogFile,EFileLoggingModeAppend,_L("*** Log file created ***"));\ + logger.CloseLog();\ + logger.Close();\ + } + +// Log 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));\ + } + +// Log a Descriptor +#define LOGDES(aLogFile,aDes) \ + {\ + RFileLogger::Write(KLogDir,aLogFile,EFileLoggingModeAppend,aDes);\ + RDebug::Print(aDes);\ + } + +// Log 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);\ + } + +// With 2 parameters +#define LOGFMT2(aLogFile,aText,aParam1,aParam2) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2);\ + RDebug::Print(_L(aText), aParam1,aParam2);\ + } + +// With 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);\ + } + +// With 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);\ + } + +// With 6 parameters +#define LOGFMT6(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2,aParam3,aParam4,aParam5,aParam6);\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4,aParam5,aParam6);\ + } + +// With 12 parameters +#define LOGFMT12(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12) \ + {\ + RFileLogger::WriteFormat(KLogDir,aLogFile,EFileLoggingModeAppend,_L(aText),aParam1,aParam2,aParam3,aParam4);\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4,,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12);\ + } + +// Log hex dump +#define LOGHEXDUMP(aLogFile,aHeader,aMargin,aPtr,aLen) \ + RFileLogger::HexDump(KLogDir,aLogFile, EFileLoggingModeAppend, _S(aHeader), _S(aMargin), aPtr, aLen); + +// Log 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);\ + } + +#endif // _FLOGGER_IMPLEMENTATION_ + +#ifdef _CLOGFILE_IMPLEMENTATION_ + +#define LOG_RESET(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);\ + } + +// With 6 parameters +#define LOGFMT6(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6) \ + {\ + 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,aParam5,aParam6);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4,aParam5,aParam6);\ + } + +// With 12 parameters +#define LOGFMT12(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12) \ + {\ + 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,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12);\ + CLogFile::StaticLog(fileNameAndPath,buf);\ + }\ + fs.Close();\ + RDebug::Print(_L(aText), aParam1,aParam2,aParam3,aParam4,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12);\ + } + +// 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 // _CLOGFILE_IMPLEMENTATION_ + +#else // _ENABLED_ + +#define DEBUGLOG_ARG(x) + +#define LOG_RESET(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 LOGFMT6(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6) +#define LOGFMT12(aLogFile,aText,aParam1,aParam2,aParam3,aParam4,aParam5,aParam6,aParam7,aParam8,aParam9,aParam10,aParam11,aParam12) +#define LOGHEXDUMP(aLogFile,aHeader,aMargin,aPtr,aLen) +#define LOG_HEAP_USAGE(aLogFile) + +#endif // _ENABLED_ + +#endif // __DEBUGUTILS_H__