epoc32/include/app/imcvcodc.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/imcvcodc.h@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@2
     4
// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2
     5
// which accompanies this distribution, and is available
williamr@2
     6
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
williamr@2
    17
#if !defined(__IMCVCODC_H__)
williamr@2
    18
#define __IMCVCODC_H__
williamr@2
    19
williamr@2
    20
#include <s32buf.h>
williamr@2
    21
#include <s32stor.h>
williamr@2
    22
#include <txtrich.h>
williamr@2
    23
#include <miutatch.h>
williamr@2
    24
#include <miutconv.h>
williamr@2
    25
#include <miuthdr.h>
williamr@2
    26
#include <mentact.h>		// CMsgActive
williamr@2
    27
williamr@2
    28
#include <imcvdata.h>
williamr@2
    29
#include <imcvtext.h>
williamr@2
    30
#include <imutdll.h>
williamr@2
    31
williamr@2
    32
#define KBase64 _L("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")
williamr@2
    33
#define KCharFormat _L("%c")
williamr@2
    34
williamr@2
    35
 // Maximum length allowed for an 'encoded-word' rfc2047
williamr@2
    36
const TInt KEncodedWordMaxLength = 75;
williamr@2
    37
williamr@2
    38
// All encoding information except data and charset name length. =?B?=?    => 7
williamr@2
    39
const TInt KMaxEncodedInformationLength = 7;
williamr@2
    40
williamr@2
    41
// Length of the field name, eg "Subject: ". This may change as other fields are processed.  
williamr@2
    42
const TInt KMaxHeaderFieldNameLength = 12;
williamr@2
    43
williamr@2
    44
const TInt KImCvFinished=(-1);
williamr@2
    45
const TInt KImCvAdvance=(1);
williamr@2
    46
williamr@2
    47
williamr@2
    48
// error states involved in sending attachments etc.
williamr@2
    49
/**
williamr@2
    50
@internalComponent
williamr@2
    51
@deprecated
williamr@2
    52
*/
williamr@2
    53
enum TIattErrorCode
williamr@2
    54
	{
williamr@2
    55
	KImAttNoError = 0,
williamr@2
    56
	KImAttFinished = 1
williamr@2
    57
	};
williamr@2
    58
williamr@2
    59
williamr@2
    60
/**
williamr@2
    61
@internalComponent
williamr@2
    62
@released
williamr@2
    63
*/
williamr@2
    64
enum TImBodyConvAlgorithm
williamr@2
    65
	{
williamr@2
    66
	ENoAlgorithm,
williamr@2
    67
	EQPEncode,
williamr@2
    68
	EQPDecode,
williamr@2
    69
	EBase64Encode,
williamr@2
    70
	EBase64Decode,
williamr@2
    71
	EUUEncode,
williamr@2
    72
	EUUDecode
williamr@2
    73
	};
williamr@2
    74
	
williamr@2
    75
// Used in CImSendConvert
williamr@2
    76
/**
williamr@2
    77
@internalComponent
williamr@2
    78
@deprecated
williamr@2
    79
*/
williamr@2
    80
enum TImSendEncoding 
williamr@2
    81
	{ 
williamr@2
    82
	ESendNoAlgorithm,
williamr@2
    83
	ESendMimeAlgorithm
williamr@2
    84
	};	
williamr@2
    85
williamr@2
    86
struct SAttachmentInfo
williamr@2
    87
/**
williamr@2
    88
@internalComponent
williamr@2
    89
@released
williamr@2
    90
*/
williamr@2
    91
	{
williamr@2
    92
	TInt iSize;
williamr@2
    93
	TFileName iName;
williamr@2
    94
	TFileName iPath;
williamr@2
    95
	TBool iComplete;
williamr@2
    96
	};
williamr@2
    97
williamr@2
    98
// Shared implementation code	
williamr@2
    99
//----------------------------------------------------------------------------------------
williamr@2
   100
class TImCodec
williamr@2
   101
//----------------------------------------------------------------------------------------
williamr@2
   102
/**
williamr@2
   103
@internalAll
williamr@2
   104
@released
williamr@2
   105
*/
williamr@2
   106
	{
williamr@2
   107
protected:
williamr@2
   108
	// base64 and UU coding defines.
williamr@2
   109
	enum EMaskValues{ ESixBitMask = 0x3F, EEightBitMask = 0xFF };
williamr@2
   110
	enum EMaskShiftValues{ ESix = 6, EFour = 4, ETwo = 2, EZero = 0 };
williamr@2
   111
williamr@2
   112
public:
williamr@2
   113
	virtual TInt Encode( const TDesC8& aSrcString, TDes8& rDestString)=0 ;
williamr@2
   114
	virtual TBool Decode( const TDesC8& aInputLine, TDes8& rOutputLine)=0;
williamr@2
   115
williamr@2
   116
protected:
williamr@2
   117
	// TImCodec();
williamr@2
   118
	inline TBool IsDigit( TChar aChar );
williamr@2
   119
	};
