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