realtimenetprots/sipfw/SIP/Logging/src/TSIPLogLineParser.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Logging/src/TSIPLogLineParser.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,124 @@
+// Copyright (c) 2002-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          : TSIPLogLineParser.cpp
+// Part of       : Logging
+// Version       : SIP/2.0 
+//
+
+
+
+
+#include "TSIPLogLineParser.h"
+
+// -----------------------------------------------------------------------------
+// TSIPLogLineParser::TSIPLogLineParser
+// -----------------------------------------------------------------------------
+//
+TSIPLogLineParser::TSIPLogLineParser (const TDesC8& aMessage,
+									  TUint aMaxLineLength)
+ : iMaxLineLength(aMaxLineLength),
+   iMessage(aMessage),
+   iCurrentPos(0)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// TSIPLogLineParser::End
+// -----------------------------------------------------------------------------
+//
+TBool TSIPLogLineParser::End ()
+	{
+	return (iCurrentPos >= iMessage.Length());
+	}
+
+// -----------------------------------------------------------------------------
+// TSIPLogLineParser::GetLine
+// -----------------------------------------------------------------------------
+//
+TPtrC8 TSIPLogLineParser::GetLine ()
+	{
+	if (End()) return TPtrC8();
+
+    TPtrC8 ptr(iMessage.Mid(iCurrentPos));
+    TUint lineEndOffset = 0;
+    TInt nextLineEndPos = FindNextLineEndPos(ptr,lineEndOffset);
+    TUint length;
+    if (nextLineEndPos == KErrNotFound)
+		{
+        if (ptr.Length() < iMaxLineLength) 
+			{
+            length = ptr.Length();
+			}
+        else
+			{
+            length = iMaxLineLength;
+			}
+		}
+    else
+		{
+        if (nextLineEndPos <= iMaxLineLength)
+			{
+            length = nextLineEndPos;
+            iCurrentPos += lineEndOffset;
+			}
+        else
+			{
+            length = iMaxLineLength;
+			}
+		}
+    iCurrentPos += length;
+    return ptr.Left(length);
+	}
+
+// -----------------------------------------------------------------------------
+// TSIPLogLineParser::FindNextLineEndPos
+// -----------------------------------------------------------------------------
+//
+TInt TSIPLogLineParser::FindNextLineEndPos (const TDesC8& aDes,
+											TUint& aLineEndOffset)
+	{
+    TInt crPos = aDes.Locate ('\r');
+    TInt lfPos = aDes.Locate ('\n');
+
+    TInt pos = KErrNotFound;
+    if (!(crPos == KErrNotFound))
+		{
+        aLineEndOffset = 1;
+        if (!(lfPos == KErrNotFound))
+			{
+            if (crPos < lfPos)
+				{
+                if (crPos+1 == lfPos) aLineEndOffset = 2;
+                pos = crPos;
+				}
+            else
+				{
+                pos = lfPos;
+				}
+			}
+        else
+			{
+            pos = crPos;
+			}
+		}
+    else
+		{
+        if (!(lfPos == KErrNotFound))
+			{
+            aLineEndOffset = 1;
+            pos = lfPos;
+			}
+		}
+    return pos;
+	}