diff -r 000000000000 -r 2e3d3ce01487 filehandling/fileconverterfw/SRC/QPCONV.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filehandling/fileconverterfw/SRC/QPCONV.CPP Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,272 @@ +// 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: +// See 6.7 in http://www.ietf.org/rfc/rfc2045.txt +// +// + +#include +#include +#include +#include +#include +#include + +#include "QPCONV.H" + +// The ASCII character '#' is not encoded into quoted printable format. If it is present along with +// the phone number, it gets converted to its corresponding character '=23'. This makes a bit difficult +// for the user to identify the exact phone number from a VCard file. Hence the encoding is not performed. + +#define KLineFeed 10 +#define KCarriageReturn 13 +#define KEquals '=' +#define KSpace ' ' +#define KTab 9 +#define KExclamationPoint '!' +#define KTilde 0x7E +#define KDoubleQuotes 0x22 +#define KDollarSign 0x24 +#define KAtSign 0x40 +#define KSquareBracketOpen 0x5B +#define KBackSlash 0x5C +#define KSquareBracketClose 0x5D +#define KCircumflex 0x5E +#define KSingleQuote 0x60 +#define KCurlyBracketOpen 0x7B +#define KOrOperatorSign 0x7C +#define KCurlyBracketClose 0x7D +#define KQuotedPrintableNewLine _L8("=\r\n") +#define KQuotedPrintableCarriageReturn _L8("=0D") +#define KQuotedPrintableLineFeed _L8("=0A") + +// Patchable const data value defined in conarc.cpp +IMPORT_C extern const TInt KEnableAllSplCharForQpCnv; + + +// +// class CQpToTxtCnv +// + +void CQpToTxtCnv::ConvertObjectAL(RReadStream& aReadStream, RWriteStream& aWriteStream,MConverterUiObserver* /*aObserver*/) + { + iReadStream = &aReadStream; + iWriteStream = &aWriteStream; + + iBufferPos = 0; + iBuffer.SetMax(); + } + +TBool CQpToTxtCnv::DoConvertL() + { + // Check if we need to move out the oldest charcter + if (iBufferPos == 3) + { + iBuffer[0] = iBuffer[1]; + iBuffer[1] = iBuffer[2]; + iBufferPos = 2; + } + + TBuf8<1> character; + TRAPD(err, iReadStream->ReadL(character)); + if (err == KErrEof) + { + // Write what we have in the buffer, and exit + iWriteStream->WriteL(iBuffer, iBufferPos); + return EFalse; + } + else if (err == KErrNone) + { + iBuffer[iBufferPos] = character[0]; + iBufferPos++; + if (iBufferPos == 3) + { + // Check that we have three characters to compare: + if (iBuffer[0] == KEquals) + { + // Check for special QP codes + if (!(iBuffer[1] == KCarriageReturn && iBuffer[2] == KLineFeed)) + { + // act on the code + TLex8 lex(iBuffer); + TUint code; + (void)lex.Get(); // skip the equals + lex.Val(code,EHex); + iWriteStream->WriteUint8L(STATIC_CAST(TUint8,code)); + } + iBufferPos=0; + } + else if (iBuffer[1] == KCarriageReturn && iBuffer[2] == KLineFeed) + { + // throw away these characters + iBufferPos=0; + } + else + { + // Write out the last character in the stream + iWriteStream->WriteUint8L(iBuffer[0]); + } + } + } + + else + { + // Some other error, let's clear up and go home + return EFalse; + } + return ETrue; + } + +TUid CQpToTxtCnv::Uid() + { + return KUidQuotedPrintableToText; + } + +TInt CQpToTxtCnv::Capabilities() + { + return EConvertsObjects; + } + +CQpToTxtCnv::CQpToTxtCnv() + {} + +// +// class CTxtToQpCnv +// + +void CTxtToQpCnv::ConvertObjectAL(RReadStream& aReadStream, RWriteStream& aWriteStream,MConverterUiObserver* /*aObserver*/) + { + iReadStream = &aReadStream; + iWriteStream = &aWriteStream; + + iLineLen = 0; + } + +TBool CTxtToQpCnv::DoConvertL() + { + TBuf8<1> character; + TRAPD(err, iReadStream->ReadL(character)); + if (err == KErrNone) + { + switch (character[0]) + { + case KCarriageReturn: + iWriteStream->WriteL(KQuotedPrintableCarriageReturn); + iLineLen += 3; + break; + case KLineFeed: + iWriteStream->WriteL(KQuotedPrintableLineFeed); + iLineLen += 3; + break; + case KEquals: + case KTab: + case KSpace: + { + FormatAndWriteBufferL(character); + } + break; + case KExclamationPoint: + case KTilde: + case KDoubleQuotes: + case KDollarSign: + case KAtSign: + case KSquareBracketOpen: + case KBackSlash: + case KSquareBracketClose: + case KCircumflex: + case KSingleQuote: + case KCurlyBracketOpen: + case KOrOperatorSign: + case KCurlyBracketClose: + { + if (iEnableAllSplCharForQpCnv) + { + FormatAndWriteBufferL(character); + } + else + { + WriteBufferL(character); + } + } + break; + default: + if( character[0] > KQuotedPrintableConvertAbove ) + { + FormatAndWriteBufferL(character); + } + else + { + WriteBufferL(character); + } + break; + } + + // Check to see if the line is getting too long + if (iLineLen > 70) + { + iWriteStream->WriteL(KQuotedPrintableNewLine); + iLineLen = 0; + } + + return ETrue; + } + else + { + // Exit on end of stream + return EFalse; + } + + } + +void CTxtToQpCnv::FormatAndWriteBufferL(TDes8& aChar) + { + TBuf8<3> buf; + buf.Format(_L8("=%02X"),STATIC_CAST(TUint,aChar[0])); // RFC 2045 states "Uppercase letters must be used; lowercase letters are not allowed", hence the capital 'X' in this format descriptor to the statement + iWriteStream->WriteL(buf); + iLineLen+=3; + } + +void CTxtToQpCnv::WriteBufferL(TDes8& aChar) + { + iWriteStream->WriteL(aChar); + iLineLen++; + } + +TUid CTxtToQpCnv::Uid() + { + return KUidTextToQuotedPrintable; + } + +TInt CTxtToQpCnv::Capabilities() + { + return EConvertsObjects; + } + +CTxtToQpCnv::CTxtToQpCnv():iEnableAllSplCharForQpCnv(KEnableAllSplCharForQpCnv) + { +#ifdef __WINS__ + // KEnableAllSplCharForQpCnv is a Rom patchable constant, so patch for emulator builds can be done by + // adding "patchdata_conarc_dll_KEnableAllSplCharForQpCnv X" to epoc.ini file. + // When X is set to non zero, the conversion is performed for all the special characters. + // When X is set to zero, no conversion is performed in case of the special characters. + // Requires licensees to set the patch data value in epoc.ini file. + + TInt valueOfKEnableAllSplCharForQpCnv = 0; + if (UserSvr::HalFunction(EHalGroupEmulator,EEmulatorHalIntProperty,(TAny*)"patchdata_conarc_dll_KEnableAllSplCharForQpCnv",&valueOfKEnableAllSplCharForQpCnv) == KErrNone) + { + iEnableAllSplCharForQpCnv = valueOfKEnableAllSplCharForQpCnv; + } +#endif + } + +