williamr@2
   120
williamr@2
   121
williamr@2
   122
// Interface for sending file data.
williamr@2
   123
//----------------------------------------------------------------------------------------
williamr@2
   124
class TImFileCodec : public TImCodec
williamr@2
   125
//----------------------------------------------------------------------------------------
williamr@2
   126
/**
williamr@2
   127
@internalAll
williamr@2
   128
@released
williamr@2
   129
*/
williamr@2
   130
	{
williamr@2
   131
public:
williamr@2
   132
	virtual TInt PrefixNextLineL( TDes8& rOutputLine, const TFileName& aName, TInt& rPaddingCount );
williamr@2
   133
	virtual TInt PostfixNextLine( TDes8& rOutputLine, TInt& rPaddingCount );
williamr@2
   134
	virtual void Initialise();
williamr@2
   135
williamr@2
   136
protected:
williamr@2
   137
	TInt iPrefixState;
williamr@2
   138
	TInt iPostfixState;
williamr@2
   139
	};	
williamr@2
   140
williamr@2
   141
// Dummy, just copies
williamr@2
   142
//----------------------------------------------------------------------------------------
williamr@2
   143
class TImCodecNull :  public TImFileCodec
williamr@2
   144
//----------------------------------------------------------------------------------------
williamr@2
   145
/**
williamr@2
   146
@internalComponent
williamr@2
   147
@released
williamr@2
   148
*/
williamr@2
   149
	{
williamr@2
   150
public:
williamr@2
   151
	TInt Encode( const TDesC8& aSrcString, TDes8& rDestString);
williamr@2
   152
	TBool Decode( const TDesC8& aInputLine, TDes8& rOutputLine);
williamr@2
   153
	};
williamr@2
   154
	
williamr@2
   155
// Quoted-printable encoding/decoding
williamr@2
   156
williamr@2
   157
//----------------------------------------------------------------------------------------
williamr@2
   158
class TImCodecQP : public TImFileCodec
williamr@2
   159
//----------------------------------------------------------------------------------------
williamr@2
   160
/**
williamr@2
   161
@internalAll
williamr@2
   162
@released
williamr@2
   163
*/
williamr@2
   164
	{
williamr@2
   165
public:
williamr@2
   166
	IMPORT_C TImCodecQP();
williamr@2
   167
	IMPORT_C TInt Encode( const TDesC8& aSrcString, TDes8& rDestString);
williamr@2
   168
	IMPORT_C TBool Decode( const TDesC8& aInputLine, TDes8& rOutputLine);
williamr@2
   169
williamr@2
   170
	// Not to be used anymore..
williamr@2
   171
	IMPORT_C TInt EncodeRichText( const TDesC8& aInputLine, TDes8& rOutputLine);
williamr@2
   172
	IMPORT_C TInt DecodeRichText( const TDesC8& aSrcString, TDes& rDestString );
williamr@2
   173
williamr@2
   174
	// Functions which allow flexiblity. Can replace the '=' char or add characters..
williamr@2
   175
	// to what is defined as 'plain.
williamr@2
   176
	inline void AddPlainChar(const TDesC8&  aCharList );
williamr@2
   177
	inline void AddEncodeChar(const TDesC8&  aCharList );
williamr@2
   178
	inline void SetQPChar( TUint8 aChar);
williamr@2
   179
williamr@2
   180
	inline TUint8 ReplacementChar( TChar aControlChar );
williamr@2
   181
	inline TBool IsPlain( TChar aChar );
williamr@2
   182
williamr@2
   183
private:
williamr@2
   184
	TBool SmartBreak( TInt written, const TDesC8& pSource );
williamr@2
   185
	inline TBool IsBreakable( TChar aChar);
williamr@2
   186
	inline void AddSoftLineBreak(TDes8& aPtr, TInt& aPadding, TInt& aWritten);
williamr@2
   187
	inline void AddSoftLineBreak(const TUint8* apEnd, TUint8* aPtr, TInt& aPadding, TInt& aWritten);
williamr@2
   188
williamr@2
   189
private:
williamr@2
   190
	TUint8 iQPCharacter;
williamr@2
   191
	TPtrC8 iPlainCharList;  
williamr@2
   192
	TPtrC8 iEncodeCharList;  
williamr@2
   193
williamr@2
   194
	TInt iPaddingCount;
williamr@2
   195
	};
williamr@2
   196
williamr@2
   197
williamr@2
   198
williamr@2
   199
// Base64 coding/decoding
williamr@2
   200
williamr@2
   201
//----------------------------------------------------------------------------------------
williamr@2
   202
class TImCodecB64 : public TImFileCodec
williamr@2
   203
