sl@0: /* sl@0: * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "wtlsdec.h" sl@0: sl@0: //stolen from stdlib sl@0: #define WTLS_UNIX_BASE TTime(MAKE_TINT64(0x00dcddb3,0x0f2f8000)) // 00:00, Jan 1st 1970 sl@0: const TInt KTimeLength = 4; sl@0: sl@0: sl@0: TWTLSDecVector::TWTLSDecVector(const TDesC8& aSource, TInt aMinLength, TInt aMaxLength) sl@0: :iEncoding(aSource), iMinLength(aMinLength), iMaxLength(aMaxLength), iLengthOfContents(0), iLengthOfLength(0) sl@0: { sl@0: } sl@0: sl@0: void TWTLSDecVector::InitL() sl@0: { sl@0: if (iMaxLength <= 255) sl@0: { sl@0: iLengthOfLength = 1; sl@0: } sl@0: else sl@0: { sl@0: if (iMaxLength <= 65535) sl@0: { sl@0: iLengthOfLength = 2; sl@0: } sl@0: else sl@0: { sl@0: if (iMaxLength <= 16777215) sl@0: { sl@0: iLengthOfLength = 3; sl@0: } sl@0: else sl@0: { sl@0: iLengthOfLength = 4; sl@0: } sl@0: } sl@0: } sl@0: if (iEncoding.Length() < (iLengthOfLength + iMinLength)) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: TWTLSDecUnsignedInteger decLength; sl@0: TInt pos = 0; sl@0: iLengthOfContents = decLength.DecodeShortL(iEncoding, pos, iLengthOfLength); sl@0: if (iEncoding.Length() < (iLengthOfLength + iLengthOfContents)) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: /* sl@0: TPtrC8 TWTLSDecVector::Encoding() const sl@0: { sl@0: return iEncoding.Left(EncodingLength()); sl@0: } sl@0: */ sl@0: TInt TWTLSDecVector::EncodingLength() const sl@0: { sl@0: return iLengthOfLength + iLengthOfContents; sl@0: } sl@0: /* sl@0: TPtrC8 TWTLSDecVector::Content() const sl@0: { sl@0: return iEncoding.Mid(iLengthOfLength, iLengthOfContents); sl@0: } sl@0: sl@0: TInt TWTLSDecVector::ContentLength() const sl@0: { sl@0: return iLengthOfContents; sl@0: } sl@0: sl@0: TInt TWTLSDecVector::HeaderLength() const sl@0: { sl@0: return iLengthOfLength; sl@0: } sl@0: */ sl@0: TWTLSDecUnsignedInteger::TWTLSDecUnsignedInteger() sl@0: { sl@0: } sl@0: sl@0: TInt TWTLSDecUnsignedInteger::DecodeShortL(const TDesC8& aSource,TInt& aPos, TInt aLength) sl@0: { sl@0: if (aLength > 4) sl@0: { sl@0: User::Leave(KErrOverflow); sl@0: } sl@0: TInt sourceLength = aSource.Length(); sl@0: TInt res=0; sl@0: while (aLength) sl@0: { sl@0: if (sourceLength <= aPos) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: res<<=8; sl@0: res+=aSource[aPos++]; sl@0: aLength--; sl@0: } sl@0: return res; sl@0: } sl@0: sl@0: RInteger TWTLSDecUnsignedInteger::DecodeLongL(const TDesC8& aSource,TInt& aPos, TInt aLength) sl@0: { sl@0: if (aSource.Length() < (aPos + aLength)) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: const TPtrC8 ptr = aSource.Mid(aPos, aLength); sl@0: aPos += aLength; sl@0: RInteger res = RInteger::NewL(ptr); sl@0: return res; sl@0: } sl@0: sl@0: sl@0: TWTLSDecTime::TWTLSDecTime() sl@0: { sl@0: } sl@0: sl@0: TTime TWTLSDecTime::DecodeL(const TDesC8& aSource, TInt& aPos) sl@0: { sl@0: if ((aSource.Length() - aPos) < KTimeLength) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: TWTLSDecUnsignedInteger decInt; sl@0: TInt inc = decInt.DecodeShortL(aSource, aPos, 4); sl@0: return WTLS_UNIX_BASE + TTimeIntervalSeconds(inc); sl@0: }