realtimenetprots/sipfw/SIP/Logging/src/TSIPMessageLogger.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Logging/src/TSIPMessageLogger.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,248 @@
+// Copyright (c) 2005-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:
+// Name          : TSIPMessageLogger.cpp
+// Part of       : Logging
+// Version       : SIP/4.0 
+//
+
+
+
+#include "SipLogs.h"
+
+#ifdef USE_SIP_MESSAGE_LOG
+
+#include <flogger.h>
+#include "TSIPMessageLogger.h"
+#include "TSIPLogLineParser.h"
+#include "sipmessage.h"
+
+_LIT(KSIPMessageLogFileDir, "Sip");
+_LIT(KSIPMessageLogFileName, "SipLog.txt");
+//_LIT(KSipLogPath, "C:\\logs\\sip\\");
+
+_LIT8(KFormatParseError, "    SIP Codec parse error: %d!");
+_LIT8(KFooter, "-----");
+
+// Leave some space for date and time:
+const TInt KMaxLineLength = KLogBufferSize-50;
+
+#ifdef WRITE_EXTRA_LOGS
+const TInt KSensibleLineLength = 60;
+_LIT8(KShortFooter, "---");
+#endif
+
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::Write
+// -----------------------------------------------------------------------------
+//
+void TSIPMessageLogger::Write(
+    const TDesC8& aSubsystemName,
+    CSIPMessage& aSIPMessage )
+    {
+    CBufBase* sipMessageAsText = 0;
+    TRAPD( err, sipMessageAsText = aSIPMessage.ToTextHeaderPartL() );
+    if (err != KErrNone)
+        {
+        WriteParseError( aSubsystemName, err );
+        }
+    else
+        {
+        Write( aSubsystemName, sipMessageAsText->Ptr( 0 ) );
+        delete sipMessageAsText;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::Write
+// -----------------------------------------------------------------------------
+//
+void TSIPMessageLogger::Write(
+    const TDesC8& aSubsystemName,
+    const TDesC8& aSIPMessage)
+    {
+    TBool exists = LogDirExists( KSipLogPath );
+    
+    if ( exists )
+        {
+        RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                            EFileLoggingModeAppend, aSubsystemName);
+        }
+    else
+        {
+        RDebug::RawPrint( aSubsystemName );
+        }
+  
+    WriteSipMessage (aSIPMessage);
+    
+#ifdef WRITE_EXTRA_LOGS
+    if ( exists )
+        {
+        RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                            EFileLoggingModeAppend,KShortFooter);
+      }
+    else
+        {
+        RDebug::RawPrint( KShortFooter );
+        }
+    WriteExtraLogs(aSIPMessage);
+#endif
+
+    if ( exists )
+        {
+        RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                            EFileLoggingModeAppend,KFooter);
+        }
+    else
+        {
+        RDebug::RawPrint( KFooter );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::WriteParseError
+// -----------------------------------------------------------------------------
+//
+void TSIPMessageLogger::WriteParseError(
+    const TDesC8& aSubsystemName,
+    TInt aError)
+    {
+    if ( LogDirExists( KSipLogPath ) )
+        {
+        RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                            EFileLoggingModeAppend,
+                            aSubsystemName);
+
+        RFileLogger::WriteFormat( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                                  EFileLoggingModeAppend,
+                                  KFormatParseError, aError);
+
+        RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                            EFileLoggingModeAppend,KFooter);
+        }
+    else
+        {
+        _LIT8( KFmt, "%d" );
+        TBuf8<32> buf;
+        buf.Format( KFmt, aError );
+        RDebug::RawPrint( aSubsystemName );
+        RDebug::RawPrint( buf );
+        RDebug::RawPrint( KFooter );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::WriteSipMessage
+// -----------------------------------------------------------------------------
+//
+void TSIPMessageLogger::WriteSipMessage (const TDesC8& aSIPMessage)
+    {
+    TSIPLogLineParser lineParser( aSIPMessage, KMaxLineLength );
+    
+    if ( LogDirExists( KSipLogPath ) )
+        { 
+        while ( !lineParser.End())
+            {
+            RFileLogger::Write( KSIPMessageLogFileDir,KSIPMessageLogFileName, 
+                                EFileLoggingModeAppend,
+                                lineParser.GetLine());
+            }
+        }
+    else
+        {
+        while ( !lineParser.End() )
+            {
+            RDebug::RawPrint( lineParser.GetLine() );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::LogDirExists
+// -----------------------------------------------------------------------------
+//
+TBool TSIPMessageLogger::LogDirExists( const TDesC& aFolderName )
+    {
+    TBool exists( EFalse );
+    RFs fs;
+    if ( KErrNone == fs.Connect() )
+        {
+        TEntry entry;
+        exists = ( fs.Entry( aFolderName, entry ) == KErrNone );
+        fs.Close();        
+        }
+    return exists;
+    }
+    
+// -----------------------------------------------------------------------------
+// TSIPMessageLogger::WriteExtraLogs
+// -----------------------------------------------------------------------------
+//
+#ifdef WRITE_EXTRA_LOGS
+void TSIPMessageLogger::WriteExtraLogs(const TDesC8& aSIPMessage)
+    {
+    TBuf8<KMaxLineLength> buf;
+    for (TInt i = 0; i < aSIPMessage.Length(); i++)
+        {
+        if (aSIPMessage[i] > 0x20 && aSIPMessage[i] < 0x7f)
+            {
+            buf.Append(aSIPMessage[i]);
+            }
+        else
+            {
+            //Print few of the most common invisible characters with abbreviations
+            switch(aSIPMessage[i])
+                {
+                case 0x0:
+                    buf.Append(_L8("<nul>")); break;
+                case 0x9:
+                    buf.Append(_L8("<tab>")); break;
+                case 0xa:
+                    buf.Append(_L8("<lf>")); break;
+                case 0xd:
+                    buf.Append(_L8("<cr>")); break;
+                case 0x1b:
+                    buf.Append(_L8("<esc>")); break;
+                case 0x20:
+                    buf.Append(_L8("<sp>")); break;
+                default:
+                    buf.Append(_L8("#"));
+                }
+
+            }
+        
+        if (buf.Length() >= KSensibleLineLength)
+            {
+            //Buffer full, write it to log file
+            RFileLogger::Write (KSIPMessageLogFileDir,KSIPMessageLogFileName,
+                                EFileLoggingModeAppend, buf);
+            buf.Zero();
+            }
+        }
+
+    if (buf.Length() > 0)
+        {
+        if ( LogDirExists( KSipLogPath ) )
+            {
+            RFileLogger::Write (KSIPMessageLogFileDir,KSIPMessageLogFileName, 
+                            EFileLoggingModeAppend, buf);
+          }
+        else
+            {
+            RDebug::RawPrint( buf );
+            }
+        }
+    }
+#endif // WRITE_EXTRA_LOGS
+
+#endif // USE_SIP_MESSAGE_LOG