//----------------------------------------------------------------------------------------
williamr@2
   204
/**
williamr@2
   205
@publishedAll
williamr@2
   206
@released
williamr@2
   207
*/
williamr@2
   208
	{
williamr@2
   209
private:
williamr@2
   210
	// base64 coding defines
williamr@2
   211
	enum{ EPadChar = 64 };
williamr@2
   212
williamr@2
   213
public:
williamr@2
   214
	IMPORT_C TImCodecB64();
williamr@2
   215
	IMPORT_C TInt Encode( const TDesC8& aSrcString, TDes8& rDestString);
williamr@2
   216
	IMPORT_C TBool Decode( const TDesC8& aSrcString, TDes8& rDestString);
williamr@2
   217
 	IMPORT_C void  Initialise();
williamr@2
   218
williamr@2
   219
protected:
williamr@2
   220
	TInt DoEncode(const TDesC8& aSrcString, TDes8& rDestString, TBool aInsertLineBreaks);
williamr@2
   221
williamr@2
   222
private:
williamr@2
   223
	TInt iShiftStored;
williamr@2
   224
	TInt iMaskShiftStored;
williamr@2
   225
	};
williamr@2
   226
williamr@2
   227
class TImCodecB64WithLineBreaks : public TImCodecB64
williamr@2
   228
/**
williamr@2
   229
@internalComponent
williamr@2
   230
@released
williamr@2
   231
*/
williamr@2
   232
	{
williamr@2
   233
public:
williamr@2
   234
	TInt Encode(const TDesC8& aSrcString, TDes8& rDestString);
williamr@2
   235
	};
williamr@2
   236
williamr@2
   237
williamr@2
   238
// UU coding/decoding
williamr@2
   239
williamr@2
   240
//----------------------------------------------------------------------------------------
williamr@2
   241
class TImCodecUU : public TImFileCodec
williamr@2
   242
//----------------------------------------------------------------------------------------
williamr@2
   243
/**
williamr@2
   244
@publishedAll
williamr@2
   245
@released
williamr@2
   246
*/
williamr@2
   247
	{
williamr@2
   248
private:
williamr@2
   249
	// UU coding defines
williamr@2
   250
williamr@2
   251
	enum{ ESpace = 32, EBackQuote = 96 };
williamr@2
   252
williamr@2
   253
	enum TImBodyPostfix
williamr@2
   254
		{
williamr@2
   255
		EInvertedComma = 0,
williamr@2
   256
		EEndString,
williamr@2
   257
		EEndOfPostfix
williamr@2
   258
		};
williamr@2
   259
williamr@2
   260
public:
williamr@2
   261
	IMPORT_C TImCodecUU();
williamr@2
   262
	IMPORT_C TInt Encode( const TDesC8& aSrcString, TDes8& rDestString );
williamr@2
   263
	IMPORT_C TBool Decode( const TDesC8& aSrcString, TDes8& rDestString );
williamr@2
   264
	TInt PrefixNextLineL( TDes8& rOutputLine, const TFileName& aName, TInt& rPaddingCount );
williamr@2
   265
	TInt PostfixNextLine( TDes8& rOutputLine, TInt& rPaddingCount );
williamr@2
   266
private:
williamr@2
   267
	void AppendFilenameL( TDes8& rOutputLine, const TFileName& aName );
williamr@2
   268
	
williamr@2
   269
	};
williamr@2
   270
williamr@2
   271
williamr@2
   272
williamr@2
   273
williamr@2
   274
// For converting a text string to/from encoded form
williamr@2
   275
// Note: 'Word' here has special meaning derived from the one defined in rfc2047.
williamr@2
   276
// It refers to one encoding instance.
williamr@2
   277
williamr@2
   278
//----------------------------------------------------------------------------------------
williamr@2
   279
class CImConvertHeader : public CBase
williamr@2
   280
//----------------------------------------------------------------------------------------
williamr@2
   281
