From: srowen Date: Fri, 17 Sep 2010 08:54:11 +0000 (+0000) Subject: Properly escape MECARD reserved chars X-Git-Url: http://git.rot13.org/?p=zxing.git;a=commitdiff_plain;h=b106c4e151ba160a364acc7adc4000d0ce011ed3 Properly escape MECARD reserved chars git-svn-id: http://zxing.googlecode.com/svn/trunk@1594 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- diff --git a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java index 873ccd5c..8cf6693e 100755 --- a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java +++ b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java @@ -209,25 +209,25 @@ final class QRCodeEncoder { newContents.append("MECARD:"); String name = trim(bundle.getString(Contacts.Intents.Insert.NAME)); if (name != null) { - newContents.append("N:").append(name).append(';'); + newContents.append("N:").append(escapeMECARD(name)).append(';'); newDisplayContents.append(name); } String address = trim(bundle.getString(Contacts.Intents.Insert.POSTAL)); if (address != null) { - newContents.append("ADR:").append(address).append(';'); + newContents.append("ADR:").append(escapeMECARD(address)).append(';'); newDisplayContents.append('\n').append(address); } for (int x = 0; x < Contents.PHONE_KEYS.length; x++) { String phone = trim(bundle.getString(Contents.PHONE_KEYS[x])); if (phone != null) { - newContents.append("TEL:").append(phone).append(';'); + newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); } } for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) { String email = trim(bundle.getString(Contents.EMAIL_KEYS[x])); if (email != null) { - newContents.append("EMAIL:").append(email).append(';'); + newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); newDisplayContents.append('\n').append(email); } } @@ -265,7 +265,7 @@ final class QRCodeEncoder { if (names != null && names.length > 0) { String name = trim(names[0]); if (name != null) { - newContents.append("N:").append(name).append(';'); + newContents.append("N:").append(escapeMECARD(name)).append(';'); newDisplayContents.append(name); } } @@ -274,7 +274,7 @@ final class QRCodeEncoder { for (String address : addresses) { address = trim(address); if (address != null) { - newContents.append("ADR:").append(address).append(';'); + newContents.append("ADR:").append(escapeMECARD(address)).append(';'); newDisplayContents.append('\n').append(address); } } @@ -284,7 +284,7 @@ final class QRCodeEncoder { for (String phone : phoneNumbers) { phone = trim(phone); if (phone != null) { - newContents.append("TEL:").append(phone).append(';'); + newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); } } @@ -294,14 +294,14 @@ final class QRCodeEncoder { for (String email : emails) { email = trim(email); if (email != null) { - newContents.append("EMAIL:").append(email).append(';'); + newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); newDisplayContents.append('\n').append(email); } } } String url = trim(contact.getURL()); if (url != null) { - newContents.append("URL:").append(url).append(';'); + newContents.append("URL:").append(escapeMECARD(url)).append(';'); newDisplayContents.append('\n').append(url); } // Make sure we've encoded at least one field. @@ -364,4 +364,20 @@ final class QRCodeEncoder { return s.length() == 0 ? null : s; } + private static String escapeMECARD(String input) { + if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { + return input; + } + int length = input.length(); + StringBuilder result = new StringBuilder(length); + for (int i = 0; i < length; i++) { + char c = input.charAt(i); + if (c == ':' || c == ';') { + result.append('\\'); + } + result.append(c); + } + return result.toString(); + } + }