os/ossrv/genericopenlibs/openenvcore/liblogger/src/libloggerhandler.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description:  Contained libc logger class implementation.
sl@0
    15
 *
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
// INCLUDE FILES
sl@0
    20
#include <f32file.h>
sl@0
    21
sl@0
    22
#ifdef SYMBIAN_FILE_LOGGER
sl@0
    23
#include <flogger.h>
sl@0
    24
#endif
sl@0
    25
sl@0
    26
#include "libloggerhandler.h"
sl@0
    27
sl@0
    28
// CONSTANTS
sl@0
    29
#define LOG_MESSAGE_TYPE_INFO "INFO"
sl@0
    30
#define LOG_MESSAGE_TYPE_MINOR "MINOR"
sl@0
    31
#define LOG_MESSAGE_TYPE_MAJOR "MAJOR"
sl@0
    32
#define LOG_MESSAGE_TYPE_CRITICAL "CRITICAL"
sl@0
    33
sl@0
    34
sl@0
    35
#define MAX_LOG_STR_LEN 512 /* Overall size of any logging string size, including timestamp and others */
sl@0
    36
#define MAX_DATE_TIME_LEN 32
sl@0
    37
sl@0
    38
#define DUMP_STR_LENGTH 16
sl@0
    39
sl@0
    40
#ifdef SYMBIAN_FILE_LOGGER
sl@0
    41
_LIT(KLogFileLocation,"libc"); // c:\logs\libc
sl@0
    42
#else
sl@0
    43
_LIT(KLogFileLocation,"c:\\logs\\libc\\");
sl@0
    44
_LIT8(KDumpSpace,"                   %04x ");
sl@0
    45
#endif
sl@0
    46
sl@0
    47
const char KMsgType[4][16] =
sl@0
    48
	{
sl@0
    49
		LOG_MESSAGE_TYPE_INFO,
sl@0
    50
		LOG_MESSAGE_TYPE_MINOR,
sl@0
    51
		LOG_MESSAGE_TYPE_MAJOR,
sl@0
    52
		LOG_MESSAGE_TYPE_CRITICAL
sl@0
    53
	};
sl@0
    54
sl@0
    55
// ============================ LOCAL FUNCTIONS ===============================
sl@0
    56
sl@0
    57
// strlen is implemented over here, just to remove the dependancy from libc/estdlib
sl@0
    58
sl@0
    59
// -----------------------------------------------------------------------------
sl@0
    60
// _lstrlen
sl@0
    61
// find the string length.
sl@0
    62
// -----------------------------------------------------------------------------
sl@0
    63
//
sl@0
    64
LOCAL_C TInt _lstrlen(const char *str)
sl@0
    65
sl@0
    66
    {
sl@0
    67
	const char *s;
sl@0
    68
	for (s = str; *s; ++s)
sl@0
    69
	    {
sl@0
    70
	    }
sl@0
    71
	return(s - str);
sl@0
    72
    }
sl@0
    73
// -----------------------------------------------------------------------------
sl@0
    74
// BitPosition
sl@0
    75
// Find the bit position within the number
sl@0
    76
// -----------------------------------------------------------------------------
sl@0
    77
//
sl@0
    78
LOCAL_C TInt BitPosition(TInt aNumber)
sl@0
    79
    {
sl@0
    80
    TInt pos = 0;
sl@0
    81
    while(!(aNumber & 1))
sl@0
    82
        {
sl@0
    83
        aNumber = (aNumber >> 1);
sl@0
    84
        pos++;
sl@0
    85
        }
sl@0
    86
    // only first 4 bits are used.
sl@0
    87
    if ( pos < 0 || pos >= 4)
sl@0
    88
        {
sl@0
    89
        // crosses the boundary.
sl@0
    90
        pos = 0;
sl@0
    91
        }
sl@0
    92
    return pos;
sl@0
    93
    }
sl@0
    94
sl@0
    95
sl@0
    96
// -----------------------------------------------------------------------------
sl@0
    97
