/* * Copyright (C) 2011 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.util.Log; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; /** * Represents vCard's property, or logical "one line" of each vCard entry. * * e.g. * Given a vCard below, objects for N:name, TEL:1111111111 are * "property". * * * BEGIN:VCARD * N:name * TEL:1111111111 * END:VCARD * * * vCard's property has three elements: name, parameter (or param), and value. Name is the name * of each property. Parameter or param is additional information for the property. Value is one * or multiple values representing the parameter. * * e.g. * N;CHARSET=UTF-8:Joe;Due;M.;Mr.;Ph.D., has "N" for name, "CHALSET=UTF-8" for param, * and "Joe;Due;M.;Mr.;Ph.D." for value. * * Usually params are represented as "key=value" pair, but not always * (The property TEL;WORK;VOICE:(111) 555-1212 has two params without key "TYPE", * which are same as "TYPE=WORK" and "TYPE=VOICE". In vCard 3.0, we can even express them as * "TYPE=WORK,VOICE"). * * Sometimes (not always) value can be separated by semi-colon. In the example above "Joe;Due;;;" * should be interpreted as five strings: "Joe" (for family name), "Due" (for given name), "M." * (for middle name), "Mr." (for prefix), and "Ph.D." (for suffix). Whether the value is * separable or not is specified by vCard specs. */ public class VCardProperty { private static final String LOG_TAG = VCardConstants.LOG_TAG; private String mName; private List mGroupList; private Map> mParameterMap = new HashMap>(); private String mRawValue; private List mValueList; private byte[] mByteValue; public void setName(String name) { if (mName != null) { Log.w(LOG_TAG, String.format("Property name is re-defined " + "(existing: %s, requested: %s", mName, name)); } mName = name; } public void addGroup(String group) { if (mGroupList == null) { mGroupList = new ArrayList(); } mGroupList.add(group); } public void setParameter(final String paramName, final String paramValue) { mParameterMap.clear(); addParameter(paramName, paramValue); } public void addParameter(final String paramName, final String paramValue) { Collection values; if (!mParameterMap.containsKey(paramName)) { if (paramName.equals("TYPE")) { values = new HashSet(); } else { values = new ArrayList(); } mParameterMap.put(paramName, values); } else { values = mParameterMap.get(paramName); } values.add(paramValue); } public void setRawValue(String rawValue) { mRawValue = rawValue; } // TODO: would be much better to have translateRawValue() functionality instead of forcing // VCardParserImpl does this job. public void setValues(String... propertyValues) { mValueList = Arrays.asList(propertyValues); } public void setValues(List propertyValueList) { mValueList = propertyValueList; } public void addValues(String... propertyValues) { if (mValueList == null) { mValueList = Arrays.asList(propertyValues); } else { mValueList.addAll(Arrays.asList(propertyValues)); } } public void addValues(List propertyValueList) { if (mValueList == null) { mValueList = new ArrayList(propertyValueList); } else { mValueList.addAll(propertyValueList); } } public void setByteValue(byte[] byteValue) { mByteValue = byteValue; } public String getName() { return mName; } public List getGroupList() { return mGroupList; } public Map> getParameterMap() { return mParameterMap; } public Collection getParameters(String type) { return mParameterMap.get(type); } public String getRawValue() { return mRawValue; } public List getValueList() { return mValueList; } public byte[] getByteValue() { return mByteValue; } }