Fix #150 again by moving towards a more RFC 2822-compliant definition of valid syntax
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Fri, 6 Mar 2009 15:17:38 +0000 (15:17 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Fri, 6 Mar 2009 15:17:38 +0000 (15:17 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@872 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java
core/test/src/com/google/zxing/client/result/ParsedReaderResultTestCase.java

index 94ebb02..b4eb70e 100644 (file)
@@ -27,6 +27,9 @@ import com.google.zxing.Result;
  */
 final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser {
 
+  private static final char[] ATEXT_SYMBOLS =
+      {'@','.','!','#','$','%','&','\'','*','+','-','/','=','?','^','_','`','{','|','}','~'};
+
   public static EmailAddressParsedResult parse(Result result) {
     String rawText = result.getText();
     if (rawText == null || !rawText.startsWith("MATMSG:")) {
@@ -47,8 +50,8 @@ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser {
 
   /**
    * This implements only the most basic checking for an email address's validity -- that it contains
-   * an '@' and a '.', and that it contains no space or LF.
-   * We want to generally be lenient here since this class is only intended to encapsulate what's
+   * an '@' contains no characters disallowed by RFC 2822. This is an overly lenient definition of
+   * validity. We want to generally be lenient here since this class is only intended to encapsulate what's
    * in a barcode, not "judge" it.
    */
   static boolean isBasicallyValidEmailAddress(String email) {
@@ -56,21 +59,29 @@ final class EmailDoCoMoResultParser extends AbstractDoCoMoResultParser {
       return false;
     }
     boolean atFound = false;
-    boolean periodFound = false;
     for (int i = 0; i < email.length(); i++) {
       char c = email.charAt(i);
+      if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9') &&
+          !isAtextSymbol(c)) {
+        return false;
+      }
       if (c == '@') {
         if (atFound) {
           return false;
         }
         atFound = true;
-      } else if (c == '.') {
-        periodFound = true;
-      } else if (c == ' ' || c == '\n') {
-        return false;
       }
     }
-    return atFound && periodFound;
+    return atFound;
+  }
+
+  private static boolean isAtextSymbol(char c) {
+    for (int i = 0; i < ATEXT_SYMBOLS.length; i++) {
+      if (c == ATEXT_SYMBOLS[i]) {
+        return true;
+      }
+    }
+    return false;
   }
 
 }
\ No newline at end of file
index eef5816..125c6a5 100644 (file)
@@ -73,7 +73,7 @@ public final class ParsedReaderResultTestCase extends TestCase {
     doTestResult("srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS);
     doTestResult("mailto:srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS);
     doTestResult("MAILTO:srowen@example.org", "srowen@example.org", ParsedResultType.EMAIL_ADDRESS);
-    doTestResult("srowen@example", "srowen@example", ParsedResultType.TEXT);
+    doTestResult("srowen@example", "srowen@example", ParsedResultType.EMAIL_ADDRESS);
     doTestResult("srowen", "srowen", ParsedResultType.TEXT);
     doTestResult("Let's meet @ 2", "Let's meet @ 2", ParsedResultType.TEXT);
   }