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