You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.4 KiB
99 lines
3.4 KiB
//-----------------------------------------------------------------------------
|
|
//
|
|
//
|
|
// File: dsn_utf7
|
|
//
|
|
// Description: Implementations of UTF-7 based unicode character encoding
|
|
// methods for DSN generation.
|
|
//
|
|
// Author: Mike Swafford (MikeSwa)
|
|
//
|
|
// History:
|
|
// 10/20/98 - MikeSwa Created
|
|
//
|
|
// Copyright (C) 1998 Microsoft Corporation
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef __DSN_UTF7_H__
|
|
#define __DSN_UTF7_H__
|
|
|
|
#include <windows.h>
|
|
#include <dbgtrace.h>
|
|
#include "b64octet.h"
|
|
#include "dsnconv.h"
|
|
|
|
#define UTF7_CHARSET "unicode-1-1-utf-7"
|
|
|
|
#define UTF7_CONTEXT_SIG '7FTU'
|
|
|
|
#define UTF7_START_STREAM_CHAR '+'
|
|
#define UTF7_STOP_STREAM_CHAR '-'
|
|
#define UTF7_RFC1522_ENCODE_START "=?" UTF7_CHARSET "?Q?+"
|
|
#define UTF7_RFC1522_ENCODE_STOP "?="
|
|
#define UTF7_RFC1522_PHRASE_SEPARATOR " \r\n\t"
|
|
#define UTF7_RFC1522_MAX_LENGTH 76
|
|
|
|
|
|
class CUTF7ConversionContext : public CDefaultResourceConversionContext
|
|
{
|
|
protected:
|
|
DWORD m_dwSignature;
|
|
DWORD m_cBytesSinceCRLF;
|
|
DWORD m_dwCurrentState;
|
|
CHAR chNeedsEncoding(WCHAR wch);
|
|
CBase64OctetStream m_Base64Stream;
|
|
|
|
//State Description enum flags
|
|
enum
|
|
{
|
|
UTF7_INITIAL_STATE = 0x00000000, //Initial state
|
|
UTF7_ENCODING_RFC1522_SUBJECT = 0x80000000, //encoding RFC1522 subject
|
|
UTF7_ENCODING_WORD = 0x00000001, //In process of encoding a word
|
|
UTF7_WORD_CLOSING_PENDING = 0x00000002, //Needs a '-'
|
|
UTF7_RFC1522_CHARSET_PENDING = 0x00000004, //=?charset?Q?+ pending
|
|
UTF7_RFC1522_CLOSING_PENDING = 0x00000008, //needs '=?'
|
|
UTF7_RFC1522_CURRENTLY_ENCODING = 0x00000010, //Currently encoding RFC1522 phrase
|
|
UTF7_FOLD_HEADER_PENDING = 0x00000020, //Need to fold head before encoding
|
|
//more
|
|
UTF7_FLUSH_BUFFERS = 0x00000040, //Need to flush conversion buffers
|
|
|
|
//Used to determine if subject needs to be encoded
|
|
UTF7_SOME_INVALID_RFC822_CHARS = 0x40000000, //Contains some invalid RFC822 chars
|
|
UFT7_ALL_VALID_RFC822_CHARS = 0x20000000, //All characters are valid RFC822 chars
|
|
};
|
|
|
|
void WriteChar(IN CHAR ch, IN OUT BYTE ** ppbBuffer, IN OUT DWORD *pcbWritten);
|
|
BOOL fWriteString(IN LPSTR szString, IN DWORD cbString, IN DWORD cbBuffer,
|
|
IN OUT BYTE ** ppbBuffer, IN OUT DWORD *pcbWritten);
|
|
BOOL fSubjectNeedsEncoding(IN BYTE *pbBuffer, IN DWORD cbBuffer);
|
|
|
|
BOOL fUTF7EncodeBuffer(
|
|
IN PBYTE pbInputBuffer,
|
|
IN DWORD cbInputBuffer,
|
|
IN PBYTE pbOutputBuffer,
|
|
IN DWORD cbOutputBuffer,
|
|
OUT DWORD *pcbWritten,
|
|
OUT DWORD *pcbRead);
|
|
|
|
BOOL fConvertBufferTo7BitASCII(
|
|
IN PBYTE pbInputBuffer,
|
|
IN DWORD cbInputBuffer,
|
|
IN PBYTE pbOutputBuffer,
|
|
IN DWORD cbOutputBuffer,
|
|
OUT DWORD *pcbWritten,
|
|
OUT DWORD *pcbRead);
|
|
|
|
public:
|
|
CUTF7ConversionContext(BOOL fIsRFC1522Subject = FALSE);
|
|
BOOL fConvertBuffer(
|
|
IN BOOL fASCII,
|
|
IN PBYTE pbInputBuffer,
|
|
IN DWORD cbInputBuffer,
|
|
IN PBYTE pbOutputBuffer,
|
|
IN DWORD cbOutputBuffer,
|
|
OUT DWORD *pcbWritten,
|
|
OUT DWORD *pcbRead);
|
|
};
|
|
|
|
#endif //__DSN_UTF7_H__
|