htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/Logger.cpp
changeset 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/Logger.cpp	Tue Feb 02 00:17:27 2010 +0200
@@ -0,0 +1,201 @@
+/*
+* 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:  Logger implementation.
+*
+*/
+
+
+// INCLUDE FILES
+#include "Logger.h"
+#include <f32file.h>
+
+#ifdef __ENABLE_LOGGING__
+
+// CONSTANTS
+_LIT(KDebugStr, "DEBUG: ");
+_LIT(KInfoStr,  "INFO:  ");
+_LIT(KWarnStr,  "WARN:  ");
+_LIT(KErrStr,   "ERROR: ");
+
+
+/*---------------------------------------------------------------------------*/
+void LogBytes( const TDesC8& aData, TInt aMaxBytesToLog )
+    {
+    TInt i = 0;
+    while ( i < aData.Length() && i < aMaxBytesToLog )
+        {
+        TBuf<64> hexbuf;
+        TBuf<32> stringbuf;
+        TInt k=0;
+        while ( i < aMaxBytesToLog && i < aData.Length() && k < 16 )
+            {
+            const TUint8 uint8 = aData[i];
+            hexbuf.AppendFormat( _L( "%02X "), uint8 );
+
+            if ( uint8 == '%' )
+                {
+                stringbuf.Append( _L( "%%" ) ); // escape character in format string
+                }
+            else if ( uint8 < 32 || uint8 > 126 )
+                {
+                stringbuf.Append( _L(".") );
+                }
+            else
+                {
+                stringbuf.Append( ( TChar ) uint8 );
+                }
+            i++;
+            k++;
+            }
+        TBuf<128> finalbuf;
+        finalbuf.Copy( hexbuf );
+        finalbuf.Append( _L(" | " ) );
+        finalbuf.Append( stringbuf );
+        DebugLog( finalbuf );
+        }
+    }
+
+/*---------------------------------------------------------------------------*/
+class TOverflowHandler : public TDes16Overflow
+    {
+    void Overflow( TDes16& aDes )
+        {
+        TBuf<KLogEntryMaxLength> logString( _L("LOG ERROR: overflow: ") );
+        logString.Append( aDes.Left(
+            KLogEntryMaxLength - logString.Length() ) );
+        aDes.Copy( logString );
+        }
+    };
+
+/*---------------------------------------------------------------------------*/
+// Usage example: DOLOG(_L("Logstring"));
+void DebugLog( TRefByValue<const TDesC> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    Log( KLogLevelDebug, aFmt, list );
+    }
+
+/*---------------------------------------------------------------------------*/
+void InfoLog( TRefByValue<const TDesC> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    Log( KLogLevelInfo, aFmt, list );
+    }
+
+/*---------------------------------------------------------------------------*/
+void WarnLog( TRefByValue<const TDesC> aFmt, ... )
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    Log( KLogLevelWarning, aFmt, list );
+    }
+
+/*---------------------------------------------------------------------------*/
+void ErrLog( TRefByValue<const TDesC> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    Log( KLogLevelError, aFmt, list );
+    }
+
+/*---------------------------------------------------------------------------*/
+void Log( TInt aLevel, TRefByValue<const TDesC> aText, VA_LIST list )
+    {
+
+    if ( aLevel < KMinimumLogLevel )
+        return;
+
+    _LIT( KLineFeed, "\n" );
+
+    /**
+     *  Log time format (see TTime) is
+     *  Day-Month-Year Hours:Minutes:Seconds:Milliseconds
+     *
+     *  Example: 30-12-2004 23:00:55:990
+     */
+    _LIT( KLogTimeFormat, "%F%D-%M-%Y %H:%T:%S:%*C3" );
+
+    TBuf8<KLogEntryMaxLength> writeBuffer;
+    TBuf16<KLogEntryMaxLength> logEntry;
+    RFs FileServer;
+    RFile File;
+
+    if ( FileServer.Connect() != KErrNone )
+        {
+        FileServer.Close(); // just in case
+        User::Panic( KLogPanicCategory(), KPanicFsConnectFailed );
+        return;
+        }
+
+    // Open file for writing, if exists. Othervise create new file.
+    if ( File.Open( FileServer, KLogFileName(), EFileWrite ) != KErrNone )
+        {
+        if ( File.Create( FileServer, KLogFileName(), EFileWrite )
+            != KErrNone )
+            {
+            FileServer.Close();
+            User::Panic( KLogPanicCategory(), KPanicFileCreateFailed );
+            }
+        }
+
+    TTime currentTime;
+    currentTime.UniversalTime();
+    TBuf<32> timeString;
+
+    // currentTime is now in universal time. Convert it to home time.
+    TLocale locale;
+    TTimeIntervalSeconds universalTimeOffset( locale.UniversalTimeOffset() );
+    TTimeIntervalHours daylightSaving( 0 );
+    if ( locale.QueryHomeHasDaylightSavingOn() )
+        {
+        daylightSaving = 1;
+        }
+    currentTime = currentTime + universalTimeOffset + daylightSaving;
+    currentTime.FormatL( timeString, KLogTimeFormat );
+
+    // Add LogString to the end of file and close the file
+    TInt currentSize = 0, returnCode;
+    writeBuffer.Append( timeString );
+    writeBuffer.Append( _L(": ") );
+
+    if ( aLevel < KLogLevelInfo )
+        writeBuffer.Append(KDebugStr);
+    else if ( aLevel < KLogLevelWarning )
+        writeBuffer.Append(KInfoStr);
+    else if ( aLevel < KLogLevelError )
+        writeBuffer.Append(KWarnStr);
+    else
+        writeBuffer.Append(KErrStr);
+
+    logEntry.AppendFormatList( aText, list ); //, &overFlowHandler );
+    writeBuffer.Append( logEntry.Left(
+        KLogEntryMaxLength - writeBuffer.Length() ) );
+    writeBuffer.Append( KLineFeed );
+    File.Size( currentSize );
+    returnCode = File.Write( currentSize,
+                             writeBuffer,
+                             writeBuffer.Length() );
+    File.Close();
+    // Close file server session
+    FileServer.Close();
+
+    if ( returnCode != KErrNone )
+        {
+        User::Panic( KLogPanicCategory(), KPanicFileWriteFailed );
+        }
+    }
+
+#endif // __ENABLE_LOGGING__