From 74a459f65a99b29e4342402558b335e3be337b32 Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Tue, 28 Mar 2023 16:31:41 -0500 Subject: [PATCH] continue removing todo!()s --- .../base_extentions/qrcode_version.rs | 2 +- src/common/cpp_essentials/decoder_result.rs | 6 ++- src/qrcode/cpp_port/decoder.rs | 2 +- src/qrcode/decoder/mode.rs | 38 +++++++++++-- src/qrcode/decoder/version.rs | 53 +++++++++++++------ 5 files changed, 76 insertions(+), 25 deletions(-) diff --git a/src/common/cpp_essentials/base_extentions/qrcode_version.rs b/src/common/cpp_essentials/base_extentions/qrcode_version.rs index 1ca2bda..e0415a3 100644 --- a/src/common/cpp_essentials/base_extentions/qrcode_version.rs +++ b/src/common/cpp_essentials/base_extentions/qrcode_version.rs @@ -66,7 +66,7 @@ impl Version { return Err(Exceptions::ILLEGAL_STATE); } - pub fn isMicroQRCode(&self) -> bool { + pub const fn isMicroQRCode(&self) -> bool { self.is_micro } } diff --git a/src/common/cpp_essentials/decoder_result.rs b/src/common/cpp_essentials/decoder_result.rs index 0906e13..d8a9ab5 100644 --- a/src/common/cpp_essentials/decoder_result.rs +++ b/src/common/cpp_essentials/decoder_result.rs @@ -47,12 +47,14 @@ where Self::default() } pub fn with_eci_string_builder(src: ECIStringBuilder) -> Self { - todo!() + let mut new_self = Self::default(); + new_self.content = src; + new_self } pub fn isValid(&self) -> bool { + self.content.symbology.code != 0 //return includeErrors || (_content.symbology.code != 0 && !_error); - todo!() } pub fn content(&self) -> &ECIStringBuilder { diff --git a/src/qrcode/cpp_port/decoder.rs b/src/qrcode/cpp_port/decoder.rs index 211bc17..bda6371 100644 --- a/src/qrcode/cpp_port/decoder.rs +++ b/src/qrcode/cpp_port/decoder.rs @@ -306,7 +306,7 @@ pub fn DecodeBitStream( mode = Mode::CodecModeForBits( bits.readBits(modeBitLength as usize)?, Some(version.isMicroQRCode()), - ); + )?; } match (mode) { diff --git a/src/qrcode/decoder/mode.rs b/src/qrcode/decoder/mode.rs index 06440d7..b7b2b51 100644 --- a/src/qrcode/decoder/mode.rs +++ b/src/qrcode/decoder/mode.rs @@ -123,10 +123,18 @@ impl Mode { } pub const fn get_terminator_bit_length(version: &Version) -> u8 { - todo!() + (if version.isMicroQRCode() { + version.getVersionNumber() * 2 + 1 + } else { + 4 + }) as u8 } pub const fn get_codec_mode_bits_length(version: &Version) -> u8 { - todo!() + (if version.isMicroQRCode() { + version.getVersionNumber() - 1 + } else { + 4 + }) as u8 } /** * @param bits variable number of bits encoding a QR Code data mode @@ -134,9 +142,23 @@ impl Mode { * @return Mode encoded by these bits * @throws FormatError if bits do not correspond to a known mode */ - pub fn CodecModeForBits(bits: u32, isMicro: Option) -> Self { + pub fn CodecModeForBits(bits: u32, isMicro: Option) -> Result { let isMicro = isMicro.unwrap_or(false); - todo!() + const BITS_2_MODE_LEN: usize = 4; + + if (!isMicro) { + if ((bits >= 0x00 && bits <= 0x05) || (bits >= 0x07 && bits <= 0x09) || bits == 0x0d) { + return Mode::try_from(bits); + } + } else { + const Bits2Mode: [Mode; BITS_2_MODE_LEN] = + [Mode::NUMERIC, Mode::ALPHANUMERIC, Mode::BYTE, Mode::KANJI]; + if ((bits as usize) < BITS_2_MODE_LEN) { + return Ok(Bits2Mode[bits as usize]); + } + } + + Err(Exceptions::format_with("Invalid codec mode")) } /** @@ -162,3 +184,11 @@ impl TryFrom for Mode { Self::forBits(value) } } + +impl TryFrom for Mode { + type Error = Exceptions; + + fn try_from(value: u32) -> Result { + Self::forBits(value as u8) + } +} diff --git a/src/qrcode/decoder/version.rs b/src/qrcode/decoder/version.rs index 59c54dc..d39e360 100755 --- a/src/qrcode/decoder/version.rs +++ b/src/qrcode/decoder/version.rs @@ -57,7 +57,7 @@ pub struct Version { pub(crate) is_micro: bool, } impl Version { - fn new(versionNumber: u32, alignmentPatternCenters: Vec, ecBlocks: [ECBlocks;4]) -> Self { + fn new(versionNumber: u32, alignmentPatternCenters: Vec, ecBlocks: [ECBlocks; 4]) -> Self { let mut total = 0; let ecCodewords = ecBlocks[0].getECCodewordsPerBlock(); let ecbArray = ecBlocks[0].getECBlocks(); @@ -72,7 +72,7 @@ impl Version { alignmentPatternCenters, ecBlocks: ecBlocks.to_vec(), totalCodewords: total, - is_micro: false + is_micro: false, } } @@ -91,11 +91,11 @@ impl Version { alignmentPatternCenters: Vec::default(), ecBlocks, totalCodewords: total, - is_micro: true + is_micro: true, } } - pub fn getVersionNumber(&self) -> u32 { + pub const fn getVersionNumber(&self) -> u32 { self.versionNumber } @@ -203,19 +203,38 @@ impl Version { Ok(bitMatrix) } -pub fn build_micro_versions() -> Vec { - vec![ - Version::new_micro(1, vec![ECBlocks::new(2, vec![ECB::new(1,3)])]), - Version::new_micro(2, vec![ECBlocks::new(5, vec![ECB::new(1,5)]), ECBlocks::new(6, vec![ECB::new(1,4)])]), - Version::new_micro(3, vec![ECBlocks::new(6, vec![ECB::new(1,11)]), ECBlocks::new(8, vec![ECB::new(1,9)])]), - Version::new_micro(4, vec![ECBlocks::new(8, vec![ECB::new(1,16)]), ECBlocks::new(10, vec![ECB::new(1,14)]), ECBlocks::new(14, vec![ECB::new(1,10)])]), - ] - // static const Version allVersions[] = { - // {1, {2, 1, 3, 0, 0}}, - // {2, {5, 1, 5, 0, 0, 6, 1, 4, 0, 0}}, - // {3, {6, 1, 11, 0, 0, 8, 1, 9, 0, 0}}, - // {4, {8, 1, 16, 0, 0, 10, 1, 14, 0, 0, 14, 1, 10, 0, 0}}}; -} + pub fn build_micro_versions() -> Vec { + vec![ + Version::new_micro(1, vec![ECBlocks::new(2, vec![ECB::new(1, 3)])]), + Version::new_micro( + 2, + vec![ + ECBlocks::new(5, vec![ECB::new(1, 5)]), + ECBlocks::new(6, vec![ECB::new(1, 4)]), + ], + ), + Version::new_micro( + 3, + vec![ + ECBlocks::new(6, vec![ECB::new(1, 11)]), + ECBlocks::new(8, vec![ECB::new(1, 9)]), + ], + ), + Version::new_micro( + 4, + vec![ + ECBlocks::new(8, vec![ECB::new(1, 16)]), + ECBlocks::new(10, vec![ECB::new(1, 14)]), + ECBlocks::new(14, vec![ECB::new(1, 10)]), + ], + ), + ] + // static const Version allVersions[] = { + // {1, {2, 1, 3, 0, 0}}, + // {2, {5, 1, 5, 0, 0, 6, 1, 4, 0, 0}}, + // {3, {6, 1, 11, 0, 0, 8, 1, 9, 0, 0}}, + // {4, {8, 1, 16, 0, 0, 10, 1, 14, 0, 0, 14, 1, 10, 0, 0}}}; + } /** * See ISO 18004:2006 6.5.1 Table 9