1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2007-2008 Esmertec AG. 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2007-2008 The Android Open Source Project 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.mmslib.pdu; 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.util.Log; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.io.ByteArrayOutputStream; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.io.IOException; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.io.UnsupportedEncodingException; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.ArrayList; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/** 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Encoded-string-value = Text-string | Value-length Char-set Text-string 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class EncodedStringValue implements Cloneable { 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String TAG = "EncodedStringValue"; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final boolean DEBUG = false; 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final boolean LOCAL_LOGV = false; 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * The Char-set value. 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private int mCharacterSet; 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * The Text-string value. 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private byte[] mData; 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Constructor. 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param charset the Char-set value 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param data the Text-string value 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @throws NullPointerException if Text-string value is null. 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public EncodedStringValue(int charset, byte[] data) { 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // TODO: CharSet needs to be validated against MIBEnum. 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (null == data) { 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new NullPointerException("EncodedStringValue: Text-string is null."); 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mCharacterSet = charset; 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = new byte[data.length]; 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd System.arraycopy(data, 0, mData, 0, data.length); 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Constructor. 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param data the Text-string value 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @throws NullPointerException if Text-string value is null. 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public EncodedStringValue(byte[] data) { 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this(CharacterSets.DEFAULT_CHARSET, data); 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public EncodedStringValue(String data) { 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this(CharacterSets.DEFAULT_CHARSET, data); 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Constructor 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param charset 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param data The text in Java String 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @throws NullPointerException if Text-string value is null. 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public EncodedStringValue(int charset, String data) { 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (null == data) { 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new NullPointerException("EncodedStringValue: Text-string is null"); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mCharacterSet = charset; 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = data.getBytes(CharacterSets.getMimeName(charset)); 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (UnsupportedEncodingException e) { 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Log.e(TAG, "Input encoding " + charset + " must be supported.", e); 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = data.getBytes(); 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Get Char-set value. 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @return the value 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getCharacterSet() { 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mCharacterSet; 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Set Char-set value. 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param charset the Char-set value 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setCharacterSet(int charset) { 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // TODO: CharSet needs to be validated against MIBEnum. 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mCharacterSet = charset; 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Get Text-string value. 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @return the value 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public byte[] getTextString() { 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd byte[] byteArray = new byte[mData.length]; 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd System.arraycopy(mData, 0, byteArray, 0, mData.length); 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return byteArray; 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Set Text-string value. 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param textString the Text-string value 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @throws NullPointerException if Text-string value is null. 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setTextString(byte[] textString) { 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (null == textString) { 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new NullPointerException("EncodedStringValue: Text-string is null."); 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = new byte[textString.length]; 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd System.arraycopy(textString, 0, mData, 0, textString.length); 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Convert this object to a {@link java.lang.String}. If the encoding of 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * the EncodedStringValue is null or unsupported, it will be 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * treated as iso-8859-1 encoding. 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @return The decoded String. 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public String getString() { 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (CharacterSets.ANY_CHARSET == mCharacterSet) { 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new String(mData); // system default encoding. 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd String name = CharacterSets.getMimeName(mCharacterSet); 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new String(mData, name); 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (UnsupportedEncodingException e) { 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (LOCAL_LOGV) { 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Log.v(TAG, e.getMessage(), e); 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new String(mData, CharacterSets.MIMENAME_ISO_8859_1); 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (UnsupportedEncodingException exception) { 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new String(mData); // system default encoding. 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Append to Text-string. 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param textString the textString to append 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @throws NullPointerException if the text String is null 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * or an IOException occured. 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void appendTextString(byte[] textString) { 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (null == textString) { 179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new NullPointerException("Text-string is null."); 180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (null == mData) { 183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = new byte[textString.length]; 184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd System.arraycopy(textString, 0, mData, 0, textString.length); 185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ByteArrayOutputStream newTextString = new ByteArrayOutputStream(); 187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd newTextString.write(mData); 189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd newTextString.write(textString); 190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (IOException e) { 191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd e.printStackTrace(); 192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new NullPointerException( 193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd "appendTextString: failed when write a new Text-string"); 194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mData = newTextString.toByteArray(); 197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /* 201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * (non-Javadoc) 202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @see java.lang.Object#clone() 203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public Object clone() throws CloneNotSupportedException { 206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.clone(); 207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd int len = mData.length; 208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd byte[] dstBytes = new byte[len]; 209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd System.arraycopy(mData, 0, dstBytes, 0, len); 210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new EncodedStringValue(mCharacterSet, dstBytes); 213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (Exception e) { 214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Log.e(TAG, "failed to clone an EncodedStringValue: " + this); 215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd e.printStackTrace(); 216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd throw new CloneNotSupportedException(e.getMessage()); 217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Split this encoded string around matches of the given pattern. 222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param pattern the delimiting pattern 224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @return the array of encoded strings computed by splitting this encoded 225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * string around matches of the given pattern 226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public EncodedStringValue[] split(String pattern) { 228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd String[] temp = getString().split(pattern); 229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd EncodedStringValue[] ret = new EncodedStringValue[temp.length]; 230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (int i = 0; i < ret.length; ++i) { 231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ret[i] = new EncodedStringValue(mCharacterSet, 233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd temp[i].getBytes()); 234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } catch (NullPointerException exception) { 235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Can't arrive here 236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return ret; 240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Extract an EncodedStringValue[] from a given String. 244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static EncodedStringValue[] extract(String src) { 246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd String[] values = src.split(";"); 247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ArrayList<EncodedStringValue> list = new ArrayList<EncodedStringValue>(); 249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (int i = 0; i < values.length; i++) { 250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (values[i].length() > 0) { 251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd list.add(new EncodedStringValue(values[i])); 252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd int len = list.size(); 256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (len > 0) { 257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return list.toArray(new EncodedStringValue[len]); 258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Concatenate an EncodedStringValue[] into a single String. 265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static String concat(EncodedStringValue[] addr) { 267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd StringBuilder sb = new StringBuilder(); 268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd int maxIndex = addr.length - 1; 269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (int i = 0; i <= maxIndex; i++) { 270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd sb.append(addr[i].getString()); 271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (i < maxIndex) { 272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd sb.append(";"); 273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return sb.toString(); 277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static EncodedStringValue copy(EncodedStringValue value) { 280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (value == null) { 281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new EncodedStringValue(value.mCharacterSet, value.mData); 285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static EncodedStringValue[] encodeStrings(String[] array) { 288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd int count = array.length; 289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (count > 0) { 290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd EncodedStringValue[] encodedArray = new EncodedStringValue[count]; 291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (int i = 0; i < count; i++) { 292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd encodedArray[i] = new EncodedStringValue(array[i]); 293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return encodedArray; 295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 299