rhodes 2.4.1 → 3.0.0.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +7 -0
- data/Rakefile +7 -36
- data/doc/build.txt +48 -22
- data/doc/device-caps.txt +130 -1
- data/doc/rhom.txt +9 -3
- data/doc/test-log-debug.txt +5 -2
- data/lib/extensions/barcode/ext/barcode/platform/android/Rakefile +40 -20
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/AUTHORS +58 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/CHANGES +266 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/COPYING +201 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/README +11 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ext_build.files +173 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/jni/src/barcode.cpp +34 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BarcodeFormat.java +103 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Binarizer.java +80 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BinaryBitmap.java +128 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ChecksumException.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/DecodeHintType.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/EncodeHintType.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/FormatException.java +38 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/LuminanceSource.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatReader.java +166 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatWriter.java +65 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/NotFoundException.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Reader.java +64 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ReaderException.java +98 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Result.java +143 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultMetadataType.java +109 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPoint.java +127 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPointCallback.java +29 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Writer.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/WriterException.java +35 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AbstractDoCoMoResultParser.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookAUResultParser.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookParsedResult.java +122 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BizcardResultParser.java +94 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java +46 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/CalendarParsedResult.java +134 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressParsedResult.java +61 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressResultParser.java +64 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductParsedResult.java +195 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductResultParser.java +199 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoParsedResult.java +132 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoResultParser.java +77 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNParsedResult.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNResultParser.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResult.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResultType.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductParsedResult.java +49 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductResultParser.java +66 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ResultParser.java +319 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSMMSResultParser.java +107 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSParsedResult.java +104 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSTOMMSTOResultParser.java +57 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelParsedResult.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelResultParser.java +44 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TextParsedResult.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIParsedResult.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIResultParser.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URLTOResultParser.java +47 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VCardResultParser.java +346 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VEventResultParser.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiParsedResult.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiResultParser.java +50 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/AbstractNDEFResultParser.java +45 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFRecord.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterParsedResult.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterResultParser.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFTextResultParser.java +57 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFURIResultParser.java +95 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitArray.java +247 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitMatrix.java +226 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitSource.java +97 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/CharacterSetECI.java +110 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Collections.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Comparator.java +27 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DecoderResult.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DefaultGridSampler.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DetectorResult.java +46 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/ECI.java +52 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GlobalHistogramBinarizer.java +196 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GridSampler.java +171 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/HybridBinarizer.java +185 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/PerspectiveTransform.java +148 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/StringUtils.java +191 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/MonochromeRectangleDetector.java +209 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/WhiteRectangleDetector.java +316 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256.java +139 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256Poly.java +263 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java +194 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonException.java +31 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/DataMatrixReader.java +161 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +446 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DataBlock.java +118 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java +462 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Decoder.java +134 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Version.java +242 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/detector/Detector.java +348 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/ByQuadrantReader.java +96 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java +156 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/MultipleBarcodeReader.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/QRCodeMultiReader.java +80 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiDetector.java +72 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java +324 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/CodaBarReader.java +263 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Reader.java +473 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Writer.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Reader.java +333 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Writer.java +82 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code93Reader.java +273 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Reader.java +135 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Writer.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Reader.java +72 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Writer.java +76 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EANManufacturerOrgSupport.java +170 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFReader.java +348 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFWriter.java +68 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatOneDReader.java +109 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatUPCEANReader.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/OneDReader.java +297 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCAReader.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANExtensionSupport.java +186 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANReader.java +355 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANWriter.java +104 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEReader.java +153 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/AbstractRSSReader.java +110 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/DataCharacter.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/FinderPattern.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/Pair.java +41 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSS14Reader.java +494 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSSUtils.java +155 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/ExpandedPair.java +68 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java +578 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java +47 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java +55 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java +66 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java +76 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java +106 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java +56 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java +56 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java +58 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java +60 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java +69 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java +52 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java +44 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java +285 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java +414 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/PDF417Reader.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/BitMatrixParser.java +1163 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java +629 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/Decoder.java +150 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/detector/Detector.java +498 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeReader.java +166 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeWriter.java +108 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java +203 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataBlock.java +123 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataMask.java +155 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java +261 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Decoder.java +148 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +86 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/FormatInformation.java +171 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Mode.java +112 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Version.java +586 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPattern.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +279 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/Detector.java +400 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPattern.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java +585 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternInfo.java +49 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/BlockPair.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/ByteMatrix.java +97 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/Encoder.java +557 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MaskUtil.java +217 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MatrixUtil.java +524 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/QRCode.java +239 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/Barcode.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/RhoLuminanceSource.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/Barcode.xcodeproj/project.pbxproj +74 -318
- data/lib/extensions/barcode/ext/barcode/platform/iphone/Classes/barcode.m +70 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/COPYING +27 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h +105 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h +60 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImage.h +69 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h +51 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h +142 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h +118 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h +100 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h +33 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h +71 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar.h +1476 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h +201 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h +187 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Image.h +321 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h +130 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h +223 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h +162 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h +529 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Video.h +170 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Window.h +136 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/LICENSE +504 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/README +59 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-back.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-help.html +88 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-helpicons.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-samples.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/libzbar.a +0 -0
- data/lib/extensions/debugger/debugger.rb +215 -67
- data/lib/extensions/nfc/ext/nfc/platform/android/AndroidManifest.xml +1 -1
- data/lib/extensions/nfc/ext/nfc/platform/android/src/com/nfc/Nfc.java +14 -2
- data/lib/extensions/timeout/timeout.rb +114 -0
- data/lib/framework/rho/render.rb +14 -16
- data/lib/framework/rho/rho.rb +38 -14
- data/lib/framework/rho/rhoapplication.rb +1 -1
- data/lib/framework/rho/rhocontroller.rb +3 -3
- data/lib/framework/rho/rhofsconnector.rb +18 -6
- data/lib/framework/rho/rhoviewhelpers.rb +1 -1
- data/lib/framework/rhoappmanifest.rb +44 -0
- data/lib/framework/rhodes.rb +1 -1
- data/lib/framework/rhoframework.rb +31 -11
- data/lib/framework/rholang/localization_simplified.rb +10 -6
- data/lib/framework/rhom/rhom_object_factory.rb +3 -3
- data/lib/framework/version.rb +1 -1
- data/lib/rhodes.rb +1 -1
- data/platform/android/Rhodes/AndroidManifest.xml +2 -2
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesApplication.h +32 -8
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +21 -21
- data/platform/android/Rhodes/jni/src/rhocryptimpl.cpp +1 -0
- data/platform/android/Rhodes/jni/src/rhodes.cpp +21 -9
- data/platform/android/Rhodes/jni/src/sslimpl.cpp +1 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +7 -6
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +19 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoCryptImpl.java +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +24 -15
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +39 -47
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +113 -106
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java +11 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/StatusNotification.java +49 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +1 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java +5 -1
- data/platform/android/build/RhodesSRC_build.files +1 -0
- data/platform/android/build/android.rake +93 -6
- data/platform/bb/RubyVM/src/com/rho/RhodesApp.java +5 -4
- data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +10 -0
- data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +16 -15
- data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +2 -2
- data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +21 -19
- data/platform/bb/rhodes/src/com/rho/BrowserAdapter5.java +2 -2
- data/platform/bb/rhodes/src/com/rho/rubyext/System.java +6 -1
- data/platform/bb/rhodes/src/com/rho/rubyext/WebView.java +10 -3
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -1
- data/platform/iphone/Classes/SimpleMainView.m +5 -5
- data/platform/iphone/Info.plist +1 -1
- data/platform/iphone/rbuild/iphone.rake +30 -1
- data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +12 -0
- data/platform/shared/SyncClient/SyncClient.cpp +136 -20
- data/platform/shared/SyncClient/SyncClient.h +17 -0
- data/platform/shared/common/AppMenu.cpp +6 -1
- data/platform/shared/common/RhoConf.cpp +13 -1
- data/platform/shared/common/RhoConf.h +3 -1
- data/platform/shared/common/RhoDefs.h +10 -0
- data/platform/shared/common/RhoFile.cpp +15 -0
- data/platform/shared/common/RhoFile.h +1 -0
- data/platform/shared/common/RhodesApp.cpp +16 -3
- data/platform/shared/common/RhodesApp.h +1 -0
- data/platform/shared/common/RhodesAppBase.cpp +102 -62
- data/platform/shared/common/RhodesAppBase.h +7 -1
- data/platform/shared/curl/lib/rhossl.c +1 -0
- data/platform/shared/db/DBAdapter.cpp +14 -2
- data/platform/shared/logging/RhoLogConf.cpp +21 -0
- data/platform/shared/logging/RhoLogConf.h +11 -0
- data/platform/shared/logging/RhoLogSink.cpp +24 -0
- data/platform/shared/logging/RhoLogSink.h +20 -1
- data/platform/shared/net/HttpServer.cpp +8 -6
- data/platform/shared/net/RawSocket.cpp +130 -0
- data/platform/shared/net/RawSocket.h +74 -0
- data/platform/shared/ruby/ext/rho/rhoruby.c +37 -1
- data/platform/shared/ruby/ext/rho/rhosupport.c +74 -21
- data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +9 -1
- data/platform/shared/ruby/vm_eval.c +4 -3
- data/platform/shared/sync/SyncEngine.cpp +11 -12
- data/platform/shared/sync/SyncEngine.h +2 -2
- data/platform/shared/sync/SyncNotify.cpp +41 -13
- data/platform/shared/sync/SyncNotify.h +20 -3
- data/platform/shared/sync/SyncSource.cpp +21 -19
- data/platform/shared/sync/SyncThread.cpp +11 -1
- data/platform/shared/sync/SyncThread.h +3 -0
- data/platform/shared/test/test_helper.cpp +7 -0
- data/platform/win32/RhoSimulator/QtCore4.dll +0 -0
- data/platform/win32/RhoSimulator/QtGui4.dll +0 -0
- data/platform/win32/RhoSimulator/QtNetwork4.dll +0 -0
- data/platform/win32/RhoSimulator/QtWebKit4.dll +0 -0
- data/platform/win32/RhoSimulator/imageformats/qgif4.dll +0 -0
- data/platform/win32/RhoSimulator/imageformats/qjpeg4.dll +0 -0
- data/platform/win32/RhoSimulator/rhosimulator.exe +0 -0
- data/platform/wm/RhoLib/RhoLib.vcproj +762 -14
- data/platform/wm/build/wm.rake +87 -10
- data/platform/wm/rhodes.sln +155 -72
- data/platform/wm/rhodes/MainWindow.cpp +5 -2
- data/platform/wm/rhodes/MainWindow.h +9 -1
- data/platform/wm/rhodes/RhoNativeViewManager.cpp +4 -0
- data/platform/wm/rhodes/Rhodes.cpp +60 -6
- data/platform/wm/rhodes/emulator/ExternalWebView.cpp +20 -0
- data/platform/wm/rhodes/emulator/ExternalWebView.h +23 -0
- data/platform/wm/rhodes/emulator/ExternalWebView.ui +46 -0
- data/platform/wm/rhodes/emulator/MainWindowCallback.h +18 -0
- data/platform/wm/rhodes/emulator/MainWindowProxy.cpp +268 -0
- data/platform/wm/rhodes/emulator/MainWindowProxy.h +34 -0
- data/platform/wm/rhodes/emulator/MainWindowQt.cpp +345 -0
- data/platform/wm/rhodes/emulator/MainWindowQt.h +118 -0
- data/platform/wm/rhodes/emulator/NativeToolbarQt.cpp +57 -0
- data/platform/wm/rhodes/emulator/NativeToolbarQt.h +52 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.cpp +219 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.h +62 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.ui +122 -0
- data/platform/wm/rhodes/{RhoCryptImpl.cpp → rho/common/RhoCryptImpl.cpp} +0 -0
- data/platform/wm/rhodes/{RhoCryptImpl.h → rho/common/RhoCryptImpl.h} +0 -0
- data/platform/wm/rhodes/rho/rubyext/NativeToolbar.cpp +2 -86
- data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.cpp +87 -0
- data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.h +6 -0
- data/platform/wm/rhodes/rho/rubyext/SystemImpl.cpp +60 -0
- data/platform/wm/rhodes/rhodes.vcproj +4025 -365
- data/platform/wm/rhodes/signature/Signature.cpp +29 -13
- data/platform/wm/rubylib/rubylib.vcproj +1167 -195
- data/platform/wm/shttpd/shttpd.vcproj +4 -4
- data/platform/wm/sqlite3/sqlite3.vcproj +441 -13
- data/platform/wm/syncengine/syncengine.vcproj +443 -15
- data/platform/wm/tcmalloc/tcmalloc.vcproj +0 -154
- data/platform/wm/tools/detool/LogServer.cpp +150 -0
- data/platform/wm/tools/detool/LogServer.h +23 -0
- data/platform/wm/tools/detool/detool.cpp +42 -4
- data/platform/wm/tools/detool/detool.vcproj +10 -1
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.Libraries.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Dynamic.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.Core.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.dll +0 -0
- data/platform/wp7/RhoAppRunner/Program.cs +20 -3
- data/platform/wp7/RhoLogServer/Program.cs +22 -0
- data/platform/wp7/RhoLogServer/Properties/AssemblyInfo.cs +36 -0
- data/platform/wp7/RhoLogServer/RhoLogServer.csproj +65 -0
- data/platform/wp7/RhoLogServer/SocketServer.cs +210 -0
- data/platform/wp7/RhoRubyExtGen/RhoAsyncHttp.cs +6 -0
- data/platform/wp7/RhoRubyLib/Initializers.Generated.cs +3 -2
- data/platform/wp7/RhoRubyLib/RhoRuby.cs +82 -0
- data/platform/wp7/RhoRubyLib/RhoRubyLib.csproj +7 -5
- data/platform/wp7/RhoRubyLib/WP_PlatformAdaptationLayer.cs +1 -1
- data/platform/wp7/RhoRubyLib/common/RhoParams.cs +1 -1
- data/platform/wp7/RhoRubyLib/common/ThreadQueue.cs +4 -1
- data/platform/wp7/RhoRubyLib/db/DBAdapter.cs +2 -2
- data/platform/wp7/RhoRubyLib/logging/IRhoLogSink.cs +1 -1
- data/platform/wp7/RhoRubyLib/logging/RhoEmptyLogger.cs +30 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogConf.cs +10 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogFileSink.cs +6 -1
- data/platform/wp7/RhoRubyLib/logging/RhoLogServerSink.cs +56 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogger.cs +24 -11
- data/platform/wp7/RhoRubyLib/net/AsyncHttp.cs +57 -14
- data/platform/wp7/RhoRubyLib/net/NetRequest.cs +32 -9
- data/platform/wp7/RhoRubyLib/rubyext/RhoAsyncHttp.cs +7 -0
- data/platform/wp7/RhoRubyLib/rubyext/RhoKernelOps.cs +6 -0
- data/platform/wp7/RhoRubyLib/sync/SyncEngine.cs +20 -16
- data/platform/wp7/RhoRubyLib/sync/SyncNotify.cs +2 -2
- data/platform/wp7/RhoRubyLib/sync/SyncSource.cs +138 -40
- data/platform/wp7/WPApplication/rho/apps/app/layout.erb +3 -1
- data/platform/wp7/build/wp.rake +151 -12
- data/platform/wp7/rhodes.sln +10 -0
- data/platform/wp7/rhodes/App.xaml.cs +6 -0
- data/platform/wp7/rhodes/MainPage.xaml +3 -0
- data/platform/wp7/rhodes/MainPage.xaml.cs +19 -0
- data/platform/wp7/rhodes/Rhodes.csproj +4 -2
- data/rakefile.rb +7 -36
- data/res/build-tools/RhoAppRunner.exe +0 -0
- data/res/build-tools/RhoLogServer.exe +0 -0
- data/res/build-tools/detool.exe +0 -0
- data/res/build-tools/wp7explorer.exe +0 -0
- data/res/generators/templates/application/app/layout.erb +3 -1
- data/res/generators/templates/application/public/jqtouch/jqtouch.js +1 -1
- data/rhodes.gemspec +1 -1
- data/spec/framework_spec/app/layout.erb +1 -1
- data/spec/framework_spec/build.yml +1 -0
- data/spec/perfomance_spec/app/layout.erb +3 -0
- data/spec/phone_spec/app/Account_s/account_s.rb +4 -1
- data/spec/phone_spec/app/spec/rhom_object_spec.rb +30 -1
- data/spec/phone_spec/app/spec_runner.rb +1 -1
- data/spec/phone_spec/build.yml +4 -1
- metadata +262 -10
- data/platform/wp7/IronRuby/Languages/Ruby/Ruby/Builtins/ConsoleStream.cs +0 -107
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2007 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.qrcode.decoder;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* <p>Encapsulates a block of data within a QR Code. QR Codes may split their data into
|
|
21
|
+
* multiple blocks, each of which is a unit of data and error-correction codewords. Each
|
|
22
|
+
* is represented by an instance of this class.</p>
|
|
23
|
+
*
|
|
24
|
+
* @author Sean Owen
|
|
25
|
+
*/
|
|
26
|
+
final class DataBlock {
|
|
27
|
+
|
|
28
|
+
private final int numDataCodewords;
|
|
29
|
+
private final byte[] codewords;
|
|
30
|
+
|
|
31
|
+
private DataBlock(int numDataCodewords, byte[] codewords) {
|
|
32
|
+
this.numDataCodewords = numDataCodewords;
|
|
33
|
+
this.codewords = codewords;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* <p>When QR Codes use multiple data blocks, they are actually interleaved.
|
|
38
|
+
* That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This
|
|
39
|
+
* method will separate the data into original blocks.</p>
|
|
40
|
+
*
|
|
41
|
+
* @param rawCodewords bytes as read directly from the QR Code
|
|
42
|
+
* @param version version of the QR Code
|
|
43
|
+
* @param ecLevel error-correction level of the QR Code
|
|
44
|
+
* @return {@link DataBlock}s containing original bytes, "de-interleaved" from representation in the
|
|
45
|
+
* QR Code
|
|
46
|
+
*/
|
|
47
|
+
static DataBlock[] getDataBlocks(byte[] rawCodewords,
|
|
48
|
+
Version version,
|
|
49
|
+
ErrorCorrectionLevel ecLevel) {
|
|
50
|
+
|
|
51
|
+
if (rawCodewords.length != version.getTotalCodewords()) {
|
|
52
|
+
throw new IllegalArgumentException();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Figure out the number and size of data blocks used by this version and
|
|
56
|
+
// error correction level
|
|
57
|
+
Version.ECBlocks ecBlocks = version.getECBlocksForLevel(ecLevel);
|
|
58
|
+
|
|
59
|
+
// First count the total number of data blocks
|
|
60
|
+
int totalBlocks = 0;
|
|
61
|
+
Version.ECB[] ecBlockArray = ecBlocks.getECBlocks();
|
|
62
|
+
for (int i = 0; i < ecBlockArray.length; i++) {
|
|
63
|
+
totalBlocks += ecBlockArray[i].getCount();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Now establish DataBlocks of the appropriate size and number of data codewords
|
|
67
|
+
DataBlock[] result = new DataBlock[totalBlocks];
|
|
68
|
+
int numResultBlocks = 0;
|
|
69
|
+
for (int j = 0; j < ecBlockArray.length; j++) {
|
|
70
|
+
Version.ECB ecBlock = ecBlockArray[j];
|
|
71
|
+
for (int i = 0; i < ecBlock.getCount(); i++) {
|
|
72
|
+
int numDataCodewords = ecBlock.getDataCodewords();
|
|
73
|
+
int numBlockCodewords = ecBlocks.getECCodewordsPerBlock() + numDataCodewords;
|
|
74
|
+
result[numResultBlocks++] = new DataBlock(numDataCodewords, new byte[numBlockCodewords]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// All blocks have the same amount of data, except that the last n
|
|
79
|
+
// (where n may be 0) have 1 more byte. Figure out where these start.
|
|
80
|
+
int shorterBlocksTotalCodewords = result[0].codewords.length;
|
|
81
|
+
int longerBlocksStartAt = result.length - 1;
|
|
82
|
+
while (longerBlocksStartAt >= 0) {
|
|
83
|
+
int numCodewords = result[longerBlocksStartAt].codewords.length;
|
|
84
|
+
if (numCodewords == shorterBlocksTotalCodewords) {
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
longerBlocksStartAt--;
|
|
88
|
+
}
|
|
89
|
+
longerBlocksStartAt++;
|
|
90
|
+
|
|
91
|
+
int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.getECCodewordsPerBlock();
|
|
92
|
+
// The last elements of result may be 1 element longer;
|
|
93
|
+
// first fill out as many elements as all of them have
|
|
94
|
+
int rawCodewordsOffset = 0;
|
|
95
|
+
for (int i = 0; i < shorterBlocksNumDataCodewords; i++) {
|
|
96
|
+
for (int j = 0; j < numResultBlocks; j++) {
|
|
97
|
+
result[j].codewords[i] = rawCodewords[rawCodewordsOffset++];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Fill out the last data block in the longer ones
|
|
101
|
+
for (int j = longerBlocksStartAt; j < numResultBlocks; j++) {
|
|
102
|
+
result[j].codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++];
|
|
103
|
+
}
|
|
104
|
+
// Now add in error correction blocks
|
|
105
|
+
int max = result[0].codewords.length;
|
|
106
|
+
for (int i = shorterBlocksNumDataCodewords; i < max; i++) {
|
|
107
|
+
for (int j = 0; j < numResultBlocks; j++) {
|
|
108
|
+
int iOffset = j < longerBlocksStartAt ? i : i + 1;
|
|
109
|
+
result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
int getNumDataCodewords() {
|
|
116
|
+
return numDataCodewords;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
byte[] getCodewords() {
|
|
120
|
+
return codewords;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2007 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.qrcode.decoder;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.common.BitMatrix;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* <p>Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations
|
|
23
|
+
* of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix,
|
|
24
|
+
* including areas used for finder patterns, timing patterns, etc. These areas should be unused
|
|
25
|
+
* after the point they are unmasked anyway.</p>
|
|
26
|
+
*
|
|
27
|
+
* <p>Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position
|
|
28
|
+
* and j is row position. In fact, as the text says, i is row position and j is column position.</p>
|
|
29
|
+
*
|
|
30
|
+
* @author Sean Owen
|
|
31
|
+
*/
|
|
32
|
+
abstract class DataMask {
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* See ISO 18004:2006 6.8.1
|
|
36
|
+
*/
|
|
37
|
+
private static final DataMask[] DATA_MASKS = {
|
|
38
|
+
new DataMask000(),
|
|
39
|
+
new DataMask001(),
|
|
40
|
+
new DataMask010(),
|
|
41
|
+
new DataMask011(),
|
|
42
|
+
new DataMask100(),
|
|
43
|
+
new DataMask101(),
|
|
44
|
+
new DataMask110(),
|
|
45
|
+
new DataMask111(),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
private DataMask() {
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* <p>Implementations of this method reverse the data masking process applied to a QR Code and
|
|
53
|
+
* make its bits ready to read.</p>
|
|
54
|
+
*
|
|
55
|
+
* @param bits representation of QR Code bits
|
|
56
|
+
* @param dimension dimension of QR Code, represented by bits, being unmasked
|
|
57
|
+
*/
|
|
58
|
+
final void unmaskBitMatrix(BitMatrix bits, int dimension) {
|
|
59
|
+
for (int i = 0; i < dimension; i++) {
|
|
60
|
+
for (int j = 0; j < dimension; j++) {
|
|
61
|
+
if (isMasked(i, j)) {
|
|
62
|
+
bits.flip(j, i);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
abstract boolean isMasked(int i, int j);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @param reference a value between 0 and 7 indicating one of the eight possible
|
|
72
|
+
* data mask patterns a QR Code may use
|
|
73
|
+
* @return {@link DataMask} encapsulating the data mask pattern
|
|
74
|
+
*/
|
|
75
|
+
static DataMask forReference(int reference) {
|
|
76
|
+
if (reference < 0 || reference > 7) {
|
|
77
|
+
throw new IllegalArgumentException();
|
|
78
|
+
}
|
|
79
|
+
return DATA_MASKS[reference];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 000: mask bits for which (x + y) mod 2 == 0
|
|
84
|
+
*/
|
|
85
|
+
private static class DataMask000 extends DataMask {
|
|
86
|
+
boolean isMasked(int i, int j) {
|
|
87
|
+
return ((i + j) & 0x01) == 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 001: mask bits for which x mod 2 == 0
|
|
93
|
+
*/
|
|
94
|
+
private static class DataMask001 extends DataMask {
|
|
95
|
+
boolean isMasked(int i, int j) {
|
|
96
|
+
return (i & 0x01) == 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 010: mask bits for which y mod 3 == 0
|
|
102
|
+
*/
|
|
103
|
+
private static class DataMask010 extends DataMask {
|
|
104
|
+
boolean isMasked(int i, int j) {
|
|
105
|
+
return j % 3 == 0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 011: mask bits for which (x + y) mod 3 == 0
|
|
111
|
+
*/
|
|
112
|
+
private static class DataMask011 extends DataMask {
|
|
113
|
+
boolean isMasked(int i, int j) {
|
|
114
|
+
return (i + j) % 3 == 0;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 100: mask bits for which (x/2 + y/3) mod 2 == 0
|
|
120
|
+
*/
|
|
121
|
+
private static class DataMask100 extends DataMask {
|
|
122
|
+
boolean isMasked(int i, int j) {
|
|
123
|
+
return (((i >>> 1) + (j /3)) & 0x01) == 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 101: mask bits for which xy mod 2 + xy mod 3 == 0
|
|
129
|
+
*/
|
|
130
|
+
private static class DataMask101 extends DataMask {
|
|
131
|
+
boolean isMasked(int i, int j) {
|
|
132
|
+
int temp = i * j;
|
|
133
|
+
return (temp & 0x01) + (temp % 3) == 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0
|
|
139
|
+
*/
|
|
140
|
+
private static class DataMask110 extends DataMask {
|
|
141
|
+
boolean isMasked(int i, int j) {
|
|
142
|
+
int temp = i * j;
|
|
143
|
+
return (((temp & 0x01) + (temp % 3)) & 0x01) == 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0
|
|
149
|
+
*/
|
|
150
|
+
private static class DataMask111 extends DataMask {
|
|
151
|
+
boolean isMasked(int i, int j) {
|
|
152
|
+
return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2007 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.qrcode.decoder;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.FormatException;
|
|
20
|
+
import com.google.zxing.common.BitSource;
|
|
21
|
+
import com.google.zxing.common.CharacterSetECI;
|
|
22
|
+
import com.google.zxing.common.DecoderResult;
|
|
23
|
+
import com.google.zxing.common.StringUtils;
|
|
24
|
+
|
|
25
|
+
import java.io.UnsupportedEncodingException;
|
|
26
|
+
import java.util.Hashtable;
|
|
27
|
+
import java.util.Vector;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* <p>QR Codes can encode text as bits in one of several modes, and can use multiple modes
|
|
31
|
+
* in one QR Code. This class decodes the bits back into text.</p>
|
|
32
|
+
*
|
|
33
|
+
* <p>See ISO 18004:2006, 6.4.3 - 6.4.7</p>
|
|
34
|
+
*
|
|
35
|
+
* @author Sean Owen
|
|
36
|
+
*/
|
|
37
|
+
final class DecodedBitStreamParser {
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* See ISO 18004:2006, 6.4.4 Table 5
|
|
41
|
+
*/
|
|
42
|
+
private static final char[] ALPHANUMERIC_CHARS = {
|
|
43
|
+
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
|
|
44
|
+
'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
45
|
+
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
46
|
+
' ', '$', '%', '*', '+', '-', '.', '/', ':'
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
private DecodedBitStreamParser() {
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static DecoderResult decode(byte[] bytes, Version version, ErrorCorrectionLevel ecLevel, Hashtable hints)
|
|
53
|
+
throws FormatException {
|
|
54
|
+
BitSource bits = new BitSource(bytes);
|
|
55
|
+
StringBuffer result = new StringBuffer(50);
|
|
56
|
+
CharacterSetECI currentCharacterSetECI = null;
|
|
57
|
+
boolean fc1InEffect = false;
|
|
58
|
+
Vector byteSegments = new Vector(1);
|
|
59
|
+
Mode mode;
|
|
60
|
+
do {
|
|
61
|
+
// While still another segment to read...
|
|
62
|
+
if (bits.available() < 4) {
|
|
63
|
+
// OK, assume we're done. Really, a TERMINATOR mode should have been recorded here
|
|
64
|
+
mode = Mode.TERMINATOR;
|
|
65
|
+
} else {
|
|
66
|
+
try {
|
|
67
|
+
mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits
|
|
68
|
+
} catch (IllegalArgumentException iae) {
|
|
69
|
+
throw FormatException.getFormatInstance();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!mode.equals(Mode.TERMINATOR)) {
|
|
73
|
+
if (mode.equals(Mode.FNC1_FIRST_POSITION) || mode.equals(Mode.FNC1_SECOND_POSITION)) {
|
|
74
|
+
// We do little with FNC1 except alter the parsed result a bit according to the spec
|
|
75
|
+
fc1InEffect = true;
|
|
76
|
+
} else if (mode.equals(Mode.STRUCTURED_APPEND)) {
|
|
77
|
+
// not really supported; all we do is ignore it
|
|
78
|
+
// Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue
|
|
79
|
+
bits.readBits(16);
|
|
80
|
+
} else if (mode.equals(Mode.ECI)) {
|
|
81
|
+
// Count doesn't apply to ECI
|
|
82
|
+
int value = parseECIValue(bits);
|
|
83
|
+
currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value);
|
|
84
|
+
if (currentCharacterSetECI == null) {
|
|
85
|
+
throw FormatException.getFormatInstance();
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
// How many characters will follow, encoded in this mode?
|
|
89
|
+
int count = bits.readBits(mode.getCharacterCountBits(version));
|
|
90
|
+
if (mode.equals(Mode.NUMERIC)) {
|
|
91
|
+
decodeNumericSegment(bits, result, count);
|
|
92
|
+
} else if (mode.equals(Mode.ALPHANUMERIC)) {
|
|
93
|
+
decodeAlphanumericSegment(bits, result, count, fc1InEffect);
|
|
94
|
+
} else if (mode.equals(Mode.BYTE)) {
|
|
95
|
+
decodeByteSegment(bits, result, count, currentCharacterSetECI, byteSegments, hints);
|
|
96
|
+
} else if (mode.equals(Mode.KANJI)) {
|
|
97
|
+
decodeKanjiSegment(bits, result, count);
|
|
98
|
+
} else {
|
|
99
|
+
throw FormatException.getFormatInstance();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} while (!mode.equals(Mode.TERMINATOR));
|
|
104
|
+
|
|
105
|
+
return new DecoderResult(bytes, result.toString(), byteSegments.isEmpty() ? null : byteSegments, ecLevel);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private static void decodeKanjiSegment(BitSource bits,
|
|
109
|
+
StringBuffer result,
|
|
110
|
+
int count) throws FormatException {
|
|
111
|
+
// Each character will require 2 bytes. Read the characters as 2-byte pairs
|
|
112
|
+
// and decode as Shift_JIS afterwards
|
|
113
|
+
byte[] buffer = new byte[2 * count];
|
|
114
|
+
int offset = 0;
|
|
115
|
+
while (count > 0) {
|
|
116
|
+
// Each 13 bits encodes a 2-byte character
|
|
117
|
+
int twoBytes = bits.readBits(13);
|
|
118
|
+
int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0);
|
|
119
|
+
if (assembledTwoBytes < 0x01F00) {
|
|
120
|
+
// In the 0x8140 to 0x9FFC range
|
|
121
|
+
assembledTwoBytes += 0x08140;
|
|
122
|
+
} else {
|
|
123
|
+
// In the 0xE040 to 0xEBBF range
|
|
124
|
+
assembledTwoBytes += 0x0C140;
|
|
125
|
+
}
|
|
126
|
+
buffer[offset] = (byte) (assembledTwoBytes >> 8);
|
|
127
|
+
buffer[offset + 1] = (byte) assembledTwoBytes;
|
|
128
|
+
offset += 2;
|
|
129
|
+
count--;
|
|
130
|
+
}
|
|
131
|
+
// Shift_JIS may not be supported in some environments:
|
|
132
|
+
try {
|
|
133
|
+
result.append(new String(buffer, StringUtils.SHIFT_JIS));
|
|
134
|
+
} catch (UnsupportedEncodingException uee) {
|
|
135
|
+
throw FormatException.getFormatInstance();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private static void decodeByteSegment(BitSource bits,
|
|
140
|
+
StringBuffer result,
|
|
141
|
+
int count,
|
|
142
|
+
CharacterSetECI currentCharacterSetECI,
|
|
143
|
+
Vector byteSegments,
|
|
144
|
+
Hashtable hints) throws FormatException {
|
|
145
|
+
byte[] readBytes = new byte[count];
|
|
146
|
+
if (count << 3 > bits.available()) {
|
|
147
|
+
throw FormatException.getFormatInstance();
|
|
148
|
+
}
|
|
149
|
+
for (int i = 0; i < count; i++) {
|
|
150
|
+
readBytes[i] = (byte) bits.readBits(8);
|
|
151
|
+
}
|
|
152
|
+
String encoding;
|
|
153
|
+
if (currentCharacterSetECI == null) {
|
|
154
|
+
// The spec isn't clear on this mode; see
|
|
155
|
+
// section 6.4.5: t does not say which encoding to assuming
|
|
156
|
+
// upon decoding. I have seen ISO-8859-1 used as well as
|
|
157
|
+
// Shift_JIS -- without anything like an ECI designator to
|
|
158
|
+
// give a hint.
|
|
159
|
+
encoding = StringUtils.guessEncoding(readBytes, hints);
|
|
160
|
+
} else {
|
|
161
|
+
encoding = currentCharacterSetECI.getEncodingName();
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
result.append(new String(readBytes, encoding));
|
|
165
|
+
} catch (UnsupportedEncodingException uce) {
|
|
166
|
+
throw FormatException.getFormatInstance();
|
|
167
|
+
}
|
|
168
|
+
byteSegments.addElement(readBytes);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private static char toAlphaNumericChar(int value) throws FormatException {
|
|
172
|
+
if (value >= ALPHANUMERIC_CHARS.length) {
|
|
173
|
+
throw FormatException.getFormatInstance();
|
|
174
|
+
}
|
|
175
|
+
return ALPHANUMERIC_CHARS[value];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private static void decodeAlphanumericSegment(BitSource bits,
|
|
179
|
+
StringBuffer result,
|
|
180
|
+
int count,
|
|
181
|
+
boolean fc1InEffect) throws FormatException {
|
|
182
|
+
// Read two characters at a time
|
|
183
|
+
int start = result.length();
|
|
184
|
+
while (count > 1) {
|
|
185
|
+
int nextTwoCharsBits = bits.readBits(11);
|
|
186
|
+
result.append(toAlphaNumericChar(nextTwoCharsBits / 45));
|
|
187
|
+
result.append(toAlphaNumericChar(nextTwoCharsBits % 45));
|
|
188
|
+
count -= 2;
|
|
189
|
+
}
|
|
190
|
+
if (count == 1) {
|
|
191
|
+
// special case: one character left
|
|
192
|
+
result.append(toAlphaNumericChar(bits.readBits(6)));
|
|
193
|
+
}
|
|
194
|
+
// See section 6.4.8.1, 6.4.8.2
|
|
195
|
+
if (fc1InEffect) {
|
|
196
|
+
// We need to massage the result a bit if in an FNC1 mode:
|
|
197
|
+
for (int i = start; i < result.length(); i++) {
|
|
198
|
+
if (result.charAt(i) == '%') {
|
|
199
|
+
if (i < result.length() - 1 && result.charAt(i + 1) == '%') {
|
|
200
|
+
// %% is rendered as %
|
|
201
|
+
result.deleteCharAt(i + 1);
|
|
202
|
+
} else {
|
|
203
|
+
// In alpha mode, % should be converted to FNC1 separator 0x1D
|
|
204
|
+
result.setCharAt(i, (char) 0x1D);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private static void decodeNumericSegment(BitSource bits,
|
|
212
|
+
StringBuffer result,
|
|
213
|
+
int count) throws FormatException {
|
|
214
|
+
// Read three digits at a time
|
|
215
|
+
while (count >= 3) {
|
|
216
|
+
// Each 10 bits encodes three digits
|
|
217
|
+
int threeDigitsBits = bits.readBits(10);
|
|
218
|
+
if (threeDigitsBits >= 1000) {
|
|
219
|
+
throw FormatException.getFormatInstance();
|
|
220
|
+
}
|
|
221
|
+
result.append(toAlphaNumericChar(threeDigitsBits / 100));
|
|
222
|
+
result.append(toAlphaNumericChar((threeDigitsBits / 10) % 10));
|
|
223
|
+
result.append(toAlphaNumericChar(threeDigitsBits % 10));
|
|
224
|
+
count -= 3;
|
|
225
|
+
}
|
|
226
|
+
if (count == 2) {
|
|
227
|
+
// Two digits left over to read, encoded in 7 bits
|
|
228
|
+
int twoDigitsBits = bits.readBits(7);
|
|
229
|
+
if (twoDigitsBits >= 100) {
|
|
230
|
+
throw FormatException.getFormatInstance();
|
|
231
|
+
}
|
|
232
|
+
result.append(toAlphaNumericChar(twoDigitsBits / 10));
|
|
233
|
+
result.append(toAlphaNumericChar(twoDigitsBits % 10));
|
|
234
|
+
} else if (count == 1) {
|
|
235
|
+
// One digit left over to read
|
|
236
|
+
int digitBits = bits.readBits(4);
|
|
237
|
+
if (digitBits >= 10) {
|
|
238
|
+
throw FormatException.getFormatInstance();
|
|
239
|
+
}
|
|
240
|
+
result.append(toAlphaNumericChar(digitBits));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
private static int parseECIValue(BitSource bits) {
|
|
245
|
+
int firstByte = bits.readBits(8);
|
|
246
|
+
if ((firstByte & 0x80) == 0) {
|
|
247
|
+
// just one byte
|
|
248
|
+
return firstByte & 0x7F;
|
|
249
|
+
} else if ((firstByte & 0xC0) == 0x80) {
|
|
250
|
+
// two bytes
|
|
251
|
+
int secondByte = bits.readBits(8);
|
|
252
|
+
return ((firstByte & 0x3F) << 8) | secondByte;
|
|
253
|
+
} else if ((firstByte & 0xE0) == 0xC0) {
|
|
254
|
+
// three bytes
|
|
255
|
+
int secondThirdBytes = bits.readBits(16);
|
|
256
|
+
return ((firstByte & 0x1F) << 16) | secondThirdBytes;
|
|
257
|
+
}
|
|
258
|
+
throw new IllegalArgumentException("Bad ECI bits starting with byte " + firstByte);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
}
|