/* * 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.tests.testutils; import com.android.vcard.VCardConfig; import com.android.vcard.VCardInterpreter; import com.android.vcard.VCardProperty; import com.android.vcard.VCardUtils; import android.content.ContentValues; import android.util.Base64; import android.util.CharsetUtils; import android.util.Log; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; /** *

* The class storing the parse result to custom datastruct: * {@link VNode}, and {@link PropertyNode}. * Maybe several vcard instance, so use vNodeList to store. *

*

* This is called VNode, not VCardNode, since it was used for expressing vCalendar (iCal). *

*/ public class VNodeBuilder implements VCardInterpreter { private static String LOG_TAG = "VNodeBuilder"; private List mVNodeList = new ArrayList(); private VNode mCurrentVNode; /** * The charset using which VParser parses the text. */ private String mSourceCharset; /** * The charset with which byte array is encoded to String. */ private String mTargetCharset; private boolean mStrictLineBreakParsing; public VNodeBuilder() { this(VCardConfig.DEFAULT_IMPORT_CHARSET, false); } public VNodeBuilder(String targetCharset, boolean strictLineBreakParsing) { mSourceCharset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET; if (targetCharset != null) { mTargetCharset = targetCharset; } else { mTargetCharset = VCardConfig.DEFAULT_IMPORT_CHARSET; } mStrictLineBreakParsing = strictLineBreakParsing; } @Override public void onVCardStarted() { } @Override public void onVCardEnded() { } @Override public void onEntryStarted() { mCurrentVNode = new VNode(); mVNodeList.add(mCurrentVNode); } @Override public void onEntryEnded() { int lastIndex = mVNodeList.size() - 1; mVNodeList.remove(lastIndex--); mCurrentVNode = lastIndex >= 0 ? mVNodeList.get(lastIndex) : null; } @Override public void onPropertyCreated(VCardProperty property) { // TODO: remove PropertyNode. PropertyNode propNode = new PropertyNode(); propNode.propName = property.getName(); List groupList = property.getGroupList(); if (groupList != null) { propNode.propGroupSet.addAll(groupList); } Map> propertyParameterMap = property.getParameterMap(); for (String paramType : propertyParameterMap.keySet()) { Collection paramValueList = propertyParameterMap.get(paramType); if (paramType.equalsIgnoreCase("TYPE")) { propNode.paramMap_TYPE.addAll(paramValueList); } else { for (String paramValue : paramValueList) { propNode.paramMap.put(paramType, paramValue); } } } // TODO: just redundant if (property.getRawValue() == null) { propNode.propValue_bytes = null; propNode.propValue_vector.clear(); propNode.propValue_vector.add(""); propNode.propValue = ""; return; } final List values = property.getValueList(); if (values == null || values.size() == 0) { propNode.propValue_vector.clear(); propNode.propValue_vector.add(""); propNode.propValue = ""; } else { propNode.propValue_vector.addAll(values); propNode.propValue = listToString(propNode.propValue_vector); } propNode.propValue_bytes = property.getByteValue(); mCurrentVNode.propList.add(propNode); } private String listToString(List list){ int size = list.size(); if (size > 1) { StringBuilder typeListB = new StringBuilder(); for (String type : list) { typeListB.append(type).append(";"); } int len = typeListB.length(); if (len > 0 && typeListB.charAt(len - 1) == ';') { return typeListB.substring(0, len - 1); } return typeListB.toString(); } else if (size == 1) { return list.get(0); } else { return ""; } } public String getResult(){ throw new RuntimeException("Not supported"); } public List getVNodeList() { return mVNodeList; } public VNode getCurrentVNode() { return mCurrentVNode; } }