|
|
// --------------------------------------------------------------------------------
// 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
|