size_t wxConvAuto::ToWChar(wchar_t *dst, size_t dstLen, const char *src, size_t srcLen) const { // we check BOM and create the appropriate conversion the first time we're // called but we also need to ensure that the BOM is skipped not only // during this initial call but also during the first call with non-NULL // dst as typically we're first called with NULL dst to calculate the // needed buffer size wxConvAuto *self = const_cast<wxConvAuto *>(this); if ( !m_conv ) { self->InitFromInput(&src, &srcLen); if ( dst ) self->m_consumedBOM = true; } if ( !m_consumedBOM && dst ) { self->m_consumedBOM = true; SkipBOM(&src, &srcLen); } // try to convert using the auto-detected encoding size_t rc = m_conv->ToWChar(dst, dstLen, src, srcLen); if ( rc == wxCONV_FAILED && m_bomType == BOM_None ) { // if the conversion failed but we didn't really detect anything and // simply tried UTF-8 by default, retry it using the fall-back if ( m_encDefault != wxFONTENCODING_MAX ) { if ( m_ownsConv ) delete m_conv; self->m_conv = new wxCSConv(m_encDefault == wxFONTENCODING_DEFAULT ? GetFallbackEncoding() : m_encDefault); self->m_ownsConv = true; rc = m_conv->ToWChar(dst, dstLen, src, srcLen); } } return rc; }
size_t wxConvAuto::ToWChar(wchar_t *dst, size_t dstLen, const char *src, size_t srcLen) const { // we check BOM and create the appropriate conversion the first time we're // called but we also need to ensure that the BOM is skipped not only // during this initial call but also during the first call with non-NULL // dst as typically we're first called with NULL dst to calculate the // needed buffer size wxConvAuto *self = const_cast<wxConvAuto *>(this); if ( !m_conv ) { if ( !self->InitFromInput(src, srcLen) ) { // there is not enough data to determine whether we have a BOM or // not, so fail for now -- the caller is supposed to call us again // with more data return wxCONV_FAILED; } } if ( !m_consumedBOM ) { SkipBOM(&src, &srcLen); if ( srcLen == 0 ) { // there is nothing left except the BOM so we'd return 0 below but // this is unexpected: decoding a non-empty string must either fail // or return something non-empty, in particular this would break // the code in wxTextInputStream::NextChar() // // so still return an error as we need some more data to be able to // decode it return wxCONV_FAILED; } } // try to convert using the auto-detected encoding size_t rc = m_conv->ToWChar(dst, dstLen, src, srcLen); if ( rc == wxCONV_FAILED && m_bomType == BOM_None ) { // if the conversion failed but we didn't really detect anything and // simply tried UTF-8 by default, retry it using the fall-back if ( m_encDefault != wxFONTENCODING_MAX ) { if ( m_ownsConv ) delete m_conv; self->m_conv = new wxCSConv(m_encDefault == wxFONTENCODING_DEFAULT ? GetFallbackEncoding() : m_encDefault); self->m_ownsConv = true; rc = m_conv->ToWChar(dst, dstLen, src, srcLen); } } // don't skip the BOM again the next time if we really consumed it if ( rc != wxCONV_FAILED && dst && !m_consumedBOM ) self->m_consumedBOM = true; return rc; }
void wxConvAuto::InitFromInput(const char **src, size_t *len) { m_bomType = DetectBOM(*src, *len); InitFromBOM(m_bomType); SkipBOM(src, len); }