diff -r 000000000000 -r 2e3d3ce01487 filehandling/fileconverterfw/SRC/BASE64.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filehandling/fileconverterfw/SRC/BASE64.CPP Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,196 @@ +// 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 "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 +#include + +#include "BASE64.H" +#include "BASE64DF.H" + +// +// class CBase64CodecBase +// +// Provides 3 octet encoding and decoding alone +// Returns an error code in the case of invalid source +// + +void CBase64CodecBase::Reset() +// +// Reset the internal buffer + { + for (TInt i = 0; i < 4; i++) + iQuart[i] = NULL; + iQuartCount = 0; + } + + +TInt CBase64CodecBase::Encode(const TDesC8& aSource, TDes8& aResult) const +// +// Encode an arbitrary number of octets in aSource append the output to aResult. +// If the number of octets in aSource is not a multiple of 3 +// padding will be added terminating the encoding +// + { + TInt sourceLength = aSource.Length(); + if (sourceLength == 0) + return KErrNone; + __ASSERT_ALWAYS(((sourceLength * 4)/3 + sourceLength%3) <= (aResult.MaxLength()-aResult.Length()), Panic(EBase64Overflow)); + + sourceLength -= sourceLength%3; + TUint8 sixBit=NULL; + TText8 source; + TInt i; + + for (i = 0; i < sourceLength; i++) + { + source=aSource[i]; + sixBit = STATIC_CAST(TUint8,(source & 0xFC) >> 2); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x03) << 4); + source=aSource[++i]; + sixBit |= STATIC_CAST(TUint8,(source & 0xF0) >> 4); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x0F) << 2); + source=aSource[++i]; + sixBit |= STATIC_CAST(TUint8,(source & 0xC0) >> 6); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x3F)); + aResult.Append(KBase64Alphabet[sixBit]); + } + switch (aSource.Length() % 3) + { + case 2: + source=aSource[i]; + sixBit = STATIC_CAST(TUint8,(source & 0xFC) >> 2); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x03) << 4); + source=aSource[++i]; + sixBit |= STATIC_CAST(TUint8,(source & 0xF0) >> 4); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x0F) << 2); + aResult.Append(KBase64Alphabet[sixBit]); + aResult.Append(KBase64Alphabet[KBase64Pad]); + break; + case 1: + source=aSource[i]; + sixBit = STATIC_CAST(TUint8,(source & 0xFC) >> 2); + aResult.Append(KBase64Alphabet[sixBit]); + sixBit = NULL; + sixBit = STATIC_CAST(TUint8,(source & 0x03) << 4); + aResult.Append(KBase64Alphabet[sixBit]); + aResult.Append(KBase64Alphabet[KBase64Pad]); + aResult.Append(KBase64Alphabet[KBase64Pad]); + break; + default: + break; + } + return KErrNone; + } + +TInt CBase64CodecBase::Decode(const TDesC8& aSource, TDes8& aResult) +// +// Decode the base64 stream in aSource append the output to aResult. +// Any non base64 chars are discarded while decoding +// Returns if either an end of stream is found, or all aSource is exhausted +// +// Octets are only decoded when complete +// + { + __ASSERT_ALWAYS((aSource.Length() * 3)/4 <= (aResult.MaxLength() - aResult.Length()), Panic(EBase64Overflow)); + if (aSource.Length() == 0) + return KErrNone; + TText8* readPtr=CONST_CAST(TText8*,aSource.Ptr()); + TText8* writePtr=CONST_CAST(TText8*,aResult.Ptr()); + TText8* writeStart=writePtr; + writePtr += aResult.Length(); + TText8 result; + TText8* readEnd=(readPtr + aSource.Length()); + + for (; readPtr < readEnd; readPtr++) + { + TUint8 base64code = Base64Char(*readPtr); + switch (base64code) + { + case KBase64Pad: + if (iQuartCount == 0) + return KErrNone; + result = STATIC_CAST(TText8,iQuart[0] << 2); + result |= STATIC_CAST(TText8,((iQuart[1] & 0x30) >> 4)); + *writePtr=result; + writePtr++; + if (iQuartCount == 3) + { + result = STATIC_CAST(TText8,(iQuart[1] & 0x0F) << 4); + result |= STATIC_CAST(TText8,((iQuart[2] & 0x3C) >> 2)); + *writePtr=result; + writePtr++; + } + aResult.SetLength(writePtr-writeStart); + iQuartCount = 0; + return KErrNone; + case KErrInvalidCharacter: + // Do nothing + break; + default: + { + iQuart[iQuartCount++] = base64code; + if (iQuartCount == 4) + { + result = STATIC_CAST(TText8,iQuart[0] << 2); + result |= STATIC_CAST(TText8,((iQuart[1] & 0x30) >> 4)); + *writePtr=result; + writePtr++; + result = STATIC_CAST(TText8,(iQuart[1] & 0x0F) << 4); + result |= STATIC_CAST(TText8,((iQuart[2] & 0x3C) >> 2)); + *writePtr=result; + writePtr++; + result = STATIC_CAST(TText8,((iQuart[2] & 0x03) << 6)); + result |= STATIC_CAST(TText8,iQuart[3]); + *writePtr=result; + writePtr++; + iQuartCount = 0; + } + } + } + } + aResult.SetLength(writePtr-writeStart); + return KErrNone; + } + +TUint8 CBase64CodecBase::Base64Char(TText8 aChar) const +// +// Return the code or KErrInvalidCharacter + { + for (TUint8 i = 0; i < 65; i++) + { + if (aChar == KBase64Alphabet[i]) + return i; + } + return KErrInvalidCharacter; + } + + +GLDEF_C void Panic(TBase64Panic aPanic) +// Panic the process with Base64 codec as the category. +// + { + _LIT(KPanicBase64Codec,"Base64 codec"); + User::Panic(KPanicBase64Codec,aPanic); + }