XmlUtils.java revision a8f6d5f0720f400b6f59b0809aaefea83c5f51d4
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
126a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int convertValueToUnsignedInt(String value, int defaultValue) {
127a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        if (null == value) {
128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
129a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        }
130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return parseUnsignedIntAttribute(value);
132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
134a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String  value = charSeq.toString();
136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        long    bits;
138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     index = 0;
139087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     len = value.length();
140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     base = 10;
141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == value.charAt(index)) {
143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for zero by itself
144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = value.charAt(index + 1);
148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {     //  check for hex
150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {                        //  check for octal
153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if ('#' == value.charAt(index)) {
157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (int) Long.parseLong(value.substring(index), base);
162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an output stream as XML.  The map can later be
166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readMapXml().
167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, String, XmlSerializer)
172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, OutputStream out)
177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = new FastXmlSerializer();
179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeMapXml(val, null, serializer);
183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an output stream as XML.  The list can later be
188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readListXml().
189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, String, XmlSerializer)
194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, OutputStream out)
199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = Xml.newSerializer();
202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeListXml(val, null, serializer);
206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an XmlSerializer.  The map can later be read back
211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisMapXml().
212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the map into.
217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, OutputStream)
219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, String name, XmlSerializer out)
224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Set s = val.entrySet();
233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Iterator i = s.iterator();
234087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
235087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
241087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
242087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(e.getValue(), (String)e.getKey(), out);
243087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
244087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
245087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "map");
246087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
269087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
270087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
271087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
272087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
273087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
274087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
275087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
276087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
277087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
279087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
285212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
286212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final void writeSetXml(Set val, String name, XmlSerializer out)
287212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
288212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (val == null) {
289212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.startTag(null, "null");
290212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.endTag(null, "null");
291212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
292212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
293212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
294212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.startTag(null, "set");
295212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (name != null) {
296212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.attribute(null, "name", name);
297212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
298212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
299212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        for (Object v : val) {
300212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeValueXml(v, null, out);
301212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
302212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
303212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.endTag(null, "set");
304212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] val, String name,
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "byte-array");
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        StringBuilder sb = new StringBuilder(val.length*2);
337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeListXml((List)v, name, out);
446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
447212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (v instanceof Set) {
448212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeSetXml((Set)v, name, out);
449212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
450087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
451087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
452087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
453087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
454087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
455087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
456087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
457087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
458087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
459087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
460087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
461087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
462087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
463087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
464087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
465087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
466087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
467087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
468087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
469087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
470087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
471087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
472087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
473087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
474087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
475087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
476087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
477087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
478087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
479087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
480087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
481087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
482087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
483087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
484087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
485087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
486087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readMapXml(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 (HashMap)readValueXml(parser, new String[1]);
492087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
493087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
494087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
495087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
496087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
497087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
498087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
499087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
500212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return ArrayList The resulting list.
501087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
502087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
503087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
504087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
505087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
506087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
507087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
508087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
509087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
510087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
511087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
512087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
513087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
514212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
515212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
516212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
517212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet from an InputStream containing XML. The stream can
518212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * previously have been written by writeSetXml().
519212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
520212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param in The InputStream from which to read.
521212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
522212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The resulting set.
523212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
524212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
525212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
526212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
527212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readValueXml
528212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readThisSetXml
529212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #writeSetXml
530212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
531212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readSetXml(InputStream in)
532212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
533212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        XmlPullParser parser = Xml.newPullParser();
534212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        parser.setInput(in, null);
535212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return (HashSet) readValueXml(parser, new String[1]);
536212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
537087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
538087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
539087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
540087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
541087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
542087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
543087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
544087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
545087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
546087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
547087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
548087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
549087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
550087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
551087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
552087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final HashMap readThisMapXml(XmlPullParser parser, String endTag, String[] name)
553087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
554087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
555087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        HashMap map = new HashMap();
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                if (name[0] != null) {
562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Adding to map: " + name + " -> " + val);
563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    map.put(name[0], val);
564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Map value without name attribute: " + parser.getName());
567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
569087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
570087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
571087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
572087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
573087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
574087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
575087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
576087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
577087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
578087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
579087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
580087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
581087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
582087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
583087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
584087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
585087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
586087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
587087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
588087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
589087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
590087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
591087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
592087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
593087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
594087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
595087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
596087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, String[] name)
597087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                Object val = readThisValueXml(parser, name);
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
620212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
621212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
622212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet object from an XmlPullParser. The XML data could previously
623212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * have been generated by writeSetXml(). The XmlPullParser must be positioned
624212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <em>after</em> the tag that begins the set.
625212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
626212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param parser The XmlPullParser from which to read the set data.
627212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param endTag Name of the tag that will end the set, usually "set".
628212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param name An array of one string, used to return the name attribute
629212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *             of the set's tag.
630212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
631212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The newly generated set.
632212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
633212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
634212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
635212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
636212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readSetXml
637212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
638212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
639212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
640212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        HashSet set = new HashSet();
641212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
642212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        int eventType = parser.getEventType();
643212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        do {
644212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (eventType == parser.START_TAG) {
645212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                Object val = readThisValueXml(parser, name);
646212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                set.add(val);
647212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                //System.out.println("Adding to set: " + val);
648212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            } else if (eventType == parser.END_TAG) {
649212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                if (parser.getName().equals(endTag)) {
650212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return set;
651212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
652212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                throw new XmlPullParserException(
653212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                        "Expected " + endTag + " end tag at: " + parser.getName());
654212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
655212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            eventType = parser.next();
656212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } while (eventType != parser.END_DOCUMENT);
657212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
658212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        throw new XmlPullParserException(
659212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                "Document ended before " + endTag + " end tag");
660212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
681087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
682087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
687087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
693087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
716087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
717087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
718087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
719087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
720087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
721087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
722087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
723087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
724087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
725087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
726087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
727087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
728087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
729087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
730087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
731087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
732087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
734087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
735087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
749087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return readThisValueXml(parser, name);
753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
754087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
755087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
756087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
757087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
758087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
759087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
760087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
761087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
762087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
763087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
764087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
765087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
766087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
767087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    private static final Object readThisValueXml(XmlPullParser parser, String[] name)
768087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
769087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
770087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
771087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
772087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
773087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
774087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
775087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
776087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
777087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
778087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
783087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
784087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int")) {
801087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Integer.parseInt(parser.getAttributeValue(null, "value"));
802087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("long")) {
803087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Long.valueOf(parser.getAttributeValue(null, "value"));
804087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("float")) {
805087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = new Float(parser.getAttributeValue(null, "value"));
806087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("double")) {
807087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = new Double(parser.getAttributeValue(null, "value"));
808087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("boolean")) {
809087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = Boolean.valueOf(parser.getAttributeValue(null, "value"));
810087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
811087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
812087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
813087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
814087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
815087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
816087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
817087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
818087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisMapXml(parser, "map", name);
819087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
820087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
821087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
822087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
823087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
824087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisListXml(parser, "list", name);
825087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
826087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
827087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
828212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (tagName.equals("set")) {
829212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            parser.next();
830212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            res = readThisSetXml(parser, "set", name);
831212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            name[0] = valueName;
832212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            //System.out.println("Returning value for " + valueName + ": " + res);
833212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return res;
834087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
835087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
836087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unknown tag: " + tagName);
837087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
838087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
839087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
840087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
841087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
842087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
843087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
844087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
845087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
846087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
847087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
848087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
849087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
850087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
851087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
852087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
853087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
854087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
855087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
856087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
857087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
858087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
859087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
860087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
861087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
862087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
863087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
864087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
865087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
866087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
867087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
868087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
869087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
870087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
871087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
872087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
873087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
874087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
875087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
876087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
877087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
878087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
879087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
880087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
881087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
882087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
883087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
884087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
885087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
886087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
887087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
888a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown
889a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
890a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            throws IOException, XmlPullParserException {
891a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        for (;;) {
892a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            int type = parser.next();
893a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.END_DOCUMENT
894a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
895a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return false;
896a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
897a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.START_TAG
898a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    && parser.getDepth() == outerDepth + 1) {
899a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return true;
900a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
901a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        }
902a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    }
903087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
904