Leaked source code of windows server 2003
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.
|
|
// ============================================================================
// Internet Character Set Conversion: Base Class
// ============================================================================
#include "private.h"
#include "convbase.h"
#include "fechrcnv.h"
#include "codepage.h"
/******************************************************************************
************************** C O N S T R U C T O R ************************** ******************************************************************************/
CINetCodeConverter::CINetCodeConverter() { m_uCodePage = 0; m_nCodeSet = CP_UNDEFINED; m_cchOverflow = 0; }
CINetCodeConverter::CINetCodeConverter(UINT uCodePage, int nCodeSet) { m_uCodePage = uCodePage; m_nCodeSet = nCodeSet; m_cchOverflow = 0; }
/******************************************************************************
******************** G E T S T R I N G S I Z E A ******************** ******************************************************************************/
HRESULT CINetCodeConverter::GetStringSizeA(LPCSTR lpSrcStr, int cchSrc, LPINT lpnSize) { m_fOutput = FALSE;
return WalkString(lpSrcStr, cchSrc, lpnSize); }
/******************************************************************************
********************* C O N V E R T S T R I N G A ********************* ******************************************************************************/
HRESULT CINetCodeConverter::ConvertStringA(LPCSTR lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest, LPINT lpnSize) { m_fOutput = TRUE; m_lpDestStr = lpDestStr; m_cchDest = cchDest;
if ( !OutputOverflowBuffer() ) // Output those chars which could not be output at previous time.
return FALSE;
return WalkString(lpSrcStr, cchSrc, lpnSize); }
/******************************************************************************
************************** W A L K S T R I N G ************************** ******************************************************************************/
HRESULT CINetCodeConverter::WalkString(LPCSTR lpSrcStr, int cchSrc, LPINT lpnSize) { HRESULT hr = S_OK;
m_cchOutput = 0;
if (lpSrcStr) { while (cchSrc-- > 0) { HRESULT _hr = ConvertChar(*lpSrcStr++, cchSrc); if (!SUCCEEDED(_hr)) { hr = _hr; break; } else if (hr == S_OK && _hr == S_FALSE) hr = S_FALSE; } } else { if (!CleanUp()) hr = E_FAIL; }
if (lpnSize) *lpnSize = m_cchOutput;
return hr; }
/******************************************************************************
************************** E N D O F D E S T ************************** ******************************************************************************/
BOOL CINetCodeConverter::EndOfDest(UCHAR tc) { if (m_cchOverflow < MAXOVERFLOWCHARS) { m_OverflowBuffer[m_cchOverflow++] = tc; return TRUE; } else { return FALSE; // Overflow on Overflow buffer, No way
} }
/******************************************************************************
*************** O U T P U T O V E R F L O W B U F F E R *************** ******************************************************************************/
BOOL CINetCodeConverter::OutputOverflowBuffer() { for (int n = 0; n < m_cchOverflow; n++) { if (m_cchOutput < m_cchDest) { *m_lpDestStr++ = m_OverflowBuffer[n]; m_cchOutput++; } else { // Overflow again
for (int n2 = 0; n < m_cchOverflow; n++, n2++) m_OverflowBuffer[n2] = m_OverflowBuffer[n]; m_cchOverflow = n2; return FALSE; } } return TRUE; }
|