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