--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SigComp/SigCompEngine/src/MessageReader.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,257 @@
+// Copyright (c) 2003-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 : MessageReader.cpp
+// Part of : SigComp / dispatcher
+// SigComp message reader
+// Version : 1.0
+//
+
+
+
+
+// INCLUDE FILES
+#include "MessageReader.h"
+#include "Sigcomp.h"
+
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+CMessageReader::CMessageReader(const TDesC8& aMessage,
+ TBool aStreamBasedProtocol) :
+ iMessage(aMessage),
+ iStreamBasedProtocol(aStreamBasedProtocol)
+ {
+ }
+
+TInt CMessageReader::ReadByte(TUint& aByte)
+ {
+
+ if (iStreamBasedProtocol)
+ {
+ if (iQuoteBytes > 0)
+ {
+ if (iPos < iMessage.Length())
+ {
+ aByte = iMessage[iPos];
+ iPos++;
+ iQuoteBytes--;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ else
+ {
+ if (iPos < iMessage.Length())
+ {
+ aByte = iMessage[iPos];
+ iPos++;
+
+ if (aByte == 0xff)
+ {
+ if (iPos < iMessage.Length())
+ {
+ aByte = iMessage[iPos];
+ iPos++;
+
+ if (aByte <= 0x7f)
+ {
+ iQuoteBytes = aByte;
+ aByte = 0xff;
+ return KErrNone;
+ }
+ else if (aByte == 0xff)
+ {
+ return KErrEof;
+ }
+ else // aByte: 0x80-0xfe
+ {
+ return CSigComp::EDecompressionFailure;
+ }
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ }
+ else
+ {
+ if (iPos < iMessage.Length())
+ {
+ aByte = iMessage[iPos];
+ iPos++;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ }
+
+TInt CMessageReader::ReadBlock(TDes8& aBlock)
+ {
+ return ReadBlock(aBlock, aBlock.MaxLength());
+ }
+
+TInt CMessageReader::ReadBlock(TDes8& aBlock, TInt aLength)
+ {
+
+ if (iStreamBasedProtocol)
+ {
+ aBlock.SetLength(0);
+
+ TInt i;
+ TUint byte;
+ for (i = 0; i < aLength; i++)
+ {
+ TInt retval = ReadByte(byte);
+ if (retval == KErrNone)
+ {
+ aBlock.Append(byte);
+ }
+ else
+ {
+ return retval;
+ }
+ }
+
+ return KErrNone;
+ }
+ else
+ {
+
+ TInt len = aLength;
+
+ if ((iPos + len) > iMessage.Length())
+ {
+ len = iMessage.Length() - iPos;
+ }
+
+ aBlock.Copy(iMessage.Mid(iPos, len));
+ iPos += len;
+
+ if (len == aLength)
+ {
+ return KErrNone;
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ }
+
+TInt CMessageReader::Avail(TInt aLength)
+ {
+
+ if (iStreamBasedProtocol)
+ {
+ TInt quote = iQuoteBytes;
+ TInt pos = iPos;
+
+ TInt i;
+ TUint byte;
+
+ for (i = 0; i < aLength; i++)
+ {
+ TInt retval = ReadByte(byte);
+ if (retval != KErrNone)
+ {
+ iQuoteBytes = quote;
+ iPos = pos;
+ return retval;
+ }
+ }
+
+ iQuoteBytes = quote;
+ iPos = pos;
+
+ return KErrNone;
+ }
+ else
+ {
+ if ((iPos + aLength) <= iMessage.Length())
+ {
+ return KErrNone;
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ }
+
+TInt CMessageReader::SkipDelimiters(TUint aDelToSkip)
+ {
+ if (iStreamBasedProtocol)
+ {
+ TUint i;
+ for (i = 0; i < aDelToSkip; i++)
+ {
+ if (iPos < iMessage.Length())
+ {
+ if (iMessage[iPos] == 0xff)
+ {
+ if ((iPos+1) < iMessage.Length())
+ {
+ if (iMessage[iPos+1] == 0xff)
+ {
+ iPos += 2;
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ else
+ {
+ return KErrTooBig;
+ }
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+
+TInt CMessageReader::Pos()
+ {
+ return iPos;
+ }