diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Logging/src/TSIPMessageLogger.cpp --- /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 +#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 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("")); break; + case 0x9: + buf.Append(_L8("")); break; + case 0xa: + buf.Append(_L8("")); break; + case 0xd: + buf.Append(_L8("")); break; + case 0x1b: + buf.Append(_L8("")); break; + case 0x20: + buf.Append(_L8("")); 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