Hello,
When i continue to play with this function i found another problem.
in the lines 347+:
t->transcodeFrom(&src[totalBytesEaten], toEat, outputBuf, MYBUFSIZE,
bytesEaten, charSizes);
outputBuf[iReaded] = chNull;
function transcodeFrom can read less than buffer size bytes, and putting of
chNull at the
end of buffer is not corect.Result of this is a corrupted outputBuf, and
next
sbXMLChCat function cannot copy corect block of data and at the end this
cause problems
with large blocks of data, they are not correct.
So, finaly modified function looks like this one :
#define MYBUFSIZE 1024
XMLCh * transcodeFromUTF8(const unsigned char * src) {
// Take a UTF-8 buffer and transcode to UTF-16
safeBuffer fullDest;
fullDest.sbXMLChIn(DSIGConstants::s_unicodeStrEmpty);
XMLCh outputBuf[MYBUFSIZE+4];
// Used to record byte sizes
unsigned char charSizes[MYBUFSIZE+4];
// Grab a transcoder
XMLTransService::Codes failReason;
#if defined(XSEC_XERCES_REQUIRES_MEMMGR)
XMLTranscoder* t =
XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8",
failReason, MYBUFSIZE, XMLPlatformUtils::fgMemoryManager);
#else
XMLTranscoder* t =
XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8", failReason,
MYBUFSIZE);
#endif
Janitor<XMLTranscoder> j_t(t);
// Need to loop through, 2K at a time
unsigned int bytesEaten;
unsigned int totalBytesEaten = 0;
unsigned int bytesToEat = XMLString::stringLen((char *) src);
while (totalBytesEaten < bytesToEat) {
int toEat = ((bytesToEat - totalBytesEaten) > MYBUFSIZE ?
MYBUFSIZE : (bytesToEat - totalBytesEaten));
int iReaded = t->transcodeFrom(&src[totalBytesEaten], toEat,
outputBuf, MYBUFSIZE, bytesEaten, charSizes);
outputBuf[iReaded] = chNull;
fullDest.sbXMLChCat(outputBuf);
totalBytesEaten += bytesEaten;
}
// Dup and output
return XMLString::replicate(fullDest.rawXMLChBuffer());
}
#undef MYBUFSIZE
regards,
decho