peiyongz 2004/08/11 09:47:32
Modified: c/src/xercesc/util Base64.hpp Base64.cpp
Log:
Decoding and getCanRep
Revision Changes Path
1.10 +33 -3 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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Base64.hpp 24 Jun 2004 15:00:37 -0000 1.9
+++ Base64.hpp 11 Aug 2004 16:47:32 -0000 1.10
@@ -131,7 +131,7 @@
*/
static XMLByte* decode(
const XMLByte* const inputData
- , unsigned int* outputLength
+ , unsigned int* decodedLength
, MemoryManager* const memMgr = 0
, Conformance conform = Conf_RFC2045
);
@@ -156,7 +156,7 @@
*/
static XMLCh* decode(
const XMLCh* const inputData
- , unsigned int* outputLength
+ , unsigned int* decodedLength
, MemoryManager* const memMgr = 0
, Conformance conform = Conf_RFC2045
);
@@ -181,11 +181,41 @@
//@}
+ /**
+ * get canonical representation
+ *
+ * Caller is responsible for the proper deallcation
+ * of the string returned.
+ *
+ * @param inputData A string containing the Base64
+ * @param memMgr client provided memory manager
+ * @param conform conformance specified
+ *
+ * return: the canonical representation of the Base64
+ * if it is a valid Base64
+ * 0 otherwise
+ */
+
+ static XMLCh* getCanonicalRepresentation
+ (
+ const XMLCh* const inputData
+ , MemoryManager* const memMgr = 0
+ , Conformance conform = Conf_RFC2045
+ );
+
private :
// -----------------------------------------------------------------------
// Helper methods
// -----------------------------------------------------------------------
+
+ static XMLByte* decode(
+ const XMLByte* const inputData
+ , unsigned int* outputLength
+ , XMLByte* canRepData
+ , MemoryManager* const memMgr = 0
+ , Conformance conform = Conf_RFC2045
+ );
static void init();
1.13 +150 -54 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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Base64.cpp 24 Jun 2004 15:00:37 -0000 1.12
+++ Base64.cpp 11 Aug 2004 16:47:32 -0000 1.13
@@ -56,6 +56,9 @@
/*
* $Log$
+ * Revision 1.13 2004/08/11 16:47:32 peiyongz
+ * Decoding and getCanRep
+ *
* Revision 1.12 2004/06/24 15:00:37 peiyongz
* Schema-Errata: E2-54 new specs for base64
*
@@ -341,6 +344,141 @@
}
}
+XMLByte* Base64::decode(const XMLByte* const inputData
+ , unsigned int* decodedLength
+ , MemoryManager* const memMgr
+ , Conformance conform )
+{
+ XMLByte* canRepInByte = 0;
+ XMLByte* retStr = decode(
+ inputData
+ , decodedLength
+ , canRepInByte
+ , memMgr
+ , conform);
+
+ /***
+ * Release the canRepData
+ */
+ if (retStr)
+ returnExternalMemory(memMgr, canRepInByte);
+
+ return retStr;
+}
+
+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;
+}
+
+/***
+* 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
+ */
+ 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
+ */
+ unsigned int 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
+ */
+ XMLCh *canRepData = (XMLCh*) getExternalMemory(memMgr, (decodedLength+1) *
sizeof(XMLCh));
+
+ for (unsigned int j = 0; j < decodedLength; j++)
+ canRepData[j] = (XMLCh)canRepInByte[j];
+
+ canRepData[decodedLength] = 0;
+
+ /***
+ * Release the memory allocated in the actual decoding method
+ */
+ returnExternalMemory(memMgr, retStr);
+ returnExternalMemory(memMgr, canRepInByte);
+
+ return canRepData;
+}
+// -----------------------------------------------------------------------
+// Helper methods
+// -----------------------------------------------------------------------
+
//
// return 0(null) if invalid data found.
// return the buffer containning decoded data otherwise
@@ -394,10 +532,12 @@
*
*/
-XMLByte* Base64::decode(const XMLByte* const inputData
- , unsigned int* decodedLength
- , MemoryManager* const memMgr
- , Conformance conform )
+XMLByte* Base64::decode ( const XMLByte* const inputData
+ , unsigned int* decodedLength
+ , XMLByte* canRepData
+ , MemoryManager* const memMgr
+ , Conformance conform
+ )
{
if (!isInitialized)
init();
@@ -468,6 +608,8 @@
break;
}
+ //now rawInputData contains canonical representation
+ //if the data is valid Base64
rawInputData[ rawInputLength ] = 0;
// the length of raw data should be divisible by four
@@ -583,59 +725,13 @@
decodedData[ outputIndex ] = 0;
*decodedLength = outputIndex;
- return decodedData;
-}
+ //allow the caller to have access to the canonical representation
+ jan.release();
+ canRepData = rawInputData;
-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;
+ return decodedData;
}
-// -----------------------------------------------------------------------
-// Helper methods
-// -----------------------------------------------------------------------
void Base64::init()
{
if (isInitialized)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]