XmlUtils.java revision 2ddce3226e2a1f380dfc4ad3f7e962dfdbfc39dd
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
19087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
20087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParser;
21087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParserException;
22087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer;
23087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
24087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException;
25087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.InputStream;
26087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream;
27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.ArrayList;
28087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.HashMap;
29212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet;
30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator;
31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List;
32087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map;
33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set;
34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport android.util.Xml;
36087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
37087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */
38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorpublic class XmlUtils
39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor{
40087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static void skipCurrentTag(XmlPullParser parser)
42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, IOException {
43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int outerDepth = parser.getDepth();
44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor               && (type != XmlPullParser.END_TAG
47087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                       || parser.getDepth() > outerDepth)) {
48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
49087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
50087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToList(CharSequence value, String[] options, int defaultValue)
53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null != value) {
55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            for (int i = 0; i < options.length; i++) {
56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (value.equals(options[i]))
57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return i;
58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return defaultValue;
62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final boolean
65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToBoolean(CharSequence value, boolean defaultValue)
66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        boolean result = false;
68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (value.equals("1")
73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("true")
74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("TRUE"))
75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            result = true;
76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return result;
78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToInt(CharSequence charSeq, int defaultValue)
82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == charSeq)
84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String nm = charSeq.toString();
87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // XXX This code is copied from Integer.decode() so we don't
89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // have to instantiate an Integer!
90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int value;
92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int sign = 1;
93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int index = 0;
94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int len = nm.length();
95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int base = 10;
96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('-' == nm.charAt(0)) {
98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sign = -1;
99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == nm.charAt(index)) {
103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for a zero by itself
104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = nm.charAt(index + 1);
108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {
110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {
113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        else if ('#' == nm.charAt(index))
118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        {
119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return Integer.parseInt(nm.substring(index), base) * sign;
124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToUnsignedInt(String value, int defaultValue)
128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return parseUnsignedIntAttribute(value);
133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    parseUnsignedIntAttribute(CharSequence charSeq)
137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String  value = charSeq.toString();
139087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        long    bits;
141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     index = 0;
142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     len = value.length();
143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     base = 10;
144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == value.charAt(index)) {
146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for zero by itself
147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = value.charAt(index + 1);
151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {     //  check for hex
153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {                        //  check for octal
156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if ('#' == value.charAt(index)) {
160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (int) Long.parseLong(value.substring(index), base);
165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an output stream as XML.  The map can later be
169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readMapXml().
170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, String, XmlSerializer)
175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, OutputStream out)
180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = new FastXmlSerializer();
182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeMapXml(val, null, serializer);
186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an output stream as XML.  The list can later be
191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readListXml().
192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, String, XmlSerializer)
197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, OutputStream out)
202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = Xml.newSerializer();
205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeListXml(val, null, serializer);
209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an XmlSerializer.  The map can later be read back
214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisMapXml().
215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the map into.
220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, OutputStream)
222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, String name, XmlSerializer out)
227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
234087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
235087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Set s = val.entrySet();
236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Iterator i = s.iterator();
237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
241087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
242087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
243087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
244087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
245087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(e.getValue(), (String)e.getKey(), out);
246087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "map");
249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
269087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
270087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
271087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
272087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
273087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
274087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
275087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
276087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
277087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
279087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
285087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
288212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
289212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final void writeSetXml(Set val, String name, XmlSerializer out)
290212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
291212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (val == null) {
292212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.startTag(null, "null");
293212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.endTag(null, "null");
294212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
295212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
296212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
297212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.startTag(null, "set");
298212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (name != null) {
299212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.attribute(null, "name", name);
300212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
301212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
302212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        for (Object v : val) {
303212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeValueXml(v, null, out);
304212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
305212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
306212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.endTag(null, "set");
307212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] val, String name,
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "byte-array");
332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        StringBuilder sb = new StringBuilder(val.length*2);
340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
447087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
448087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeListXml((List)v, name, out);
449087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
450212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (v instanceof Set) {
451212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeSetXml((Set)v, name, out);
452212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
453087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
454087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
455087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
456087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
457087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
458087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
459087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
460087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
461087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
462087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
463087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
464087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
465087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
466087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
467087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
468087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
469087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
470087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
471087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
472087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
473087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
474087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
475087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
476087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
477087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
478087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
479087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
480087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
481087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
482087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
483087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
484087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
485087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
486087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
487087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
488087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
489087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readMapXml(InputStream in)
490087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
491087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
492087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
493087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
494087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (HashMap)readValueXml(parser, new String[1]);
495087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
496087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
497087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
498087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
499087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
500087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
501087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
502087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
503212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return ArrayList The resulting list.
504087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
505087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
506087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
507087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
508087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
509087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
510087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
511087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
512087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
513087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
514087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
515087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
516087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
517212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
518212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
519212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
520212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet from an InputStream containing XML. The stream can
521212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * previously have been written by writeSetXml().
522212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
523212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param in The InputStream from which to read.
524212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
525212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The resulting set.
526212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
527212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
528212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
529212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
530212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readValueXml
531212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readThisSetXml
532212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #writeSetXml
533212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
534212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readSetXml(InputStream in)
535212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
536212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        XmlPullParser parser = Xml.newPullParser();
537212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        parser.setInput(in, null);
538212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return (HashSet) readValueXml(parser, new String[1]);
539212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
540087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
541087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
542087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
543087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
544087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
545087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
546087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
547087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
548087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
549087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
550087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
551087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
552087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
553087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
554087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
555087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readThisMapXml(XmlPullParser parser, String endTag, String[] name)
556087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
557087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
558087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        HashMap map = new HashMap();
559087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
560087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
561087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                Object val = readThisValueXml(parser, name);
564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (name[0] != null) {
565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Adding to map: " + name + " -> " + val);
566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    map.put(name[0], val);
567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
569087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Map value without name attribute: " + parser.getName());
570087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
571087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
572087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
573087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
574087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
575087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
576087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
577087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
578087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
579087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
580087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
581087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
582087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
583087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
584087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
585087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
586087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
587087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
588087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
589087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
590087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
591087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
592087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
593087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
594087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
595087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
596087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
597087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, String[] name)
600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                Object val = readThisValueXml(parser, name);
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
620087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
621087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
622087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
623212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
624212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
625212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet object from an XmlPullParser. The XML data could previously
626212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * have been generated by writeSetXml(). The XmlPullParser must be positioned
627212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <em>after</em> the tag that begins the set.
628212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
629212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param parser The XmlPullParser from which to read the set data.
630212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param endTag Name of the tag that will end the set, usually "set".
631212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param name An array of one string, used to return the name attribute
632212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *             of the set's tag.
633212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
634212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The newly generated set.
635212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
636212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
637212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
638212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
639212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readSetXml
640212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
641212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
642212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
643212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        HashSet set = new HashSet();
644212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
645212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        int eventType = parser.getEventType();
646212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        do {
647212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (eventType == parser.START_TAG) {
648212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                Object val = readThisValueXml(parser, name);
649212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                set.add(val);
650212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                //System.out.println("Adding to set: " + val);
651212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            } else if (eventType == parser.END_TAG) {
652212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                if (parser.getName().equals(endTag)) {
653212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return set;
654212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
655212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                throw new XmlPullParserException(
656212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                        "Expected " + endTag + " end tag at: " + parser.getName());
657212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
658212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            eventType = parser.next();
659212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } while (eventType != parser.END_DOCUMENT);
660212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
661212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        throw new XmlPullParserException(
662212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                "Document ended before " + endTag + " end tag");
663212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
681087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
682087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
687087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
693087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
716087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
717087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
718087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
719087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
720087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
721087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
722087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
723087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
724087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
725087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
726087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
727087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
728087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
729087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
730087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
731087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
732087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
734087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
735087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
749087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
754087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
755087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return readThisValueXml(parser, name);
756087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
757087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
758087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
759087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
760087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
761087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
762087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
763087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
764087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
765087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
766087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
767087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
768087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
769087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
770087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    private static final Object readThisValueXml(XmlPullParser parser, String[] name)
771087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
772087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
773087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
774087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
775087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
776087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
777087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
778087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
783087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
784087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
801087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
802087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
8032ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
8042ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            // all work already done by readThisPrimitiveValueXml
805087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
806087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
807087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
808087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
809087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
810087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
811087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
812087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
813087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisMapXml(parser, "map", name);
814087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
815087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
816087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
817087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
818087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
819087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisListXml(parser, "list", name);
820087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
821087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
822087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
823212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (tagName.equals("set")) {
824212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            parser.next();
825212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            res = readThisSetXml(parser, "set", name);
826212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            name[0] = valueName;
827212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            //System.out.println("Returning value for " + valueName + ": " + res);
828212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return res;
829087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
830087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
831087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unknown tag: " + tagName);
832087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
833087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
834087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
835087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
836087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
837087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
838087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
839087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
840087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
841087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
842087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
843087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
844087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
845087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
846087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
847087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
848087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
849087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
850087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
851087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
852087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
853087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
854087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
855087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
856087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
8572ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
8582ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    throws XmlPullParserException, java.io.IOException
8592ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    {
8602ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        try {
8612ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            if (tagName.equals("int")) {
8622ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Integer.parseInt(parser.getAttributeValue(null, "value"));
8632ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("long")) {
8642ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Long.valueOf(parser.getAttributeValue(null, "value"));
8652ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("float")) {
8662ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Float(parser.getAttributeValue(null, "value"));
8672ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("double")) {
8682ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Double(parser.getAttributeValue(null, "value"));
8692ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("boolean")) {
8702ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
8712ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else {
8722ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return null;
8732ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            }
8742ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NullPointerException e) {
8752ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
8762ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NumberFormatException e) {
8772ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException(
8782ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                    "Not a number in value attribute in <" + tagName + ">");
8792ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        }
8802ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    }
8812ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko
882087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
883087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
884087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
885087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
886087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
887087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
888087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
889087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
890087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
891087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
892087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
893087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
894087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
895087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
896087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
897087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
898087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
899087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
900087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
901087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
902087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
903087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
904087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
905087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
906087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
907087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
908a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown
909a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
910a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            throws IOException, XmlPullParserException {
911a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        for (;;) {
912a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            int type = parser.next();
913a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.END_DOCUMENT
914a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
915a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return false;
916a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
917a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.START_TAG
918a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    && parser.getDepth() == outerDepth + 1) {
919a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return true;
920a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
921a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        }
922a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    }
923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
924