XMLByte* Base64::decodeToXMLByte(const XMLCh* const inputData , XMLSize_t* decodedLen , MemoryManager* const memMgr , Conformance conform ) { if (!inputData || !*inputData) return 0; /*** * Move input data to a XMLByte buffer */ XMLSize_t srcLen = XMLString::stringLen(inputData); XMLByte *dataInByte = (XMLByte*) getExternalMemory(memMgr, (srcLen+1) * sizeof(XMLByte)); ArrayJanitor<XMLByte> janFill(dataInByte, memMgr ? memMgr : XMLPlatformUtils::fgMemoryManager); for (XMLSize_t i = 0; i < srcLen; i++) dataInByte[i] = (XMLByte)inputData[i]; dataInByte[srcLen] = 0; /*** * Forward to the actual decoding method to do the decoding */ *decodedLen = 0; return decode(dataInByte, decodedLen, memMgr, conform); }
XMLCh* HexBin::decode(const XMLCh* const hexData , MemoryManager* const manager) { if (( hexData == 0 ) || ( *hexData == 0 )) // zero length return 0; int strLen = XMLString::stringLen(hexData); if ( strLen%2 != 0 ) return 0; if ( !isInitialized ) init(); //prepare the return string int decodeLength = strLen/2; XMLCh *retVal = (XMLCh*) manager->allocate( (decodeLength + 1) * sizeof(XMLCh)); ArrayJanitor<XMLCh> janFill(retVal, manager); XMLByte temp1, temp2; for( int i = 0; i<decodeLength; i++ ) { temp1 = hexNumberTable[hexData[i*2]]; if (temp1 == (XMLByte) -1) return 0; temp2 = hexNumberTable[hexData[i*2+1]]; if (temp2 == (XMLByte) -1) return 0; retVal[i] = (XMLCh)((temp1 << 4) | temp2); } janFill.release(); retVal[decodeLength] = 0; return retVal; }
/*** * E2-54 * * Canonical-base64Binary ::= (B64 B64 B64 B64)*((B64 B64 B16 '=')|(B64 B04 '=='))? * B04 ::= [AQgw] * B16 ::= [AEIMQUYcgkosw048] * B64 ::= [A-Za-z0-9+/] * ***/ XMLCh* Base64::getCanonicalRepresentation(const XMLCh* const inputData , MemoryManager* const memMgr , Conformance conform) { if (!inputData || !*inputData) return 0; /*** * Move input data to a XMLByte buffer */ XMLSize_t srcLen = XMLString::stringLen(inputData); XMLByte *dataInByte = (XMLByte*) getExternalMemory(memMgr, (srcLen+1) * sizeof(XMLByte)); ArrayJanitor<XMLByte> janFill(dataInByte, memMgr ? memMgr : XMLPlatformUtils::fgMemoryManager); for (XMLSize_t i = 0; i < srcLen; i++) dataInByte[i] = (XMLByte)inputData[i]; dataInByte[srcLen] = 0; /*** * Forward to the actual decoding method to do the decoding */ XMLSize_t decodedLength = 0; XMLByte* canRepInByte = 0; XMLByte* retStr = decode( dataInByte , &decodedLength , canRepInByte , memMgr , conform); if (!retStr) return 0; /*** * Move canonical representation to a XMLCh buffer to return */ XMLSize_t canRepLen = XMLString::stringLen((char*)canRepInByte); XMLCh *canRepData = (XMLCh*) getExternalMemory(memMgr, (canRepLen + 1) * sizeof(XMLCh)); for (XMLSize_t j = 0; j < canRepLen; j++) canRepData[j] = (XMLCh)canRepInByte[j]; canRepData[canRepLen] = 0; /*** * Release the memory allocated in the actual decoding method */ returnExternalMemory(memMgr, retStr); returnExternalMemory(memMgr, canRepInByte); return canRepData; }
XMLCh* Base64::decode(const XMLCh* const inputData , unsigned int* decodedLen , MemoryManager* const memMgr , Conformance conform ) { if (!inputData) return 0; /*** * Move input data to a XMLByte buffer */ unsigned int srcLen = XMLString::stringLen(inputData); XMLByte *dataInByte = (XMLByte*) getExternalMemory(memMgr, (srcLen+1) * sizeof(XMLByte)); ArrayJanitor<XMLByte> janFill(dataInByte, memMgr ? memMgr : XMLPlatformUtils::fgMemoryManager); for (unsigned int i = 0; i < srcLen; i++) dataInByte[i] = (XMLByte)inputData[i]; dataInByte[srcLen] = 0; /*** * Forward to the actual decoding method to do the decoding */ *decodedLen = 0; XMLByte *DecodedBuf = decode(dataInByte, decodedLen, memMgr, conform); if (!DecodedBuf) return 0; /*** * Move decoded data to a XMLCh buffer to return */ XMLCh *toRet = (XMLCh*) getExternalMemory(memMgr, (*decodedLen+1) * sizeof(XMLCh)); for (unsigned int j = 0; j < *decodedLen; j++) toRet[j] = (XMLCh)DecodedBuf[j]; toRet[*decodedLen] = 0; /*** * Release the memory allocated in the actual decoding method */ returnExternalMemory(memMgr, DecodedBuf); return toRet; }