1526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen/* 2526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2007-2008 Esmertec AG. 3526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Copyright (C) 2007-2008 The Android Open Source Project 4526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 5526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Licensed under the Apache License, Version 2.0 (the "License"); 6526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * you may not use this file except in compliance with the License. 7526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * You may obtain a copy of the License at 8526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 9526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * http://www.apache.org/licenses/LICENSE-2.0 10526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 11526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Unless required by applicable law or agreed to in writing, software 12526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * distributed under the License is distributed on an "AS IS" BASIS, 13526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * See the License for the specific language governing permissions and 15526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * limitations under the License. 16526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 17526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 18526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpackage com.google.android.mms.pdu; 19526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 20526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport android.util.Log; 21526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 22526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.io.ByteArrayOutputStream; 23526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.io.IOException; 24526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.io.UnsupportedEncodingException; 25526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenimport java.util.ArrayList; 26526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 27526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen/** 28526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Encoded-string-value = Text-string | Value-length Char-set Text-string 29526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 30526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wenpublic class EncodedStringValue implements Cloneable { 31526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final String TAG = "EncodedStringValue"; 32526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final boolean DEBUG = false; 33526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private static final boolean LOCAL_LOGV = false; 34526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 35526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 36526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * The Char-set value. 37526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 38526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private int mCharacterSet; 39526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 40526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 41526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * The Text-string value. 42526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 43526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen private byte[] mData; 44526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 45526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 46526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Constructor. 47526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 48526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param charset the Char-set value 49526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param data the Text-string value 50526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @throws NullPointerException if Text-string value is null. 51526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 52526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public EncodedStringValue(int charset, byte[] data) { 53526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen // TODO: CharSet needs to be validated against MIBEnum. 54526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if(null == data) { 55526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen throw new NullPointerException("EncodedStringValue: Text-string is null."); 56526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 57526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 58526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCharacterSet = charset; 59526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mData = new byte[data.length]; 60526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen System.arraycopy(data, 0, mData, 0, data.length); 61526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 62526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 63526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 64526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Constructor. 65526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 66526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param data the Text-string value 67526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @throws NullPointerException if Text-string value is null. 68526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 69526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public EncodedStringValue(byte[] data) { 70526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen this(CharacterSets.DEFAULT_CHARSET, data); 71526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 72526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 73526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public EncodedStringValue(String data) { 74526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 75526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mData = data.getBytes(CharacterSets.DEFAULT_CHARSET_NAME); 76526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCharacterSet = CharacterSets.DEFAULT_CHARSET; 77526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } catch (UnsupportedEncodingException e) { 78526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.e(TAG, "Default encoding must be supported.", e); 79526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 80526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 81526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 82526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 83526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Get Char-set value. 84526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 85526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @return the value 86526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 87526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public int getCharacterSet() { 88526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return mCharacterSet; 89526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 90526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 91526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 92526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Set Char-set value. 93526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 94526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param charset the Char-set value 95526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 96526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public void setCharacterSet(int charset) { 97526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen // TODO: CharSet needs to be validated against MIBEnum. 98526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mCharacterSet = charset; 99526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 100526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 101526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 102526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Get Text-string value. 103526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 104526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @return the value 105526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 106526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public byte[] getTextString() { 107526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen byte[] byteArray = new byte[mData.length]; 108526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 109526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen System.arraycopy(mData, 0, byteArray, 0, mData.length); 110526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return byteArray; 111526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 112526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 113526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 114526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Set Text-string value. 115526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 116526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param textString the Text-string value 117526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @throws NullPointerException if Text-string value is null. 118526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 119526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public void setTextString(byte[] textString) { 120526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if(null == textString) { 121526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen throw new NullPointerException("EncodedStringValue: Text-string is null."); 122526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 123526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 124526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mData = new byte[textString.length]; 125526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen System.arraycopy(textString, 0, mData, 0, textString.length); 126526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 127526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 128526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 129526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Convert this object to a {@link java.lang.String}. If the encoding of 130526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * the EncodedStringValue is null or unsupported, it will be 131526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * treated as iso-8859-1 encoding. 132526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 133526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @return The decoded String. 134526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 135526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public String getString() { 136526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (CharacterSets.ANY_CHARSET == mCharacterSet) { 137526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new String(mData); // system default encoding. 138526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } else { 139526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 140526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen String name = CharacterSets.getMimeName(mCharacterSet); 141526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new String(mData, name); 142526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } catch (UnsupportedEncodingException e) { 143526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (LOCAL_LOGV) { 144526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.v(TAG, e.getMessage(), e); 145526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 146526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 147526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new String(mData, CharacterSets.MIMENAME_ISO_8859_1); 148d717d188558f47cae0519a79af174fb8e9e38816Neil Fuller } catch (UnsupportedEncodingException e2) { 149526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new String(mData); // system default encoding. 150526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 151526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 152526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 153526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 154526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 155526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 156526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Append to Text-string. 157526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 158526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param textString the textString to append 159526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @throws NullPointerException if the text String is null 160526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * or an IOException occured. 161526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 162526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public void appendTextString(byte[] textString) { 163526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if(null == textString) { 164526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen throw new NullPointerException("Text-string is null."); 165526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 166526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 167526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if(null == mData) { 168526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mData = new byte[textString.length]; 169526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen System.arraycopy(textString, 0, mData, 0, textString.length); 170526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } else { 171526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen ByteArrayOutputStream newTextString = new ByteArrayOutputStream(); 172526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 173526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen newTextString.write(mData); 174526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen newTextString.write(textString); 175526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } catch (IOException e) { 176526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen e.printStackTrace(); 177526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen throw new NullPointerException( 178526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen "appendTextString: failed when write a new Text-string"); 179526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 180526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 181526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen mData = newTextString.toByteArray(); 182526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 183526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 184526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 185526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /* 186526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * (non-Javadoc) 187526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @see java.lang.Object#clone() 188526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 189526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen @Override 190526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public Object clone() throws CloneNotSupportedException { 191526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen super.clone(); 192526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen int len = mData.length; 193526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen byte[] dstBytes = new byte[len]; 194526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen System.arraycopy(mData, 0, dstBytes, 0, len); 195526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 196526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 197526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new EncodedStringValue(mCharacterSet, dstBytes); 198526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } catch (Exception e) { 199526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen Log.e(TAG, "failed to clone an EncodedStringValue: " + this); 200526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen e.printStackTrace(); 201526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen throw new CloneNotSupportedException(e.getMessage()); 202526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 203526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 204526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 205526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 206526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Split this encoded string around matches of the given pattern. 207526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * 208526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @param pattern the delimiting pattern 209526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * @return the array of encoded strings computed by splitting this encoded 210526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * string around matches of the given pattern 211526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 212526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public EncodedStringValue[] split(String pattern) { 213526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen String[] temp = getString().split(pattern); 214526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen EncodedStringValue[] ret = new EncodedStringValue[temp.length]; 215526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen for (int i = 0; i < ret.length; ++i) { 216526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen try { 217526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen ret[i] = new EncodedStringValue(mCharacterSet, 218526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen temp[i].getBytes()); 219d717d188558f47cae0519a79af174fb8e9e38816Neil Fuller } catch (NullPointerException e) { 220526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen // Can't arrive here 221526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return null; 222526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 223526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 224526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return ret; 225526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 226526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 227526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 228526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Extract an EncodedStringValue[] from a given String. 229526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 230526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public static EncodedStringValue[] extract(String src) { 231526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen String[] values = src.split(";"); 232526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 233526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen ArrayList<EncodedStringValue> list = new ArrayList<EncodedStringValue>(); 234526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen for (int i = 0; i < values.length; i++) { 235526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (values[i].length() > 0) { 236526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen list.add(new EncodedStringValue(values[i])); 237526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 238526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 239526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 240526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen int len = list.size(); 241526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (len > 0) { 242526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return list.toArray(new EncodedStringValue[len]); 243526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } else { 244526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return null; 245526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 246526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 247526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 248526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen /** 249526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen * Concatenate an EncodedStringValue[] into a single String. 250526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen */ 251526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public static String concat(EncodedStringValue[] addr) { 252526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen StringBuilder sb = new StringBuilder(); 253526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen int maxIndex = addr.length - 1; 254526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen for (int i = 0; i <= maxIndex; i++) { 255526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen sb.append(addr[i].getString()); 256526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (i < maxIndex) { 257526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen sb.append(";"); 258526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 259526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 260526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 261526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return sb.toString(); 262526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 263526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 264526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public static EncodedStringValue copy(EncodedStringValue value) { 265526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (value == null) { 266526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return null; 267526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 268526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 269526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return new EncodedStringValue(value.mCharacterSet, value.mData); 270526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 271526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen 272526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen public static EncodedStringValue[] encodeStrings(String[] array) { 273526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen int count = array.length; 274526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen if (count > 0) { 275526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen EncodedStringValue[] encodedArray = new EncodedStringValue[count]; 276526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen for (int i = 0; i < count; i++) { 277526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen encodedArray[i] = new EncodedStringValue(array[i]); 278526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 279526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return encodedArray; 280526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 281526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen return null; 282526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen } 283526ecd1799a2fc467cfce114eae3578b42ccb786Ye Wen} 284