Added code for the Data Matrix decoder.
[zxing.git] / core / src / com / google / zxing / MultiFormatReader.java
index d19cc94..0409436 100644 (file)
 
 package com.google.zxing;
 
+import com.google.zxing.oned.MultiFormatOneDReader;
 import com.google.zxing.qrcode.QRCodeReader;
+import com.google.zxing.datamatrix.DataMatrixReader;
 
 import java.util.Hashtable;
+import java.util.Vector;
 
 /**
- * For now, only delegates to {@link QRCodeReader}.
+ * <p>This implementation can detect barcodes in one of several formats within
+ * an image, and then decode what it finds. This implementation supports all
+ * barcode formats that this library supports.</p>
  *
  * @author srowen@google.com (Sean Owen), dswitkin@google.com (Daniel Switkin)
  */
@@ -31,15 +36,42 @@ public final class MultiFormatReader implements Reader {
     return decode(image, null);
   }
 
-  public Result decode(MonochromeBitmapSource image, Hashtable hints)
-      throws ReaderException {
-    Hashtable possibleFormats =
-        hints == null ? null : (Hashtable) hints.get(DecodeHintType.POSSIBLE_FORMATS);
-    if (possibleFormats == null || possibleFormats.contains(BarcodeFormat.QR_CODE)) {
-      return new QRCodeReader().decode(image, hints);
-    } else {
-      throw new ReaderException();
+  public Result decode(MonochromeBitmapSource image, Hashtable hints) throws ReaderException {
+
+    Vector possibleFormats = hints == null ? null : (Vector) hints.get(DecodeHintType.POSSIBLE_FORMATS);
+    Vector readers = new Vector();
+    if (possibleFormats != null) {
+      if (possibleFormats.contains(BarcodeFormat.UPC_A) ||
+          possibleFormats.contains(BarcodeFormat.UPC_E) ||
+          possibleFormats.contains(BarcodeFormat.EAN_13) ||
+          possibleFormats.contains(BarcodeFormat.EAN_8) ||
+          possibleFormats.contains(BarcodeFormat.CODE_39) ||
+          possibleFormats.contains(BarcodeFormat.CODE_128)) {
+        readers.addElement(new MultiFormatOneDReader());
+      }
+      if (possibleFormats.contains(BarcodeFormat.QR_CODE)) {
+        readers.addElement(new QRCodeReader());
+      }
+      if (possibleFormats.contains(BarcodeFormat.DATAMATRIX)) {
+        readers.addElement(new DataMatrixReader());
+      }
+    }
+    if (readers.isEmpty()) {
+      readers.addElement(new MultiFormatOneDReader());
+      readers.addElement(new QRCodeReader());
+      readers.addElement(new DataMatrixReader());
     }
+
+    for (int i = 0; i < readers.size(); i++) {
+      Reader reader = (Reader) readers.elementAt(i);
+      try {
+        return reader.decode(image, hints);
+      } catch (ReaderException re) {
+        // continue
+      }
+    }
+
+    throw new ReaderException("No barcode was detected in this image.");
   }
 
 }