?? iconvfbsdtransservice.cpp
字號(hào):
if (wLent >= gTempBuffArraySize) wideCharBuf = allocatedArray = new wchar_t[wLent + 1]; else wideCharBuf = tmpWideCharArr; fbsd_mbstowcs(wideCharBuf, toTranscode, wLent); retVal = new XMLCh[wLent + 1]; if (retVal == NULL) { if (allocatedArray) delete [] allocatedArray; return NULL; } for (unsigned int i = 0; i < wLent; i++) retVal[i] = (XMLCh) wideCharBuf[i]; retVal[wLent] = 0x00; if (allocatedArray) delete [] allocatedArray;#else /* XML_USE_LIBICONV */ char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); retVal = new XMLCh[wLent + 1]; if (retVal == NULL) return NULL; if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = new char[len]; if (wBufPtr == NULL) return 0; wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; } else wideCharBuf = (char *) retVal; size_t flen = strlen(toTranscode); char *ptr = wideCharBuf; size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); if (rc == (size_t) -1) { if (wBufPtr) delete [] wBufPtr; return NULL; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (wideCharBuf, wLent, retVal, wLent); if (wBufPtr) delete [] wBufPtr; retVal[wLent] = 0x00;#endif /* !XML_USE_LIBICONV */ } else { retVal = new XMLCh[1]; if (retVal == NULL ) return 0; retVal[0] = 0; } return retVal;}XMLCh* IconvFBSDLCPTranscoder::transcode(const char* const toTranscode, MemoryManager* const manager){ if (!toTranscode) return 0; XMLCh* retVal = 0; if (*toTranscode) { const unsigned int wLent = calcRequiredSize(toTranscode, manager); if (wLent == 0) { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; retVal[0] = 0; return retVal; }#ifndef XML_USE_LIBICONV wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; if (wLent >= gTempBuffArraySize) wideCharBuf = allocatedArray = (wchar_t*) manager->allocate ( (wLent + 1) * sizeof(wchar_t) );//new wchar_t[wLent + 1]; else wideCharBuf = tmpWideCharArr; fbsd_mbstowcs(wideCharBuf, toTranscode, wLent); retVal = (XMLCh*) manager->allocate((wLent + 1) * sizeof(XMLCh));//new XMLCh[wLent + 1]; if (retVal == NULL) { if (allocatedArray) manager->deallocate(allocatedArray);//delete [] allocatedArray; return NULL; } for (unsigned int i = 0; i < wLent; i++) retVal[i] = (XMLCh) wideCharBuf[i]; retVal[wLent] = 0x00; if (allocatedArray) manager->deallocate(allocatedArray);//delete [] allocatedArray;#else /* XML_USE_LIBICONV */ char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); retVal = (XMLCh*) manager->allocate((wLent + 1) * sizeof(XMLCh));//new XMLCh[wLent + 1]; if (retVal == NULL) return NULL; if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len]; if (wBufPtr == NULL) return 0; wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; } else wideCharBuf = (char *) retVal; size_t flen = strlen(toTranscode); char *ptr = wideCharBuf; size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); if (rc == (size_t) -1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return NULL; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (wideCharBuf, wLent, retVal, wLent); if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; retVal[wLent] = 0x00;#endif /* !XML_USE_LIBICONV */ } else { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; if (retVal == NULL ) return 0; retVal[0] = 0; } return retVal;}bool IconvFBSDLCPTranscoder::transcode(const char* const toTranscode , XMLCh* const toFill , const unsigned int maxChars , MemoryManager* const manager){ // Check for a couple of psycho corner cases if (!toTranscode || !maxChars) { toFill[0] = 0; return true; } if (!*toTranscode) { toFill[0] = 0; return true; } size_t wLent = calcRequiredSize(toTranscode); if (wLent > maxChars) wLent = maxChars;#ifndef XML_USE_LIBICONV wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; if (maxChars >= gTempBuffArraySize) wideCharBuf = allocatedArray = (wchar_t*) manager->allocate ( (wLent + 1) * sizeof(wchar_t) );//new wchar_t[wLent + 1]; else wideCharBuf = tmpWideCharArr; if (fbsd_mbstowcs(wideCharBuf, toTranscode, wLent) == -1) { if (allocatedArray) manager->deallocate(allocatedArray);//delete [] allocatedArray; return false; } for (unsigned int i = 0; i < wLent; i++) toFill[i] = (XMLCh) wideCharBuf[i]; if (allocatedArray) manager->deallocate(allocatedArray);//delete [] allocatedArray;#else /* XML_USE_LIBICONV */ char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate ( len * sizeof(char) );//new char[len]; if (wBufPtr == NULL) return 0; wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; } else wideCharBuf = (char *) toFill; size_t flen = strlen(toTranscode); // wLent; char *ptr = wideCharBuf; size_t rc = iconvFrom(toTranscode, &flen, &ptr, len); if (rc == (size_t)-1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return false; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (wideCharBuf, wLent, toFill, wLent); if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr;#endif /* !XML_USE_LIBICONV */ toFill[wLent] = 0x00; return true;}// ---------------------------------------------------------------------------// IconvFBSDLCPTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------#ifdef XML_USE_LIBICONVIconvFBSDLCPTranscoder::IconvFBSDLCPTranscoder (iconv_t cd_from, iconv_t cd_to, size_t uchsize, unsigned int ubo) : IconvFBSDCD (cd_from, cd_to, uchsize, ubo){}#endif /* XML_USE_LIBICONV */#ifndef XML_USE_LIBICONVIconvFBSDLCPTranscoder::IconvFBSDLCPTranscoder(){}#endif /* !XML_USE_LIBICONV */IconvFBSDLCPTranscoder::~IconvFBSDLCPTranscoder(){}#ifdef XML_USE_LIBICONV// ---------------------------------------------------------------------------// IconvFBSDTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------IconvFBSDTranscoder::IconvFBSDTranscoder (const XMLCh* const encodingName , const unsigned int blockSize , iconv_t cd_from , iconv_t cd_to , size_t uchsize , unsigned int ubo , MemoryManager* const manager ) : XMLTranscoder(encodingName, blockSize, manager) , IconvFBSDCD (cd_from, cd_to, uchsize, ubo){}IconvFBSDTranscoder::~IconvFBSDTranscoder(){ ICONV_LOCK; if (cdTo() != (iconv_t)-1) { iconv_close (cdTo()); setCDTo ((iconv_t)-1); } if (cdFrom() != (iconv_t)-1) { iconv_close (cdFrom()); setCDFrom ((iconv_t)-1); }}// ---------------------------------------------------------------------------// IconvFBSDTranscoder: Implementation of the virtual transcoder API// ---------------------------------------------------------------------------unsigned int IconvFBSDTranscoder::transcodeFrom( const XMLByte* const srcData , const unsigned int srcCount , XMLCh* const toFill , const unsigned int maxChars , unsigned int& bytesEaten , unsigned char* const charSizes ){ // Transcode TO XMLCh const char* startSrc = (const char*) srcData; const char* endSrc = (const char*) srcData + srcCount; char tmpWBuff[gTempBuffArraySize]; char *startTarget = 0; char *wBufPtr = 0; size_t len = maxChars * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) getMemoryManager()->allocate ( len * sizeof(char) );//new char[len]; if (wBufPtr == NULL) return 0; startTarget = wBufPtr; } else startTarget = tmpWBuff; } else startTarget = (char *) toFill; // Do character-by-character transcoding char *orgTarget = startTarget; size_t srcLen = srcCount; size_t prevSrcLen = srcLen; unsigned int toReturn = 0; bytesEaten = 0; for (size_t cnt = 0; cnt < maxChars && srcLen; cnt++) { size_t rc = iconvFrom(startSrc, &srcLen, &orgTarget, uChSize()); if (rc == (size_t)-1) { if (errno != E2BIG || prevSrcLen == srcLen) { if (wBufPtr) getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr; ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, getMemoryManager()); } } charSizes[cnt] = prevSrcLen - srcLen; prevSrcLen = srcLen; bytesEaten += charSizes[cnt]; startSrc = endSrc - srcLen; toReturn++; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (startTarget, toReturn, toFill, toReturn); if (wBufPtr) getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr; return toReturn;}unsigned int IconvFBSDTranscoder::transcodeTo( const XMLCh* const srcData , const unsigned int srcCount , XMLByte* const toFill , const unsigned int maxBytes , unsigned int& charsEaten , const UnRepOpts options ){ // Transcode FROM XMLCh char tmpWBuff[gTempBuffArraySize]; char *startSrc = tmpWBuff; char *wBufPtr = 0; size_t len = srcCount * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) getMemoryManager()->allocate ( len * sizeof(char) );//new char[len]; if (wBufPtr == NULL) return 0; startSrc = wBufPtr; } else startSrc = tmpWBuff; xmlToMbs (srcData, srcCount, startSrc, srcCount); } else startSrc = (char *) srcData; char* startTarget = (char *) toFill; size_t srcLen = len; size_t rc = iconvTo (startSrc, &srcLen, &startTarget, maxBytes); if (rc == (size_t)-1 && errno != E2BIG) { if (wBufPtr) getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr; ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, getMemoryManager()); } charsEaten = srcCount - srcLen / uChSize(); if (wBufPtr) getMemoryManager()->deallocate(wBufPtr);//delete [] wBufPtr; return startTarget - (char *)toFill;}bool IconvFBSDTranscoder::canTranscodeTo( const unsigned int toCheck) const{ // // If the passed value is really a surrogate embedded together, then // we need to break it out into its two chars. Else just one. // char srcBuf[2 * uChSize()]; unsigned int srcCount = 1; if (toCheck & 0xFFFF0000) { XMLCh ch1 = (toCheck >> 10) + 0xD800; XMLCh ch2 = toCheck & 0x3FF + 0xDC00; xmlToMbs(&ch1, 1, srcBuf, 1); xmlToMbs(&ch2, 1, srcBuf + uChSize(), 1); srcCount++; } else xmlToMbs((const XMLCh*) &toCheck, 1, srcBuf, 1); size_t len = srcCount * uChSize(); char tmpBuf[64]; char* pTmpBuf = tmpBuf; size_t rc = iconvTo( srcBuf, &len, &pTmpBuf, 64); return (rc != (size_t)-1) && (len == 0);}#endif /* XML_USE_LIBICONV */XERCES_CPP_NAMESPACE_END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -