windows-nt/Source/XPSP1/NT/shell/ext/mlang/mimedb.h
2020-09-26 16:20:57 +08:00

138 lines
3.8 KiB
C++

#ifndef _MIMEDB_H_
#define _MIMEDB_H_
#define ALLOC_BLOCK 10
typedef struct tagMIMECODEPAGE {
UINT uiCodePage;
LPWSTR wszHeaderCharset;
LPWSTR wszBodyCharset;
LPWSTR wszWebCharset;
UINT uidFixedWidthFont;
UINT uidProportionalFont;
UINT uidDescription;
UINT uiFamilyCodePage;
DWORD dwFlags;
} MIMECODEPAGE;
typedef struct tagMIMEREGCHARSET
{
LPCWSTR szCharset;
UINT uiCodePage;
UINT uiInternetEncoding;
DWORD dwFlags;
} MIMECHARSET;
typedef struct tagMIMERFC1766
{
LCID LcId;
LPCWSTR szRfc1766;
UINT uidLCID;
DWORD dwFlags;
} MIMERFC1766;
extern MIMECODEPAGE MimeCodePage[];
extern const MIMERFC1766 MimeRfc1766[];
extern const MIMECHARSET MimeCharSet[];
#ifdef __cplusplus
//
// CMimeDatabase declaration without IMimeDatabase Interface
//
class CMimeDatabase // This would support IMimeDatabase when available
{
MIMECONTF dwMimeSource;
public:
// Possible IMimeDatabase methods
STDMETHODIMP GetNumberOfCodePageInfo(UINT *pcCodePage);
STDMETHODIMP EnumCodePageInfo(void);
STDMETHODIMP GetCodePageInfo(UINT uiCodePage, LANGID LangId, PMIMECPINFO pcpInfo);
STDMETHODIMP GetCodePageInfoWithIndex(UINT uidx, LANGID LangId, PMIMECPINFO pcpInfo);
STDMETHODIMP GetCharsetInfo(BSTR Charset, PMIMECSETINFO pcsetInfo);
STDMETHODIMP ValidateCP(UINT uiCodePage);
STDMETHODIMP SetMimeDBSource(MIMECONTF dwSource)
{
if ((dwSource != MIMECONTF_MIME_IE4) &&
(dwSource != MIMECONTF_MIME_LATEST) &&
(dwSource != MIMECONTF_MIME_REGISTRY))
{
return E_INVALIDARG;
}
dwMimeSource = dwSource;
return S_OK;
}
CMimeDatabase(void)
{
dwMimeSource = MIMECONTF_MIME_LATEST;
}
protected:
void FreeMimeDatabase(void);
BOOL CheckFont(BYTE bGDICharset);
};
//
// Globals
//
extern CMimeDatabase *g_pMimeDatabase;
//
// CMimeDatabase declaration without IMimeDatabase Interface
//
class CMimeDatabaseReg // This would support IMimeDatabase when available
{
public:
// Possible IMimeDatabase methods
STDMETHODIMP GetNumberOfCodePageInfo(UINT *pcCodePage);
STDMETHODIMP EnumCodePageInfo(void);
STDMETHODIMP GetCodePageInfo(UINT uiCodePage, PMIMECPINFO pcpInfo);
STDMETHODIMP GetCodePageInfoWithIndex(UINT uidx, PMIMECPINFO pcpInfo);
STDMETHODIMP GetCharsetInfo(BSTR Charset, PMIMECSETINFO pcsetInfo);
STDMETHODIMP ValidateCP(UINT uiCodePage);
STDMETHODIMP LcidToRfc1766A(LCID Locale, LPSTR pszRfc1766, int iMaxLength);
STDMETHODIMP LcidToRfc1766W(LCID Locale, LPWSTR pwszRfc1766, int nChar);
STDMETHODIMP Rfc1766ToLcidA(PLCID pLocale, LPCSTR pszRfc1766);
STDMETHODIMP Rfc1766ToLcidW(PLCID pLocale, LPCWSTR pwszRfc1766);
void EnsureRfc1766Table(void);
// Constructor & Destructor
CMimeDatabaseReg();
~CMimeDatabaseReg();
protected:
void BuildCodePageMimeDatabase(void);
void BuildCharsetMimeDatabase(void);
void FreeMimeDatabase(void);
int FindCodePageFromCache(UINT uiCodePage);
BOOL FindCodePageFromRegistry(UINT uiCodePage, MIMECPINFO *pCPInfo);
int FindCharsetFromCache(BSTR Charset);
int FindCharsetFromRegistry(BSTR Charset, BOOL fFromAlias);
BOOL CheckFont(BYTE bGDICharset);
void QSortCodePageInfo(LONG left, LONG right);
void QSortCharsetInfo(LONG left, LONG right);
void BuildRfc1766Table(void);
void FreeRfc1766Table(void);
CRITICAL_SECTION _cs;
BOOL _fAllCPCached;
PMIMECPINFO _pCodePage;
UINT _cCodePage;
UINT _cMaxCodePage;
PMIMECSETINFO _pCharset;
UINT _cCharset;
UINT _cMaxCharset;
};
extern CMimeDatabaseReg *g_pMimeDatabaseReg;
#endif // __cplusplus
#endif // _MIMEDB_H_