1be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa/* 2be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project 3be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * 4be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 5be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * you may not use this file except in compliance with the License. 6be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * You may obtain a copy of the License at 7be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * 8be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 9be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * 10be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 11be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 12be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * See the License for the specific language governing permissions and 14be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * limitations under the License. 15be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa */ 16be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawapackage com.android.vcard; 17be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 18be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawaimport java.util.Set; 19be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 20be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 21be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa/** 22be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * <p> 23be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * Basic implementation parsing vCard 4.0. 24be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * </p> 25be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * <p> 2602117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa * vCard 4.0 is not published yet. Also this implementation is premature. 27be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * </p> 28be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * @hide 29be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa */ 30be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa/* package */ class VCardParserImpl_V40 extends VCardParserImpl_V30 { 3102117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa // private static final String LOG_TAG = VCardConstants.LOG_TAG; 32be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 33be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa public VCardParserImpl_V40() { 34be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa super(); 35be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 36be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 37be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa public VCardParserImpl_V40(final int vcardType) { 38be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa super(vcardType); 39be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 40be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 41be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa @Override 42be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa protected int getVersion() { 43be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa return VCardConfig.VERSION_40; 44be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 45be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 46be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa @Override 47be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa protected String getVersionString() { 48be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa return VCardConstants.VERSION_V40; 49be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 50be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 51be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa /** 52be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa * We escape "\N" into new line for safety. 53be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa */ 54be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa @Override 55be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa protected String maybeUnescapeText(final String text) { 56be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa return unescapeText(text); 57be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 58be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 59be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa public static String unescapeText(final String text) { 60be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa // TODO: more strictly, vCard 4.0 requires different type of unescaping rule 61be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa // toward each property. 62be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa final StringBuilder builder = new StringBuilder(); 63be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa final int length = text.length(); 64be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa for (int i = 0; i < length; i++) { 65be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa char ch = text.charAt(i); 66be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa if (ch == '\\' && i < length - 1) { 67be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa final char next_ch = text.charAt(++i); 68be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa if (next_ch == 'n' || next_ch == 'N') { 69be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa builder.append("\n"); 70be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } else { 71be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa builder.append(next_ch); 72be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 73be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } else { 74be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa builder.append(ch); 75be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 76be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 77be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa return builder.toString(); 78be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 79be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa 804560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa public static String unescapeCharacter(final char ch) { 814560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa if (ch == 'n' || ch == 'N') { 824560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa return "\n"; 834560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa } else { 844560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa return String.valueOf(ch); 854560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa } 864560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa } 874560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa 88be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa @Override 89be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa protected Set<String> getKnownPropertyNameSet() { 90be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa return VCardParser_V40.sKnownPropertyNameSet; 91be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa } 92be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa}