WindowsXP-SP1/shell/ext/mlang/convbase.h
2020-09-30 16:53:49 +02:00

60 lines
1.3 KiB
C++

#ifndef CONVBASE_H_
#define CONVBASE_H_
#define MAXOVERFLOWCHARS 16
class CINetCodeConverter
{
private:
UINT m_uCodePage;
int m_nCodeSet;
BOOL m_fOutput;
LPSTR m_lpDestStr;
int m_cchDest;
int m_cchOutput;
int m_cchOverflow;
UCHAR m_OverflowBuffer[MAXOVERFLOWCHARS];
public:
CINetCodeConverter();
CINetCodeConverter(UINT uCodePage, int nCodeSet);
virtual ~CINetCodeConverter() {}
int GetCodeSet() {return m_nCodeSet;}
HRESULT GetStringSizeA(LPCSTR lpSrcStr, int cchSrc, LPINT lpnSize = NULL);
HRESULT ConvertStringA(LPCSTR lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest, LPINT lpnSize = NULL);
virtual int GetUnconvertBytes() = 0 ;
virtual DWORD GetConvertMode() = 0 ;
virtual void SetConvertMode(DWORD mode) = 0 ;
private:
HRESULT WalkString(LPCSTR lpSrcStr, int cchSrc, LPINT lpnSize);
BOOL EndOfDest(UCHAR tc);
BOOL OutputOverflowBuffer();
protected:
virtual HRESULT ConvertChar(UCHAR tc, int cchSrc=-1) = 0;
virtual BOOL CleanUp() = 0;
protected:
inline BOOL Output(UCHAR tc)
{
BOOL fDone = TRUE;
if (m_fOutput) {
if (m_cchOutput < m_cchDest) {
*m_lpDestStr++ = tc;
} else {
(void)EndOfDest(tc);
fDone = FALSE;
}
}
m_cchOutput++;
return fDone;
}
};
#endif /* CONVBASE_H_ */