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