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 android.support.v7.mms.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        try {
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mData = data.getBytes(CharacterSets.DEFAULT_CHARSET_NAME);
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mCharacterSet = CharacterSets.DEFAULT_CHARSET;
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } catch (UnsupportedEncodingException e) {
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Log.e(TAG, "Default encoding must be supported.", e);
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Char-set value.
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getCharacterSet() {
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mCharacterSet;
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Char-set value.
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param charset the Char-set value
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setCharacterSet(int charset) {
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // TODO: CharSet needs to be validated against MIBEnum.
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mCharacterSet = charset;
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Text-string value.
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the value
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public byte[] getTextString() {
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        byte[] byteArray = new byte[mData.length];
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        System.arraycopy(mData, 0, byteArray, 0, mData.length);
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return byteArray;
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Set Text-string value.
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param textString the Text-string value
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if Text-string value is null.
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setTextString(byte[] textString) {
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if(null == textString) {
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("EncodedStringValue: Text-string is null.");
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mData = new byte[textString.length];
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        System.arraycopy(textString, 0, mData, 0, textString.length);
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Convert this object to a {@link java.lang.String}. If the encoding of
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * the EncodedStringValue is null or unsupported, it will be
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * treated as iso-8859-1 encoding.
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return The decoded String.
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getString()  {
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (CharacterSets.ANY_CHARSET == mCharacterSet) {
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return new String(mData); // system default encoding.
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            try {
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                String name = CharacterSets.getMimeName(mCharacterSet);
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return new String(mData, name);
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } catch (UnsupportedEncodingException e) {
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            	if (LOCAL_LOGV) {
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            		Log.v(TAG, e.getMessage(), e);
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            	}
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            	try {
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return new String(mData, CharacterSets.MIMENAME_ISO_8859_1);
148ec2fe3006b51e33505be8a4cb8366d8e03762df4Ye Wen                } catch (UnsupportedEncodingException e2) {
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return new String(mData); // system default encoding.
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Append to Text-string.
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param textString the textString to append
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @throws NullPointerException if the text String is null
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *                      or an IOException occured.
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void appendTextString(byte[] textString) {
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if(null == textString) {
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new NullPointerException("Text-string is null.");
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if(null == mData) {
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mData = new byte[textString.length];
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            System.arraycopy(textString, 0, mData, 0, textString.length);
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            ByteArrayOutputStream newTextString = new ByteArrayOutputStream();
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            try {
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                newTextString.write(mData);
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                newTextString.write(textString);
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } catch (IOException e) {
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                e.printStackTrace();
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                throw new NullPointerException(
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        "appendTextString: failed when write a new Text-string");
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mData = newTextString.toByteArray();
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /*
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * (non-Javadoc)
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @see java.lang.Object#clone()
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public Object clone() throws CloneNotSupportedException {
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.clone();
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int len = mData.length;
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        byte[] dstBytes = new byte[len];
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        System.arraycopy(mData, 0, dstBytes, 0, len);
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        try {
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return new EncodedStringValue(mCharacterSet, dstBytes);
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } catch (Exception e) {
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            Log.e(TAG, "failed to clone an EncodedStringValue: " + this);
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            e.printStackTrace();
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            throw new CloneNotSupportedException(e.getMessage());
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Split this encoded string around matches of the given pattern.
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param pattern the delimiting pattern
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return the array of encoded strings computed by splitting this encoded
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     *         string around matches of the given pattern
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public EncodedStringValue[] split(String pattern) {
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        String[] temp = getString().split(pattern);
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        EncodedStringValue[] ret = new EncodedStringValue[temp.length];
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < ret.length; ++i) {
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            try {
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                ret[i] = new EncodedStringValue(mCharacterSet,
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        temp[i].getBytes());
219ec2fe3006b51e33505be8a4cb8366d8e03762df4Ye Wen            } catch (NullPointerException e) {
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Can't arrive here
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return null;
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return ret;
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Extract an EncodedStringValue[] from a given String.
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static EncodedStringValue[] extract(String src) {
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        String[] values = src.split(";");
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        ArrayList<EncodedStringValue> list = new ArrayList<EncodedStringValue>();
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < values.length; i++) {
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (values[i].length() > 0) {
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                list.add(new EncodedStringValue(values[i]));
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int len = list.size();
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (len > 0) {
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return list.toArray(new EncodedStringValue[len]);
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return null;
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Concatenate an EncodedStringValue[] into a single String.
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static String concat(EncodedStringValue[] addr) {
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        StringBuilder sb = new StringBuilder();
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int maxIndex = addr.length - 1;
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i <= maxIndex; i++) {
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            sb.append(addr[i].getString());
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (i < maxIndex) {
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                sb.append(";");
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return sb.toString();
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static EncodedStringValue copy(EncodedStringValue value) {
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (value == null) {
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return null;
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return new EncodedStringValue(value.mCharacterSet, value.mData);
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static EncodedStringValue[] encodeStrings(String[] array) {
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int count = array.length;
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (count > 0) {
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            EncodedStringValue[] encodedArray = new EncodedStringValue[count];
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            for (int i = 0; i < count; i++) {
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                encodedArray[i] = new EncodedStringValue(array[i]);
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return encodedArray;
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return null;
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
284