/**
williamr@2
   282
@internalTechnology
williamr@2
   283
@released
williamr@2
   284
*/
williamr@2
   285
	{
williamr@2
   286
public:
williamr@2
   287
	IMPORT_C static CImConvertHeader* NewL(CImConvertCharconv& aConverter);
williamr@2
   288
	~CImConvertHeader();
williamr@2
   289
williamr@2
   290
	IMPORT_C void SetMessageType(TBool aIsMIME); 
williamr@2
   291
	IMPORT_C void DecodeAllHeaderFieldsL(CImHeader& rHeader); 
williamr@2
   292
williamr@2
   293
	// Functions for decoding & converting descriptors
williamr@2
   294
williamr@2
   295
	IMPORT_C void DecodeNonMIMEHeaderFieldL(const TDesC8& aBufIn, TDes& aBufOut); 
williamr@2
   296
	IMPORT_C void DecodeHeaderFieldL(const TDesC8& aBufIn, TDes& aBufOut); 
williamr@2
   297
	IMPORT_C void DecodeHeaderFieldL(const TDesC16& aBufIn, TDes& aBufOut); 
williamr@2
   298
	IMPORT_C void ConvertHeaderFieldL(const TDesC16& aBufIn, RBuf8& aBufOut, TBool aIsAddressField); 
williamr@2
   299
	
williamr@2
   300
	// Header needed for retrieving encoding information, used in Send code.
williamr@2
   301
    IMPORT_C void EncodeHeaderFieldL(const TDesC& aBufIn, RBuf8& aBufOut, 
williamr@2
   302
            CArrayFix<TImHeaderEncodingInfo>* aInfoArray, TInt aState, TInt aArrayVal = 0);
williamr@2
   303
williamr@2
   304
	IMPORT_C void EncodeHeaderFieldL(const TDesC& aBufIn, RBuf8& aBufOut,  
williamr@2
   305
		                             const TUint aCharset, const TImHeaderEncodingInfo::TEncodingType aType, TBool aIsAddressField);
williamr@2
   306
	
williamr@2
   307
	IMPORT_C TBool FindEncodedWord(TPtrC8& aData, TInt& aInit,TInt& rStart, TInt& rEnd);
williamr@2
   308
williamr@2
   309
	void Append(TDes& aBuffer, const TDesC8& aAddition);
williamr@2
   310
	inline CImConvertCharconv& CharConv();
williamr@2
   311
williamr@2
   312
	IMPORT_C TUint OverrideCharset() const;
williamr@2
   313
	IMPORT_C void SetOverrideCharset(TUint aCharset);
williamr@2
   314
williamr@2
   315
private:
williamr@2
   316
	void ConstructL();
williamr@2
   317
	CImConvertHeader(CImConvertCharconv&);
williamr@2
   318
	// Functions dealing only with single 'encoded-word's
williamr@2
   319
	void GetCharsetAndEncodeDataL(const TDesC& aBufIn, RBuf8& aBufOut, TImHeaderEncodingInfo& aInfo);
williamr@2
   320
	void EncodeWordL(const TDesC& aBufIn, RBuf8& aBufOut, TImHeaderEncodingInfo& aInfo,
williamr@2
   321
						const TDesC8& aCharsetName, RBuf8& aEncodedWord);
williamr@2
   322
williamr@2
   323
	TBool DecodeWordL(const TDesC8& aBufIn, TDes& aBufOut, TInt rRemainder); 
williamr@2
   324
	void DecodeRecipientListL( CDesCArray& aArray);
williamr@2
   325
	void DecodeFieldL(const TDesC& aField);
williamr@2
   326
williamr@2
   327
	TBool DoCharsetConversionL(const TDesC& aDataToConvert, RBuf8& aEncodedWord);
williamr@2
   328
williamr@2
   329
	void DoEncodingL(RBuf8& aEncodedWord, TImHeaderEncodingInfo& aInfo);
williamr@2
   330
williamr@2
   331
	TInt AddEncodedWordInfoL(const TDesC8& aEncodedWord, RBuf8& aBufOut, 
williamr@2
   332
							 TImHeaderEncodingInfo& aInfo, const TDesC8& aCharsetName);
williamr@2
   333
williamr@2
   334
	TBool IsAscii( TUint aChar ) const;
williamr@2
   335
	TBool ExtractTextToEncode(const TDesC& aBufIn, TInt& rStart, TInt& rEnd, TBool aIsAddressField);
williamr@2
   336
	void Insert(TDes8& aBuffer, const TDesC16& aInsert);
williamr@2
   337
williamr@2
   338
private:
williamr@2
   339
	TImHeaderEncodingInfo iEncodingInfo;
williamr@2
   340
	CImConvertCharconv& iCharConv;
williamr@2
   341
williamr@2
   342
	// Get access to QP/ Base64 encoding/decoding functions
williamr@2
   343
	TImCodecB64	 iB64Codec;
williamr@2
   344
	TImCodecQP	 iQPCodec;
williamr@2
   345
williamr@2
   346
	// Need in the narrow build, to check if possible to convert to/from
williamr@2
   347
	// the machines character set.
williamr@2
   348
	TUint iCharacterSetId; 
williamr@2
   349
williamr@2
   350
	CImHeader* iHeader;	
williamr@2
   351
williamr@2
   352
	// Converted static variables used in EncodeWordL()
williamr@2
   353
	TBool	isMIMEMessageHeader;
williamr@2
   354
	TUint   iOverrideCharset;
williamr@2
   355
	};
williamr@2
   356
williamr@2
   357
williamr@2
   358
#include <imcvcodc.inl>
williamr@2
   359
williamr@2
   360
#endif