CBC_CommonDecoderResult* CBC_DataMatrixDecoder::Decode( CBC_CommonBitMatrix* bits, int32_t& e) { CBC_DataMatrixBitMatrixParser parser; parser.Init(bits, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_DataMatrixVersion* version = parser.GetVersion(); CFX_ByteArray* byteTemp = parser.ReadCodewords(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_AutoPtr<CFX_ByteArray> codewords(byteTemp); CFX_PtrArray* dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); int32_t dataBlocksCount = dataBlocks->GetSize(); int32_t totalBytes = 0; int32_t i, j; for (i = 0; i < dataBlocksCount; i++) { totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords(); } CFX_ByteArray resultBytes; resultBytes.SetSize(totalBytes); for (j = 0; j < dataBlocksCount; j++) { CFX_ByteArray* codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords(); int32_t numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords(); CorrectErrors(*codewordBytes, numDataCodewords, e); if (e != BCExceptionNO) { for (int32_t i = 0; i < dataBlocks->GetSize(); i++) { delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; } delete dataBlocks; dataBlocks = NULL; return NULL; } int32_t i; for (i = 0; i < numDataCodewords; i++) { resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i]; } } for (i = 0; i < (dataBlocks->GetSize()); i++) { delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i]; } delete dataBlocks; dataBlocks = NULL; CBC_CommonDecoderResult* resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); return resultR; }
CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(CBC_CommonBitMatrix* bits, int32_t byteModeDecode, int32_t& e) { CBC_QRBitMatrixParser parser; parser.Init(bits, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderVersion* version = parser.ReadVersion(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderFormatInformation* temp = parser.ReadFormatInformation(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_QRCoderErrorCorrectionLevel* ecLevel = temp->GetErrorCorrectionLevel(); CFX_ByteArray* ba = parser.ReadCodewords(e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); CBC_AutoPtr<CFX_ByteArray> codewords(ba); CFX_PtrArray* dataBlocks = CBC_QRDataBlock::GetDataBlocks(codewords.get(), version, ecLevel, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); int32_t totalBytes = 0; for (int32_t i = 0; i < dataBlocks->GetSize(); i++) { totalBytes += ((CBC_QRDataBlock*)((*dataBlocks)[i]))->GetNumDataCodewords(); } CFX_ByteArray resultBytes; for (int32_t j = 0; j < dataBlocks->GetSize(); j++) { CBC_QRDataBlock* dataBlock = (CBC_QRDataBlock*)((*dataBlocks)[j]); CFX_ByteArray* codewordBytes = dataBlock->GetCodewords(); int32_t numDataCodewords = dataBlock->GetNumDataCodewords(); CorrectErrors(codewordBytes, numDataCodewords, e); if (e != BCExceptionNO) { for (int32_t k = 0; k < dataBlocks->GetSize(); k++) { delete (CBC_QRDataBlock*)(*dataBlocks)[k]; } dataBlocks->RemoveAll(); delete dataBlocks; dataBlocks = NULL; return NULL; } for (int32_t i = 0; i < numDataCodewords; i++) { resultBytes.Add((*codewordBytes)[i]); } } for (int32_t k = 0; k < dataBlocks->GetSize(); k++) { delete (CBC_QRDataBlock*)(*dataBlocks)[k]; } dataBlocks->RemoveAll(); delete dataBlocks; dataBlocks = NULL; CBC_CommonDecoderResult* cdr = CBC_QRDecodedBitStreamParser::Decode( &resultBytes, version, ecLevel, byteModeDecode, e); BC_EXCEPTION_CHECK_ReturnValue(e, NULL); return cdr; }