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; }
char* IconvGNULCPTranscoder::transcode(const XMLCh* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; char* retVal = 0; if (*toTranscode) { unsigned int wLent = getWideCharLength(toTranscode); // Calc needed size. const size_t neededLen = calcRequiredSize (toTranscode, manager); if (neededLen == 0) return 0; // allocate output buffer retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1]; if (retVal == NULL) return 0; // prepare the original 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; // 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 char* const toTranscode , XMLCh* const toFill , const XMLSize_t 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; } XMLSize_t wLent = calcRequiredSize(toTranscode); if (wLent > maxChars) wLent = maxChars; char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; ArrayJanitor<char> janBuf(wBufPtr, manager); 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]; janBuf.reset(wBufPtr, manager); wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; } else wideCharBuf = (char *) toFill; size_t flen = strlen(toTranscode); // wLent; char *ptr = wideCharBuf; size_t rc; { XMLMutexLock lockConverter(&fMutex); rc = iconvFrom(toTranscode, &flen, &ptr, len); } if (rc == (size_t)-1) { return false; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (wideCharBuf, toFill, wLent); toFill[wLent] = 0x00; return true; }
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; }
XMLCh* IconvGNULCPTranscoder::transcode(const char* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; XMLCh* retVal = 0; if (!*toTranscode) { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; retVal[0] = 0; return retVal; } XMLSize_t 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; ArrayJanitor<char> janBuf(wBufPtr, manager); size_t len = wLent * uChSize(); retVal = (XMLCh*) manager->allocate((wLent + 1) * sizeof(XMLCh));//new XMLCh[wLent + 1]; if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len]; janBuf.reset(wBufPtr, manager); wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; } else wideCharBuf = (char *) retVal; size_t flen = strlen(toTranscode); char *ptr = wideCharBuf; size_t rc; { XMLMutexLock lockConverter(&fMutex); rc = iconvFrom(toTranscode, &flen, &ptr, len); } if (rc == (size_t) -1) { return NULL; } if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) mbsToXML (wideCharBuf, retVal, wLent); retVal[wLent] = 0x00; return retVal; }
char* IconvGNULCPTranscoder::transcode(const XMLCh* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; char* retVal = 0; if (!*toTranscode) { retVal = (char*) manager->allocate(sizeof(char));//new char[1]; retVal[0] = 0; return retVal; } XMLSize_t wLent = getWideCharLength(toTranscode); // Calc needed size. XMLSize_t neededLen = calcRequiredSize (toTranscode, manager); if (neededLen == 0) return 0; // allocate output buffer retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1]; // prepare the original char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; ArrayJanitor<char> janBuf(wBufPtr, manager); 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]; janBuf.reset(wBufPtr, manager); wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; xmlToMbs (toTranscode, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // perform conversion char* ptr = retVal; size_t rc; { XMLMutexLock lockConverter(&fMutex); rc = iconvTo(wideCharBuf, &len, &ptr, neededLen); } if (rc == (size_t)-1) { return 0; } retVal[neededLen] = 0; return retVal; }
XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; XMLCh* retVal = 0; if (*toTranscode) { const unsigned int len = calcRequiredSize(toTranscode, manager); if (len == 0) { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; retVal[0] = 0; return retVal; } wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; retVal = (XMLCh*) manager->allocate((len + 1) * sizeof(XMLCh));//new XMLCh[len + 1]; size_t retCode; char *tmpInPtr = (char*) toTranscode; char *tmpOutPtr = (char*) retVal; size_t inByteLeft = len; size_t outByteLeft = len*2; { XMLMutexLock lockConverter(&converter->fMutex); retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft); } if (retCode == -1) { manager->deallocate(retVal);//delete [] retVal; return 0; } retVal[len] = 0x00; manager->deallocate(allocatedArray);//delete [] allocatedArray; } else { retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1]; retVal[0] = 0; } return retVal; }