// CLibLogger::GetLogFilename
sl@0
    98
// Get the log file name.
sl@0
    99
// -----------------------------------------------------------------------------
sl@0
   100
//
sl@0
   101
void CLibLogger::GetLogFilename(TDes& aFileName)
sl@0
   102
{
sl@0
   103
	_LIT(KFileNameFormat, "Mrt_%S.txt");
sl@0
   104
    RProcess currentProcess;
sl@0
   105
    TName processName = currentProcess.Name();
sl@0
   106
#ifdef SYMBIAN_FILE_LOGGER
sl@0
   107
    aFileName.Format(KFileNameFormat, &processName);
sl@0
   108
#else
sl@0
   109
    aFileName.Copy(KLogFileLocation);
sl@0
   110
    aFileName.AppendFormat(KFileNameFormat, &processName);
sl@0
   111
#endif
sl@0
   112
    currentProcess.Close();
sl@0
   113
}
sl@0
   114
sl@0
   115
// -----------------------------------------------------------------------------
sl@0
   116
// CLibLogger::WriteMessage
sl@0
   117
// Write message to the log file
sl@0
   118
// -----------------------------------------------------------------------------
sl@0
   119
//
sl@0
   120
TInt CLibLogger::WriteMessage(const TDesC8& aMessage)
sl@0
   121
{
sl@0
   122
	TFileName logFileName;
sl@0
   123
	GetLogFilename(logFileName);
sl@0
   124
	TInt err = KErrNone;
sl@0
   125
#ifdef SYMBIAN_FILE_LOGGER
sl@0
   126
    RFileLogger::Write(KLogFileLocation, logFileName, EFileLoggingModeAppend, aMessage);
sl@0
   127
#else
sl@0
   128
	RFs fsSession; /* file server */
sl@0
   129
	RFile iFile;
sl@0
   130
	err = CLibLogger::CreateFileSession(fsSession, iFile);
sl@0
   131
	if(KErrNone != err)
sl@0
   132
	{
sl@0
   133
		/* Error : Unable to initialize the file session */
sl@0
   134
		return err;
sl@0
   135
	}
sl@0
   136
sl@0
   137
	/* write the buffer to the file */
sl@0
   138
	err = iFile.Write(aMessage);
sl@0
   139
	if(KErrNone != err)
sl@0
   140
	{
sl@0
   141
		/* Error : Unable to initialize the file session */
sl@0
   142
		iFile.Close();
sl@0
   143
		fsSession.Close();
sl@0
   144
		return err;
sl@0
   145
	}
sl@0
   146
sl@0
   147
	/* flush the buffer */
sl@0
   148
	iFile.Flush(); /* commit the write. */
sl@0
   149
sl@0
   150
	/* close the session and resources */
sl@0
   151
	iFile.Close();
sl@0
   152
	fsSession.Close();
sl@0
   153
#endif
sl@0
   154
    return err;
sl@0
   155
}
sl@0
   156
sl@0
   157
// -----------------------------------------------------------------------------
sl@0
   158
// CLibLogger::LogMessage
sl@0
   159
// Logging the internal messages.
sl@0
   160
// -----------------------------------------------------------------------------
sl@0
   161
//
sl@0
   162
int CLibLogger::LogMessage(TLibTraceMessageType aLogMessageType,
sl@0
   163
							char *aFileName,
sl@0
   164
							int aLine,
sl@0
   165
							char *aFormat,
sl@0
   166
							VA_LIST& aMarkerList)
sl@0
   167
{
sl@0
   168
	/* checking for error inputs */
sl@0
   169
	if(NULL == aFormat)
sl@0
   170
	{
sl@0
   171
		/* Error : Check the input parameter. */
sl@0
   172
		return -1;
sl@0
   173
	}
sl@0
   174
sl@0
   175
	/* trying to fetch the local time */
sl@0
   176
	TBuf8<MAX_LOG_STR_LEN> lBuf;
sl@0
   177
	lBuf.FillZ();
sl@0
   178
	lBuf.SetLength(0);
sl@0
   179
sl@0
   180
#ifdef SYMBIAN_FILE_LOGGER
sl@0
   181
	/* formulate the time stamp with log type */
sl@0
   182
	_LIT8(KFormat, "(%s : %d) [%s] - ");
sl@0
   183
	lBuf.Format(KFormat,
sl@0
   184
		aFileName,
sl@0
   185
		aLine,
sl@0
   186
		KMsgType[BitPosition(aLogMessageType)]
sl@0
   187
		);
sl@0
   188
#else
sl@0
   189
	TTime lCurTime;
sl@0
   190
	lCurTime.HomeTime();
sl@0
   191
	TDateTime lTimeStamp = lCurTime.DateTime();
sl@0
   192
sl@0
   193
	/* formulate the time stamp with log type */
sl@0
   194
	_LIT8(KFormat, "%2d/%2d/%d-%2d:%2d:%2d.%3d - (%s : %d) [%s] - ");
sl@0
   195
	lBuf.Format(KFormat,
sl@0
   196
		lTimeStamp.Day(),
sl@0
   197
		(int)(lTimeStamp.Month() + 1),
sl@0
   198
		lTimeStamp.Year(),
sl@0
   199
		lTimeStamp.Hour(),
sl@0
   200
		lTimeStamp.Minute(),
sl@0
   201
		lTimeStamp.Second(),
sl@0
   202
		(int)((lTimeStamp.MicroSecond())/1000),
sl@0
   203
		aFileName,
sl@0
   204
		aLine,
sl@0
   205
		KMsgType[BitPosition(aLogMessageType)]
sl@0
   206
		);
sl@0
   207
#endif // SYMBIAN_FILE_LOGGER
sl@0
   208
sl@0
   209
	TPtrC8 lPtr((TUint8*)aFormat, _lstrlen(aFormat));
sl@0
   210
	lBuf.AppendFormatList(lPtr, aMarkerList);
sl@0
   211
sl@0
   212
	/* new line */
sl@0
   213
	_LIT8(KNewLine, "\r\n");
sl@0
   214
	lBuf.Append(KNewLine);
sl@0
   215
    WriteMessage(lBuf);
sl@0
   216
	return lBuf.Length();
sl@0
   217
}
sl@0
   218
sl@0
   219
// -----------------------------------------------------------------------------
sl@0
   220
// CLibLogger::LogMessage
sl@0
   221
// Logging the internal messages.
sl@0
   222
// -----------------------------------------------------------------------------
sl@0
   223
//
sl@0
   224
int CLibLogger::LogMessage(char *aFileName, int aLine)
sl@0
   225
{
sl@0
   226
	/* trying to fetch the local time */
sl@0
   227
	TBuf8<MAX_LOG_STR_LEN> lBuf;
sl@0
   228
	lBuf.FillZ();
sl@0
   229
	lBuf.SetLength(0);
sl@0
   230
sl@0
   231
#ifdef SYMBIAN_FILE_LOGGER
sl@0
   232
	/* formulate the time stamp with log type */
sl@0
   233
	_LIT8(KFormat, "(%s : %d) ");
sl@0
   234
	lBuf.Format(KFormat,
sl@0
   235
		aFileName,
sl@0
   236
		aLine);
sl@0
   237
#else
sl@0
   238
	TTime lCurTime;
sl@0
   239
	lCurTime.HomeTime();
sl@0
   240
	TDateTime lTimeStamp = lCurTime.DateTime();
sl@0
   241
sl@0
   242
	/* formulate the time stamp with log type */
sl@0
   243
	_LIT8(KFormat, "%2d/%2d/%d-%2d:%2d:%2d.%3d - (%s : %d) ");
sl@0
   244
	lBuf.Format(KFormat,
sl@0
   245
		lTimeStamp.Day(),
sl@0
   246
		(int)(lTimeStamp.Month() + 1),
sl@0
   247
		lTimeStamp.Year(),
sl@0
   248
		lTimeStamp.Hour(),
sl@0
   249
		lTimeStamp.Minute(),
sl@0
   250
		lTimeStamp.Second(),
sl@0
   251
		(int)((lTimeStamp.MicroSecond())/1000),
sl@0
   252
		aFileName,
sl@0
   253
		aLine);
sl@0
   254
#endif // SYMBIAN_FILE_LOGGER
sl@0
   255
    WriteMessage(lBuf);
sl@0
   256
	return lBuf.Length();
sl@0
   257
}
sl@0
   258
sl@0
   259
sl@0
   260
// -----------------------------------------------------------------------------
sl@0
   261
// CLibLogger::LogMessage
sl@0
   262
// Logging the internal messages.
sl@0
   263
// -----------------------------------------------------------------------------
sl@0
   264
//
sl@0
   265
int CLibLogger::LogMessage(TLibTraceMessageType aLogMessageType,
sl@0
   266
							char *aFormat, 
sl@0
   267
							VA_LIST& aMarkerList)
sl@0
   268
{
sl@0
   269
	/* checking for error inputs */
sl@0
   270
	if(NULL == aFormat)
sl@0
   271
	{
sl@0
   272
		/* Error : Check the input parameter. */
sl@0
   273
		return -1;
sl@0
   274
	}
sl@0
   275
sl@0
   276
	/* trying to fetch the local time */
sl@0
   277
	TBuf8<MAX_LOG_STR_LEN> lBuf;
sl@0
   278
	lBuf.FillZ();
sl@0
   279
	lBuf.SetLength(0);
sl@0
   280
sl@0
   281
	/* formulate the time stamp with log type */
sl@0
   282
	_LIT8(KFormat, "[%s] - ");
sl@0
   283
	lBuf.Format(KFormat, 
sl@0
   284
		KMsgType[BitPosition(aLogMessageType)]
sl@0
   285
		);
sl@0
   286
sl@0
   287
	TPtrC8 lPtr((TUint8*)aFormat, _lstrlen(aFormat));
sl@0
   288
	lBuf.AppendFormatList(lPtr, aMarkerList);
sl@0
   289
sl@0
   290
	/* new line */
sl@0
   291
	_LIT8(KNewLine, "\r\n");
sl@0
   292
	lBuf.Append(KNewLine);
sl@0
   293
    WriteMessage(lBuf);
sl@0
   294
	return lBuf.Length();
sl@0
   295
}
sl@0
   296
sl@0
   297
sl@0
   298
// -----------------------------------------------------------------------------
sl@0
   299
// CLibLogger::DumpFormatMessage
sl@0
   300
// Dump the internal message in hex format.
sl@0
   301
// -----------------------------------------------------------------------------
sl@0
   302
//
sl@0
   303
int CLibLogger::DumpFormatMessage(TLibTraceMessageType aLogMessageType,
sl@0
   304
                            char *aFileName,
sl@0
   305
							int aLine,
sl@0
   306
							char *aMessage,
sl@0
   307
							char *aFormat,
sl@0
   308
							VA_LIST& aMarkerList)
sl@0
   309
{
sl@0
   310
	if(NULL == aFormat)
sl@0
   311
	{
sl@0
   312
		/* Error : Check your input value. */
sl@0
   313
		return 0;
sl@0
   314
	}
sl@0
   315
	TBuf8<MAX_LOG_STR_LEN> lBuf;
sl@0
   316
	lBuf.FillZ();
sl@0
   317
	lBuf.SetLength(0);
sl@0
   318
	TPtrC8 lPtr((TUint8*)aFormat, _lstrlen(aFormat));
sl@0
   319
	lBuf.AppendFormatList(lPtr, aMarkerList);
sl@0
   320
sl@0
   321
	return DumpMessage(aLogMessageType, aFileName, aLine, aMessage, (char *)lBuf.PtrZ(), lBuf.Length());
sl@0
   322
}
sl@0
   323
