cryptoservices/certificateandkeymgmt/wtlscert/wtlsdec.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/wtlscert/wtlsdec.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,144 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+#include "wtlsdec.h"
+
+//stolen from stdlib
+#define WTLS_UNIX_BASE   TTime(MAKE_TINT64(0x00dcddb3,0x0f2f8000))    // 00:00, Jan 1st 1970
+const TInt KTimeLength = 4;
+
+
+TWTLSDecVector::TWTLSDecVector(const TDesC8& aSource, TInt aMinLength, TInt aMaxLength)
+	:iEncoding(aSource), iMinLength(aMinLength), iMaxLength(aMaxLength), iLengthOfContents(0), iLengthOfLength(0)
+	{
+	}
+
+void TWTLSDecVector::InitL()
+	{
+	if (iMaxLength <= 255)
+		{
+		iLengthOfLength = 1;
+		}
+	else
+		{
+		if (iMaxLength <= 65535)
+			{
+			iLengthOfLength = 2;
+			}
+		else
+			{
+			if (iMaxLength <= 16777215)
+				{
+				iLengthOfLength = 3;
+				}
+			else
+				{
+				iLengthOfLength = 4;
+				}
+			}
+		}
+	if (iEncoding.Length() < (iLengthOfLength + iMinLength))
+		{
+		User::Leave(KErrArgument);
+		}
+	TWTLSDecUnsignedInteger decLength;
+	TInt pos = 0;
+	iLengthOfContents = decLength.DecodeShortL(iEncoding, pos, iLengthOfLength);
+	if (iEncoding.Length() < (iLengthOfLength + iLengthOfContents))
+		{
+		User::Leave(KErrArgument);
+		}
+	}
+/*
+TPtrC8 TWTLSDecVector::Encoding() const
+	{
+	return iEncoding.Left(EncodingLength());
+	}
+*/
+TInt TWTLSDecVector::EncodingLength() const
+	{
+	return iLengthOfLength + iLengthOfContents;
+	}
+/*	
+TPtrC8 TWTLSDecVector::Content() const
+	{
+	return iEncoding.Mid(iLengthOfLength, iLengthOfContents);
+	}
+
+TInt TWTLSDecVector::ContentLength() const
+	{
+	return iLengthOfContents;
+	}
+	
+TInt TWTLSDecVector::HeaderLength() const
+	{
+	return iLengthOfLength;
+	}
+*/
+TWTLSDecUnsignedInteger::TWTLSDecUnsignedInteger()
+	{
+	}
+
+TInt TWTLSDecUnsignedInteger::DecodeShortL(const TDesC8& aSource,TInt& aPos, TInt aLength)
+	{
+	if (aLength > 4)
+		{
+		User::Leave(KErrOverflow);
+		}
+	TInt sourceLength = aSource.Length();
+	TInt res=0;
+	while (aLength)
+		{
+		if (sourceLength <= aPos)
+			{
+			User::Leave(KErrArgument);
+			}
+		res<<=8;
+		res+=aSource[aPos++];
+		aLength--;
+		}
+	return res;
+	}
+
+RInteger TWTLSDecUnsignedInteger::DecodeLongL(const TDesC8& aSource,TInt& aPos, TInt aLength)
+	{
+	if (aSource.Length() < (aPos + aLength))
+		{
+		User::Leave(KErrArgument);
+		}
+	const TPtrC8 ptr = aSource.Mid(aPos, aLength);
+	aPos += aLength;
+	RInteger res = RInteger::NewL(ptr);
+	return res;
+	}
+
+
+TWTLSDecTime::TWTLSDecTime()
+	{
+	}
+
+TTime TWTLSDecTime::DecodeL(const TDesC8& aSource, TInt& aPos)
+	{
+	if ((aSource.Length() - aPos) < KTimeLength)
+		{
+		User::Leave(KErrArgument);
+		}
+	TWTLSDecUnsignedInteger decInt;
+	TInt inc = decInt.DecodeShortL(aSource, aPos, 4);
+	return WTLS_UNIX_BASE + TTimeIntervalSeconds(inc);
+	}