/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.vcard; import android.accounts.Account; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** *

* The {@link VCardInterpreter} implementation which enables {@link VCardEntryHandler} objects * to easily handle each vCard entry. *

*

* This class understand details inside vCard and translates it to {@link VCardEntry}. * Then the class throw it to {@link VCardEntryHandler} registered via * {@link #addEntryHandler(VCardEntryHandler)}, so that all those registered objects * are able to handle the {@link VCardEntry} object. *

*

* If you want to know the detail inside vCard, it would be better to implement * {@link VCardInterpreter} directly, instead of relying on this class and * {@link VCardEntry} created by the object. *

*/ public class VCardEntryConstructor implements VCardInterpreter { private static String LOG_TAG = VCardConstants.LOG_TAG; /** * Represents current stack of VCardEntry. Used to support nested vCard (vCard 2.1). */ private final List mEntryStack = new ArrayList(); private VCardEntry mCurrentEntry; private final int mVCardType; private final Account mAccount; private final List mEntryHandlers = new ArrayList(); public VCardEntryConstructor() { this(VCardConfig.VCARD_TYPE_V21_GENERIC, null, null); } public VCardEntryConstructor(final int vcardType) { this(vcardType, null, null); } public VCardEntryConstructor(final int vcardType, final Account account) { this(vcardType, account, null); } /** * @deprecated targetCharset is not used anymore. * Use {@link #VCardEntryConstructor(int, Account)} */ @Deprecated public VCardEntryConstructor(final int vcardType, final Account account, String targetCharset) { mVCardType = vcardType; mAccount = account; } public void addEntryHandler(VCardEntryHandler entryHandler) { mEntryHandlers.add(entryHandler); } @Override public void onVCardStarted() { for (VCardEntryHandler entryHandler : mEntryHandlers) { entryHandler.onStart(); } } @Override public void onVCardEnded() { for (VCardEntryHandler entryHandler : mEntryHandlers) { entryHandler.onEnd(); } } public void clear() { mCurrentEntry = null; mEntryStack.clear(); } @Override public void onEntryStarted() { mCurrentEntry = new VCardEntry(mVCardType, mAccount); mEntryStack.add(mCurrentEntry); } @Override public void onEntryEnded() { mCurrentEntry.consolidateFields(); for (VCardEntryHandler entryHandler : mEntryHandlers) { entryHandler.onEntryCreated(mCurrentEntry); } final int size = mEntryStack.size(); if (size > 1) { VCardEntry parent = mEntryStack.get(size - 2); parent.addChild(mCurrentEntry); mCurrentEntry = parent; } else { mCurrentEntry = null; } mEntryStack.remove(size - 1); } @Override public void onPropertyCreated(VCardProperty property) { mCurrentEntry.addProperty(property); } }