sl@0
   324
// -----------------------------------------------------------------------------
sl@0
   325
// CLibLogger::DumpMessage
sl@0
   326
// Dump the internal message in hex format.
sl@0
   327
// -----------------------------------------------------------------------------
sl@0
   328
//
sl@0
   329
int CLibLogger::DumpMessage(TLibTraceMessageType aLogMessageType,
sl@0
   330
                            char *aFileName,
sl@0
   331
							int aLine,
sl@0
   332
							char *aMessage,
sl@0
   333
							char *aStr,
sl@0
   334
							int aStrLen)
sl@0
   335
{
sl@0
   336
	int istrLen = (aStrLen == -1) ? _lstrlen(aStr) : aStrLen;
sl@0
   337
	if((NULL == aStr)
sl@0
   338
		|| (istrLen <= 0))
sl@0
   339
	{
sl@0
   340
		/* Error : Check your input value. */
sl@0
   341
		return 0;
sl@0
   342
	}
sl@0
   343
	/* log the timestamp */
sl@0
   344
sl@0
   345
	return LibTracer(aLogMessageType, aFileName, aLine, aMessage) + DumpMessage(aStr, istrLen);
sl@0
   346
}
sl@0
   347
sl@0
   348
// -----------------------------------------------------------------------------
sl@0
   349
// CLibLogger::DumpFormatMessage
sl@0
   350
// Dump the internal message in hex format.
sl@0
   351
// -----------------------------------------------------------------------------
sl@0
   352
//
sl@0
   353
int CLibLogger::DumpFormatMessage(TLibTraceMessageType aLogMessageType,
sl@0
   354
							char *aMessage,
sl@0
   355
							char *aFormat,
sl@0
   356
							VA_LIST& aMarkerList)
sl@0
   357
{
sl@0
   358
	if(NULL == aFormat)
sl@0
   359
	{
sl@0
   360
		/* Error : Check your input value. */
sl@0
   361
		return 0;
sl@0
   362
	}
sl@0
   363
sl@0
   364
sl@0
   365
	/* trying to fetch the local time */
sl@0
   366
	TBuf8<MAX_LOG_STR_LEN> lBuf;
sl@0
   367
	lBuf.FillZ();
sl@0
   368
	lBuf.SetLength(0);
sl@0
   369
sl@0
   370
	/* formulate the time stamp with log type */
sl@0
   371
	_LIT8(KFormat, "[%s] - %s");
sl@0
   372
	lBuf.Format(KFormat,
sl@0
   373
		KMsgType[BitPosition(aLogMessageType)], aMessage);
sl@0
   374
sl@0
   375
sl@0
   376
	_LIT8(KNewLine, "\r\n");
sl@0
   377
	lBuf.Append(KNewLine);
sl@0
   378
    WriteMessage(lBuf);
sl@0
   379
    int len = lBuf.Length();
sl@0
   380
	lBuf.FillZ();
sl@0
   381
	lBuf.SetLength(0);
sl@0
   382
	TPtrC8 lPtr((TUint8*)aFormat, _lstrlen(aFormat));
sl@0
   383
	lBuf.AppendFormatList(lPtr, aMarkerList);
sl@0
   384
sl@0
   385
	return len + DumpMessage((char *)lBuf.PtrZ(), lBuf.Length());
sl@0
   386
}
sl@0
   387
sl@0
   388
sl@0
   389
sl@0
   390
#ifdef SYMBIAN_FILE_LOGGER
sl@0
   391
// -----------------------------------------------------------------------------
sl@0
   392
// CLibLogger::DumpMessage
sl@0
   393
// Dump the internal message in hex format.
sl@0
   394
// -----------------------------------------------------------------------------
sl@0
   395
//
sl@0
   396
