14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2009 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage com.android.vcard;
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.exception.VCardException;
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.io.IOException;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.io.InputStream;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Arrays;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Collections;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashSet;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Set;
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/**
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * vCard parser for vCard 2.1. See the specification for more detail about the spec itself.
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p>
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * The spec is written in 1996, and currently various types of "vCard 2.1" exist.
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * To handle real the world vCard formats appropriately and effectively, this class does not
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * obey with strict vCard 2.1.
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * In stead, not only vCard spec but also real world vCard is considered.
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * e.g. A lot of devices and softwares let vCard importer/exporter to use
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the PNG format to determine the type of image, while it is not allowed in
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the original specification. As of 2010, we can see even the FLV format
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * (possible in Japanese mobile phones).
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
431de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawapublic final class VCardParser_V21 extends VCardParser {
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * A unmodifiable Set storing the property names available in the vCard 2.1 specification.
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sKnownPropertyNameSet =
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableSet(new HashSet<String>(
49c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa                    Arrays.asList("BEGIN", "END", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL",
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER")));
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * A unmodifiable Set storing the types known in vCard 2.1.
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sKnownTypeSet =
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableSet(new HashSet<String>(
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    Arrays.asList("DOM", "INTL", "POSTAL", "PARCEL", "HOME", "WORK",
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "PREF", "VOICE", "FAX", "MSG", "CELL", "PAGER", "BBS",
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "MODEM", "CAR", "ISDN", "VIDEO", "AOL", "APPLELINK",
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "ATTMAIL", "CIS", "EWORLD", "INTERNET", "IBMMAIL",
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "MCIMAIL", "POWERSHARE", "PRODIGY", "TLX", "X400", "GIF",
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "CGM", "WMF", "BMP", "MET", "PMB", "DIB", "PICT", "TIFF",
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "PDF", "PS", "JPEG", "QTIME", "MPEG", "MPEG2", "AVI",
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                            "WAVE", "AIFF", "PCM", "X509", "PGP")));
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * A unmodifiable Set storing the values for the type "VALUE", available in the vCard 2.1.
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sKnownValueSet =
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableSet(new HashSet<String>(
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    Arrays.asList("INLINE", "URL", "CONTENT-ID", "CID")));
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * A unmodifiable Set storing the values for the type "ENCODING", available in the vCard 2.1.
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Though vCard 2.1 specification does not allow "B" encoding, some data may have it.
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We allow it for safety.
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sAvailableEncoding =
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        Collections.unmodifiableSet(new HashSet<String>(
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                Arrays.asList(VCardConstants.PARAM_ENCODING_7BIT,
864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardConstants.PARAM_ENCODING_8BIT,
874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardConstants.PARAM_ENCODING_QP,
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardConstants.PARAM_ENCODING_BASE64,
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        VCardConstants.PARAM_ENCODING_B)));
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final VCardParserImpl_V21 mVCardParserImpl;
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardParser_V21() {
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl = new VCardParserImpl_V21();
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardParser_V21(int vcardType) {
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl = new VCardParserImpl_V21(vcardType);
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
101c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa    @Override
1021de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void addInterpreter(VCardInterpreter interpreter) {
1031de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        mVCardParserImpl.addInterpreter(interpreter);
1041de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
1051de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
1061de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    @Override
1071de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void parse(InputStream is) throws IOException, VCardException {
1081de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        mVCardParserImpl.parse(is);
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
111c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa    @Override
11256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    public void parseOne(InputStream is) throws IOException, VCardException {
11356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        mVCardParserImpl.parseOne(is);
11456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
11556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
11656650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    @Override
1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void cancel() {
1184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl.cancel();
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
121