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 3.0. See RFC 2426 for more detail.
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p>
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * This parser allows vCard format which is not allowed in the RFC, since
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * we have seen several vCard 3.0 files which don't comply with it.
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p>
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * e.g. vCard 3.0 does not allow "CHARSET" attribute, but some actual files
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * have it and they uses non UTF-8 charsets. UTF-8 is recommended in RFC 2426,
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * but it is not a must. We silently allow "CHARSET".
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p>
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
411de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawapublic class VCardParser_V30 extends VCardParser {
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sKnownPropertyNameSet =
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(
44c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa                    "BEGIN", "END", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL",
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER", // 2.1
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    "NAME", "PROFILE", "SOURCE", "NICKNAME", "CLASS",
48422643669a44d08ca8b22a73286fae988a288b0eDaisuke Miyakawa                    "SORT-STRING", "CATEGORIES", "PRODID",  // 3.0
49422643669a44d08ca8b22a73286fae988a288b0eDaisuke Miyakawa                    "IMPP"))); // RFC 4770
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * A unmodifiable Set storing the values for the type "ENCODING", available in the vCard 3.0.
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Though vCard 2.1 specification does not allow "7BIT" or "BASE64", we allow them for safety.
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * "QUOTED-PRINTABLE" is not allowed in vCard 3.0 and not in this parser either,
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * because the encoding ambiguates how the vCard file to be parsed.
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final Set<String> sAcceptableEncoding =
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    VCardConstants.PARAM_ENCODING_7BIT,
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    VCardConstants.PARAM_ENCODING_8BIT,
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    VCardConstants.PARAM_ENCODING_BASE64,
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    VCardConstants.PARAM_ENCODING_B)));
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private final VCardParserImpl_V30 mVCardParserImpl;
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardParser_V30() {
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl = new VCardParserImpl_V30();
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public VCardParser_V30(int vcardType) {
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl = new VCardParserImpl_V30(vcardType);
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
80c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa    @Override
811de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void addInterpreter(VCardInterpreter interpreter) {
821de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        mVCardParserImpl.addInterpreter(interpreter);
831de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
841de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
851de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    @Override
861de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    public void parse(InputStream is) throws IOException, VCardException {
871de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        mVCardParserImpl.parse(is);
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
90c955c8b0da0c9fcbad0ddcae76641358c27e72cdDaisuke Miyakawa    @Override
9156650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    public void parseOne(InputStream is) throws IOException, VCardException {
9256650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa        mVCardParserImpl.parseOne(is);
9356650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    }
9456650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa
9556650608f09fc75f260c03e00456ef3d1e60c929Daisuke Miyakawa    @Override
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void cancel() {
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mVCardParserImpl.cancel();
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
100