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