1087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/*
2087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Copyright (C) 2006 The Android Open Source Project
3087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor *
4087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Licensed under the Apache License, Version 2.0 (the "License");
5087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * you may not use this file except in compliance with the License.
6087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * You may obtain a copy of the License at
7087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor *
8087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor *      http://www.apache.org/licenses/LICENSE-2.0
9087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor *
10087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Unless required by applicable law or agreed to in writing, software
11087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * distributed under the License is distributed on an "AS IS" BASIS,
12087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * See the License for the specific language governing permissions and
14087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * limitations under the License.
15087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */
16087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
172269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornpackage com.android.internal.util;
182269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
191cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.Bitmap;
201cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.BitmapFactory;
211cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.Bitmap.CompressFormat;
221cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.net.Uri;
237121e18595d4c559044e26bfe6035406a862f466Svet Ganovimport android.text.TextUtils;
24a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackbornimport android.util.ArrayMap;
251cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.util.Base64;
26ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport android.util.Xml;
27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
28087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParser;
29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParserException;
30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer;
31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
321cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport java.io.ByteArrayOutputStream;
33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException;
34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.InputStream;
35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream;
36ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport java.net.ProtocolException;
379e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewiczimport java.nio.charset.StandardCharsets;
38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.ArrayList;
39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.HashMap;
40212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet;
41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator;
42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List;
43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map;
44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set;
45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */
47ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeypublic class XmlUtils {
48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
497121e18595d4c559044e26bfe6035406a862f466Svet Ganov    private static final String STRING_ARRAY_SEPARATOR = ":";
507121e18595d4c559044e26bfe6035406a862f466Svet Ganov
51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static void skipCurrentTag(XmlPullParser parser)
52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, IOException {
53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int outerDepth = parser.getDepth();
54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor               && (type != XmlPullParser.END_TAG
57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                       || parser.getDepth() > outerDepth)) {
58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToList(CharSequence value, String[] options, int defaultValue)
63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null != value) {
65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            for (int i = 0; i < options.length; i++) {
66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (value.equals(options[i]))
67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return i;
68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return defaultValue;
72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final boolean
75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToBoolean(CharSequence value, boolean defaultValue)
76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        boolean result = false;
78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (value.equals("1")
83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("true")
84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("TRUE"))
85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            result = true;
86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return result;
88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToInt(CharSequence charSeq, int defaultValue)
92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == charSeq)
94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String nm = charSeq.toString();
97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // XXX This code is copied from Integer.decode() so we don't
99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // have to instantiate an Integer!
100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int value;
102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int sign = 1;
103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int index = 0;
104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int len = nm.length();
105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int base = 10;
106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('-' == nm.charAt(0)) {
108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sign = -1;
109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == nm.charAt(index)) {
113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for a zero by itself
114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = nm.charAt(index + 1);
118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {
120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {
123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        else if ('#' == nm.charAt(index))
128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        {
129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return Integer.parseInt(nm.substring(index), base) * sign;
134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
136a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int convertValueToUnsignedInt(String value, int defaultValue) {
137a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        if (null == value) {
138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
139a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        }
140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return parseUnsignedIntAttribute(value);
142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
144a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String  value = charSeq.toString();
146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        long    bits;
148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     index = 0;
149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     len = value.length();
150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     base = 10;
151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == value.charAt(index)) {
153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for zero by itself
154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = value.charAt(index + 1);
158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {     //  check for hex
160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {                        //  check for octal
163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if ('#' == value.charAt(index)) {
167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (int) Long.parseLong(value.substring(index), base);
172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an output stream as XML.  The map can later be
176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readMapXml().
177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, String, XmlSerializer)
182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, OutputStream out)
187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = new FastXmlSerializer();
1899e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz        serializer.setOutput(out, StandardCharsets.UTF_8.name());
190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeMapXml(val, null, serializer);
193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an output stream as XML.  The list can later be
198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readListXml().
199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, String, XmlSerializer)
204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, OutputStream out)
209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = Xml.newSerializer();
2129e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz        serializer.setOutput(out, StandardCharsets.UTF_8.name());
213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeListXml(val, null, serializer);
216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an XmlSerializer.  The map can later be read back
221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisMapXml().
222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the map into.
227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, OutputStream)
229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, String name, XmlSerializer out)
234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, name, out, null);
236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml().
241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this list's tag, or null for
244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Method to call when an Object type is not recognized.
247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
253ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
254ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
255ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, String name, XmlSerializer out,
256ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
257ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
269ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, out, callback);
270ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
271ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "map");
272ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
273ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml(). This method presumes that the start tag and
277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * name attribute have already been written and does not write an end tag.
278ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
284ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
286ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
287ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
288ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
289ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, XmlSerializer out,
290ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
291ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
292ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
293ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
294ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
295ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Set s = val.entrySet();
296ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Iterator i = s.iterator();
297ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
300ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
341212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
342212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final void writeSetXml(Set val, String name, XmlSerializer out)
343212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
344212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (val == null) {
345212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.startTag(null, "null");
346212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.endTag(null, "null");
347212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
348212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
349212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
350212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.startTag(null, "set");
351212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (name != null) {
352212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.attribute(null, "name", name);
353212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
354212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
355212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        for (Object v : val) {
356212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeValueXml(v, null, out);
357212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
358212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
359212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.endTag(null, "set");
360212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] val, String name,
375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "byte-array");
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        StringBuilder sb = new StringBuilder(val.length*2);
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a long[] into an XmlSerializer.  The list can later be read back
448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisLongArrayXml().
449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The long array to be flattened.
451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
462ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
463ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
464ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
465ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
466ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
467ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
468ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "long-array");
469ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
470ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
471ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
472ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
473ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
474ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
475ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
476ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
477ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
478ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Long.toString(val[i]));
479ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "long-array");
483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
486ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a double[] into an XmlSerializer.  The list can later be read back
487ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisDoubleArrayXml().
488ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
489ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The double array to be flattened.
490ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
491ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
492ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
493ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
494ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
495ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
496ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
497ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
498ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
499ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
500ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
501ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
502ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
503ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
504ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "double-array");
508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
511ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
512ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
513ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
514ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
515ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Double.toString(val[i]));
518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "double-array");
522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a String[] into an XmlSerializer.  The list can later be read back
526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisStringArrayXml().
527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
52873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param val The String array to be flattened.
529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "string-array");
547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
550ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
551ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
552ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
553ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
554ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
555ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
556ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", val[i]);
557ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
558ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
559ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
560ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "string-array");
561ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
562ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
563ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
56473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * Flatten a boolean[] into an XmlSerializer.  The list can later be read back
56573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * with readThisBooleanArrayXml().
56673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *
56773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param val The boolean array to be flattened.
56873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param name Name attribute to include with this array's tag, or null for
56973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *             none.
57073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param out XmlSerializer to write the array into.
57173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *
57273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @see #writeMapXml
57373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @see #writeValueXml
57473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @see #readThisIntArrayXml
57573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     */
57673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    public static final void writeBooleanArrayXml(boolean[] val, String name, XmlSerializer out)
57773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            throws XmlPullParserException, java.io.IOException {
57873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
57973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        if (val == null) {
58073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.startTag(null, "null");
58173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.endTag(null, "null");
58273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            return;
58373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        }
58473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
58573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        out.startTag(null, "boolean-array");
58673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        if (name != null) {
58773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.attribute(null, "name", name);
58873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        }
58973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
59073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        final int N = val.length;
59173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        out.attribute(null, "num", Integer.toString(N));
59273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
59373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        for (int i=0; i<N; i++) {
59473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.startTag(null, "item");
59573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.attribute(null, "value", Boolean.toString(val[i]));
59673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            out.endTag(null, "item");
59773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        }
59873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
59973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        out.endTag(null, "boolean-array");
60073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    }
60173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
60273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    /**
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
619ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
620ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeValueXml(v, name, out, null);
621ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
622ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
623ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
624ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten an object's value into an XmlSerializer.  The value can later
625ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * be read back with readThisValueXml().
626ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
627ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Currently supported value types are: null, String, Integer, Long,
628ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Float, Double Boolean, Map, List.
629ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
630ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param v The object to be flattened.
631ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this value's tag, or null
632ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             for none.
633ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the object into.
634ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Handler for Object types not recognized.
635ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
636ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
637ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
638ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readValueXml
639ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
640ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final void writeValueXml(Object v, String name, XmlSerializer out,
641ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback)  throws XmlPullParserException, java.io.IOException {
642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
643087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
645087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
646087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
647087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
653087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
654087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
655087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
659087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
660087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
674ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof long[]) {
675ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeLongArrayXml((long[])v, name, out);
676ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
677ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof double[]) {
678ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeDoubleArrayXml((double[])v, name, out);
679ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
680ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof String[]) {
681ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeStringArrayXml((String[])v, name, out);
682ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
68373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        } else if (v instanceof boolean[]) {
68473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            writeBooleanArrayXml((boolean[])v, name, out);
68573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            return;
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
687087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
690ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeListXml((List) v, name, out);
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
692212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (v instanceof Set) {
693ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeSetXml((Set) v, name, out);
694212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
706ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
707ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            callback.writeUnknownObject(v, name, out);
708ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
716087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
717087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
718087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
719087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
720087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
721087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
722087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
723087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
724087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
725087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
726087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
727087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
728087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
729087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
730087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
731087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
732087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
734f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    @SuppressWarnings("unchecked")
735f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readMapXml(InputStream in)
736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
7399e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz        parser.setInput(in, StandardCharsets.UTF_8.name());
740f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
749212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return ArrayList The resulting list.
750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
754087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
755087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
756087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
757087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
758087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
759087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
7609e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz        parser.setInput(in, StandardCharsets.UTF_8.name());
761087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
762087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
763212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
764212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
765212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
766212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet from an InputStream containing XML. The stream can
767212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * previously have been written by writeSetXml().
768212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
769212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param in The InputStream from which to read.
770212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
771212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The resulting set.
772212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
773212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
774212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
775212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
776212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readValueXml
777212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readThisSetXml
778212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #writeSetXml
779212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
780212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readSetXml(InputStream in)
781212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
782212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        XmlPullParser parser = Xml.newPullParser();
783212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        parser.setInput(in, null);
784212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return (HashSet) readValueXml(parser, new String[1]);
785212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
801f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
802ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
803ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisMapXml(parser, endTag, name, null);
804ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
805ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
806ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
807ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashMap object from an XmlPullParser.  The XML data could
808ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeMapXml().  The XmlPullParser
809ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the map.
810ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
811ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the map data.
812ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the map, usually "map".
813ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
814ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the map's tag.
815ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
816ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated map.
817ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
818ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
819ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
820ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
821ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
822ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name, ReadMapCallback callback)
823ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException
824087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
825f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        HashMap<String, Object> map = new HashMap<String, Object>();
826087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
827087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
828087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
829087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
830a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                Object val = readThisValueXml(parser, name, callback, false);
831a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                map.put(name[0], val);
832a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            } else if (eventType == parser.END_TAG) {
833a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                if (parser.getName().equals(endTag)) {
834a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                    return map;
835a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                }
836a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                throw new XmlPullParserException(
837a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                    "Expected " + endTag + " end tag at: " + parser.getName());
838a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            }
839a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            eventType = parser.next();
840a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        } while (eventType != parser.END_DOCUMENT);
841a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn
842a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        throw new XmlPullParserException(
843a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            "Document ended before " + endTag + " end tag");
844a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn    }
845a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn
846a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn    /**
847a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn     * Like {@link #readThisMapXml}, but returns an ArrayMap instead of HashMap.
848a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn     * @hide
849a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn     */
850a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn    public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag,
851a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            String[] name, ReadMapCallback callback)
852a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            throws XmlPullParserException, java.io.IOException
853a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn    {
854a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        ArrayMap<String, Object> map = new ArrayMap<>();
855a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn
856a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        int eventType = parser.getEventType();
857a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        do {
858a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            if (eventType == parser.START_TAG) {
859a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                Object val = readThisValueXml(parser, name, callback, true);
860f748257eee651b974e15274e03fe9843a8393073Narayan Kamath                map.put(name[0], val);
861087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
862087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
863087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
864087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
865087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
866087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
867087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
868087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
869087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
870087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
871087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
872087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
873087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
874087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
875087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
876087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
877087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
878087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
879087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
880087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
881087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
882087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
883087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
884087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
885087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
886087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
887087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
888087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
889ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
890ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
891a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        return readThisListXml(parser, endTag, name, null, false);
892ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
893ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
894ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
895ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read an ArrayList object from an XmlPullParser.  The XML data could
896ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeListXml().  The XmlPullParser
897ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
898ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
899ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
900ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
901ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
902ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
903ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
904ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated list.
905ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
906ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
907ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
908ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
909a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            String[] name, ReadMapCallback callback, boolean arrayMap)
910ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
911087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
912087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
913087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
914087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
915087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
916a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                Object val = readThisValueXml(parser, name, callback, arrayMap);
917087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
918087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
919087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
920087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
921087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
922087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
924087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
925087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
926087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
927087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
928087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
929087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
930087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
931087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
932ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
933ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
934ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashSet object from an XmlPullParser. The XML data could previously
935ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * have been generated by writeSetXml(). The XmlPullParser must be positioned
936ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * <em>after</em> the tag that begins the set.
937ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
938ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the set data.
939ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the set, usually "set".
940ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
941ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the set's tag.
942ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
943ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashSet The newly generated set.
944ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
945ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws XmlPullParserException
946ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws java.io.IOException
947ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
948ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readSetXml
949ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
950ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
951ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
952a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn        return readThisSetXml(parser, endTag, name, null, false);
953ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
954ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
955212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
956212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet object from an XmlPullParser. The XML data could previously
957212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * have been generated by writeSetXml(). The XmlPullParser must be positioned
958212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <em>after</em> the tag that begins the set.
959212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
960212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param parser The XmlPullParser from which to read the set data.
961212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param endTag Name of the tag that will end the set, usually "set".
962212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param name An array of one string, used to return the name attribute
963212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *             of the set's tag.
964212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
965212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The newly generated set.
966212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
967212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
968212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
969212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
970212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readSetXml
971ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
972212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
973ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
974a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            ReadMapCallback callback, boolean arrayMap)
975a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            throws XmlPullParserException, java.io.IOException {
976212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        HashSet set = new HashSet();
977212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
978212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        int eventType = parser.getEventType();
979212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        do {
980212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (eventType == parser.START_TAG) {
981a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                Object val = readThisValueXml(parser, name, callback, arrayMap);
982212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                set.add(val);
983212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                //System.out.println("Adding to set: " + val);
984212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            } else if (eventType == parser.END_TAG) {
985212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                if (parser.getName().equals(endTag)) {
986212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return set;
987212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
988212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                throw new XmlPullParserException(
989212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                        "Expected " + endTag + " end tag at: " + parser.getName());
990212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
991212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            eventType = parser.next();
992212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } while (eventType != parser.END_DOCUMENT);
993212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
994212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        throw new XmlPullParserException(
995212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                "Document ended before " + endTag + " end tag");
996212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
997087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
998087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
999087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
1000087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
1001087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
1002087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1003087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
1004087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
1005087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
1006087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
1007087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1008087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
1009087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1010087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
1011087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
1012087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
1013087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
1014087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
1015087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1016087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
1017087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
1018087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1019087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
1020087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
1021087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
1022087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
1023087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
1024087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
1025087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1026ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1027087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1028087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
1029087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
1030087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1031087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
1032087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
1033087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
1034087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
1035087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
1036087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
1037087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
1038087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
1039087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
1040087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
1041087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
1042087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
1043087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
1044087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
1045087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
1046087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1047087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
1048087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1049087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
1050087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
1051087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
1052087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
1053087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
1054087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
1055087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1056087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
1057087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
1058087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1059087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1060087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
1061087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
1062087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1063087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1064087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
1065087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1066087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1067087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
1068ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a long[] object from an XmlPullParser.  The XML data could
1069ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeLongArrayXml().  The XmlPullParser
1070ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1071ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1072ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1073ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
1074ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1075ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1076ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1077ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated long[].
1078ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1079ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1080ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1081ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final long[] readThisLongArrayXml(XmlPullParser parser,
1082ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String endTag, String[] name)
1083ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
1084ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1085ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1086ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1087ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1088ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1089ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in long-array");
1090ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1091ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in long-array");
1092ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1093ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1094ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1095ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        long[] array = new long[num];
1096ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1097ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1098ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1099ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1100ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1101ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1102ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1103ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
1104ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1105ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1106ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1107ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1108ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1109ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1110ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1111ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1112ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1113ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1114ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1115ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1116ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1117ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1118ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1119ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1120ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1121ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1122ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1123ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1124ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1125ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1126ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1127ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1128ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1129ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a double[] object from an XmlPullParser.  The XML data could
1130ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
1131ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1132ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1133ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1134ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "double-array".
1135ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1136ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1137ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1138ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated double[].
1139ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1140ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1141ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1142ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
1143ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1144ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1145ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1146ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1147ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1148ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1149ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in double-array");
1150ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1151ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in double-array");
1152ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1153ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1154ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1155ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        double[] array = new double[num];
1156ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1157ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1158ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1159ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1160ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1161ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1162ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1163ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
1164ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1165ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1166ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1167ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1168ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1169ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1170ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1171ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1172ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1173ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1174ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1175ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1176ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1177ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1178ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1179ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1180ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1181ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1182ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1183ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1184ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1185ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1186ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1187ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1188ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1189ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a String[] object from an XmlPullParser.  The XML data could
1190ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeStringArrayXml().  The XmlPullParser
1191ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1192ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1193ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1194ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "string-array".
1195ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1196ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1197ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1198ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated String[].
1199ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1200ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1201ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1202ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
1203ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1204ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1205ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1206ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1207ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1208ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1209ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in string-array");
1210ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1211ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in string-array");
1212ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1213ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1214ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1215ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        String[] array = new String[num];
1216ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1217ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1218ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1219ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1220ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1221ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1222ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1223ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = parser.getAttributeValue(null, "value");
1224ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1225ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1226ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1227ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1228ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1229ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1230ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1231ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1232ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1233ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
124973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * Read a boolean[] object from an XmlPullParser.  The XML data could
125073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * previously have been generated by writeBooleanArrayXml().  The XmlPullParser
125173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * must be positioned <em>after</em> the tag that begins the list.
125273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *
125373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param parser The XmlPullParser from which to read the list data.
125473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param endTag Name of the tag that will end the list, usually "string-array".
125573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @param name An array of one string, used to return the name attribute
125673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *             of the list's tag.
125773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *
125873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @return Returns a newly generated boolean[].
125973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     *
126073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     * @see #readListXml
126173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner     */
126273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    public static final boolean[] readThisBooleanArrayXml(XmlPullParser parser, String endTag,
126373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
126473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
126573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        int num;
126673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        try {
126773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
126873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        } catch (NullPointerException e) {
126973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            throw new XmlPullParserException("Need num attribute in string-array");
127073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        } catch (NumberFormatException e) {
127173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            throw new XmlPullParserException("Not a number in num attribute in string-array");
127273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        }
127373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        parser.next();
127473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
127573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        boolean[] array = new boolean[num];
127673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        int i = 0;
127773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
127873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        int eventType = parser.getEventType();
127973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        do {
128073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            if (eventType == parser.START_TAG) {
128173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                if (parser.getName().equals("item")) {
128273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    try {
128373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                        array[i] = Boolean.valueOf(parser.getAttributeValue(null, "value"));
128473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    } catch (NullPointerException e) {
128573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                        throw new XmlPullParserException("Need value attribute in item");
128673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    } catch (NumberFormatException e) {
128773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
128873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    }
128973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                } else {
129073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
129173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                }
129273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            } else if (eventType == parser.END_TAG) {
129373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                if (parser.getName().equals(endTag)) {
129473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    return array;
129573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                } else if (parser.getName().equals("item")) {
129673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    i++;
129773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                } else {
129873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
129973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                            parser.getName());
130073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner                }
130173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            }
130273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            eventType = parser.next();
130373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        } while (eventType != parser.END_DOCUMENT);
130473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
130573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
130673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    }
130773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner
130873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner    /**
1309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
1310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
1311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
1312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
1313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
1315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
1316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
1317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
1319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
1321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
1322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
1323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
1324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
1325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
1326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
1328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
1329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
1330a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                return readThisValueXml(parser, name, null, false);
1331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
1332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
1334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
1337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
1339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
1340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
1343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1345ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
1346a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            ReadMapCallback callback, boolean arrayMap)
1347a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            throws XmlPullParserException, java.io.IOException {
1348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
1349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
1350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
1352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
1354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
1356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
1357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
1358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
1359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
1360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
1362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
1363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
1364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
1365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
1366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
1367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
1369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
1370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
1371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
1372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
1374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
1377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
13782ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
13792ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            // all work already done by readThisPrimitiveValueXml
1380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
1381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
1382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1385ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("long-array")) {
1386ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisLongArrayXml(parser, "long-array", name);
1387ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1388ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1389ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1390ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("double-array")) {
1391ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisDoubleArrayXml(parser, "double-array", name);
1392ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1393ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1394ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1395ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("string-array")) {
1396ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisStringArrayXml(parser, "string-array", name);
1397ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1398ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1399ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
140073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner        } else if (tagName.equals("boolean-array")) {
140173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            res = readThisBooleanArrayXml(parser, "boolean-array", name);
140273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            name[0] = valueName;
140373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
140473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner            return res;
1405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
1406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1407a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            res = arrayMap
1408a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                    ? readThisArrayMapXml(parser, "map", name, callback)
1409a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn                    : readThisMapXml(parser, "map", name, callback);
1410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
1414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1415a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            res = readThisListXml(parser, "list", name, callback, arrayMap);
1416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1419212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (tagName.equals("set")) {
1420212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            parser.next();
1421a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn            res = readThisSetXml(parser, "set", name, callback, arrayMap);
1422212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            name[0] = valueName;
1423212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            //System.out.println("Returning value for " + valueName + ": " + res);
1424212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return res;
1425ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
1426ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = callback.readThisUnknownObjectXml(parser, tagName);
1427ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1428ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
1430ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Unknown tag: " + tagName);
1431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
1434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
1435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
1437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
1438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
1439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
1440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
1441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
1444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
1447087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
1448087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1449087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
1450087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1451087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1452087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1453087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
1454087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1455087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
14562ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
14572ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    throws XmlPullParserException, java.io.IOException
14582ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    {
14592ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        try {
14602ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            if (tagName.equals("int")) {
14612ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Integer.parseInt(parser.getAttributeValue(null, "value"));
14622ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("long")) {
14632ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Long.valueOf(parser.getAttributeValue(null, "value"));
14642ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("float")) {
14652ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Float(parser.getAttributeValue(null, "value"));
14662ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("double")) {
14672ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Double(parser.getAttributeValue(null, "value"));
14682ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("boolean")) {
14692ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
14702ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else {
14712ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return null;
14722ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            }
14732ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NullPointerException e) {
14742ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
14752ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NumberFormatException e) {
14762ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException(
14772ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                    "Not a number in value attribute in <" + tagName + ">");
14782ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        }
14792ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    }
14802ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko
1481087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
1482087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1483087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1484087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1485087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1486087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1487087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1488087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1489087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
1490087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
1491087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1492087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1493087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
1494087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
1495087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
1496087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1497087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1498087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1499087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
1500087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1501087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1502087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1503087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1504087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1505087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1506087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1507a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown
1508a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
1509a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            throws IOException, XmlPullParserException {
1510a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        for (;;) {
1511a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            int type = parser.next();
1512a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.END_DOCUMENT
1513a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
1514a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return false;
1515a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1516a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.START_TAG
1517a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    && parser.getDepth() == outerDepth + 1) {
1518a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return true;
1519a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1520a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        }
1521a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    }
1522ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1523d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
1524d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        final String value = in.getAttributeValue(null, name);
1525d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        try {
1526d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return Integer.parseInt(value);
1527d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        } catch (NumberFormatException e) {
1528d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return defaultValue;
1529d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        }
1530d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    }
1531d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot
1532ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
1533ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1534ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1535ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Integer.parseInt(value);
1536ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1537ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
1538ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1539ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1540ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1541ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeIntAttribute(XmlSerializer out, String name, int value)
1542ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1543ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Integer.toString(value));
1544ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1545ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1546e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
1547e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1548e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        try {
1549e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return Long.parseLong(value);
1550e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        } catch (NumberFormatException e) {
1551e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return defaultValue;
1552e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        }
1553e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
1554e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
1555ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
1556ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1557ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1558ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Long.parseLong(value);
1559ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1560ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
1561ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1562ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1563ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1564ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeLongAttribute(XmlSerializer out, String name, long value)
1565ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1566ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Long.toString(value));
1567ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1568ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
15691cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
15701cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
15711cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        try {
15721cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return Float.parseFloat(value);
15731cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } catch (NumberFormatException e) {
15741cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
15751cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
15761cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
15771cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
15781cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeFloatAttribute(XmlSerializer out, String name, float value)
15791cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
15801cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        out.attribute(null, name, Float.toString(value));
15811cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
15821cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
1583ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
1584ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1585ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        return Boolean.parseBoolean(value);
1586ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1587ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
158877d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey    public static boolean readBooleanAttribute(XmlPullParser in, String name,
158977d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            boolean defaultValue) {
159077d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        final String value = in.getAttributeValue(null, name);
159177d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        if (value == null) {
159277d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            return defaultValue;
159377d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        } else {
159477d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            return Boolean.parseBoolean(value);
159577d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        }
159677d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey    }
159777d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey
1598ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
1599ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1600ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Boolean.toString(value));
1601ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1602ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
16031cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static Uri readUriAttribute(XmlPullParser in, String name) {
16041cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
16051cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        return (value != null) ? Uri.parse(value) : null;
16061cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16071cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16081cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
16091cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
16101cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16111cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, value.toString());
16121cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16131cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16141cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16151cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static String readStringAttribute(XmlPullParser in, String name) {
16161cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        return in.getAttributeValue(null, name);
16171cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16181cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16191cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeStringAttribute(XmlSerializer out, String name, String value)
16201cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
16211cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16221cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, value);
16231cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16241cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16251cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16261cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
16271cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
16281cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16291cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return Base64.decode(value, Base64.DEFAULT);
16301cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } else {
16311cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return null;
16321cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16331cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16341cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16351cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
16361cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
16371cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16381cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
16391cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16401cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16411cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
16421cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
16431cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final byte[] value = readByteArrayAttribute(in, name);
16441cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16451cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return BitmapFactory.decodeByteArray(value, 0, value.length);
16461cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } else {
16471cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return null;
16481cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16491cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16501cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
165102bd78490d8594d225ecc70a74b2058cb968a657Jeff Sharkey    @Deprecated
16521cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
16531cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
16541cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
16551cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            final ByteArrayOutputStream os = new ByteArrayOutputStream();
16561cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            value.compress(CompressFormat.PNG, 90, os);
16571cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            writeByteArrayAttribute(out, name, os.toByteArray());
16581cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
16591cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
16601cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
1661ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1662ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface WriteMapCallback {
1663ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1664ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from writeMapXml when an Object type is not recognized. The implementer
1665ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * must write out the entire element including start and end tags.
1666ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1667ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param v The object to be written out
1668ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param name The mapping key for v. Must be written into the "name" attribute of the
1669ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *             start tag.
1670ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param out The XML output stream.
1671ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException on unrecognized Object type.
1672ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlSerializer serialization errors.
1673ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1674ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1675ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         public void writeUnknownObject(Object v, String name, XmlSerializer out)
1676ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                 throws XmlPullParserException, IOException;
1677ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1678ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1679ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1680ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface ReadMapCallback {
1681ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1682ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
1683ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * is positioned within the start tag so that attributes can be read using in.getAttribute.
1684ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1685ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param in the XML input stream
1686ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param tag the START_TAG that was not recognized.
1687ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @return the Object parsed from the stream which will be put into the map.
1688ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException if the START_TAG is not recognized.
1689ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlPullParser serialization errors.
1690ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1691ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1692ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
1693ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                throws XmlPullParserException, IOException;
1694ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
1696