diff -r 000000000000 -r e4d67989cc36 genericservices/httputils/Authentication/TConvBase64.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericservices/httputils/Authentication/TConvBase64.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,176 @@ +// Copyright (c) 2006-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: +// TBase64.cpp +// +// + +#include + +/** +TBase64 constructor +*/ +EXPORT_C TBase64::TBase64(): iShiftStored(0), iMaskShiftStored(ESix) + {} + + +/** + Encodes an ASCII string to Base64 string. + + @param aSrcString The source string in ASCII code. + @param rDestString The destination string with converted base64 values. + @return Number of characters in the source string that were not Encoded. +*/ +EXPORT_C TInt TBase64::Encode(const TDesC8& aSrcString, TDes8& rDestString) + { + // Clears the destination string + rDestString.Zero(); + // Initialise variables + const TUint8* srcStringPtr=aSrcString.Ptr(); + const TUint8* srcStringEnd=aSrcString.Length()+srcStringPtr; + TUint8* destStringPtr=(TUint8*)rDestString.Ptr(); + TUint8* destStringPtrBase=destStringPtr; + TInt character=0; + TUint8 encodedChar=0; + TInt charStorage=0; + TInt maskShift=EZero; + TInt destStringCharNum = 0; + + while(srcStringPtr<=srcStringEnd) + { + // maskShift is used as a char read counter + if(maskShift==ESix) + { + // If the 3rd char read is also the last char then the while loop + // is broken on the next check. + if(srcStringPtr==srcStringEnd) + srcStringPtr++; + maskShift=EZero; + character=0; + } + else + { + if(srcStringPtr==srcStringEnd) + character=0; + else + character=*srcStringPtr; + + srcStringPtr++; + // Shifts charStorage ready for the next char + charStorage=charStorage<<8; + maskShift+=ETwo; + } + charStorage=charStorage|character; + // Shifts the mask to the correct bit location + // Masks (AND's) the valid bits from charStorage + // Shifts the valid bits into the low order 8bits + // Converts to BASE64 char, Casts the result to an unsigned char (which it should be ?....I hope) + encodedChar=(TUint8)Base64ToAscii[((charStorage>>maskShift)&ESixBitMask)]; + + *destStringPtr++=encodedChar; + destStringCharNum++; + + // Add a CRLF every KMaxB64EncodedCharsPerLine characters so as not to exceed the line length + // limitation specified in RFC 2822. + if (destStringCharNum == KMaxB64EncodedCharsPerLine) + { + destStringCharNum = 0; + *destStringPtr++ = '\r'; + *destStringPtr++ = '\n'; + } + } + + // Check for not enough chars and pad if required + if (maskShift==EFour) + { + *destStringPtr++=KImcvConvEquals; + *destStringPtr++=KImcvConvEquals; + } + else + if(maskShift==ESix) + *destStringPtr++=KImcvConvEquals; + + rDestString.SetLength((TInt)(destStringPtr-destStringPtrBase)); + return ((TInt)(srcStringPtr-srcStringEnd)); + } + +/** + Decodes the Base64 string to ASCII pattern. + + @param aSrcString The source string in Base64 codeset. + @param rDestString The destination string with converted ASCII code values. + @return ETrue if aSrcString is not long enough to decode fully, resulting in the storage of + the last character and requiring another aSrcString (poss 0 length) to be passed to it to clear this character. + Returns EFalse if the line was decoded OK or the end of the encoded file is reached ie "=" +*/ +EXPORT_C TBool TBase64::Decode(const TDesC8& aSrcString, TDes8& rDestString) + { + TInt decodedInt=0; + TInt8 offsetChar=0; + TUint8 decodedChar=0; + + // Clears the destination string + rDestString.Zero(); + + // Initialise variables + const TUint8* srcStringPtr=aSrcString.Ptr(); + const TUint8* srcStringEnd=aSrcString.Length()+srcStringPtr; + TUint8* destStringPtr=(TUint8*)rDestString.Ptr(); + TUint8* destStringPtrBase=destStringPtr; + + TInt maskShift=iMaskShiftStored; + TInt shiftStorage=iShiftStored; + + // Main character process loop + while(srcStringPtr=0)&&(offsetChar<80)) + { + // Read in next character and B64 decode + decodedInt=AsciiToBase64[offsetChar]; + + // Exits when a PAD char is reached + if(decodedInt==EPadChar) + { + rDestString.SetLength((TInt)(destStringPtr-destStringPtrBase)); + return EFalse; + } + + // Ensures the first 2 chars of 4 are received before processing + if(maskShift==ESix) + maskShift=EFour; + else + { + shiftStorage=shiftStorage<>maskShift)&EEightBitMask); + + if((maskShift-=ETwo)