peiyongz 2004/08/11 09:46:54 Modified: c/src/xercesc/util HexBin.hpp HexBin.cpp Log: Decoding and getCanRep Revision Changes Path 1.4 +43 -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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- HexBin.hpp 29 Jan 2004 11:48:46 -0000 1.3 +++ HexBin.hpp 11 Aug 2004 16:46:54 -0000 1.4 @@ -61,7 +61,7 @@ #ifndef HEXBIN_HPP #define HEXBIN_HPP -#include <xercesc/util/XercesDefs.hpp> +#include <xercesc/util/PlatformUtils.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -91,6 +91,47 @@ */ static bool isArrayByteHex(const XMLCh* const hexData); + + /** + * get canonical representation + * + * Caller is responsible for the proper deallcation + * of the string returned. + * + * @param hexData A string containing the HexBinary + * + * return: the canonical representation of the HexBinary + * if it is a valid HexBinary, + * 0 otherwise + */ + + static XMLCh* getCanonicalRepresentation + ( + const XMLCh* const hexData + , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); + + /** + * Decodes HexBinary data into XMLCh + * + * 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 memMgr client provided memory manager + * @return Decoded binary data in XMLCh stream, + * or NULL if input data can not be decoded. + * @see XMLString::release(XMLCh**) + */ + static XMLCh* decode( + const XMLCh* const hexData + , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); + //@} 1.4 +55 -0 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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- HexBin.cpp 4 Nov 2002 15:22:03 -0000 1.3 +++ HexBin.cpp 11 Aug 2004 16:46:54 -0000 1.4 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2004/08/11 16:46:54 peiyongz + * Decoding and getCanRep + * * Revision 1.3 2002/11/04 15:22:03 tng * C++ Namespace Support. * @@ -76,6 +79,7 @@ #include <xercesc/util/HexBin.hpp> #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/util/XMLString.hpp> +#include <xercesc/util/Janitor.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -115,6 +119,57 @@ return false; return true; +} + +XMLCh* HexBin::getCanonicalRepresentation(const XMLCh* const hexData + , MemoryManager* const manager) +{ + + if (getDataLength(hexData) == -1) + return 0; + + XMLCh* retStr = XMLString::replicate(hexData, manager); + XMLString::upperCase(retStr); + + return retStr; +} + + +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 + XMLCh *retVal = (XMLCh*) manager->allocate( (strLen/2 + 1) * sizeof(XMLCh)); + ArrayJanitor<XMLCh> janFill(retVal, manager); + + for ( int i = 0; i < strLen; ) + { + if( !isHex(hexData[i]) || + !isHex(hexData[i+1]) ) + return 0; + else + { + retVal[i/2] = (XMLCh)( + (((XMLByte) hexData[i]) << 4 ) | + ((XMLByte) hexData[i+1]) + ); + i+=2; + } + } + + janFill.release(); + retVal[strLen/2] = 0; + return retVal; } // -----------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]