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}