Correct exception handling in certain situations so that routine decoding failures...
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 21 Dec 2008 18:40:41 +0000 (18:40 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Sun, 21 Dec 2008 18:40:41 +0000 (18:40 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@799 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/qrcode/decoder/DataBlock.java
core/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java

index a517611..a08b568 100755 (executable)
@@ -34,7 +34,7 @@ final class DataBlock {
   }\r
 \r
   /**\r
-   * <p>When QR Codes use multiple data blocks, they are actually interleave the bytes of each of them.\r
+   * <p>When QR Codes use multiple data blocks, they are actually interleaved.\r
    * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This\r
    * method will separate the data into original blocks.</p>\r
    *\r
@@ -47,6 +47,11 @@ final class DataBlock {
   static DataBlock[] getDataBlocks(byte[] rawCodewords,\r
                                    Version version,\r
                                    ErrorCorrectionLevel ecLevel) {\r
+\r
+    if (rawCodewords.length != version.getTotalCodewords()) {\r
+      throw new IllegalArgumentException();\r
+    }\r
+\r
     // Figure out the number and size of data blocks used by this version and\r
     // error correction level\r
     Version.ECBlocks ecBlocks = version.getECBlocksForLevel(ecLevel);\r
@@ -79,9 +84,6 @@ final class DataBlock {
       if (numCodewords == shorterBlocksTotalCodewords) {\r
         break;\r
       }\r
-      if (numCodewords != shorterBlocksTotalCodewords + 1) {\r
-        throw new IllegalArgumentException("Data block sizes differ by more than 1");\r
-      }\r
       longerBlocksStartAt--;\r
     }\r
     longerBlocksStartAt++;\r
@@ -107,11 +109,6 @@ final class DataBlock {
         result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++];\r
       }\r
     }\r
-\r
-    if (rawCodewordsOffset != rawCodewords.length) {\r
-      throw new IllegalArgumentException();\r
-    }\r
-\r
     return result;\r
   }\r
 \r
index 917a7ff..16bfb62 100644 (file)
@@ -70,7 +70,11 @@ final class DecodedBitStreamParser {
         // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here
         mode = Mode.TERMINATOR;
       } else {
-        mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits
+        try {
+          mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits
+        } catch (IllegalArgumentException iae) {
+          throw ReaderException.getInstance();
+        }
       }
       if (!mode.equals(Mode.TERMINATOR)) {
         if (mode.equals(Mode.FNC1_FIRST_POSITION) || mode.equals(Mode.FNC1_SECOND_POSITION)) {
@@ -78,11 +82,11 @@ final class DecodedBitStreamParser {
           fc1InEffect = true;
         } else if (mode.equals(Mode.ECI)) {
           // Count doesn't apply to ECI
-          int value = parseECIValue(bits);
           try {
+            int value = parseECIValue(bits);
             currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value);
           } catch (IllegalArgumentException iae) {
-            // unsupported... just continue?
+            throw ReaderException.getInstance();
           }
         } else {
           // How many characters will follow, encoded in this mode?