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