int CLibLogger::DumpMessage(char *aStr, int aStrLen)
sl@0
   397
{
sl@0
   398
	/* check the inputs */
sl@0
   399
	if((NULL == aStr)
sl@0
   400
		|| (aStrLen <= 0))
sl@0
   401
	{
sl@0
   402
		/* Error : Check your input value. */
sl@0
   403
		return 0;
sl@0
   404
	}
sl@0
   405
sl@0
   406
	/* Input parameter is okey */
sl@0
   407
sl@0
   408
	TFileName logFileName;
sl@0
   409
	GetLogFilename(logFileName);
sl@0
   410
    RFileLogger::HexDump(KLogFileLocation, logFileName, EFileLoggingModeAppend, NULL, NULL, (TUint8*)aStr, aStrLen);
sl@0
   411
    return aStrLen;
sl@0
   412
}
sl@0
   413
sl@0
   414
sl@0
   415
#else
sl@0
   416
sl@0
   417
// -----------------------------------------------------------------------------
sl@0
   418
// CLibLogger::CreateFileSession
sl@0
   419
// Create a file session for the logger.
sl@0
   420
// -----------------------------------------------------------------------------
sl@0
   421
//
sl@0
   422
int CLibLogger::CreateFileSession(RFs &aFsSession, RFile &aFile)
sl@0
   423
{
sl@0
   424
	int lErr;
sl@0
   425
	/* register with the file service session. */
sl@0
   426
sl@0
   427
	lErr = aFsSession.Connect();
sl@0
   428
	if(lErr != KErrNone)
sl@0
   429
	{
sl@0
   430
		/* Error : unable to create a session with file server */
sl@0
   431
		return lErr;
sl@0
   432
	}
sl@0
   433
sl@0
   434
	/* Success : application is connected with the file server */
sl@0
   435
sl@0
   436
	TFileName logFileName;
sl@0
   437
	GetLogFilename(logFileName);
sl@0
   438
sl@0
   439
	aFsSession.MkDirAll(logFileName);
sl@0
   440
	CDir* fileList;
sl@0
   441
	CDir* dirList;
sl@0
   442
	
sl@0
   443
	//coverity[alloc_fn]
sl@0
   444
	lErr = aFsSession.GetDir(logFileName,KEntryAttNormal,
sl@0
   445
		ESortByName,fileList,dirList);
sl@0
   446
	if(lErr != KErrNone)
sl@0
   447
	{
sl@0
   448
		/* Error : unable to retrieve the directory list */
sl@0
   449
		aFsSession.Close(); /* close the session with file server */
sl@0
   450
		return lErr;
sl@0
   451
	}
sl@0
   452
sl@0
   453
	if(0 >= fileList->Count())
sl@0
   454
	{
sl@0
   455
		/* File doesn't exist. create a new file. */
sl@0
   456
		lErr = aFile.Replace(aFsSession,
sl@0
   457
								logFileName,
sl@0
   458
								EFileWrite|EFileStreamText);
sl@0
   459
		if(lErr != KErrNone)
sl@0
   460
		{
sl@0
   461
			/* Error : unable to create the new file. */
sl@0
   462
			delete fileList;
sl@0
   463
			delete dirList;
sl@0
   464
			aFsSession.Close(); /* close the session with file server */
sl@0
   465
			return lErr;
sl@0
   466
		}
sl@0
   467
	}
sl@0
   468
	else
sl@0
   469
	{
sl@0
   470
		/* Shared access for reading and writing. */
sl@0
   471
		lErr = aFile.Open(aFsSession,
sl@0
   472
								logFileName,
sl@0
   473
								EFileWrite | EFileStreamText);
sl@0
   474
		if(lErr != KErrNone)
sl@0
   475
		{
sl@0
   476
			/* Error : unable to open the file. */
sl@0
   477
			delete fileList;
sl@0
   478
			delete dirList;
sl@0
   479
			aFsSession.Close(); /* close the session with file server */
sl@0
   480
			return lErr;
sl@0
   481
		}
sl@0
   482
		int pos = 0; /* since we have pass the 2nd parameter as reference. */
sl@0
   483
		lErr = aFile.Seek(ESeekEnd, pos);
sl@0
   484
		if(lErr != KErrNone)
sl@0
   485
		{
sl@0
   486
			/* Error : unable to move the file pointer. */
sl@0
   487
			//coverity[leave_without_push]
sl@0
   488
			aFile.Close(); /* close the file */
sl@0
   489
			//coverity[leave_without_push]
sl@0
   490
			aFsSession.Close(); /* close the session with file server */
sl@0
   491
			delete fileList;
sl@0
   492
			delete dirList;
sl@0
   493
			return lErr;
sl@0
   494
		}
sl@0
   495
	}
sl@0
   496
	/* delete the resources */
sl@0
   497
sl@0
   498
	delete fileList;
sl@0
   499
	delete dirList;
sl@0
   500
	return lErr;
sl@0
   501
}
sl@0
   502
