diff options
author | Daisuke Miyakawa <dmiyakawa@google.com> | 2010-04-07 19:26:14 +0900 |
---|---|---|
committer | Daisuke Miyakawa <dmiyakawa@google.com> | 2010-04-07 19:36:34 +0900 |
commit | 921e5f725f48ad471824df6ac8eb36d93cd054ae (patch) | |
tree | c87314709a7cf019365c39984c532199c1cb00ec /core/java/android/pim | |
parent | 9fb4ace5f3fd757c7d1ac58a09c1611b41e8a11b (diff) | |
download | frameworks_base-921e5f725f48ad471824df6ac8eb36d93cd054ae.zip frameworks_base-921e5f725f48ad471824df6ac8eb36d93cd054ae.tar.gz frameworks_base-921e5f725f48ad471824df6ac8eb36d93cd054ae.tar.bz2 |
Modify comments.
Bug: 2576594
Change-Id: I7d38bd4c738befddeb4e7ce14ac84032fb764d9d
Diffstat (limited to 'core/java/android/pim')
-rw-r--r-- | core/java/android/pim/vcard/JapaneseUtils.java | 4 | ||||
-rw-r--r-- | core/java/android/pim/vcard/VCardBuilder.java | 3 | ||||
-rw-r--r-- | core/java/android/pim/vcard/VCardParser_V21.java | 378 | ||||
-rw-r--r-- | core/java/android/pim/vcard/VCardParser_V30.java | 10 |
4 files changed, 245 insertions, 150 deletions
diff --git a/core/java/android/pim/vcard/JapaneseUtils.java b/core/java/android/pim/vcard/JapaneseUtils.java index 875c29e..b37b07d 100644 --- a/core/java/android/pim/vcard/JapaneseUtils.java +++ b/core/java/android/pim/vcard/JapaneseUtils.java @@ -366,11 +366,11 @@ import java.util.Map; } /** - * Return half-width version of that character if possible. Return null if not possible + * Returns half-width version of that character if possible. Returns null if not possible * @param ch input character * @return CharSequence object if the mapping for ch exists. Return null otherwise. */ - public static String tryGetHalfWidthText(char ch) { + public static String tryGetHalfWidthText(final char ch) { if (sHalfWidthMap.containsKey(ch)) { return sHalfWidthMap.get(ch); } else { diff --git a/core/java/android/pim/vcard/VCardBuilder.java b/core/java/android/pim/vcard/VCardBuilder.java index 03c1db9..fa0d4d4 100644 --- a/core/java/android/pim/vcard/VCardBuilder.java +++ b/core/java/android/pim/vcard/VCardBuilder.java @@ -62,7 +62,8 @@ import java.util.Set; * .appendNotes(contentValuesListMap.get(Note.CONTENT_ITEM_TYPE)) * .appendEvents(contentValuesListMap.get(Event.CONTENT_ITEM_TYPE)) * .appendIms(contentValuesListMap.get(Im.CONTENT_ITEM_TYPE)) - * .appendRelation(contentValuesListMap.get(Relation.CONTENT_ITEM_TYPE)); </pre> + * .appendRelation(contentValuesListMap.get(Relation.CONTENT_ITEM_TYPE)); + * return builder.toString();</pre> */ public class VCardBuilder { private static final String LOG_TAG = "VCardBuilder"; diff --git a/core/java/android/pim/vcard/VCardParser_V21.java b/core/java/android/pim/vcard/VCardParser_V21.java index 4f85150..608523c 100644 --- a/core/java/android/pim/vcard/VCardParser_V21.java +++ b/core/java/android/pim/vcard/VCardParser_V21.java @@ -34,11 +34,46 @@ import java.util.HashSet; import java.util.Set; /** - * This class is used to parse vCard. Please refer to vCard Specification 2.1 for more detail. + * </p> + * vCard parser implementation mostly for vCard 2.1. See the specification for more detail + * about the spec itself. + * </p> + * <p> + * The spec is written in 1996, and currently various types of "vCard 2.1" exist. + * To handle real the world vCard formats appropriately and effectively, this class does not + * obey with strict vCard 2.1. In stead, not only vCard spec but also real world + * vCard is considered. + * </p> + * e.g. A lot of devices and softwares let vCard importer/exporter to use + * the PNG format to determine the type of image, while it is not allowed in + * the original specification. As of 2010, we can see even the FLV format + * (possible in Japanese mobile phones). + * </p> */ public class VCardParser_V21 extends VCardParser { private static final String LOG_TAG = "VCardParser_V21"; + private static final class CustomBufferedReader extends BufferedReader { + private long mTime; + + public CustomBufferedReader(Reader in) { + super(in); + } + + @Override + public String readLine() throws IOException { + long start = System.currentTimeMillis(); + String ret = super.readLine(); + long end = System.currentTimeMillis(); + mTime += end - start; + return ret; + } + + public long getTotalmillisecond() { + return mTime; + } + } + /** Store the known-type */ private static final HashSet<String> sKnownTypeSet = new HashSet<String>( Arrays.asList("DOM", "INTL", "POSTAL", "PARCEL", "HOME", "WORK", @@ -69,52 +104,62 @@ public class VCardParser_V21 extends VCardParser { new HashSet<String>(Arrays.asList( "7BIT", "8BIT", "QUOTED-PRINTABLE", "BASE64", "B")); - private static final class CustomBufferedReader extends BufferedReader { - private long mTime; - - public CustomBufferedReader(Reader in) { - super(in); - } + private static final String sDefaultEncoding = "8BIT"; - @Override - public String readLine() throws IOException { - long start = System.currentTimeMillis(); - String ret = super.readLine(); - long end = System.currentTimeMillis(); - mTime += end - start; - return ret; - } - public long getTotalmillisecond() { - return mTime; - } - } + //// Protected members - // Used only for parsing END:VCARD. - private String mPreviousLine; - - /** The builder to build parsed data */ - protected VCardInterpreter mBuilder = null; + protected VCardInterpreter mInterpreter; /** - * The encoding type. "Encoding" in vCard is different from "Charset". - * e.g. 7BIT, 8BIT, QUOTED-PRINTABLE. + * <p> + * The encoding type for deconding byte streams. This member variable is reset to + * {{@link #sDefaultEncoding} every time when a new item comes. + * </p> + * <p> + * "Encoding" in vCard is different from "Charset". + * It is mainly used for addresses, notes, images. "7BIT", "8BIT", "BASE64", and + * "QUOTED-PRINTABLE" are known examples. + * </p> + */ + protected String mCurrentEncoding; + + /** + * <p> + * The reader object to be used internally. + * </p> + * <p> + * Developers should not directly read a line from this object. Use getLine() unless + * there some reason. + * </p> */ - protected String mEncoding = null; - - protected final String sDefaultEncoding = "8BIT"; - - // Should not directly read a line from this object. Use getLine() instead. protected BufferedReader mReader; - + + /** + * <p> + * Set for storing unkonwn TYPE attributes, which is not acceptable in vCard specification, + * but happens to be seen in real world vCard. + * </p> + */ + protected final Set<String> mUnknownTypeSet = new HashSet<String>(); + + /** + * <p> + * Set for storing unkonwn VALUE attributes, which is not acceptable in vCard specification, + * but happens to be seen in real world vCard. + * </p> + */ + protected final Set<String> mUnknownValueSet = new HashSet<String>(); + + + //// Private members + // In some cases, vCard is nested. Currently, we only consider the most interior vCard data. // See v21_foma_1.vcf in test directory for more information. private int mNestCount; - - // In order to reduce warning message as much as possible, we hold the value which made Logger - // emit a warning message. - protected Set<String> mUnknownTypeMap = new HashSet<String>(); - protected Set<String> mUnknownValueMap = new HashSet<String>(); + + // Used only for parsing END:VCARD. + private String mPreviousLine; // For measuring performance. private long mTimeTotal; @@ -130,14 +175,34 @@ public class VCardParser_V21 extends VCardParser { private long mTimeHandleQuotedPrintable; private long mTimeHandleBase64; + /** + * <p> + * Same as {{@link #VCardParser_V21(VCardSourceDetector)} with + * {@link VCardConfig#PARSE_TYPE_UNKNOWN}. + * </p> + */ public VCardParser_V21() { - this(null); + this(VCardConfig.PARSE_TYPE_UNKNOWN); } + /** + * <p> + * The constructor which uses the estimated type available from a given detector. + * </p> + */ public VCardParser_V21(VCardSourceDetector detector) { this(detector != null ? detector.getEstimatedType() : VCardConfig.PARSE_TYPE_UNKNOWN); } + /** + * <p> + * The constructor which uses a given parse type like + * {@link VCardConfig#PARSE_TYPE_UNKNOWN}. + * </p> + * <p> + * This should be used only when you already know the exact type to be used. + * </p> + */ public VCardParser_V21(int parseType) { super(parseType); if (parseType == VCardConfig.PARSE_TYPE_FOMA) { @@ -146,10 +211,11 @@ public class VCardParser_V21 extends VCardParser { } /** + * <p> * Parses the file at the given position. - * - * vcard_file = [wsls] vcard [wsls] + * </p> */ + // <pre class="prettyprint">vcard_file = [wsls] vcard [wsls]</pre> protected void parseVCardFile() throws IOException, VCardException { boolean firstReading = true; while (true) { @@ -171,22 +237,28 @@ public class VCardParser_V21 extends VCardParser { } } + /** + * @return {@link VCardConfig#FLAG_V21} + */ protected int getVersion() { return VCardConfig.FLAG_V21; } + /** + * @return {@link VCardConfig#FLAG_V30} + */ protected String getVersionString() { return VCardConstants.VERSION_V21; } /** - * @return true when the propertyName is a valid property name. + * @return true when a given property name is a valid property name. */ - protected boolean isValidPropertyName(String propertyName) { + protected boolean isValidPropertyName(final String propertyName) { if (!(sAvailablePropertyNameSetV21.contains(propertyName.toUpperCase()) || propertyName.startsWith("X-")) && - !mUnknownTypeMap.contains(propertyName)) { - mUnknownTypeMap.add(propertyName); + !mUnknownTypeSet.contains(propertyName)) { + mUnknownTypeSet.add(propertyName); Log.w(LOG_TAG, "Property name unsupported by vCard 2.1: " + propertyName); } return true; @@ -224,7 +296,7 @@ public class VCardParser_V21 extends VCardParser { } } - /** + /* * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF * items *CRLF * "END" [ws] ":" [ws] "VCARD" @@ -246,18 +318,18 @@ public class VCardParser_V21 extends VCardParser { return false; } long start; - if (mBuilder != null) { + if (mInterpreter != null) { start = System.currentTimeMillis(); - mBuilder.startEntry(); + mInterpreter.startEntry(); mTimeReadStartRecord += System.currentTimeMillis() - start; } start = System.currentTimeMillis(); parseItems(); mTimeParseItems += System.currentTimeMillis() - start; readEndVCard(true, false); - if (mBuilder != null) { + if (mInterpreter != null) { start = System.currentTimeMillis(); - mBuilder.endEntry(); + mInterpreter.endEntry(); mTimeReadEndRecord += System.currentTimeMillis() - start; } return true; @@ -306,8 +378,10 @@ public class VCardParser_V21 extends VCardParser { } /** + * <p> * The arguments useCache and allowGarbase are usually true and false accordingly when - * this function is called outside this function itself. + * this function is called outside this function itself. + * </p> * * @param useCache When true, line is obtained from mPreviousline. Otherwise, getLine() * is used. @@ -346,30 +420,30 @@ public class VCardParser_V21 extends VCardParser { } while (allowGarbage); } - /** + /* * items = *CRLF item * / item */ protected void parseItems() throws IOException, VCardException { boolean ended = false; - if (mBuilder != null) { + if (mInterpreter != null) { long start = System.currentTimeMillis(); - mBuilder.startProperty(); + mInterpreter.startProperty(); mTimeStartProperty += System.currentTimeMillis() - start; } ended = parseItem(); - if (mBuilder != null && !ended) { + if (mInterpreter != null && !ended) { long start = System.currentTimeMillis(); - mBuilder.endProperty(); + mInterpreter.endProperty(); mTimeEndProperty += System.currentTimeMillis() - start; } while (!ended) { // follow VCARD ,it wont reach endProperty - if (mBuilder != null) { + if (mInterpreter != null) { long start = System.currentTimeMillis(); - mBuilder.startProperty(); + mInterpreter.startProperty(); mTimeStartProperty += System.currentTimeMillis() - start; } try { @@ -378,15 +452,15 @@ public class VCardParser_V21 extends VCardParser { Log.e(LOG_TAG, "Invalid line which looks like some comment was found. Ignored."); ended = false; } - if (mBuilder != null && !ended) { + if (mInterpreter != null && !ended) { long start = System.currentTimeMillis(); - mBuilder.endProperty(); + mInterpreter.endProperty(); mTimeEndProperty += System.currentTimeMillis() - start; } } } - /** + /* * item = [groups "."] name [params] ":" value CRLF * / [groups "."] "ADR" [params] ":" addressparts CRLF * / [groups "."] "ORG" [params] ":" orgparts CRLF @@ -394,7 +468,7 @@ public class VCardParser_V21 extends VCardParser { * / [groups "."] "AGENT" [params] ":" vcard CRLF */ protected boolean parseItem() throws IOException, VCardException { - mEncoding = sDefaultEncoding; + mCurrentEncoding = sDefaultEncoding; final String line = getNonEmptyLine(); long start = System.currentTimeMillis(); @@ -458,8 +532,10 @@ public class VCardParser_V21 extends VCardParser { throw new VCardInvalidCommentLineException(); } + // This loop is developed so that we don't have to take care of bottle neck here. + // Refactor carefully when you need to do so. for (int i = 0; i < length; i++) { - char ch = line.charAt(i); + final char ch = line.charAt(i); switch (state) { case STATE_GROUP_OR_PROPNAME: { if (ch == ':') { @@ -468,8 +544,8 @@ public class VCardParser_V21 extends VCardParser { mPreviousLine = line; return null; } - if (mBuilder != null) { - mBuilder.propertyName(propertyName); + if (mInterpreter != null) { + mInterpreter.propertyName(propertyName); } propertyNameAndValue[0] = propertyName; if (i < length - 1) { @@ -480,8 +556,8 @@ public class VCardParser_V21 extends VCardParser { return propertyNameAndValue; } else if (ch == '.') { String groupName = line.substring(nameIndex, i); - if (mBuilder != null) { - mBuilder.propertyGroup(groupName); + if (mInterpreter != null) { + mInterpreter.propertyGroup(groupName); } nameIndex = i + 1; } else if (ch == ';') { @@ -490,8 +566,8 @@ public class VCardParser_V21 extends VCardParser { mPreviousLine = line; return null; } - if (mBuilder != null) { - mBuilder.propertyName(propertyName); + if (mInterpreter != null) { + mInterpreter.propertyName(propertyName); } propertyNameAndValue[0] = propertyName; nameIndex = i + 1; @@ -528,7 +604,7 @@ public class VCardParser_V21 extends VCardParser { throw new VCardInvalidLineException("Invalid line: \"" + line + "\""); } - /** + /* * params = ";" [ws] paramlist * paramlist = paramlist [ws] ";" [ws] param * / param @@ -579,13 +655,13 @@ public class VCardParser_V21 extends VCardParser { protected void handleType(final String ptypeval) { String upperTypeValue = ptypeval; if (!(sKnownTypeSet.contains(upperTypeValue) || upperTypeValue.startsWith("X-")) && - !mUnknownTypeMap.contains(ptypeval)) { - mUnknownTypeMap.add(ptypeval); + !mUnknownTypeSet.contains(ptypeval)) { + mUnknownTypeSet.add(ptypeval); Log.w(LOG_TAG, "TYPE unsupported by vCard 2.1: " + ptypeval); } - if (mBuilder != null) { - mBuilder.propertyParamType("TYPE"); - mBuilder.propertyParamValue(upperTypeValue); + if (mInterpreter != null) { + mInterpreter.propertyParamType("TYPE"); + mInterpreter.propertyParamValue(upperTypeValue); } } @@ -595,13 +671,13 @@ public class VCardParser_V21 extends VCardParser { protected void handleValue(final String pvalueval) { if (!sKnownValueSet.contains(pvalueval.toUpperCase()) && pvalueval.startsWith("X-") && - !mUnknownValueMap.contains(pvalueval)) { - mUnknownValueMap.add(pvalueval); + !mUnknownValueSet.contains(pvalueval)) { + mUnknownValueSet.add(pvalueval); Log.w(LOG_TAG, "VALUE unsupported by vCard 2.1: " + pvalueval); } - if (mBuilder != null) { - mBuilder.propertyParamType("VALUE"); - mBuilder.propertyParamValue(pvalueval); + if (mInterpreter != null) { + mInterpreter.propertyParamType("VALUE"); + mInterpreter.propertyParamValue(pvalueval); } } @@ -611,11 +687,11 @@ public class VCardParser_V21 extends VCardParser { protected void handleEncoding(String pencodingval) throws VCardException { if (isValidEncoding(pencodingval) || pencodingval.startsWith("X-")) { - if (mBuilder != null) { - mBuilder.propertyParamType("ENCODING"); - mBuilder.propertyParamValue(pencodingval); + if (mInterpreter != null) { + mInterpreter.propertyParamType("ENCODING"); + mInterpreter.propertyParamValue(pencodingval); } - mEncoding = pencodingval; + mCurrentEncoding = pencodingval; } else { throw new VCardException("Unknown encoding \"" + pencodingval + "\""); } @@ -626,9 +702,9 @@ public class VCardParser_V21 extends VCardParser { * but today's vCard often contains other charset, so we allow them. */ protected void handleCharset(String charsetval) { - if (mBuilder != null) { - mBuilder.propertyParamType("CHARSET"); - mBuilder.propertyParamValue(charsetval); + if (mInterpreter != null) { + mInterpreter.propertyParamType("CHARSET"); + mInterpreter.propertyParamValue(charsetval); } } @@ -643,81 +719,100 @@ public class VCardParser_V21 extends VCardParser { String tmp = strArray[0]; int length = tmp.length(); for (int i = 0; i < length; i++) { - if (!isLetter(tmp.charAt(i))) { + if (!isAsciiLetter(tmp.charAt(i))) { throw new VCardException("Invalid Language: \"" + langval + "\""); } } tmp = strArray[1]; length = tmp.length(); for (int i = 0; i < length; i++) { - if (!isLetter(tmp.charAt(i))) { + if (!isAsciiLetter(tmp.charAt(i))) { throw new VCardException("Invalid Language: \"" + langval + "\""); } } - if (mBuilder != null) { - mBuilder.propertyParamType("LANGUAGE"); - mBuilder.propertyParamValue(langval); + if (mInterpreter != null) { + mInterpreter.propertyParamType("LANGUAGE"); + mInterpreter.propertyParamValue(langval); + } + } + + private boolean isAsciiLetter(char ch) { + if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + return true; } + return false; } /** * Mainly for "X-" type. This accepts any kind of type without check. */ protected void handleAnyParam(String paramName, String paramValue) { - if (mBuilder != null) { - mBuilder.propertyParamType(paramName); - mBuilder.propertyParamValue(paramValue); + if (mInterpreter != null) { + mInterpreter.propertyParamType(paramName); + mInterpreter.propertyParamValue(paramValue); } } protected void handlePropertyValue(String propertyName, String propertyValue) throws IOException, VCardException { - if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { + if (mCurrentEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { final long start = System.currentTimeMillis(); final String result = getQuotedPrintable(propertyValue); - if (mBuilder != null) { + if (mInterpreter != null) { ArrayList<String> v = new ArrayList<String>(); v.add(result); - mBuilder.propertyValues(v); + mInterpreter.propertyValues(v); } mTimeHandleQuotedPrintable += System.currentTimeMillis() - start; - } else if (mEncoding.equalsIgnoreCase("BASE64") || - mEncoding.equalsIgnoreCase("B")) { + } else if (mCurrentEncoding.equalsIgnoreCase("BASE64") || + mCurrentEncoding.equalsIgnoreCase("B")) { final long start = System.currentTimeMillis(); // It is very rare, but some BASE64 data may be so big that // OutOfMemoryError occurs. To ignore such cases, use try-catch. try { final String result = getBase64(propertyValue); - if (mBuilder != null) { + if (mInterpreter != null) { ArrayList<String> v = new ArrayList<String>(); v.add(result); - mBuilder.propertyValues(v); + mInterpreter.propertyValues(v); } } catch (OutOfMemoryError error) { Log.e(LOG_TAG, "OutOfMemoryError happened during parsing BASE64 data!"); - if (mBuilder != null) { - mBuilder.propertyValues(null); + if (mInterpreter != null) { + mInterpreter.propertyValues(null); } } mTimeHandleBase64 += System.currentTimeMillis() - start; } else { - if (!(mEncoding == null || mEncoding.equalsIgnoreCase("7BIT") - || mEncoding.equalsIgnoreCase("8BIT") - || mEncoding.toUpperCase().startsWith("X-"))) { - Log.w(LOG_TAG, "The encoding unsupported by vCard spec: \"" + mEncoding + "\"."); + if (!(mCurrentEncoding == null || mCurrentEncoding.equalsIgnoreCase("7BIT") + || mCurrentEncoding.equalsIgnoreCase("8BIT") + || mCurrentEncoding.toUpperCase().startsWith("X-"))) { + Log.w(LOG_TAG, "The encoding unsupported by vCard spec: \"" + mCurrentEncoding + "\"."); } final long start = System.currentTimeMillis(); - if (mBuilder != null) { + if (mInterpreter != null) { ArrayList<String> v = new ArrayList<String>(); v.add(maybeUnescapeText(propertyValue)); - mBuilder.propertyValues(v); + mInterpreter.propertyValues(v); } mTimeHandleMiscPropertyValue += System.currentTimeMillis() - start; } } - protected String getQuotedPrintable(String firstString) throws IOException, VCardException { + /** + * <p> + * Parses and returns Quoted-Printable. + * </p> + * + * @param firstString The string following a parameter name and attributes. + * Example: "string" in "ADR:ENCODING=QUOTED-PRINTABLE:string\n\r". + * @return whole Quoted-Printable string, including a given argument and following lines. + * Excludes the last empty line following to Quoted Printable lines. + * @throws IOException + * @throws VCardException + */ + private String getQuotedPrintable(String firstString) throws IOException, VCardException { // Specifically, there may be some padding between = and CRLF. // See the following: // @@ -743,7 +838,7 @@ public class VCardParser_V21 extends VCardParser { line = getLine(); if (line == null) { throw new VCardException( - "File ended during parsing quoted-printable String"); + "File ended during parsing a Quoted-Printable String"); } if (line.trim().endsWith("=")) { // remove "transport-padding" @@ -762,7 +857,7 @@ public class VCardParser_V21 extends VCardParser { return firstString; } } - + protected String getBase64(String firstString) throws IOException, VCardException { StringBuilder builder = new StringBuilder(); builder.append(firstString); @@ -783,8 +878,11 @@ public class VCardParser_V21 extends VCardParser { } /** + * <p> * Mainly for "ADR", "ORG", and "N" - * We do not care the number of strnosemi here. + * </p> + */ + /* * * addressparts = 0*6(strnosemi ";") strnosemi * ; PO Box, Extended Addr, Street, Locality, Region, @@ -798,26 +896,30 @@ public class VCardParser_V21 extends VCardParser { * strnosemi = *(*nonsemi ("\;" / "\" CRLF)) *nonsemi * ; To include a semicolon in this string, it must be escaped * ; with a "\" character. - * - * We are not sure whether we should add "\" CRLF to each value. - * For now, we exclude them. + * + * We do not care the number of "strnosemi" here. + * + * We are not sure whether we should add "\" CRLF to each value. We exclude them for now. */ protected void handleMultiplePropertyValue(String propertyName, String propertyValue) throws IOException, VCardException { - // vCard 2.1 does not allow QUOTED-PRINTABLE here, - // but some softwares/devices emit such data. - if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { + // vCard 2.1 does not allow QUOTED-PRINTABLE here, but some softwares/devices + // emit such data. + if (mCurrentEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { propertyValue = getQuotedPrintable(propertyValue); } - if (mBuilder != null) { - mBuilder.propertyValues(VCardUtils.constructListFromValue( + if (mInterpreter != null) { + mInterpreter.propertyValues(VCardUtils.constructListFromValue( propertyValue, (getVersion() == VCardConfig.FLAG_V30))); } } - /** - * vCard 2.1 specifies AGENT allows one vcard entry. It is not encoded at all. + /* + * vCard 2.1 specifies AGENT allows one vcard entry. Currently we emit an error + * toward the AGENT property. + * + * // TODO: Support AGENT property. * * item = ... * / [groups "."] "AGENT" @@ -832,7 +934,6 @@ public class VCardParser_V21 extends VCardParser { } else { throw new VCardAgentNotSupportedException("AGENT Property is not supported now."); } - // TODO: Support AGENT property. } /** @@ -862,31 +963,31 @@ public class VCardParser_V21 extends VCardParser { } @Override - public boolean parse(InputStream is, String charset, VCardInterpreter builder) + public boolean parse(InputStream is, String inputCharset, VCardInterpreter interpreter) throws IOException, VCardException { if (is == null) { throw new NullPointerException("InputStream must not be null."); } - if (charset == null) { - charset = VCardConfig.DEFAULT_TEMPORARY_CHARSET; + if (inputCharset == null) { + inputCharset = VCardConfig.DEFAULT_TEMPORARY_CHARSET; } - final InputStreamReader tmpReader = new InputStreamReader(is, charset); + final InputStreamReader tmpReader = new InputStreamReader(is, inputCharset); if (VCardConfig.showPerformanceLog()) { mReader = new CustomBufferedReader(tmpReader); } else { mReader = new BufferedReader(tmpReader); } - mBuilder = builder; + mInterpreter = interpreter; long start = System.currentTimeMillis(); - if (mBuilder != null) { - mBuilder.start(); + if (mInterpreter != null) { + mInterpreter.start(); } parseVCardFile(); - if (mBuilder != null) { - mBuilder.end(); + if (mInterpreter != null) { + mInterpreter.end(); } mTimeTotal += System.currentTimeMillis() - start; @@ -896,14 +997,14 @@ public class VCardParser_V21 extends VCardParser { return true; } - + @Override public void parse(InputStream is, String charset, VCardInterpreter builder, boolean canceled) throws IOException, VCardException { mCanceled = canceled; parse(is, charset, builder); } - + private void showPerformanceInfo() { Log.d(LOG_TAG, "Total parsing time: " + mTimeTotal + " ms"); if (mReader instanceof CustomBufferedReader) { @@ -924,11 +1025,4 @@ public class VCardParser_V21 extends VCardParser { mTimeHandleQuotedPrintable + " ms"); Log.d(LOG_TAG, "Time for handling Base64: " + mTimeHandleBase64 + " ms"); } - - private boolean isLetter(char ch) { - if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { - return true; - } - return false; - } } diff --git a/core/java/android/pim/vcard/VCardParser_V30.java b/core/java/android/pim/vcard/VCardParser_V30.java index 4ecfe97..f5d546b 100644 --- a/core/java/android/pim/vcard/VCardParser_V30.java +++ b/core/java/android/pim/vcard/VCardParser_V30.java @@ -92,8 +92,8 @@ public class VCardParser_V30 extends VCardParser_V21 { if (!(sAcceptablePropsWithParam.contains(propertyName) || acceptablePropsWithoutParam.contains(propertyName) || propertyName.startsWith("X-")) && - !mUnknownTypeMap.contains(propertyName)) { - mUnknownTypeMap.add(propertyName); + !mUnknownTypeSet.contains(propertyName)) { + mUnknownTypeSet.add(propertyName); Log.w(LOG_TAG, "Property name unsupported by vCard 3.0: " + propertyName); } return true; @@ -248,13 +248,13 @@ public class VCardParser_V30 extends VCardParser_V21 { @Override protected void handleType(String ptypevalues) { String[] ptypeArray = ptypevalues.split(","); - mBuilder.propertyParamType("TYPE"); + mInterpreter.propertyParamType("TYPE"); for (String value : ptypeArray) { int length = value.length(); if (length >= 2 && value.startsWith("\"") && value.endsWith("\"")) { - mBuilder.propertyParamValue(value.substring(1, value.length() - 1)); + mInterpreter.propertyParamValue(value.substring(1, value.length() - 1)); } else { - mBuilder.propertyParamValue(value); + mInterpreter.propertyParamValue(value); } } } |