XmlUtils.java revision 2269d1572e5fcfb725ea55f5764d8c3280d69f6d
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;
29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator;
30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List;
31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map;
32087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set;
33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport android.util.Xml;
35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
36087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */
37087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorpublic class XmlUtils
38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor{
39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
40087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static void skipCurrentTag(XmlPullParser parser)
41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, IOException {
42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int outerDepth = parser.getDepth();
43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor               && (type != XmlPullParser.END_TAG
46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                       || parser.getDepth() > outerDepth)) {
47087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
49087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
50087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToList(CharSequence value, String[] options, int defaultValue)
52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null != value) {
54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            for (int i = 0; i < options.length; i++) {
55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (value.equals(options[i]))
56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return i;
57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return defaultValue;
61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final boolean
64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToBoolean(CharSequence value, boolean defaultValue)
65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        boolean result = false;
67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (value.equals("1")
72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("true")
73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("TRUE"))
74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            result = true;
75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return result;
77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToInt(CharSequence charSeq, int defaultValue)
81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == charSeq)
83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String nm = charSeq.toString();
86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // XXX This code is copied from Integer.decode() so we don't
88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // have to instantiate an Integer!
89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int value;
91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int sign = 1;
92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int index = 0;
93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int len = nm.length();
94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int base = 10;
95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('-' == nm.charAt(0)) {
97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sign = -1;
98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == nm.charAt(index)) {
102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for a zero by itself
103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = nm.charAt(index + 1);
107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {
109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {
112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        else if ('#' == nm.charAt(index))
117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        {
118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return Integer.parseInt(nm.substring(index), base) * sign;
123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToUnsignedInt(String value, int defaultValue)
127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return parseUnsignedIntAttribute(value);
132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    parseUnsignedIntAttribute(CharSequence charSeq)
136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String  value = charSeq.toString();
138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
139087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        long    bits;
140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     index = 0;
141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     len = value.length();
142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     base = 10;
143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == value.charAt(index)) {
145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for zero by itself
146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = value.charAt(index + 1);
150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {     //  check for hex
152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {                        //  check for octal
155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if ('#' == value.charAt(index)) {
159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (int) Long.parseLong(value.substring(index), base);
164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an output stream as XML.  The map can later be
168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readMapXml().
169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, String, XmlSerializer)
174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, OutputStream out)
179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = new FastXmlSerializer();
181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeMapXml(val, null, serializer);
185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an output stream as XML.  The list can later be
190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readListXml().
191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, String, XmlSerializer)
196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, OutputStream out)
201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = Xml.newSerializer();
204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeListXml(val, null, serializer);
208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an XmlSerializer.  The map can later be read back
213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisMapXml().
214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the map into.
219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, OutputStream)
221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, String name, XmlSerializer out)
226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
234087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Set s = val.entrySet();
235087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Iterator i = s.iterator();
236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
241087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
242087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
243087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
244087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(e.getValue(), (String)e.getKey(), out);
245087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
246087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "map");
248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
269087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
270087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
271087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
272087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
273087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
274087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
275087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
276087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
277087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
279087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
285087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
289087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] val, String name,
301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "byte-array");
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        StringBuilder sb = new StringBuilder(val.length*2);
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeListXml((List)v, name, out);
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
447087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
448087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
449087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
450087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
451087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
452087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
453087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
454087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
455087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
456087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
457087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
458087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
459087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
460087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
461087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
462087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
463087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
464087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
465087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readMapXml(InputStream in)
466087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
467087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
468087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
469087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
470087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (HashMap)readValueXml(parser, new String[1]);
471087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
472087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
473087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
474087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
475087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
476087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
477087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
478087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
479087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting list.
480087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
481087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
482087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
483087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
484087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
485087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
486087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
487087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
488087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
489087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
490087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
491087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
492087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
493087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
494087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
495087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
496087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
497087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
498087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
499087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
500087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
501087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
502087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
503087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
504087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
505087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
506087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
507087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
508087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readThisMapXml(XmlPullParser parser, String endTag, String[] name)
509087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
510087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
511087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        HashMap map = new HashMap();
512087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
513087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
514087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
515087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
516087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                Object val = readThisValueXml(parser, name);
517087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (name[0] != null) {
518087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Adding to map: " + name + " -> " + val);
519087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    map.put(name[0], val);
520087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
521087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
522087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Map value without name attribute: " + parser.getName());
523087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
524087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
525087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
526087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
527087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
528087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
529087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
530087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
531087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
532087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
533087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
534087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
535087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
536087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
537087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
538087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
539087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
540087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
541087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
542087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
543087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
544087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
545087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
546087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
547087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
548087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
549087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
550087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
551087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
552087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, String[] name)
553087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
554087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
555087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
556087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
557087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
558087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
559087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
560087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                Object val = readThisValueXml(parser, name);
561087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
569087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
570087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
571087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
572087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
573087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
574087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
575087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
576087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
577087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
578087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
579087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
580087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
581087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
582087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
583087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
584087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
585087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
586087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
587087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
588087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
589087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
590087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
591087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
592087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
593087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
594087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
595087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
596087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
597087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
620087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
621087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
622087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
623087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
624087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
625087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
626087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
627087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
628087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
629087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
630087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
631087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
632087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
633087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
634087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
635087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
636087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
637087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
638087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
639087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
640087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
641087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
643087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
645087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
646087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
647087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
653087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
654087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
655087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
659087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
660087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return readThisValueXml(parser, name);
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
681087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
682087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    private static final Object readThisValueXml(XmlPullParser parser, String[] name)
683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
687087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
693087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int")) {
716087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Integer.parseInt(parser.getAttributeValue(null, "value"));
717087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("long")) {
718087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Long.valueOf(parser.getAttributeValue(null, "value"));
719087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("float")) {
720087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = new Float(parser.getAttributeValue(null, "value"));
721087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("double")) {
722087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = new Double(parser.getAttributeValue(null, "value"));
723087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("boolean")) {
724087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Boolean.valueOf(parser.getAttributeValue(null, "value"));
725087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
726087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
727087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
728087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
729087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
730087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
731087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
732087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisMapXml(parser, "map", name);
734087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
735087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisListXml(parser, "list", name);
740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unknown tag: " + tagName);
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
749087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
754087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
755087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
756087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
757087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
758087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
759087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
760087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
761087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
762087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
763087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
764087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
765087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
766087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
767087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
768087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
769087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
770087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
771087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
772087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
773087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
774087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
775087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
776087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
777087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
778087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
783087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
784087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
798