Fixed crash and bad parsing of an SMS with a question mark in the subject or message.

git-svn-id: https://zxing.googlecode.com/svn/trunk@794 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
dswitkin 2008-12-19 15:00:20 +00:00
parent 13432e7bb2
commit 48480eba95
4 changed files with 29 additions and 15 deletions

View file

@ -232,11 +232,8 @@ public abstract class ResultParser {
String value = uri.substring(separator + 1, paramEnd); String value = uri.substring(separator + 1, paramEnd);
value = urlDecode(value); value = urlDecode(value);
result.put(key, value); result.put(key, value);
} else {
// key, no value
String key = uri.substring(paramStart, paramEnd);
result.put(key, null);
} }
// Can't put key, null into a hashtable
} }
static String[] matchPrefixedField(String prefix, String rawText, char endChar, boolean trim) { static String[] matchPrefixedField(String prefix, String rawText, char endChar, boolean trim) {

View file

@ -51,10 +51,23 @@ final class SMSMMSResultParser extends ResultParser {
} else { } else {
return null; return null;
} }
// Check up front if this is a URI syntax string with query arguments
Hashtable nameValuePairs = parseNameValuePairs(rawText);
String subject = null;
String body = null;
boolean querySyntax = false;
if (nameValuePairs != null && nameValuePairs.size() > 0) {
subject = (String) nameValuePairs.get("subject");
body = (String) nameValuePairs.get("body");
querySyntax = true;
}
// Drop sms, query portion // Drop sms, query portion
int queryStart = rawText.indexOf('?', prefixLength); int queryStart = rawText.indexOf('?', prefixLength);
String smsURIWithoutQuery; String smsURIWithoutQuery;
if (queryStart < 0) { // If it's not query syntax, the question mark is part of the subject or message
if (queryStart < 0 || !querySyntax) {
smsURIWithoutQuery = rawText.substring(prefixLength); smsURIWithoutQuery = rawText.substring(prefixLength);
} else { } else {
smsURIWithoutQuery = rawText.substring(prefixLength, queryStart); smsURIWithoutQuery = rawText.substring(prefixLength, queryStart);
@ -74,13 +87,7 @@ final class SMSMMSResultParser extends ResultParser {
via = null; via = null;
} }
} }
Hashtable nameValuePairs = parseNameValuePairs(rawText);
String subject = null;
String body = null;
if (nameValuePairs != null) {
subject = (String) nameValuePairs.get("subject");
body = (String) nameValuePairs.get("body");
}
// Thanks to dominik.wild for suggesting this enhancement to support // Thanks to dominik.wild for suggesting this enhancement to support
// smsto:number:body URIs // smsto:number:body URIs
if (body == null) { if (body == null) {

View file

@ -121,6 +121,7 @@ public final class ParsedReaderResultTestCase extends TestCase {
doTestResult("TEL:+15551212", ParsedResultType.TEL); doTestResult("TEL:+15551212", ParsedResultType.TEL);
doTestResult("tel:212 555 1212", ParsedResultType.TEL); doTestResult("tel:212 555 1212", ParsedResultType.TEL);
doTestResult("tel:2125551212", ParsedResultType.TEL); doTestResult("tel:2125551212", ParsedResultType.TEL);
doTestResult("tel:212-555-1212", ParsedResultType.TEL);
doTestResult("telephone", ParsedResultType.TEXT); doTestResult("telephone", ParsedResultType.TEXT);
} }
@ -167,6 +168,9 @@ public final class ParsedReaderResultTestCase extends TestCase {
doTestResult("sms:+15551212;via=999333", ParsedResultType.SMS); doTestResult("sms:+15551212;via=999333", ParsedResultType.SMS);
doTestResult("sms:+15551212?subject=foo&body=bar", ParsedResultType.SMS); doTestResult("sms:+15551212?subject=foo&body=bar", ParsedResultType.SMS);
doTestResult("sms:+15551212:subject", ParsedResultType.SMS); doTestResult("sms:+15551212:subject", ParsedResultType.SMS);
// Need to handle question mark in the subject
doTestResult("sms:+15551212:What's up?", ParsedResultType.SMS);
doTestResult("sms:212-555-1212:Here's a longer message. Should be fine.", ParsedResultType.SMS);
} }
public void testMMS() { public void testMMS() {
@ -177,6 +181,8 @@ public final class ParsedReaderResultTestCase extends TestCase {
doTestResult("mms:+15551212;via=999333", ParsedResultType.SMS); doTestResult("mms:+15551212;via=999333", ParsedResultType.SMS);
doTestResult("mms:+15551212?subject=foo&body=bar", ParsedResultType.SMS); doTestResult("mms:+15551212?subject=foo&body=bar", ParsedResultType.SMS);
doTestResult("mms:+15551212:subject", ParsedResultType.SMS); doTestResult("mms:+15551212:subject", ParsedResultType.SMS);
doTestResult("mms:+15551212:What's up?", ParsedResultType.SMS);
doTestResult("mms:212-555-1212:Here's a longer message. Should be fine.", ParsedResultType.SMS);
} }
/* /*

View file

@ -21,6 +21,8 @@ import com.google.zxing.MonochromeBitmapSource;
import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatReader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.client.result.ParsedResult;
import com.google.zxing.client.result.ResultParser;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@ -31,8 +33,8 @@ import java.io.IOException;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.Writer; import java.io.Writer;
import java.net.URI; import java.net.URI;
import java.util.Hashtable;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Hashtable;
/** /**
* <p>This simple command line utility decodes files, directories of files, or URIs which are passed * <p>This simple command line utility decodes files, directories of files, or URIs which are passed
@ -138,8 +140,10 @@ public final class CommandLineRunner {
try { try {
MonochromeBitmapSource source = new BufferedImageMonochromeBitmapSource(image); MonochromeBitmapSource source = new BufferedImageMonochromeBitmapSource(image);
Result result = new MultiFormatReader().decode(source, hints); Result result = new MultiFormatReader().decode(source, hints);
System.out.println(uri.toString() + " (format: " + result.getBarcodeFormat() + "):\n" + ParsedResult parsedResult = ResultParser.parseResult(result);
result.getText()); System.out.println(uri.toString() + " (format: " + result.getBarcodeFormat() +
", type: " + parsedResult.getType() + "):\nRaw result:\n" + result.getText() +
"\nParsed result:\n" + parsedResult.getDisplayResult());
return result; return result;
} catch (ReaderException e) { } catch (ReaderException e) {
System.out.println(uri.toString() + ": No barcode found"); System.out.println(uri.toString() + ": No barcode found");