XmlUtils.java revision ef73ee1dd98acfc4a19561367cfc3e4d8bbe06ea
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)
223ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
224ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, name, out, null);
225ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
226ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
227ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
228ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
229ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml().
230ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
231ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
232ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this list's tag, or null for
233ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Method to call when an Object type is not recognized.
236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, String name, XmlSerializer out,
245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
258ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, out, callback);
259ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
260ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "map");
261ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
262ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
263ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
264ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
265ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml(). This method presumes that the start tag and
266ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * name attribute have already been written and does not write an end tag.
267ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
268ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
269ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
270ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
271ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
272ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
273ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
278ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, XmlSerializer out,
279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
284ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Set s = val.entrySet();
285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Iterator i = s.iterator();
286ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
289ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
330212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
331212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final void writeSetXml(Set val, String name, XmlSerializer out)
332212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
333212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (val == null) {
334212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.startTag(null, "null");
335212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.endTag(null, "null");
336212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
337212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
338212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
339212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.startTag(null, "set");
340212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (name != null) {
341212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.attribute(null, "name", name);
342212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
343212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
344212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        for (Object v : val) {
345212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeValueXml(v, null, out);
346212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
347212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
348212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.endTag(null, "set");
349212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] 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, "byte-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        StringBuilder sb = new StringBuilder(val.length*2);
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
436ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a long[] into an XmlSerializer.  The list can later be read back
437ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisLongArrayXml().
438ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
439ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The long array to be flattened.
440ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
441ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
442ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
443ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
444ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
445ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
446ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "long-array");
458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
462ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
463ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
464ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
465ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
466ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
467ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Long.toString(val[i]));
468ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
469ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
470ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
471ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "long-array");
472ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
473ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
474ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
475ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a double[] into an XmlSerializer.  The list can later be read back
476ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisDoubleArrayXml().
477ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
478ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The double array to be flattened.
479ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
486ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
487ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
488ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
489ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
490ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
491ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
492ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
493ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
494ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
495ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
496ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "double-array");
497ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
498ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
499ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
500ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
501ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
502ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
503ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
504ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Double.toString(val[i]));
507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "double-array");
511ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
512ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
513ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
514ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a String[] into an XmlSerializer.  The list can later be read back
515ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisStringArrayXml().
516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The long array to be flattened.
518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
528ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "string-array");
536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", val[i]);
546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "string-array");
550ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
551ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
552ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
553087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
554087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
555087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
556087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
557087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
558087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
559087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
560087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
561087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
569ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
570ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeValueXml(v, name, out, null);
571ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
572ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
573ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
574ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten an object's value into an XmlSerializer.  The value can later
575ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * be read back with readThisValueXml().
576ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
577ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Currently supported value types are: null, String, Integer, Long,
578ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Float, Double Boolean, Map, List.
579ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
580ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param v The object to be flattened.
581ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this value's tag, or null
582ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             for none.
583ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the object into.
584ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Handler for Object types not recognized.
585ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
586ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
587ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
588ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readValueXml
589ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
590ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final void writeValueXml(Object v, String name, XmlSerializer out,
591ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback)  throws XmlPullParserException, java.io.IOException {
592087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
593087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
594087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
595087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
596087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
597087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
620087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
621087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
622087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
623087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
624ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof long[]) {
625ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeLongArrayXml((long[])v, name, out);
626ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
627ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof double[]) {
628ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeDoubleArrayXml((double[])v, name, out);
629ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
630ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof String[]) {
631ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeStringArrayXml((String[])v, name, out);
632ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
633087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
634087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
635087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
636087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
637ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeListXml((List) v, name, out);
638087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
639212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (v instanceof Set) {
640ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeSetXml((Set) v, name, out);
641212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
643087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
645087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
646087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
647087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
653ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
654ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            callback.writeUnknownObject(v, name, out);
655ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
659087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
660087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
681f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    @SuppressWarnings("unchecked")
682f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readMapXml(InputStream in)
683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
687f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
693087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
696212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return ArrayList The resulting list.
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
710212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
711212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
712212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
713212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet from an InputStream containing XML. The stream can
714212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * previously have been written by writeSetXml().
715212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
716212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param in The InputStream from which to read.
717212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
718212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The resulting set.
719212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
720212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
721212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
722212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
723212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readValueXml
724212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readThisSetXml
725212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #writeSetXml
726212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
727212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readSetXml(InputStream in)
728212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
729212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        XmlPullParser parser = Xml.newPullParser();
730212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        parser.setInput(in, null);
731212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return (HashSet) readValueXml(parser, new String[1]);
732212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
734087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
735087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
748f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
749ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
750ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisMapXml(parser, endTag, name, null);
751ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
752ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
753ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
754ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashMap object from an XmlPullParser.  The XML data could
755ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeMapXml().  The XmlPullParser
756ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the map.
757ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
758ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the map data.
759ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the map, usually "map".
760ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
761ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the map's tag.
762ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
763ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated map.
764ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
765ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
766ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
767ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
768ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
769ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name, ReadMapCallback callback)
770ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException
771087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
772f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        HashMap<String, Object> map = new HashMap<String, Object>();
773087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
774087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
775087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
776087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
777ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
778f748257eee651b974e15274e03fe9843a8393073Narayan Kamath                map.put(name[0], val);
779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
783087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
784087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
801087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
802087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
803087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
804087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
805087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
806087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
807ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
808ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
809ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisListXml(parser, endTag, name, null);
810ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
811ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
812ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
813ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read an ArrayList object from an XmlPullParser.  The XML data could
814ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeListXml().  The XmlPullParser
815ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
816ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
817ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
818ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
819ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
820ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
821ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
822ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated list.
823ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
824ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
825ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
826ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
827ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name, ReadMapCallback callback)
828ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
829087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
830087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
831087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
832087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
833087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
834ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
835087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
836087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
837087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
838087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
839087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
840087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
841087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
842087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
843087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
844087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
845087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
846087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
847087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
848087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
849087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
850ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
851ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
852ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashSet object from an XmlPullParser. The XML data could previously
853ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * have been generated by writeSetXml(). The XmlPullParser must be positioned
854ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * <em>after</em> the tag that begins the set.
855ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
856ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the set data.
857ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the set, usually "set".
858ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
859ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the set's tag.
860ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
861ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashSet The newly generated set.
862ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
863ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws XmlPullParserException
864ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws java.io.IOException
865ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
866ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readSetXml
867ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
868ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
869ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
870ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisSetXml(parser, endTag, name, null);
871ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
872ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
873212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
874212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet object from an XmlPullParser. The XML data could previously
875212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * have been generated by writeSetXml(). The XmlPullParser must be positioned
876212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <em>after</em> the tag that begins the set.
877212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
878212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param parser The XmlPullParser from which to read the set data.
879212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param endTag Name of the tag that will end the set, usually "set".
880212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param name An array of one string, used to return the name attribute
881212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *             of the set's tag.
882212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
883212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The newly generated set.
884212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
885212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
886212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
887212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
888212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readSetXml
889ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
890212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
891ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
892ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            ReadMapCallback callback) throws XmlPullParserException, java.io.IOException {
893212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        HashSet set = new HashSet();
894212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
895212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        int eventType = parser.getEventType();
896212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        do {
897212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (eventType == parser.START_TAG) {
898ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
899212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                set.add(val);
900212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                //System.out.println("Adding to set: " + val);
901212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            } else if (eventType == parser.END_TAG) {
902212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                if (parser.getName().equals(endTag)) {
903212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return set;
904212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
905212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                throw new XmlPullParserException(
906212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                        "Expected " + endTag + " end tag at: " + parser.getName());
907212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
908212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            eventType = parser.next();
909212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } while (eventType != parser.END_DOCUMENT);
910212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
911212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        throw new XmlPullParserException(
912212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                "Document ended before " + endTag + " end tag");
913212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
914087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
915087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
916087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
917087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
918087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
919087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
920087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
921087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
922087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
924087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
925087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
926087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
927087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
928087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
929087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
930087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
931087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
932087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
933087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
934087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
935087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
936087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
937087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
938087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
939087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
940087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
941087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
942087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
943ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
944087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
945087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
946087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
947087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
948087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
949087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
950087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
951087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
952087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
953087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
954087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
955087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
956087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
957087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
958087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
959087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
960087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
961087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
962087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
963087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
964087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
965087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
966087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
967087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
968087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
969087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
970087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
971087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
972087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
973087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
974087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
975087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
976087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
977087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
978087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
979087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
980087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
981087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
982087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
983087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
984087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
985ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a long[] object from an XmlPullParser.  The XML data could
986ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeLongArrayXml().  The XmlPullParser
987ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
988ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
989ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
990ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
991ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
992ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
993ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
994ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated long[].
995ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
996ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
997ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
998ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final long[] readThisLongArrayXml(XmlPullParser parser,
999ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String endTag, String[] name)
1000ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
1001ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1002ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1003ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1004ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1005ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1006ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in long-array");
1007ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1008ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in long-array");
1009ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1010ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1011ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1012ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        long[] array = new long[num];
1013ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1014ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1015ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1016ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1017ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1018ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1019ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1020ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
1021ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1022ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1023ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1024ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1025ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1026ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1027ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1028ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1029ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1030ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1031ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1032ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1033ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1034ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1035ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1036ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1037ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1038ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1039ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1040ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1041ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1042ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1043ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1044ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1045ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1046ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a double[] object from an XmlPullParser.  The XML data could
1047ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
1048ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1049ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1050ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1051ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "double-array".
1052ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1053ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1054ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1055ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated double[].
1056ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1057ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1058ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1059ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
1060ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1061ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1062ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1063ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1064ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1065ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1066ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in double-array");
1067ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1068ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in double-array");
1069ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1070ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1071ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1072ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        double[] array = new double[num];
1073ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1074ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1075ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1076ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1077ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1078ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1079ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1080ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
1081ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1082ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1083ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1084ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1085ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1086ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1087ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1088ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1089ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1090ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1091ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1092ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1093ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1094ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1095ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1096ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1097ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1098ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1099ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1100ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1101ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1102ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1103ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1104ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1105ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1106ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a String[] object from an XmlPullParser.  The XML data could
1107ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeStringArrayXml().  The XmlPullParser
1108ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1109ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1110ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1111ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "string-array".
1112ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1113ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1114ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1115ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated String[].
1116ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1117ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1118ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1119ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
1120ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1121ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1122ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1123ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1124ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1125ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1126ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in string-array");
1127ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1128ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in string-array");
1129ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1130ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1131ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1132ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        String[] array = new String[num];
1133ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1134ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1135ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1136ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1137ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1138ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1139ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1140ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = parser.getAttributeValue(null, "value");
1141ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1142ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1143ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1144ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1145ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1146ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1147ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1148ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1149ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1150ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1151ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1152ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1153ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1154ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1155ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1156ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1157ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1158ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1159ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1160ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1161ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1162ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1163ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1164ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1165ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
1167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
1168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
1169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
1170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
1172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
1173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
1174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
1176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
1178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
1179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
1180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
1181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
1182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
1183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
1185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
1186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
1187ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                return readThisValueXml(parser, name, null);
1188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
1189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
1191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
1194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
1196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
1197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
1200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1202ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
1203ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            ReadMapCallback callback)  throws XmlPullParserException, java.io.IOException {
1204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
1205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
1206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
1208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
1210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
1212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
1213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
1214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
1215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
1216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
1218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
1219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
1220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
1221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
1222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
1223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
1225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
1226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
1227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
1228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
1230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
1233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
12342ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
12352ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            // all work already done by readThisPrimitiveValueXml
1236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
1237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
1238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("long-array")) {
1242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisLongArrayXml(parser, "long-array", name);
1243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("double-array")) {
1247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisDoubleArrayXml(parser, "double-array", name);
1248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("string-array")) {
1252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisStringArrayXml(parser, "string-array", name);
1253ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1254ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1255ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
1257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisMapXml(parser, "map", name);
1259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
1263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisListXml(parser, "list", name);
1265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1268212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (tagName.equals("set")) {
1269212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            parser.next();
1270212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            res = readThisSetXml(parser, "set", name);
1271212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            name[0] = valueName;
1272212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            //System.out.println("Returning value for " + valueName + ": " + res);
1273212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return res;
1274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
1275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = callback.readThisUnknownObjectXml(parser, tagName);
1276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
1279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Unknown tag: " + tagName);
1280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
1283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
1284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1285087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
1286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
1287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
1288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
1289087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
1290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
1293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
1296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
1297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
1299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
1303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
13052ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
13062ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    throws XmlPullParserException, java.io.IOException
13072ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    {
13082ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        try {
13092ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            if (tagName.equals("int")) {
13102ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Integer.parseInt(parser.getAttributeValue(null, "value"));
13112ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("long")) {
13122ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Long.valueOf(parser.getAttributeValue(null, "value"));
13132ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("float")) {
13142ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Float(parser.getAttributeValue(null, "value"));
13152ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("double")) {
13162ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Double(parser.getAttributeValue(null, "value"));
13172ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("boolean")) {
13182ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
13192ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else {
13202ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return null;
13212ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            }
13222ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NullPointerException e) {
13232ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
13242ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NumberFormatException e) {
13252ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException(
13262ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                    "Not a number in value attribute in <" + tagName + ">");
13272ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        }
13282ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    }
13292ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko
1330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
1331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
1339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
1340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
1343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
1344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
1345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
1349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1356a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown
1357a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
1358a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            throws IOException, XmlPullParserException {
1359a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        for (;;) {
1360a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            int type = parser.next();
1361a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.END_DOCUMENT
1362a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
1363a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return false;
1364a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1365a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.START_TAG
1366a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    && parser.getDepth() == outerDepth + 1) {
1367a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return true;
1368a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1369a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        }
1370a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    }
1371ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1372d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
1373d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        final String value = in.getAttributeValue(null, name);
1374d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        try {
1375d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return Integer.parseInt(value);
1376d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        } catch (NumberFormatException e) {
1377d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return defaultValue;
1378d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        }
1379d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    }
1380d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot
1381ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
1382ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1383ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1384ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Integer.parseInt(value);
1385ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1386ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
1387ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1388ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1389ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1390ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeIntAttribute(XmlSerializer out, String name, int value)
1391ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1392ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Integer.toString(value));
1393ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1394ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1395e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
1396e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1397e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        try {
1398e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return Long.parseLong(value);
1399e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        } catch (NumberFormatException e) {
1400e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return defaultValue;
1401e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        }
1402e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
1403e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
1404ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
1405ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1406ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1407ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Long.parseLong(value);
1408ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1409ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
1410ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1411ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1412ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1413ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeLongAttribute(XmlSerializer out, String name, long value)
1414ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1415ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Long.toString(value));
1416ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1417ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1418ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
1419ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1420ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        return Boolean.parseBoolean(value);
1421ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1422ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1423ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
1424ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1425ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Boolean.toString(value));
1426ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1427ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1428ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1429ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface WriteMapCallback {
1430ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1431ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from writeMapXml when an Object type is not recognized. The implementer
1432ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * must write out the entire element including start and end tags.
1433ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1434ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param v The object to be written out
1435ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param name The mapping key for v. Must be written into the "name" attribute of the
1436ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *             start tag.
1437ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param out The XML output stream.
1438ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException on unrecognized Object type.
1439ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlSerializer serialization errors.
1440ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1441ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1442ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         public void writeUnknownObject(Object v, String name, XmlSerializer out)
1443ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                 throws XmlPullParserException, IOException;
1444ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1445ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1446ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface ReadMapCallback {
1448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
1450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * is positioned within the start tag so that attributes can be read using in.getAttribute.
1451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param in the XML input stream
1453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param tag the START_TAG that was not recognized.
1454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @return the Object parsed from the stream which will be put into the map.
1455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException if the START_TAG is not recognized.
1456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlPullParser serialization errors.
1457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
1460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                throws XmlPullParserException, IOException;
1461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1462087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
1463