sl@0
   503
sl@0
   504
// -----------------------------------------------------------------------------
sl@0
   505
// CLibLogger::DumpMessage
sl@0
   506
// Dump the internal message in hex format.
sl@0
   507
// -----------------------------------------------------------------------------
sl@0
   508
//
sl@0
   509
int CLibLogger::DumpMessage(char *aStr, int aStrLen)
sl@0
   510
{
sl@0
   511
	/* check the inputs */
sl@0
   512
	if((NULL == aStr)
sl@0
   513
		|| (aStrLen <= 0))
sl@0
   514
	{
sl@0
   515
		/* Error : Check your input value. */
sl@0
   516
		return 0;
sl@0
   517
	}
sl@0
   518
sl@0
   519
	/* Input parameter is okey */
sl@0
   520
sl@0
   521
	/* local variables */
sl@0
   522
	int counter = 0;
sl@0
   523
sl@0
   524
	/* store the input string to a local pointer */
sl@0
   525
	TPtrC8 istrMesg((TUint8* )aStr, aStrLen);
sl@0
   526
sl@0
   527
	/* local log buffer */
sl@0
   528
	TBuf8<MAX_LOG_STR_LEN> lstrLogMesgString;
sl@0
   529
	TBuf8<MAX_LOG_STR_LEN> ptempStr;
sl@0
   530
sl@0
   531
	/* few literals */
sl@0
   532
	_LIT8(KSpace, " ");
sl@0
   533
	_LIT8(KDblSpace, "   ");
sl@0
   534
	_LIT8(KFormat, "%2x "); /* hex format */
sl@0
   535
    _LIT8(KNewLine, "\r\n");
sl@0
   536
	RFs fsSession; /* file server */
sl@0
   537
	RFile file;
sl@0
   538
	int lErr = CLibLogger::CreateFileSession(fsSession, file);
sl@0
   539
	if(KErrNone != lErr)
sl@0
   540
	{
sl@0
   541
		/* Error : Unable to initialize the file session */
sl@0
   542
		return lErr;
sl@0
   543
	}
sl@0
   544
	// since these method can be called in from thread context and
sl@0
   545
	// thread may not call this method within TRAPD
sl@0
   546
    //CleanupClosePushL(fsSession);
sl@0
   547
    //CleanupClosePushL(file);
sl@0
   548
sl@0
   549
	for(counter = 0; counter < aStrLen; counter++)
sl@0
   550
	{
sl@0
   551
		if((counter != 0) && ((counter % DUMP_STR_LENGTH) == 0))
sl@0
   552
		{
sl@0
   553
			/* sring reaches with the multiple to 16 (DUMP_STR_LENGTH) */
sl@0
   554
			lstrLogMesgString.UpperCase();
sl@0
   555
			lstrLogMesgString.Append(KSpace);
sl@0
   556
			/* append 16 (DUMP_STR_LENGTH) characters */
sl@0
   557
			lstrLogMesgString.Append(istrMesg.Mid(((counter / DUMP_STR_LENGTH) - 1) * DUMP_STR_LENGTH, DUMP_STR_LENGTH));
sl@0
   558
sl@0
   559
			/* dump the buffer */
sl@0
   560
			ptempStr.Format(KDumpSpace, counter - DUMP_STR_LENGTH);
sl@0
   561
			lstrLogMesgString.Insert(0, ptempStr);
sl@0
   562
            file.Write(lstrLogMesgString);
sl@0
   563
            file.Write(KNewLine);
sl@0
   564
            file.Flush();
sl@0
   565
			/* free the buffer, set the length to zero */
sl@0
   566
			lstrLogMesgString.FillZ();
sl@0
   567
			lstrLogMesgString.SetLength(0);
sl@0
   568
		} /* end of if */
sl@0
   569
		ptempStr.Format(KFormat,(int)istrMesg[counter]);
sl@0
   570
		lstrLogMesgString.Append(ptempStr);
sl@0
   571
	} /*  end of for */
sl@0
   572
sl@0
   573
	if(0 < lstrLogMesgString.Length())
sl@0
   574
	{
sl@0
   575
		/* few character remains */
sl@0
   576
		/* it's not multiple of 16 (DUMP_STR_LENGTH) */
sl@0
   577
		/* adjust the dump and the character portion */
sl@0
   578
		if (aStrLen % DUMP_STR_LENGTH != 0)
sl@0
   579
		{
sl@0
   580
    		for(int lliCounter = 0; lliCounter < DUMP_STR_LENGTH - (aStrLen % DUMP_STR_LENGTH); lliCounter++)
sl@0
   581
    		{
sl@0
   582
    			lstrLogMesgString.Append(KDblSpace); /* filling the blanks */
sl@0
   583
    		} /* end of for */
sl@0
   584
        }
sl@0
   585
		lstrLogMesgString.UpperCase();
sl@0
   586
		/* fill the string */
sl@0
   587
		lstrLogMesgString.Append(KSpace);
sl@0
   588
		/* append the string */
sl@0
   589
		if (aStrLen % DUMP_STR_LENGTH != 0)
sl@0
   590
		{
sl@0
   591
		    lstrLogMesgString.Append(istrMesg.Mid(((counter / DUMP_STR_LENGTH)) * DUMP_STR_LENGTH, (aStrLen - ((counter / DUMP_STR_LENGTH)) * DUMP_STR_LENGTH)));
sl@0
   592
		}
sl@0
   593
		else
sl@0
   594
		{
sl@0
   595
		    lstrLogMesgString.Append(istrMesg.Mid(((counter / DUMP_STR_LENGTH) - 1) * DUMP_STR_LENGTH, (aStrLen - ((counter / DUMP_STR_LENGTH) -1) * DUMP_STR_LENGTH)));
sl@0
   596
		}
sl@0
   597
		ptempStr.Format(KDumpSpace, ((aStrLen / DUMP_STR_LENGTH) * DUMP_STR_LENGTH));
sl@0
   598
		lstrLogMesgString.Insert(0, ptempStr);
sl@0
   599
        file.Write(lstrLogMesgString);
sl@0
   600
        file.Write(KNewLine);
sl@0
   601
        file.Flush();
sl@0
   602
	} /* end of if */
sl@0
   603
	//CleanupStack::PopAndDestroy(2); // file, fsFession
sl@0
   604
	file.Close();
sl@0
   605
	fsSession.Close();
sl@0
   606
	return aStrLen; /* return the total dump message length */
sl@0
   607
}
sl@0
   608
sl@0
   609
#endif // SYMBIAN_FILE_LOGGER
sl@0
   610
sl@0
   611
#ifndef EKA2
sl@0
   612
sl@0
   613
GLDEF_C TInt E32Dll(TDllReason aReason)
sl@0
   614
	{
sl@0
   615
	switch (aReason)
sl@0
   616
		{
sl@0
   617
	default:
sl@0
   618
		break;
sl@0
   619
		}
sl@0
   620
	return KErrNone;
sl@0
   621
	}
sl@0
   622
sl@0
   623
#endif
sl@0
   624
sl@0
   625
// End of file