cargilld 2004/12/10 02:37:58 Modified: c/src/xercesc/framework/psvi XSValue.cpp XSValue.hpp c/src/xercesc/util Base64.cpp Base64.hpp HexBin.cpp HexBin.hpp Log: Fix problem with hexbin::decode and use XMLByte instead of XMLCh for output of decoding. Revision Changes Path 1.20 +9 -6 xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp Index: XSValue.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- XSValue.cpp 1 Dec 2004 16:18:47 -0000 1.19 +++ XSValue.cpp 10 Dec 2004 10:37:55 -0000 1.20 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.20 2004/12/10 10:37:55 cargilld + * Fix problem with hexbin::decode and use XMLByte instead of XMLCh for output of decoding. + * * Revision 1.19 2004/12/01 16:18:47 cargilld * Fix for bug xercesc-1304. * @@ -379,7 +382,7 @@ XSValue::~XSValue() { if (fMemAllocated) - fMemoryManager->deallocate(fData.fValue.f_strVal); + fMemoryManager->deallocate(fData.fValue.f_byteVal); } // --------------------------------------------------------------------------- @@ -1523,7 +1526,7 @@ break; case XSValue::dt_hexBinary: { - XMLCh* decodedData = HexBin::decode(content, manager); + XMLByte* decodedData = HexBin::decodeToXMLByte(content, manager); if (!decodedData) { @@ -1532,7 +1535,7 @@ } XSValue* retVal = new (manager) XSValue(dt_hexBinary, manager); - retVal->fData.fValue.f_strVal = decodedData; + retVal->fData.fValue.f_byteVal = decodedData; retVal->fMemAllocated = true; return retVal; break; @@ -1540,7 +1543,7 @@ case XSValue::dt_base64Binary: { unsigned int len = 0; - XMLCh* decodedData = Base64::decode(content, &len, manager); + XMLByte* decodedData = Base64::decodeToXMLByte(content, &len, manager); if (!decodedData) { @@ -1549,7 +1552,7 @@ } XSValue* retVal = new (manager) XSValue(dt_base64Binary, manager); - retVal->fData.fValue.f_strVal = decodedData; + retVal->fData.fValue.f_byteVal = decodedData; retVal->fMemAllocated = true; return retVal; break; 1.18 +5 -1 xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp Index: XSValue.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- XSValue.hpp 24 Nov 2004 10:18:59 -0000 1.17 +++ XSValue.hpp 10 Dec 2004 10:37:55 -0000 1.18 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.18 2004/12/10 10:37:55 cargilld + * Fix problem with hexbin::decode and use XMLByte instead of XMLCh for output of decoding. + * * Revision 1.17 2004/11/24 10:18:59 cargilld * Fix compilation error on HP for yesterday's commit. * @@ -261,6 +264,7 @@ float f_float; double f_double; XMLCh* f_strVal; + XMLByte* f_byteVal; struct decimal { double f_dvalue; 1.16 +31 -1 xml-xerces/c/src/xercesc/util/Base64.cpp Index: Base64.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Base64.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- Base64.cpp 8 Sep 2004 13:56:21 -0000 1.15 +++ Base64.cpp 10 Dec 2004 10:37:56 -0000 1.16 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.16 2004/12/10 10:37:56 cargilld + * Fix problem with hexbin::decode and use XMLByte instead of XMLCh for output of decoding. + * * Revision 1.15 2004/09/08 13:56:21 peiyongz * Apache License Version 2.0 * @@ -299,7 +302,7 @@ { unsigned int retLen = 0; - XMLCh* decodedData = decode(inputData, &retLen, manager, conform); + XMLByte* decodedData = decodeToXMLByte(inputData, &retLen, manager, conform); if ( !decodedData ) return -1; @@ -377,6 +380,33 @@ returnExternalMemory(memMgr, DecodedBuf); return toRet; +} + +XMLByte* Base64::decodeToXMLByte(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; + return decode(dataInByte, decodedLen, memMgr, conform); } /*** 1.14 +28 -2 xml-xerces/c/src/xercesc/util/Base64.hpp Index: Base64.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Base64.hpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- Base64.hpp 8 Sep 2004 13:56:21 -0000 1.13 +++ Base64.hpp 10 Dec 2004 10:37:56 -0000 1.14 @@ -113,14 +113,40 @@ * @return Decoded binary data in XMLCh stream, * or NULL if input data can not be decoded. * @see XMLString::release(XMLCh**) + * @deprecated use decodeToXMLByte instead. */ + static XMLCh* decode( const XMLCh* const inputData , unsigned int* decodedLength , MemoryManager* const memMgr = 0 , Conformance conform = Conf_RFC2045 ); - + + /** + * Decodes Base64 data into octets + * + * NOTE: The returned buffer is dynamically allocated and is the + * responsibility of the caller to delete it when not longer needed. + * You can call XMLString::release to release this returned buffer. + * + * If a memory manager is provided, ask the memory manager to de-allocate + * the returned buffer. + * + * @param inputData Base64 data in XMLCh stream. + * @param decodedLength Length of decoded XMLByte stream. + * @param memMgr client provided memory manager + * @param conform conformance specified + * @return Decoded binary data in XMLByte stream, + * or NULL if input data can not be decoded. + * @see XMLString::release(XMLByte**) + */ + static XMLByte* decodeToXMLByte( + const XMLCh* const inputData + , unsigned int* decodedLength + , MemoryManager* const memMgr = 0 + , Conformance conform = Conf_RFC2045 + ); /** * Get data length * 1.6 +56 -22 xml-xerces/c/src/xercesc/util/HexBin.cpp Index: HexBin.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/HexBin.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- HexBin.cpp 8 Sep 2004 13:56:22 -0000 1.5 +++ HexBin.cpp 10 Dec 2004 10:37:56 -0000 1.6 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.6 2004/12/10 10:37:56 cargilld + * Fix problem with hexbin::decode and use XMLByte instead of XMLCh for output of decoding. + * * Revision 1.5 2004/09/08 13:56:22 peiyongz * Apache License Version 2.0 * @@ -54,7 +57,7 @@ // --------------------------------------------------------------------------- // class data member // --------------------------------------------------------------------------- -bool HexBin::hexNumberTable[BASELENGTH]; +XMLByte HexBin::hexNumberTable[BASELENGTH]; bool HexBin::isInitialized = false; int HexBin::getDataLength(const XMLCh* const hexData) @@ -97,7 +100,6 @@ return retStr; } - XMLCh* HexBin::decode(const XMLCh* const hexData , MemoryManager* const manager) { @@ -112,29 +114,61 @@ init(); //prepare the return string - XMLCh *retVal = (XMLCh*) manager->allocate( (strLen/2 + 1) * sizeof(XMLCh)); + 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); + } - for ( int i = 0; i < strLen; ) - { - if( !isHex(hexData[i]) || - !isHex(hexData[i+1]) ) + janFill.release(); + retVal[decodeLength] = 0; + return retVal; +} + +XMLByte* HexBin::decodeToXMLByte(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; + XMLByte *retVal = (XMLByte*) manager->allocate( (decodeLength + 1) * sizeof(XMLByte)); + ArrayJanitor<XMLByte> janFill(retVal, manager); + + XMLByte temp1, temp2; + for( int i = 0; i<decodeLength; i++ ) { + temp1 = hexNumberTable[hexData[i*2]]; + if (temp1 == (XMLByte) -1) return 0; - else - { - retVal[i/2] = (XMLCh)( - (((XMLByte) hexData[i]) << 4 ) | - ((XMLByte) hexData[i+1]) - ); - i+=2; - } + temp2 = hexNumberTable[hexData[i*2+1]]; + if (temp2 == (XMLByte) -1) + return 0; + retVal[i] = ((temp1 << 4) | temp2); } janFill.release(); - retVal[strLen/2] = 0; + retVal[decodeLength] = 0; return retVal; } + // ----------------------------------------------------------------------- // Helper methods // ----------------------------------------------------------------------- @@ -144,7 +178,7 @@ if ( octet >= BASELENGTH ) return false; - return (hexNumberTable[octet]); + return (hexNumberTable[octet] != (XMLByte) -1); } void HexBin::init() @@ -154,16 +188,16 @@ int i; for ( i = 0; i < BASELENGTH; i++ ) - hexNumberTable[i] = false; + hexNumberTable[i] = -1; for ( i = chDigit_9; i >= chDigit_0; i-- ) - hexNumberTable[i] = true; + hexNumberTable[i] = (XMLByte) (i - chDigit_0); for ( i = chLatin_F; i >= chLatin_A; i-- ) - hexNumberTable[i] = true; - + hexNumberTable[i] = (XMLByte) (i - chLatin_A + 10); + for ( i = chLatin_f; i >= chLatin_a; i-- ) - hexNumberTable[i] = true; + hexNumberTable[i] = (XMLByte) (i - chLatin_a + 10); isInitialized = true; } 1.7 +25 -2 xml-xerces/c/src/xercesc/util/HexBin.hpp Index: HexBin.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/HexBin.hpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- HexBin.hpp 8 Sep 2004 13:56:22 -0000 1.6 +++ HexBin.hpp 10 Dec 2004 10:37:56 -0000 1.7 @@ -87,12 +87,35 @@ * @return Decoded binary data in XMLCh stream, * or NULL if input data can not be decoded. * @see XMLString::release(XMLCh**) + * @deprecated use decodeToXMLByte instead. */ + static XMLCh* decode( const XMLCh* const hexData , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); + /** + * Decodes HexBinary data into XMLByte + * + * NOTE: The returned buffer is dynamically allocated and is the + * responsibility of the caller to delete it when not longer needed. + * You can call XMLString::release to release this returned buffer. + * + * If a memory manager is provided, ask the memory manager to de-allocate + * the returned buffer. + * + * @param hexData HexBinary data in XMLCh stream. + * @param manager client provided memory manager + * @return Decoded binary data in XMLByte stream, + * or NULL if input data can not be decoded. + * @see XMLString::release(XMLByte**) + */ + static XMLByte* decodeToXMLByte( + const XMLCh* const hexData + , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); + //@} @@ -126,7 +149,7 @@ // // ----------------------------------------------------------------------- static bool isInitialized; - static bool hexNumberTable[]; + static XMLByte hexNumberTable[]; }; XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]