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
191cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.Bitmap;
201cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.BitmapFactory;
211cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.graphics.Bitmap.CompressFormat;
221cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.net.Uri;
231cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.util.Base64;
24ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport android.util.Xml;
25087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
26087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParser;
27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParserException;
28087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer;
29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
301cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport java.io.ByteArrayOutputStream;
31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException;
32087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.InputStream;
33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream;
34ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport java.net.ProtocolException;
35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.ArrayList;
36087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.HashMap;
37212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet;
38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator;
39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List;
40087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map;
41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set;
42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */
44ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeypublic class XmlUtils {
45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static void skipCurrentTag(XmlPullParser parser)
47087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, IOException {
48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int outerDepth = parser.getDepth();
49087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
50087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor               && (type != XmlPullParser.END_TAG
52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                       || parser.getDepth() > outerDepth)) {
53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToList(CharSequence value, String[] options, int defaultValue)
58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null != value) {
60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            for (int i = 0; i < options.length; i++) {
61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (value.equals(options[i]))
62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return i;
63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return defaultValue;
67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final boolean
70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToBoolean(CharSequence value, boolean defaultValue)
71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        boolean result = false;
73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == value)
75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (value.equals("1")
78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("true")
79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ||  value.equals("TRUE"))
80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            result = true;
81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return result;
83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int
86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    convertValueToInt(CharSequence charSeq, int defaultValue)
87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (null == charSeq)
89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String nm = charSeq.toString();
92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // XXX This code is copied from Integer.decode() so we don't
94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // have to instantiate an Integer!
95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int value;
97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int sign = 1;
98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int index = 0;
99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int len = nm.length();
100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int base = 10;
101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('-' == nm.charAt(0)) {
103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sign = -1;
104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == nm.charAt(index)) {
108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for a zero by itself
109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = nm.charAt(index + 1);
113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {
115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {
118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        else if ('#' == nm.charAt(index))
123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        {
124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return Integer.parseInt(nm.substring(index), base) * sign;
129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
131a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int convertValueToUnsignedInt(String value, int defaultValue) {
132a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        if (null == value) {
133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return defaultValue;
134a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy        }
135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return parseUnsignedIntAttribute(value);
137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
139a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String  value = charSeq.toString();
141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        long    bits;
143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     index = 0;
144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     len = value.length();
145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int     base = 10;
146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if ('0' == value.charAt(index)) {
148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //  Quick check for zero by itself
149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (index == (len - 1))
150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                return 0;
151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            char    c = value.charAt(index + 1);
153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if ('x' == c || 'X' == c) {     //  check for hex
155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index += 2;
156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 16;
157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else {                        //  check for octal
158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                index++;
159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                base = 8;
160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if ('#' == value.charAt(index)) {
162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            index++;
163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            base = 16;
164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (int) Long.parseLong(value.substring(index), base);
167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an output stream as XML.  The map can later be
171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readMapXml().
172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, String, XmlSerializer)
177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, OutputStream out)
182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = new FastXmlSerializer();
184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeMapXml(val, null, serializer);
188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an output stream as XML.  The list can later be
193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * read back with readListXml().
194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out Where to write the XML data.
197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, String, XmlSerializer)
199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, OutputStream out)
204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlSerializer serializer = Xml.newSerializer();
207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setOutput(out, "utf-8");
208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.startDocument(null, true);
209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        writeListXml(val, null, serializer);
211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        serializer.endDocument();
212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a Map into an XmlSerializer.  The map can later be read back
216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisMapXml().
217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The map to be flattened.
219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the map into.
222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml(Map, OutputStream)
224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeMapXml(Map val, String name, XmlSerializer out)
229ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
230ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, name, out, null);
231ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
232ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
233ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml().
236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this list's tag, or null for
239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Method to call when an Object type is not recognized.
242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, String name, XmlSerializer out,
251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "map");
260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
264ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeMapXml(val, out, callback);
265ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
266ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "map");
267ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
268ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
269ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
270ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a Map into an XmlSerializer.  The map can later be read back
271ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisMapXml(). This method presumes that the start tag and
272ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * name attribute have already been written and does not write an end tag.
273ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The map to be flattened.
275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the map into.
276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml(Map, OutputStream)
278ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
284ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeMapXml(Map val, XmlSerializer out,
285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback) throws XmlPullParserException, java.io.IOException {
286ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
287ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
288ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
289ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
290ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Set s = val.entrySet();
291ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        Iterator i = s.iterator();
292ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i.hasNext()) {
294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            Map.Entry e = (Map.Entry)i.next();
295ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a List into an XmlSerializer.  The list can later be read back
301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisListXml().
302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The list to be flattened.
304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this list's tag, or null for
305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the list into.
307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml(List, OutputStream)
309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeListXml(List val, String name, XmlSerializer out)
314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "list");
323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int N = val.size();
328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i=0;
329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while (i < N) {
330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeValueXml(val.get(i), null, out);
331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            i++;
332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "list");
335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
336212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
337212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final void writeSetXml(Set val, String name, XmlSerializer out)
338212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
339212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (val == null) {
340212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.startTag(null, "null");
341212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.endTag(null, "null");
342212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
343212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
344212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
345212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.startTag(null, "set");
346212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        if (name != null) {
347212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            out.attribute(null, "name", name);
348212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
349212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
350212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        for (Object v : val) {
351212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            writeValueXml(v, null, out);
352212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
353212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
354212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        out.endTag(null, "set");
355212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisByteArrayXml().
360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The byte array to be flattened.
362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeByteArrayXml(byte[] val, String name,
370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "byte-array");
380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        StringBuilder sb = new StringBuilder(val.length*2);
388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int b = val[i];
390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int h = b>>4;
391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            h = b&0xff;
393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.text(sb.toString());
397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "byte-array");
399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an int[] into an XmlSerializer.  The list can later be read back
403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * with readThisIntArrayXml().
404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param val The int array to be flattened.
406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this array's tag, or null for
407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             none.
408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the array into.
409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisIntArrayXml
413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeIntArrayXml(int[] val, String name,
415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            XmlSerializer out)
416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (val == null) {
419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, "int-array");
425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final int N = val.length;
430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "num", Integer.toString(N));
431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        for (int i=0; i<N; i++) {
433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "item");
434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "value", Integer.toString(val[i]));
435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "item");
436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, "int-array");
439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
442ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a long[] into an XmlSerializer.  The list can later be read back
443ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisLongArrayXml().
444ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
445ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The long array to be flattened.
446ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
462ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
463ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "long-array");
464ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
465ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
466ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
467ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
468ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
469ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
470ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
471ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
472ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
473ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Long.toString(val[i]));
474ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
475ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
476ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
477ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "long-array");
478ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
479ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a double[] into an XmlSerializer.  The list can later be read back
482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisDoubleArrayXml().
483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The double array to be flattened.
485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
486ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
487ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
488ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
489ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
490ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
491ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
492ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
493ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
494ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
495ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
496ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
497ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
498ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
499ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
500ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
501ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
502ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "double-array");
503ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
504ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
511ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
512ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", Double.toString(val[i]));
513ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
514ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
515ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "double-array");
517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten a String[] into an XmlSerializer.  The list can later be read back
521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * with readThisStringArrayXml().
522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param val The long array to be flattened.
524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this array's tag, or null for
525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             none.
526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the array into.
527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
528ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeValueXml
530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readThisIntArrayXml
531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (val == null) {
536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "null");
537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "null");
538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.startTag(null, "string-array");
542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (name != null) {
543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "name", name);
544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final int N = val.length;
547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.attribute(null, "num", Integer.toString(N));
548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int i=0; i<N; i++) {
550ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.startTag(null, "item");
551ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.attribute(null, "value", val[i]);
552ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            out.endTag(null, "item");
553ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
554ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
555ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        out.endTag(null, "string-array");
556ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
557ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
558ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
559087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Flatten an object's value into an XmlSerializer.  The value can later
560087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * be read back with readThisValueXml().
561087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
562087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Currently supported value types are: null, String, Integer, Long,
563087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Float, Double Boolean, Map, List.
564087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
565087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param v The object to be flattened.
566087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name Name attribute to include with this value's tag, or null
567087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             for none.
568087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param out XmlSerializer to write the object into.
569087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
570087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeMapXml
571087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
572087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
573087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
574087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void writeValueXml(Object v, String name, XmlSerializer out)
575ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
576ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        writeValueXml(v, name, out, null);
577ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
578ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
579ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
580ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Flatten an object's value into an XmlSerializer.  The value can later
581ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * be read back with readThisValueXml().
582ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
583ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Currently supported value types are: null, String, Integer, Long,
584ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Float, Double Boolean, Map, List.
585ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
586ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param v The object to be flattened.
587ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name Name attribute to include with this value's tag, or null
588ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             for none.
589ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param out XmlSerializer to write the object into.
590ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param callback Handler for Object types not recognized.
591ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
592ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeMapXml
593ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #writeListXml
594ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readValueXml
595ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
596ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final void writeValueXml(Object v, String name, XmlSerializer out,
597ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            WriteMapCallback callback)  throws XmlPullParserException, java.io.IOException {
598087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        String typeStr;
599087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (v == null) {
600087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "null");
601087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
602087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "null");
605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof String) {
607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Integer) {
615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "int";
616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Long) {
617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "long";
618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Float) {
619087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "float";
620087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Double) {
621087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "double";
622087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Boolean) {
623087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            typeStr = "boolean";
624087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof byte[]) {
625087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeByteArrayXml((byte[])v, name, out);
626087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
627087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof int[]) {
628087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeIntArrayXml((int[])v, name, out);
629087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
630ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof long[]) {
631ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeLongArrayXml((long[])v, name, out);
632ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
633ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof double[]) {
634ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeDoubleArrayXml((double[])v, name, out);
635ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
636ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (v instanceof String[]) {
637ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeStringArrayXml((String[])v, name, out);
638ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
639087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof Map) {
640087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            writeMapXml((Map)v, name, out);
641087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof List) {
643ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeListXml((List) v, name, out);
644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
645212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (v instanceof Set) {
646ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            writeSetXml((Set) v, name, out);
647212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return;
648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (v instanceof CharSequence) {
649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // XXX This is to allow us to at least write something if
650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // we encounter styled text...  but it means we will drop all
651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            // of the styling information. :(
652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.startTag(null, "string");
653087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (name != null) {
654087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                out.attribute(null, "name", name);
655087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.text(v.toString());
657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.endTag(null, "string");
658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return;
659ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
660ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            callback.writeUnknownObject(v, name, out);
661ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return;
662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new RuntimeException("writeValueXml: unable to write value " + v);
664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.startTag(null, typeStr);
667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (name != null) {
668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            out.attribute(null, "name", name);
669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.attribute(null, "value", v.toString());
671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        out.endTag(null, typeStr);
672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
674087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
675087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap from an InputStream containing XML.  The stream can
676087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeMapXml().
677087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
678087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
679087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
680087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The resulting map.
681087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
682087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
683087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
684087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisMapXml
685087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * #see #writeMapXml
686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
687f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    @SuppressWarnings("unchecked")
688f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readMapXml(InputStream in)
689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
690087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
692087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
693f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
694087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList from an InputStream containing XML.  The stream can
698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written by writeListXml().
699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param in The InputStream from which to read.
701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
702212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return ArrayList The resulting list.
703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readValueXml
706087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readThisListXml
707087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeListXml
708087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final ArrayList readListXml(InputStream in)
710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        XmlPullParser   parser = Xml.newPullParser();
713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        parser.setInput(in, null);
714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        return (ArrayList)readValueXml(parser, new String[1]);
715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
716212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
717212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
718212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
719212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet from an InputStream containing XML. The stream can
720212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * previously have been written by writeSetXml().
721212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
722212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param in The InputStream from which to read.
723212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
724212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The resulting set.
725212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
726212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
727212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
728212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
729212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readValueXml
730212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readThisSetXml
731212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #writeSetXml
732212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
733212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    public static final HashSet readSetXml(InputStream in)
734212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            throws XmlPullParserException, java.io.IOException {
735212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        XmlPullParser parser = Xml.newPullParser();
736212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        parser.setInput(in, null);
737212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        return (HashSet) readValueXml(parser, new String[1]);
738212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
739087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
740087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a HashMap object from an XmlPullParser.  The XML data could
742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeMapXml().  The XmlPullParser
743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the map.
744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the map data.
746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the map, usually "map".
747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the map's tag.
749087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated map.
751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
754f748257eee651b974e15274e03fe9843a8393073Narayan Kamath    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
755ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
756ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisMapXml(parser, endTag, name, null);
757ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
758ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
759ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
760ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashMap object from an XmlPullParser.  The XML data could
761ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeMapXml().  The XmlPullParser
762ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the map.
763ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
764ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the map data.
765ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the map, usually "map".
766ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
767ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the map's tag.
768ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
769ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated map.
770ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
771ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readMapXml
772ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
773ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
774ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
775ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name, ReadMapCallback callback)
776ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException
777087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
778f748257eee651b974e15274e03fe9843a8393073Narayan Kamath        HashMap<String, Object> map = new HashMap<String, Object>();
779087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
780087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
781087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
782087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
783ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
784f748257eee651b974e15274e03fe9843a8393073Narayan Kamath                map.put(name[0], val);
785087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return map;
788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an ArrayList object from an XmlPullParser.  The XML data could
801087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeListXml().  The XmlPullParser
802087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
803087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
804087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
805087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
806087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
807087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
808087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
809087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return HashMap The newly generated list.
810087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
811087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
812087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
813ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
814ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
815ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisListXml(parser, endTag, name, null);
816ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
817ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
818ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
819ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read an ArrayList object from an XmlPullParser.  The XML data could
820ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeListXml().  The XmlPullParser
821ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
822ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
823ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
824ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
825ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
826ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
827ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
828ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashMap The newly generated list.
829ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
830ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
831ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
832ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
833ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name, ReadMapCallback callback)
834ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
835087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        ArrayList list = new ArrayList();
836087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
837087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
838087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
839087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
840ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
841087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                list.add(val);
842087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                //System.out.println("Adding to list: " + val);
843087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
844087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
845087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return list;
846087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
847087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
848087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Expected " + endTag + " end tag at: " + parser.getName());
849087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
850087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
851087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
852087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
853087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
854087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
855087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
856ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
857ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
858ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a HashSet object from an XmlPullParser. The XML data could previously
859ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * have been generated by writeSetXml(). The XmlPullParser must be positioned
860ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * <em>after</em> the tag that begins the set.
861ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
862ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the set data.
863ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the set, usually "set".
864ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
865ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the set's tag.
866ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
867ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return HashSet The newly generated set.
868ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
869ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws XmlPullParserException
870ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @throws java.io.IOException
871ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
872ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readSetXml
873ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
874ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
875ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
876ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        return readThisSetXml(parser, endTag, name, null);
877ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
878ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
879212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    /**
880212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * Read a HashSet object from an XmlPullParser. The XML data could previously
881212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * have been generated by writeSetXml(). The XmlPullParser must be positioned
882212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * <em>after</em> the tag that begins the set.
883212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
884212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param parser The XmlPullParser from which to read the set data.
885212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param endTag Name of the tag that will end the set, usually "set".
886212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @param name An array of one string, used to return the name attribute
887212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *             of the set's tag.
888212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
889212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @return HashSet The newly generated set.
890212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
891212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws XmlPullParserException
892212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @throws java.io.IOException
893212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     *
894212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     * @see #readSetXml
895ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @hide
896212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell     */
897ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
898ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            ReadMapCallback callback) throws XmlPullParserException, java.io.IOException {
899212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        HashSet set = new HashSet();
900212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
901212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        int eventType = parser.getEventType();
902212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        do {
903212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            if (eventType == parser.START_TAG) {
904ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                Object val = readThisValueXml(parser, name, callback);
905212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                set.add(val);
906212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                //System.out.println("Adding to set: " + val);
907212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            } else if (eventType == parser.END_TAG) {
908212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                if (parser.getName().equals(endTag)) {
909212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return set;
910212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
911212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                throw new XmlPullParserException(
912212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                        "Expected " + endTag + " end tag at: " + parser.getName());
913212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
914212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            eventType = parser.next();
915212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } while (eventType != parser.END_DOCUMENT);
916212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
917212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        throw new XmlPullParserException(
918212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                "Document ended before " + endTag + " end tag");
919212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell    }
920087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
921087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
922087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read an int[] object from an XmlPullParser.  The XML data could
923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been generated by writeIntArrayXml().  The XmlPullParser
924087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * must be positioned <em>after</em> the tag that begins the list.
925087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
926087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the list data.
927087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param endTag Name of the tag that will end the list, usually "list".
928087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
929087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the list's tag.
930087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
931087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Returns a newly generated int[].
932087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
933087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
934087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
935087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final int[] readThisIntArrayXml(XmlPullParser parser,
936087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String endTag, String[] name)
937087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throws XmlPullParserException, java.io.IOException {
938087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
939087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int num;
940087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        try {
941087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
942087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NullPointerException e) {
943087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
944087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Need num attribute in byte-array");
945087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } catch (NumberFormatException e) {
946087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
947087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Not a number in num attribute in byte-array");
948087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
949ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
950087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
951087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int[] array = new int[num];
952087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int i = 0;
953087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
954087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
955087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
956087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
957087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals("item")) {
958087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    try {
959087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        array[i] = Integer.parseInt(
960087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                parser.getAttributeValue(null, "value"));
961087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NullPointerException e) {
962087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
963087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Need value attribute in item");
964087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    } catch (NumberFormatException e) {
965087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        throw new XmlPullParserException(
966087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                                "Not a number in value attribute in item");
967087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
968087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
969087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
970087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                            "Expected item tag at: " + parser.getName());
971087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
972087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
973087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(endTag)) {
974087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return array;
975087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (parser.getName().equals("item")) {
976087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    i++;
977087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else {
978087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
979087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Expected " + endTag + " end tag at: "
980087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        + parser.getName());
981087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
982087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
983087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
984087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
985087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
986087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
987087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Document ended before " + endTag + " end tag");
988087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
989087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
990087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    /**
991ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a long[] object from an XmlPullParser.  The XML data could
992ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeLongArrayXml().  The XmlPullParser
993ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
994ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
995ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
996ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "list".
997ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
998ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
999ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1000ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated long[].
1001ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1002ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1003ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1004ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final long[] readThisLongArrayXml(XmlPullParser parser,
1005ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String endTag, String[] name)
1006ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throws XmlPullParserException, java.io.IOException {
1007ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1008ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1009ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1010ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1011ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1012ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in long-array");
1013ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1014ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in long-array");
1015ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1016ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1017ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1018ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        long[] array = new long[num];
1019ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1020ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1021ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1022ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1023ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1024ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1025ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1026ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
1027ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1028ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1029ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1030ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1031ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1032ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1033ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1034ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1035ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1036ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1037ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1038ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1039ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1040ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1041ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1042ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1043ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1044ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1045ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1046ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1047ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1048ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1049ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1050ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1051ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1052ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a double[] object from an XmlPullParser.  The XML data could
1053ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
1054ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1055ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1056ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1057ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "double-array".
1058ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1059ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1060ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1061ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated double[].
1062ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1063ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1064ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1065ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
1066ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1067ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1068ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1069ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1070ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1071ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1072ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in double-array");
1073ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1074ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in double-array");
1075ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1076ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1077ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1078ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        double[] array = new double[num];
1079ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1080ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1081ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1082ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1083ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1084ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1085ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1086ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
1087ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1088ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1089ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1090ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1091ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1092ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1093ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1094ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1095ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1096ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1097ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1098ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1099ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1100ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1101ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1102ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1103ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1104ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1105ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1106ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1107ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1108ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1109ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1110ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1111ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1112ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * Read a String[] object from an XmlPullParser.  The XML data could
1113ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * previously have been generated by writeStringArrayXml().  The XmlPullParser
1114ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * must be positioned <em>after</em> the tag that begins the list.
1115ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1116ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param parser The XmlPullParser from which to read the list data.
1117ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param endTag Name of the tag that will end the list, usually "string-array".
1118ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @param name An array of one string, used to return the name attribute
1119ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *             of the list's tag.
1120ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1121ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @return Returns a newly generated String[].
1122ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     *
1123ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     * @see #readListXml
1124ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner     */
1125ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
1126ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            String[] name) throws XmlPullParserException, java.io.IOException {
1127ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1128ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int num;
1129ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        try {
1130ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
1131ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NullPointerException e) {
1132ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Need num attribute in string-array");
1133ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } catch (NumberFormatException e) {
1134ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Not a number in num attribute in string-array");
1135ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
1136ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        parser.next();
1137ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1138ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        String[] array = new String[num];
1139ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int i = 0;
1140ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1141ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int eventType = parser.getEventType();
1142ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        do {
1143ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            if (eventType == parser.START_TAG) {
1144ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals("item")) {
1145ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    try {
1146ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        array[i] = parser.getAttributeValue(null, "value");
1147ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NullPointerException e) {
1148ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Need value attribute in item");
1149ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    } catch (NumberFormatException e) {
1150ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        throw new XmlPullParserException("Not a number in value attribute in item");
1151ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    }
1152ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1153ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
1154ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1155ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            } else if (eventType == parser.END_TAG) {
1156ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                if (parser.getName().equals(endTag)) {
1157ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    return array;
1158ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else if (parser.getName().equals("item")) {
1159ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    i++;
1160ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                } else {
1161ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
1162ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                            parser.getName());
1163ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                }
1164ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
1165ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            eventType = parser.next();
1166ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } while (eventType != parser.END_DOCUMENT);
1167ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1168ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
1169ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1170ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1171ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /**
1172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * Read a flattened object from an XmlPullParser.  The XML data could
1173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * previously have been written with writeMapXml(), writeListXml(), or
1174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
1175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * tag that defines the value.
1176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param parser The XmlPullParser from which to read the object.
1178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @param name An array of one string, used to return the name attribute
1179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *             of the value's tag.
1180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @return Object The newly generated value object.
1182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     *
1183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readMapXml
1184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #readListXml
1185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     * @see #writeValueXml
1186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor     */
1187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final Object readValueXml(XmlPullParser parser, String[] name)
1188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    throws XmlPullParserException, java.io.IOException
1189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType = parser.getEventType();
1191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        do {
1192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.START_TAG) {
1193ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                return readThisValueXml(parser, name, null);
1194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.END_TAG) {
1195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag at: " + parser.getName());
1197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected text: " + parser.getText());
1200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            eventType = parser.next();
1202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } while (eventType != parser.END_DOCUMENT);
1203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document");
1206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1208ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
1209ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            ReadMapCallback callback)  throws XmlPullParserException, java.io.IOException {
1210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String valueName = parser.getAttributeValue(null, "name");
1211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        final String tagName = parser.getName();
1212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
1214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        Object res;
1216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (tagName.equals("null")) {
1218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = null;
1219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("string")) {
1220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            String value = "";
1221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            int eventType;
1222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (eventType == parser.END_TAG) {
1224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    if (parser.getName().equals("string")) {
1225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        name[0] = valueName;
1226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        //System.out.println("Returning value for " + valueName + ": " + value);
1227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        return value;
1228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    }
1229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected end tag in <string>: " + parser.getName());
1231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.TEXT) {
1232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    value += parser.getText();
1233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                } else if (eventType == parser.START_TAG) {
1234087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    throw new XmlPullParserException(
1235087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                        "Unexpected start tag in <string>: " + parser.getName());
1236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException(
1239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected end of document in <string>");
12402ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
12412ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            // all work already done by readThisPrimitiveValueXml
1242087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("int-array")) {
1243087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisIntArrayXml(parser, "int-array", name);
1244087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1245087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1246087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("long-array")) {
1248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisLongArrayXml(parser, "long-array", name);
1249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("double-array")) {
1253ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisDoubleArrayXml(parser, "double-array", name);
1254ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1255ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1256ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1257ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (tagName.equals("string-array")) {
1258ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = readThisStringArrayXml(parser, "string-array", name);
1259ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1260ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            //System.out.println("Returning value for " + valueName + ": " + res);
1261ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("map")) {
1263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisMapXml(parser, "map", name);
1265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else if (tagName.equals("list")) {
1269087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            parser.next();
1270087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            res = readThisListXml(parser, "list", name);
1271087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            name[0] = valueName;
1272087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            //System.out.println("Returning value for " + valueName + ": " + res);
1273087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            return res;
1274212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        } else if (tagName.equals("set")) {
1275212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            parser.next();
1276212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            res = readThisSetXml(parser, "set", name);
1277212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            name[0] = valueName;
1278212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            //System.out.println("Returning value for " + valueName + ": " + res);
1279212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            return res;
1280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        } else if (callback != null) {
1281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            res = callback.readThisUnknownObjectXml(parser, tagName);
1282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            name[0] = valueName;
1283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            return res;
1284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        } else {
1285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            throw new XmlPullParserException("Unknown tag: " + tagName);
1286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        // Skip through to end tag.
1289087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int eventType;
1290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
1291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            if (eventType == parser.END_TAG) {
1292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                if (parser.getName().equals(tagName)) {
1293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    name[0] = valueName;
1294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    //System.out.println("Returning value for " + valueName + ": " + res);
1295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    return res;
1296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                }
1297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
1299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.TEXT) {
1300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                "Unexpected text in <" + tagName + ">: " + parser.getName());
1302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            } else if (eventType == parser.START_TAG) {
1303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                throw new XmlPullParserException(
1304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
1305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            }
1306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        throw new XmlPullParserException(
1308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            "Unexpected end of document in <" + tagName + ">");
1309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
13112ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
13122ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    throws XmlPullParserException, java.io.IOException
13132ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    {
13142ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        try {
13152ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            if (tagName.equals("int")) {
13162ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Integer.parseInt(parser.getAttributeValue(null, "value"));
13172ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("long")) {
13182ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Long.valueOf(parser.getAttributeValue(null, "value"));
13192ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("float")) {
13202ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Float(parser.getAttributeValue(null, "value"));
13212ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("double")) {
13222ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return new Double(parser.getAttributeValue(null, "value"));
13232ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else if (tagName.equals("boolean")) {
13242ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
13252ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            } else {
13262ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                return null;
13272ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            }
13282ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NullPointerException e) {
13292ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
13302ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        } catch (NumberFormatException e) {
13312ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko            throw new XmlPullParserException(
13322ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko                    "Not a number in value attribute in <" + tagName + ">");
13332ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko        }
13342ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko    }
13352ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko
1336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
1337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (type != parser.START_TAG) {
1345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("No start tag found");
1346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        if (!parser.getName().equals(firstElementName)) {
1349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
1350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                    ", expected " + firstElementName);
1351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor
1354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
1355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    {
1356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        int type;
1357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        while ((type=parser.next()) != parser.START_TAG
1358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor                   && type != parser.END_DOCUMENT) {
1359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor            ;
1360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor        }
1361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor    }
1362a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown
1363a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
1364a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            throws IOException, XmlPullParserException {
1365a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        for (;;) {
1366a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            int type = parser.next();
1367a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.END_DOCUMENT
1368a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
1369a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return false;
1370a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1371a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            if (type == XmlPullParser.START_TAG
1372a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                    && parser.getDepth() == outerDepth + 1) {
1373a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown                return true;
1374a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown            }
1375a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown        }
1376a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown    }
1377ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1378d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
1379d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        final String value = in.getAttributeValue(null, name);
1380d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        try {
1381d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return Integer.parseInt(value);
1382d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        } catch (NumberFormatException e) {
1383d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot            return defaultValue;
1384d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot        }
1385d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot    }
1386d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot
1387ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
1388ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1389ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1390ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Integer.parseInt(value);
1391ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1392ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
1393ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1394ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1395ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1396ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeIntAttribute(XmlSerializer out, String name, int value)
1397ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1398ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Integer.toString(value));
1399ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1400ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1401e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
1402e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1403e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        try {
1404e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return Long.parseLong(value);
1405e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        } catch (NumberFormatException e) {
1406e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return defaultValue;
1407e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        }
1408e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
1409e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
1410ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
1411ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1412ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        try {
1413ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            return Long.parseLong(value);
1414ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        } catch (NumberFormatException e) {
1415ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
1416ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        }
1417ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1418ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
1419ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeLongAttribute(XmlSerializer out, String name, long value)
1420ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1421ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Long.toString(value));
1422ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1423ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
14241cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
14251cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
14261cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        try {
14271cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return Float.parseFloat(value);
14281cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } catch (NumberFormatException e) {
14291cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
14301cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
14311cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14321cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14331cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeFloatAttribute(XmlSerializer out, String name, float value)
14341cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
14351cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        out.attribute(null, name, Float.toString(value));
14361cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14371cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
1438ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
1439ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        final String value = in.getAttributeValue(null, name);
1440ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        return Boolean.parseBoolean(value);
1441ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1442ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey
144377d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey    public static boolean readBooleanAttribute(XmlPullParser in, String name,
144477d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            boolean defaultValue) {
144577d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        final String value = in.getAttributeValue(null, name);
144677d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        if (value == null) {
144777d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            return defaultValue;
144877d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        } else {
144977d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey            return Boolean.parseBoolean(value);
145077d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey        }
145177d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey    }
145277d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey
1453ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
1454ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey            throws IOException {
1455ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey        out.attribute(null, name, Boolean.toString(value));
1456ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey    }
1457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
14581cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static Uri readUriAttribute(XmlPullParser in, String name) {
14591cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
14601cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        return (value != null) ? Uri.parse(value) : null;
14611cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14621cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14631cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
14641cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
14651cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
14661cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, value.toString());
14671cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
14681cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14691cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14701cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static String readStringAttribute(XmlPullParser in, String name) {
14711cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        return in.getAttributeValue(null, name);
14721cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14731cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14741cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeStringAttribute(XmlSerializer out, String name, String value)
14751cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
14761cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
14771cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, value);
14781cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
14791cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14801cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14811cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
14821cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final String value = in.getAttributeValue(null, name);
14831cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
14841cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return Base64.decode(value, Base64.DEFAULT);
14851cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } else {
14861cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return null;
14871cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
14881cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14891cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14901cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
14911cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
14921cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
14931cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
14941cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
14951cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
14961cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
14971cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
14981cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        final byte[] value = readByteArrayAttribute(in, name);
14991cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
15001cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return BitmapFactory.decodeByteArray(value, 0, value.length);
15011cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        } else {
15021cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            return null;
15031cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
15041cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
15051cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
150602bd78490d8594d225ecc70a74b2058cb968a657Jeff Sharkey    @Deprecated
15071cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
15081cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            throws IOException {
15091cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        if (value != null) {
15101cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            final ByteArrayOutputStream os = new ByteArrayOutputStream();
15111cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            value.compress(CompressFormat.PNG, 90, os);
15121cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            writeByteArrayAttribute(out, name, os.toByteArray());
15131cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey        }
15141cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey    }
15151cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
1516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface WriteMapCallback {
1518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from writeMapXml when an Object type is not recognized. The implementer
1520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * must write out the entire element including start and end tags.
1521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param v The object to be written out
1523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param name The mapping key for v. Must be written into the "name" attribute of the
1524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *             start tag.
1525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param out The XML output stream.
1526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException on unrecognized Object type.
1527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlSerializer serialization errors.
1528ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         public void writeUnknownObject(Object v, String name, XmlSerializer out)
1531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                 throws XmlPullParserException, IOException;
1532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
1534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    /** @hide */
1535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    public interface ReadMapCallback {
1536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        /**
1537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
1538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * is positioned within the start tag so that attributes can be read using in.getAttribute.
1539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         *
1540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param in the XML input stream
1541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @param tag the START_TAG that was not recognized.
1542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @return the Object parsed from the stream which will be put into the map.
1543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws XmlPullParserException if the START_TAG is not recognized.
1544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @throws IOException on XmlPullParser serialization errors.
1545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         * @hide
1546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner         */
1547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
1548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                throws XmlPullParserException, IOException;
1549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
1550087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor}
1551