Windows2003-3790/inetcore/outlookexpress/inetcomm/mimeole/internat.h
2020-09-30 16:53:55 +02:00

172 lines
9.4 KiB
C++

// --------------------------------------------------------------------------------
// Internat.h
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// Steven J. Bailey
// --------------------------------------------------------------------------------
#ifndef __INTERNAT_H
#define __INTERNAT_H
#include "exrwlck.h"
// --------------------------------------------------------------------------------
// Forward Decls
// --------------------------------------------------------------------------------
typedef struct tagVARIANTCONVERT *LPVARIANTCONVERT;
typedef struct tagPROPSYMBOL *LPPROPSYMBOL;
typedef struct tagPROPSTRINGA *LPPROPSTRINGA;
typedef struct tagPROPSTRINGW *LPPROPSTRINGW;
typedef const struct tagPROPSTRINGA *LPCPROPSTRINGA;
typedef const struct tagPROPSTRINGW *LPCPROPSTRINGW;
typedef struct tagMIMEVARIANT *LPMIMEVARIANT;
// --------------------------------------------------------------------------------
// Extern Global
// --------------------------------------------------------------------------------
class CIntlGlobals {
public:
static void Init();
static void Term();
static LPINETCSETINFO GetDefBodyCset();
static LPINETCSETINFO GetDefHeadCset();
static LPINETCSETINFO GetDefaultCharset();
static void SetDefBodyCset(LPINETCSETINFO pCharset);
static void SetDefHeadCset(LPINETCSETINFO pCharset);
private:
static void DoInit();
static BOOL mg_bInit;
static CRITICAL_SECTION mg_cs;
static LPINETCSETINFO mg_pDefBodyCset;
static LPINETCSETINFO mg_pDefHeadCset;
static INETCSETINFO mg_rDefaultCharset;
};
// --------------------------------------------------------------------------------
// IsDBCSCodePage
// --------------------------------------------------------------------------------
#define IsDBCSCodePage(_cpi) \
(932 == _cpi || 936 == _cpi || 950 == _cpi || 949 == _cpi || 874 == _cpi || 10001 == _cpi)
// --------------------------------------------------------------------------------
// HCSET Handle Macros
// --------------------------------------------------------------------------------
#define HCSET_SIGN (WORD)40
#define HCSETMAKE(_index) (HCHARSET)MAKELPARAM(m_wTag + HCSET_SIGN, _index)
#define HCSETINDEX(_hcset) (ULONG)HIWORD(_hcset)
#define HCSETTICK(_hcset) (WORD)LOWORD(_hcset)
#define HCSETVALID(_hcset) ((WORD)(HCSETTICK(_hcset) - HCSET_SIGN) == m_wTag && HCSETINDEX(_hcset) < m_cst.cCharsets)
#define PCsetFromHCset(_hcset) m_cst.prgpCharset[HCSETINDEX(_hcset)]
// --------------------------------------------------------------------------------
// CSTABLE - Character Set Table
// --------------------------------------------------------------------------------
typedef struct tagCSTABLE {
ULONG cCharsets; // Number of items in prgpCset
ULONG cAlloc; // Number of items allocated in prgCset
LPINETCSETINFO *prgpCharset; // Array of INETCSETINFO structs
} CSTABLE, *LPCSTABLE;
// --------------------------------------------------------------------------------
// CPTABLE - Code Page Table
// --------------------------------------------------------------------------------
typedef struct tagCPTABLE {
ULONG cPages; // Number of items in prgpCset
ULONG cAlloc; // Number of items allocated in prgCset
LPCODEPAGEINFO *prgpPage; // Array of INETCSETINFO structs
} CPTABLE, *LPCPTABLE;
// --------------------------------------------------------------------------------
// CMimeInternational
// --------------------------------------------------------------------------------
class CMimeInternational : public IMimeInternational
{
public:
// ----------------------------------------------------------------------------
// Construction
// ----------------------------------------------------------------------------
CMimeInternational(void);
~CMimeInternational(void);
// -------------------------------------------------------------------------
// IUnknown
// -------------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// -------------------------------------------------------------------------
// IMimeInternational Methods
// -------------------------------------------------------------------------
STDMETHODIMP GetCodePageCharset(CODEPAGEID cpiCodePage, CHARSETTYPE ctCsetType, LPHCHARSET phCharset);
STDMETHODIMP SetDefaultCharset(HCHARSET hCharset);
STDMETHODIMP GetDefaultCharset(LPHCHARSET phCharset);
STDMETHODIMP FindCharset(LPCSTR pszCharset, LPHCHARSET phCharset);
STDMETHODIMP GetCharsetInfo(HCHARSET hCharset, LPINETCSETINFO pCsetInfo);
STDMETHODIMP GetCodePageInfo(CODEPAGEID cpiCodePage, LPCODEPAGEINFO pCodePageInfo);
STDMETHODIMP ConvertBuffer(CODEPAGEID cpiSource, CODEPAGEID cpiDest, LPBLOB pIn, LPBLOB pOut, ULONG *pcbRead);
STDMETHODIMP ConvertString(CODEPAGEID cpiSource, CODEPAGEID cpiDest, LPPROPVARIANT pIn, LPPROPVARIANT pOut);
STDMETHODIMP MLANG_ConvertInetReset(void);
STDMETHODIMP MLANG_ConvertInetString(CODEPAGEID cpiSource, CODEPAGEID cpiDest, LPCSTR pSourceStr,
LPINT pnSizeOfSourceStr, LPSTR pDestinationStr, LPINT pnSizeOfDestBuffer);
STDMETHODIMP DecodeHeader(HCHARSET hCharset, LPCSTR pszData, LPPROPVARIANT pDecoded, LPRFC1522INFO pRfc1522Info);
STDMETHODIMP EncodeHeader(HCHARSET hCharset, LPPROPVARIANT pData, LPSTR *ppszEncoded, LPRFC1522INFO pRfc1522Info);
STDMETHODIMP Rfc1522Decode(LPCSTR pszValue, LPSTR pszCharset, ULONG cchmax, LPSTR *ppszDecoded);
STDMETHODIMP Rfc1522Encode(LPCSTR pszValue, HCHARSET hCharset, LPSTR *ppszEncoded);
STDMETHODIMP CanConvertCodePages(CODEPAGEID cpiSource, CODEPAGEID cpiDest);
// -------------------------------------------------------------------------
// LPINETCSETINFO Based Methods
// -------------------------------------------------------------------------
HRESULT HrOpenCharset(CODEPAGEID cpiCodePage, CHARSETTYPE ctCsetType, LPINETCSETINFO *ppCharset);
HRESULT HrOpenCharset(LPCSTR pszCharset, LPINETCSETINFO *ppCharset);
HRESULT HrOpenCharset(HCHARSET hCharset, LPINETCSETINFO *ppCharset);
HRESULT HrFindCodePage(CODEPAGEID cpiCodePage, LPCODEPAGEINFO *ppCodePage);
HRESULT HrConvertString(CODEPAGEID cpiSource, CODEPAGEID cpiDest, LPMIMEVARIANT pSource, LPMIMEVARIANT pDest);
HRESULT HrDecodeHeader(LPINETCSETINFO pCharset, LPRFC1522INFO pRfc1522Info, LPMIMEVARIANT pSource, LPMIMEVARIANT pDest);
HRESULT HrEncodeHeader(LPINETCSETINFO pCharset, LPRFC1522INFO pRfc1522Info, LPMIMEVARIANT pSource, LPMIMEVARIANT pDest);
// -------------------------------------------------------------------------
// Helpers to do Header Properties
// -------------------------------------------------------------------------
HRESULT HrEncodeProperty(LPVARIANTCONVERT pConvert, LPMIMEVARIANT pSource, LPMIMEVARIANT pDest);
HRESULT HrDecodeProperty(LPVARIANTCONVERT pConvert, LPMIMEVARIANT pSource, LPMIMEVARIANT pDest);
HRESULT HrWideCharToMultiByte(CODEPAGEID cpiCodePage, LPCPROPSTRINGW pStringW, LPPROPSTRINGA pStringA);
HRESULT HrMultiByteToWideChar(CODEPAGEID cpiCodePage, LPCPROPSTRINGA pStringA, LPPROPSTRINGW pStringW);
HRESULT HrValidateCodepages(LPMIMEVARIANT pSource, LPMIMEVARIANT pDest, LPBYTE *ppbSource, ULONG *pcbSource, CODEPAGEID *pcpiSource, CODEPAGEID *pcpiDest);
// -------------------------------------------------------------------------
// CMimeInternational Methods
// -------------------------------------------------------------------------
BOOL FIsValidHandle(HCHARSET hCharset);
HRESULT IsDBCSCharset(HCHARSET hCharset);
private:
// ----------------------------------------------------------------------------
// Private Utils
// ----------------------------------------------------------------------------
void _FreeInetCsetTable(void);
void _FreeCodePageTable(void);
void _QuickSortPageInfo(long left, long right);
void _QuickSortCsetInfo(long left, long right);
HRESULT _HrReadPageInfo(CODEPAGEID cpiCodePage, LPCODEPAGEINFO *ppLangInfo);
HRESULT _HrReadCsetInfo(LPCSTR pszCharset, LPINETCSETINFO *ppCsetInfo);
private:
// -------------------------------------------------------------------------
// Private Data
// -------------------------------------------------------------------------
LONG m_cRef; // Reference Counting
WORD m_wTag; // Used to create and verify hCharsets
CSTABLE m_cst; // Character Sets
CPTABLE m_cpt; // CodePages
CExShareLockWithNestAllowed m_lock; // Thread Safety
DWORD m_dwConvState; // Used to save convert state from MLANG
};
// --------------------------------------------------------------------------------
// Prototypes
// --------------------------------------------------------------------------------
void InitInternational(void);
HRESULT HrRegisterMlangDll(void);
#endif // __INTERNAT_H