?? iconvgnutransservice.cpp
字號:
xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // perform conversion wLent *= uChSize(); char *ptr = retVal; size_t rc = iconvTo(wideCharBuf, (size_t *) &wLent, &ptr, neededLen); if (rc == (size_t)-1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return 0; } if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; retVal[neededLen] = 0; } else { retVal = (char*) manager->allocate(sizeof(char));//new char[1]; if (retVal == NULL) return 0; retVal[0] = 0; } return retVal;}bool IconvGNULCPTranscoder::transcode( const XMLCh* const toTranscode , char* const toFill , const unsigned int maxBytes , MemoryManager* const manager){ // Watch for a couple of pyscho corner cases if (!toTranscode || !maxBytes) { toFill[0] = 0; return true; } if (!*toTranscode) { toFill[0] = 0; return true; } unsigned int wLent = getWideCharLength(toTranscode); if (wLent > maxBytes) wLent = maxBytes; // Fill the "unicode" string 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; xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // Ok, go ahead and try the transcoding. If it fails, then ... char *ptr = toFill; size_t rc = iconvTo(wideCharBuf, &len, &ptr, maxBytes); if (rc == (size_t)-1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return false; } if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; // Cap it off *ptr = 0; return true;}XMLCh* IconvGNULCPTranscoder::transcode(const char* const toTranscode){ if (!toTranscode) return 0; XMLCh* retVal = 0; if (*toTranscode) { const unsigned int wLent = calcRequiredSize(toTranscode); if (wLent == 0) { retVal = new XMLCh[1]; retVal[0] = 0; return retVal; } 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; } else { retVal = new XMLCh[1]; if (retVal == NULL ) return 0; retVal[0] = 0; } return retVal;}XMLCh* IconvGNULCPTranscoder::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; } 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; } else { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; if (retVal == NULL ) return 0; retVal[0] = 0; } return retVal;}bool IconvGNULCPTranscoder::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; 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; toFill[wLent] = 0x00; return true;}// ---------------------------------------------------------------------------// IconvGNULCPTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------IconvGNULCPTranscoder::IconvGNULCPTranscoder (iconv_t cd_from, iconv_t cd_to, size_t uchsize, unsigned int ubo) : IconvGNUWrapper (cd_from, cd_to, uchsize, ubo){}IconvGNULCPTranscoder::~IconvGNULCPTranscoder(){}// ---------------------------------------------------------------------------// IconvGNUTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------IconvGNUTranscoder::IconvGNUTranscoder (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) , IconvGNUWrapper (cd_from, cd_to, uchsize, ubo){}IconvGNUTranscoder::~IconvGNUTranscoder(){ 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); }}// ---------------------------------------------------------------------------// IconvGNUTranscoder: Implementation of the virtual transcoder API// ---------------------------------------------------------------------------unsigned int IconvGNUTranscoder::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 IconvGNUTranscoder::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 IconvGNUTranscoder::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);}XERCES_CPP_NAMESPACE_END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -