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; 237121e18595d4c559044e26bfe6035406a862f466Svet Ganovimport android.text.TextUtils; 24a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackbornimport android.util.ArrayMap; 251cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport android.util.Base64; 26ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport android.util.Xml; 27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 28087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParser; 29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlPullParserException; 30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer; 31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 321cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkeyimport java.io.ByteArrayOutputStream; 33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException; 34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.InputStream; 35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream; 36ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeyimport java.net.ProtocolException; 379e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewiczimport java.nio.charset.StandardCharsets; 38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.ArrayList; 39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.HashMap; 40212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powellimport java.util.HashSet; 41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Iterator; 42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.List; 43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Map; 44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.util.Set; 45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** {@hide} */ 47ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkeypublic class XmlUtils { 48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 497121e18595d4c559044e26bfe6035406a862f466Svet Ganov private static final String STRING_ARRAY_SEPARATOR = ":"; 507121e18595d4c559044e26bfe6035406a862f466Svet Ganov 51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static void skipCurrentTag(XmlPullParser parser) 52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, IOException { 53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int outerDepth = parser.getDepth(); 54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && (type != XmlPullParser.END_TAG 57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || parser.getDepth() > outerDepth)) { 58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int 62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToList(CharSequence value, String[] options, int defaultValue) 63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null != value) { 65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i = 0; i < options.length; i++) { 66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (value.equals(options[i])) 67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return i; 68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final boolean 75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToBoolean(CharSequence value, boolean defaultValue) 76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor boolean result = false; 78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null == value) 80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (value.equals("1") 83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || value.equals("true") 84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor || value.equals("TRUE")) 85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor result = true; 86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return result; 88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int 91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor convertValueToInt(CharSequence charSeq, int defaultValue) 92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (null == charSeq) 94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String nm = charSeq.toString(); 97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // XXX This code is copied from Integer.decode() so we don't 99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // have to instantiate an Integer! 100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int value; 102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int sign = 1; 103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int index = 0; 104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int len = nm.length(); 105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int base = 10; 106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('-' == nm.charAt(0)) { 108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sign = -1; 109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('0' == nm.charAt(index)) { 113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Quick check for a zero by itself 114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (index == (len - 1)) 115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return 0; 116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = nm.charAt(index + 1); 118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('x' == c || 'X' == c) { 120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index += 2; 121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 8; 125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor else if ('#' == nm.charAt(index)) 128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return Integer.parseInt(nm.substring(index), base) * sign; 134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 136a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy public static int convertValueToUnsignedInt(String value, int defaultValue) { 137a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy if (null == value) { 138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return defaultValue; 139a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy } 140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return parseUnsignedIntAttribute(value); 142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 144a8f6d5f0720f400b6f59b0809aaefea83c5f51d4Romain Guy public static int parseUnsignedIntAttribute(CharSequence charSeq) { 145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String value = charSeq.toString(); 146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor long bits; 148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int index = 0; 149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int len = value.length(); 150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int base = 10; 151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('0' == value.charAt(index)) { 153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Quick check for zero by itself 154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (index == (len - 1)) 155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return 0; 156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = value.charAt(index + 1); 158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ('x' == c || 'X' == c) { // check for hex 160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index += 2; 161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { // check for octal 163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 8; 165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if ('#' == value.charAt(index)) { 167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor index++; 168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor base = 16; 169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return (int) Long.parseLong(value.substring(index), base); 172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a Map into an output stream as XML. The map can later be 176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * read back with readMapXml(). 177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The map to be flattened. 179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out Where to write the XML data. 180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml(Map, String, XmlSerializer) 182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeMapXml(Map val, OutputStream out) 187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer serializer = new FastXmlSerializer(); 1899e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz serializer.setOutput(out, StandardCharsets.UTF_8.name()); 190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.startDocument(null, true); 191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeMapXml(val, null, serializer); 193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.endDocument(); 194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a List into an output stream as XML. The list can later be 198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * read back with readListXml(). 199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The list to be flattened. 201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out Where to write the XML data. 202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml(List, String, XmlSerializer) 204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeListXml(List val, OutputStream out) 209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer serializer = Xml.newSerializer(); 2129e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz serializer.setOutput(out, StandardCharsets.UTF_8.name()); 213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.startDocument(null, true); 214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeListXml(val, null, serializer); 216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor serializer.endDocument(); 217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a Map into an XmlSerializer. The map can later be read back 221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisMapXml(). 222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The map to be flattened. 224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this list's tag, or null for 225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the map into. 227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml(Map, OutputStream) 229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeMapXml(Map val, String name, XmlSerializer out) 234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeMapXml(val, name, out, null); 236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a Map into an XmlSerializer. The map can later be read back 240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisMapXml(). 241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The map to be flattened. 243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this list's tag, or null for 244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the map into. 246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param callback Method to call when an Object type is not recognized. 247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml(Map, OutputStream) 249ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 250ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 251ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 252ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 253ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 254ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 255ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeMapXml(Map val, String name, XmlSerializer out, 256ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 257ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "map"); 265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 269ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeMapXml(val, out, callback); 270ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 271ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "map"); 272ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 273ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 274ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 275ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a Map into an XmlSerializer. The map can later be read back 276ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisMapXml(). This method presumes that the start tag and 277ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * name attribute have already been written and does not write an end tag. 278ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 279ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The map to be flattened. 280ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the map into. 281ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 282ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml(Map, OutputStream) 283ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 284ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 285ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 286ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 287ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 288ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 289ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeMapXml(Map val, XmlSerializer out, 290ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 291ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 292ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 293ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 294ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 295ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Set s = val.entrySet(); 296ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner Iterator i = s.iterator(); 297ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i.hasNext()) { 299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor Map.Entry e = (Map.Entry)i.next(); 300ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeValueXml(e.getValue(), (String)e.getKey(), out, callback); 301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a List into an XmlSerializer. The list can later be read back 306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisListXml(). 307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The list to be flattened. 309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this list's tag, or null for 310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the list into. 312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml(List, OutputStream) 314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeListXml(List val, String name, XmlSerializer out) 319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "list"); 328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int N = val.size(); 333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int i=0; 334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i < N) { 335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeValueXml(val.get(i), null, out); 336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i++; 337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "list"); 340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 341212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 342212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public static final void writeSetXml(Set val, String name, XmlSerializer out) 343212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throws XmlPullParserException, java.io.IOException { 344212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (val == null) { 345212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.startTag(null, "null"); 346212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.endTag(null, "null"); 347212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return; 348212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 349212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 350212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.startTag(null, "set"); 351212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (name != null) { 352212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.attribute(null, "name", name); 353212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 354212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 355212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell for (Object v : val) { 356212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell writeValueXml(v, null, out); 357212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 358212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 359212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell out.endTag(null, "set"); 360212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten a byte[] into an XmlSerializer. The list can later be read back 364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisByteArrayXml(). 365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The byte array to be flattened. 367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this array's tag, or null for 368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the array into. 370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeByteArrayXml(byte[] val, String name, 375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer out) 376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 378087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 379087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "byte-array"); 385087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 386087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 387087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 388087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 389087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int N = val.length; 390087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "num", Integer.toString(N)); 391087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 392087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor StringBuilder sb = new StringBuilder(val.length*2); 393087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i=0; i<N; i++) { 394087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int b = val[i]; 395087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int h = b>>4; 396087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); 397087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor h = b&0xff; 398087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); 399087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 400087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 401087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(sb.toString()); 402087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 403087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "byte-array"); 404087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 407087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten an int[] into an XmlSerializer. The list can later be read back 408087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * with readThisIntArrayXml(). 409087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param val The int array to be flattened. 411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this array's tag, or null for 412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * none. 413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the array into. 414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 415087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisIntArrayXml 418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 419087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeIntArrayXml(int[] val, String name, 420087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlSerializer out) 421087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 422087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 423087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (val == null) { 424087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 425087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 426087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 427087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 428087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "int-array"); 430087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int N = val.length; 435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "num", Integer.toString(N)); 436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (int i=0; i<N; i++) { 438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "item"); 439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "value", Integer.toString(val[i])); 440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "item"); 441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "int-array"); 444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 447ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a long[] into an XmlSerializer. The list can later be read back 448ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisLongArrayXml(). 449ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 450ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The long array to be flattened. 451ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 452ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 453ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 454ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 455ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 456ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 457ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 458ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 459ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out) 460ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 461ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 462ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 463ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 464ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 465ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 466ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 467ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 468ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "long-array"); 469ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 470ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 471ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 472ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 473ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 474ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 475ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 476ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 477ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 478ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", Long.toString(val[i])); 479ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "long-array"); 483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 486ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a double[] into an XmlSerializer. The list can later be read back 487ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisDoubleArrayXml(). 488ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 489ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param val The double array to be flattened. 490ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 491ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 492ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 493ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 494ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 495ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 496ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 497ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 498ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out) 499ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 500ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 501ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 502ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 503ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 504ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "double-array"); 508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 511ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 512ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 513ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 514ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 515ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 516ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 517ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", Double.toString(val[i])); 518ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 519ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 520ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 521ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "double-array"); 522ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 523ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 524ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 525ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten a String[] into an XmlSerializer. The list can later be read back 526ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * with readThisStringArrayXml(). 527ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 52873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param val The String array to be flattened. 529ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this array's tag, or null for 530ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * none. 531ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the array into. 532ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 533ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 534ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeValueXml 535ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readThisIntArrayXml 536ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 537ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out) 538ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 539ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 540ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (val == null) { 541ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "null"); 542ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "null"); 543ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 544ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 545ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 546ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "string-array"); 547ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (name != null) { 548ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "name", name); 549ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 550ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 551ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int N = val.length; 552ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "num", Integer.toString(N)); 553ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 554ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int i=0; i<N; i++) { 555ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.startTag(null, "item"); 556ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.attribute(null, "value", val[i]); 557ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "item"); 558ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 559ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 560ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner out.endTag(null, "string-array"); 561ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 562ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 563ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 56473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * Flatten a boolean[] into an XmlSerializer. The list can later be read back 56573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * with readThisBooleanArrayXml(). 56673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * 56773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param val The boolean array to be flattened. 56873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param name Name attribute to include with this array's tag, or null for 56973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * none. 57073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param out XmlSerializer to write the array into. 57173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * 57273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @see #writeMapXml 57373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @see #writeValueXml 57473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @see #readThisIntArrayXml 57573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner */ 57673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner public static final void writeBooleanArrayXml(boolean[] val, String name, XmlSerializer out) 57773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throws XmlPullParserException, java.io.IOException { 57873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 57973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner if (val == null) { 58073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.startTag(null, "null"); 58173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.endTag(null, "null"); 58273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner return; 58373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 58473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 58573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.startTag(null, "boolean-array"); 58673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner if (name != null) { 58773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.attribute(null, "name", name); 58873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 58973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 59073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner final int N = val.length; 59173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.attribute(null, "num", Integer.toString(N)); 59273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 59373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner for (int i=0; i<N; i++) { 59473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.startTag(null, "item"); 59573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.attribute(null, "value", Boolean.toString(val[i])); 59673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.endTag(null, "item"); 59773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 59873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 59973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner out.endTag(null, "boolean-array"); 60073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 60173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 60273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner /** 603087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Flatten an object's value into an XmlSerializer. The value can later 604087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * be read back with readThisValueXml(). 605087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 606087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Currently supported value types are: null, String, Integer, Long, 607087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Float, Double Boolean, Map, List. 608087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 609087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param v The object to be flattened. 610087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name Name attribute to include with this value's tag, or null 611087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * for none. 612087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param out XmlSerializer to write the object into. 613087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 614087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeMapXml 615087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 616087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 617087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 618087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void writeValueXml(Object v, String name, XmlSerializer out) 619ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 620ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeValueXml(v, name, out, null); 621ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 622ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 623ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 624ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Flatten an object's value into an XmlSerializer. The value can later 625ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * be read back with readThisValueXml(). 626ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 627ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Currently supported value types are: null, String, Integer, Long, 628ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Float, Double Boolean, Map, List. 629ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 630ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param v The object to be flattened. 631ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name Name attribute to include with this value's tag, or null 632ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * for none. 633ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out XmlSerializer to write the object into. 634ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param callback Handler for Object types not recognized. 635ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 636ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeMapXml 637ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #writeListXml 638ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readValueXml 639ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 640ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final void writeValueXml(Object v, String name, XmlSerializer out, 641ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner WriteMapCallback callback) throws XmlPullParserException, java.io.IOException { 642087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String typeStr; 643087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (v == null) { 644087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "null"); 645087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 646087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 647087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 648087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "null"); 649087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 650087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof String) { 651087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "string"); 652087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 653087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 654087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 655087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(v.toString()); 656087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "string"); 657087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 658087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Integer) { 659087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "int"; 660087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Long) { 661087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "long"; 662087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Float) { 663087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "float"; 664087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Double) { 665087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "double"; 666087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Boolean) { 667087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor typeStr = "boolean"; 668087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof byte[]) { 669087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeByteArrayXml((byte[])v, name, out); 670087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 671087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof int[]) { 672087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeIntArrayXml((int[])v, name, out); 673087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 674ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof long[]) { 675ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeLongArrayXml((long[])v, name, out); 676ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 677ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof double[]) { 678ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeDoubleArrayXml((double[])v, name, out); 679ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 680ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (v instanceof String[]) { 681ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeStringArrayXml((String[])v, name, out); 682ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 68373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else if (v instanceof boolean[]) { 68473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner writeBooleanArrayXml((boolean[])v, name, out); 68573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner return; 686087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof Map) { 687087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor writeMapXml((Map)v, name, out); 688087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 689087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof List) { 690ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeListXml((List) v, name, out); 691087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 692212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (v instanceof Set) { 693ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner writeSetXml((Set) v, name, out); 694212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return; 695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (v instanceof CharSequence) { 696087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // XXX This is to allow us to at least write something if 697087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // we encounter styled text... but it means we will drop all 698087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // of the styling information. :( 699087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, "string"); 700087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 701087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 702087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 703087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.text(v.toString()); 704087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, "string"); 705087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 706ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (callback != null) { 707ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner callback.writeUnknownObject(v, name, out); 708ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return; 709087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 710087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new RuntimeException("writeValueXml: unable to write value " + v); 711087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 712087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 713087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.startTag(null, typeStr); 714087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name != null) { 715087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "name", name); 716087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 717087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.attribute(null, "value", v.toString()); 718087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor out.endTag(null, typeStr); 719087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 720087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 721087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 722087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a HashMap from an InputStream containing XML. The stream can 723087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written by writeMapXml(). 724087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 725087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param in The InputStream from which to read. 726087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 727087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The resulting map. 728087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 729087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 730087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 731087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisMapXml 732087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * #see #writeMapXml 733087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 734f748257eee651b974e15274e03fe9843a8393073Narayan Kamath @SuppressWarnings("unchecked") 735f748257eee651b974e15274e03fe9843a8393073Narayan Kamath public static final HashMap<String, ?> readMapXml(InputStream in) 736087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 737087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 738087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlPullParser parser = Xml.newPullParser(); 7399e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz parser.setInput(in, StandardCharsets.UTF_8.name()); 740f748257eee651b974e15274e03fe9843a8393073Narayan Kamath return (HashMap<String, ?>) readValueXml(parser, new String[1]); 741087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 742087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 743087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 744087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an ArrayList from an InputStream containing XML. The stream can 745087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written by writeListXml(). 746087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 747087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param in The InputStream from which to read. 748087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 749212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return ArrayList The resulting list. 750087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 751087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 752087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readValueXml 753087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readThisListXml 754087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeListXml 755087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 756087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final ArrayList readListXml(InputStream in) 757087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 758087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 759087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor XmlPullParser parser = Xml.newPullParser(); 7609e9e2e73c6ec7bece20268196dc89ad0c8bafad4Wojciech Staszkiewicz parser.setInput(in, StandardCharsets.UTF_8.name()); 761087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return (ArrayList)readValueXml(parser, new String[1]); 762087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 763212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 764212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 765212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 766212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Read a HashSet from an InputStream containing XML. The stream can 767212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * previously have been written by writeSetXml(). 768212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 769212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param in The InputStream from which to read. 770212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 771212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return HashSet The resulting set. 772212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 773212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws XmlPullParserException 774212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws java.io.IOException 775212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 776212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readValueXml 777212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readThisSetXml 778212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #writeSetXml 779212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 780212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public static final HashSet readSetXml(InputStream in) 781212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throws XmlPullParserException, java.io.IOException { 782212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell XmlPullParser parser = Xml.newPullParser(); 783212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell parser.setInput(in, null); 784212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return (HashSet) readValueXml(parser, new String[1]); 785212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 786087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 787087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 788087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a HashMap object from an XmlPullParser. The XML data could 789087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeMapXml(). The XmlPullParser 790087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the map. 791087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 792087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the map data. 793087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the map, usually "map". 794087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 795087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the map's tag. 796087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 797087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The newly generated map. 798087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 799087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 800087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 801f748257eee651b974e15274e03fe9843a8393073Narayan Kamath public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag, 802ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 803ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return readThisMapXml(parser, endTag, name, null); 804ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 805ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 806ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 807ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a HashMap object from an XmlPullParser. The XML data could 808ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeMapXml(). The XmlPullParser 809ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the map. 810ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 811ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the map data. 812ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the map, usually "map". 813ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 814ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the map's tag. 815ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 816ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashMap The newly generated map. 817ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 818ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readMapXml 819ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 820ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 821ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag, 822ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name, ReadMapCallback callback) 823ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException 824087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 825f748257eee651b974e15274e03fe9843a8393073Narayan Kamath HashMap<String, Object> map = new HashMap<String, Object>(); 826087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 827087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 828087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 829087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 830a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn Object val = readThisValueXml(parser, name, callback, false); 831a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn map.put(name[0], val); 832a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn } else if (eventType == parser.END_TAG) { 833a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn if (parser.getName().equals(endTag)) { 834a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn return map; 835a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn } 836a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn throw new XmlPullParserException( 837a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn "Expected " + endTag + " end tag at: " + parser.getName()); 838a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn } 839a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn eventType = parser.next(); 840a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn } while (eventType != parser.END_DOCUMENT); 841a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn 842a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn throw new XmlPullParserException( 843a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn "Document ended before " + endTag + " end tag"); 844a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn } 845a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn 846a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn /** 847a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn * Like {@link #readThisMapXml}, but returns an ArrayMap instead of HashMap. 848a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn * @hide 849a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn */ 850a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag, 851a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn String[] name, ReadMapCallback callback) 852a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn throws XmlPullParserException, java.io.IOException 853a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn { 854a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn ArrayMap<String, Object> map = new ArrayMap<>(); 855a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn 856a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn int eventType = parser.getEventType(); 857a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn do { 858a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn if (eventType == parser.START_TAG) { 859a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn Object val = readThisValueXml(parser, name, callback, true); 860f748257eee651b974e15274e03fe9843a8393073Narayan Kamath map.put(name[0], val); 861087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 862087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 863087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return map; 864087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 865087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 866087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " + parser.getName()); 867087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 868087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 869087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 870087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 871087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 872087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 873087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 874087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 875087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 876087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an ArrayList object from an XmlPullParser. The XML data could 877087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeListXml(). The XmlPullParser 878087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the list. 879087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 880087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the list data. 881087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the list, usually "list". 882087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 883087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the list's tag. 884087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 885087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return HashMap The newly generated list. 886087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 887087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 888087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 889ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, 890ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 891a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn return readThisListXml(parser, endTag, name, null, false); 892ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 893ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 894ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 895ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read an ArrayList object from an XmlPullParser. The XML data could 896ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeListXml(). The XmlPullParser 897ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 898ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 899ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 900ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "list". 901ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 902ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 903ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 904ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashMap The newly generated list. 905ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 906ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 907ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 908ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final ArrayList readThisListXml(XmlPullParser parser, String endTag, 909a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn String[] name, ReadMapCallback callback, boolean arrayMap) 910ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 911087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ArrayList list = new ArrayList(); 912087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 913087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 914087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 915087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 916a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn Object val = readThisValueXml(parser, name, callback, arrayMap); 917087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor list.add(val); 918087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Adding to list: " + val); 919087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 920087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 921087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return list; 922087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 923087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 924087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " + parser.getName()); 925087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 926087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 927087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 928087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 929087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 930087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 931087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 932ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 933ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 934ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a HashSet object from an XmlPullParser. The XML data could previously 935ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * have been generated by writeSetXml(). The XmlPullParser must be positioned 936ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * <em>after</em> the tag that begins the set. 937ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 938ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the set data. 939ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the set, usually "set". 940ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 941ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the set's tag. 942ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 943ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return HashSet The newly generated set. 944ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 945ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException 946ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws java.io.IOException 947ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 948ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readSetXml 949ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 950ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name) 951ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 952a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn return readThisSetXml(parser, endTag, name, null, false); 953ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 954ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 955212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell /** 956212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * Read a HashSet object from an XmlPullParser. The XML data could previously 957212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * have been generated by writeSetXml(). The XmlPullParser must be positioned 958212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * <em>after</em> the tag that begins the set. 959212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 960212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param parser The XmlPullParser from which to read the set data. 961212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param endTag Name of the tag that will end the set, usually "set". 962212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @param name An array of one string, used to return the name attribute 963212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * of the set's tag. 964212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 965212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @return HashSet The newly generated set. 966212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 967212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws XmlPullParserException 968212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @throws java.io.IOException 969212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * 970212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell * @see #readSetXml 971ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 972212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell */ 973ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name, 974a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn ReadMapCallback callback, boolean arrayMap) 975a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn throws XmlPullParserException, java.io.IOException { 976212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell HashSet set = new HashSet(); 977212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 978212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell int eventType = parser.getEventType(); 979212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell do { 980212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (eventType == parser.START_TAG) { 981a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn Object val = readThisValueXml(parser, name, callback, arrayMap); 982212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell set.add(val); 983212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell //System.out.println("Adding to set: " + val); 984212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (eventType == parser.END_TAG) { 985212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell if (parser.getName().equals(endTag)) { 986212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return set; 987212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 988212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throw new XmlPullParserException( 989212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "Expected " + endTag + " end tag at: " + parser.getName()); 990212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 991212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell eventType = parser.next(); 992212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } while (eventType != parser.END_DOCUMENT); 993212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 994212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell throw new XmlPullParserException( 995212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell "Document ended before " + endTag + " end tag"); 996212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 997087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 998087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 999087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read an int[] object from an XmlPullParser. The XML data could 1000087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been generated by writeIntArrayXml(). The XmlPullParser 1001087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * must be positioned <em>after</em> the tag that begins the list. 1002087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1003087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the list data. 1004087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param endTag Name of the tag that will end the list, usually "list". 1005087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 1006087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the list's tag. 1007087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1008087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return Returns a newly generated int[]. 1009087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1010087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 1011087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 1012087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final int[] readThisIntArrayXml(XmlPullParser parser, 1013087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String endTag, String[] name) 1014087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException { 1015087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1016087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int num; 1017087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor try { 1018087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1019087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NullPointerException e) { 1020087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1021087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Need num attribute in byte-array"); 1022087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NumberFormatException e) { 1023087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1024087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Not a number in num attribute in byte-array"); 1025087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1026ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1027087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1028087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int[] array = new int[num]; 1029087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int i = 0; 1030087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1031087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 1032087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 1033087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 1034087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals("item")) { 1035087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor try { 1036087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor array[i] = Integer.parseInt( 1037087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.getAttributeValue(null, "value")); 1038087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NullPointerException e) { 1039087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1040087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Need value attribute in item"); 1041087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (NumberFormatException e) { 1042087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1043087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Not a number in value attribute in item"); 1044087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1045087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 1046087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1047087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected item tag at: " + parser.getName()); 1048087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1049087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 1050087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(endTag)) { 1051087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return array; 1052087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (parser.getName().equals("item")) { 1053087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i++; 1054087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 1055087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1056087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Expected " + endTag + " end tag at: " 1057087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor + parser.getName()); 1058087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1059087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1060087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 1061087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 1062087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1063087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1064087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Document ended before " + endTag + " end tag"); 1065087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1066087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1067087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor /** 1068ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a long[] object from an XmlPullParser. The XML data could 1069ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeLongArrayXml(). The XmlPullParser 1070ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 1071ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1072ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 1073ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "list". 1074ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 1075ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 1076ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1077ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated long[]. 1078ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1079ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 1080ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1081ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final long[] readThisLongArrayXml(XmlPullParser parser, 1082ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String endTag, String[] name) 1083ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, java.io.IOException { 1084ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1085ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1086ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1087ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1088ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1089ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in long-array"); 1090ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1091ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in long-array"); 1092ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1093ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1094ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1095ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner long[] array = new long[num]; 1096ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1097ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1098ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1099ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1100ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1101ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1102ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1103ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = Long.parseLong(parser.getAttributeValue(null, "value")); 1104ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1105ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1106ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1107ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1108ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1109ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1110ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1111ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1112ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1113ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1114ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1115ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1116ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1117ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1118ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1119ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1120ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1121ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1122ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1123ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1124ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1125ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1126ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1127ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1128ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1129ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a double[] object from an XmlPullParser. The XML data could 1130ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeDoubleArrayXml(). The XmlPullParser 1131ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 1132ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1133ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 1134ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "double-array". 1135ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 1136ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 1137ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1138ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated double[]. 1139ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1140ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 1141ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1142ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag, 1143ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 1144ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1145ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1146ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1147ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1148ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1149ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in double-array"); 1150ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1151ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in double-array"); 1152ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1153ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1154ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1155ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner double[] array = new double[num]; 1156ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1157ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1158ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1159ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1160ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1161ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1162ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1163ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = Double.parseDouble(parser.getAttributeValue(null, "value")); 1164ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1165ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1166ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1167ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1168ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1169ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1170ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1171ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1172ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1173ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1174ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1175ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1176ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1177ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1178ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1179ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1180ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1181ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1182ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1183ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1184ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1185ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1186ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1187ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1188ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1189ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Read a String[] object from an XmlPullParser. The XML data could 1190ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * previously have been generated by writeStringArrayXml(). The XmlPullParser 1191ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must be positioned <em>after</em> the tag that begins the list. 1192ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1193ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param parser The XmlPullParser from which to read the list data. 1194ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param endTag Name of the tag that will end the list, usually "string-array". 1195ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name An array of one string, used to return the name attribute 1196ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * of the list's tag. 1197ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1198ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return Returns a newly generated String[]. 1199ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1200ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @see #readListXml 1201ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1202ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag, 1203ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 1204ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1205ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int num; 1206ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1207ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 1208ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1209ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need num attribute in string-array"); 1210ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1211ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in num attribute in string-array"); 1212ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1213ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.next(); 1214ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1215ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner String[] array = new String[num]; 1216ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int i = 0; 1217ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1218ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int eventType = parser.getEventType(); 1219ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner do { 1220ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (eventType == parser.START_TAG) { 1221ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals("item")) { 1222ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner try { 1223ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner array[i] = parser.getAttributeValue(null, "value"); 1224ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NullPointerException e) { 1225ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Need value attribute in item"); 1226ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } catch (NumberFormatException e) { 1227ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 1228ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1229ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1230ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 1231ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1232ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (eventType == parser.END_TAG) { 1233ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (parser.getName().equals(endTag)) { 1234ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return array; 1235ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (parser.getName().equals("item")) { 1236ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner i++; 1237ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else { 1238ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 1239ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner parser.getName()); 1240ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1241ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1242ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner eventType = parser.next(); 1243ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } while (eventType != parser.END_DOCUMENT); 1244ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1245ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 1246ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1247ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1248ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 124973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * Read a boolean[] object from an XmlPullParser. The XML data could 125073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * previously have been generated by writeBooleanArrayXml(). The XmlPullParser 125173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * must be positioned <em>after</em> the tag that begins the list. 125273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * 125373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param parser The XmlPullParser from which to read the list data. 125473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param endTag Name of the tag that will end the list, usually "string-array". 125573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @param name An array of one string, used to return the name attribute 125673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * of the list's tag. 125773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * 125873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @return Returns a newly generated boolean[]. 125973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * 126073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner * @see #readListXml 126173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner */ 126273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner public static final boolean[] readThisBooleanArrayXml(XmlPullParser parser, String endTag, 126373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner String[] name) throws XmlPullParserException, java.io.IOException { 126473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 126573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner int num; 126673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner try { 126773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner num = Integer.parseInt(parser.getAttributeValue(null, "num")); 126873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } catch (NullPointerException e) { 126973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Need num attribute in string-array"); 127073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } catch (NumberFormatException e) { 127173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Not a number in num attribute in string-array"); 127273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 127373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner parser.next(); 127473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 127573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner boolean[] array = new boolean[num]; 127673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner int i = 0; 127773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 127873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner int eventType = parser.getEventType(); 127973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner do { 128073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner if (eventType == parser.START_TAG) { 128173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner if (parser.getName().equals("item")) { 128273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner try { 128373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner array[i] = Boolean.valueOf(parser.getAttributeValue(null, "value")); 128473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } catch (NullPointerException e) { 128573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Need value attribute in item"); 128673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } catch (NumberFormatException e) { 128773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Not a number in value attribute in item"); 128873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 128973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else { 129073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 129173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 129273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else if (eventType == parser.END_TAG) { 129373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner if (parser.getName().equals(endTag)) { 129473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner return array; 129573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else if (parser.getName().equals("item")) { 129673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner i++; 129773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else { 129873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 129973bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner parser.getName()); 130073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 130173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 130273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner eventType = parser.next(); 130373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } while (eventType != parser.END_DOCUMENT); 130473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 130573bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 130673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } 130773bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner 130873bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner /** 1309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Read a flattened object from an XmlPullParser. The XML data could 1310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * previously have been written with writeMapXml(), writeListXml(), or 1311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * writeValueXml(). The XmlPullParser must be positioned <em>at</em> the 1312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * tag that defines the value. 1313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param parser The XmlPullParser from which to read the object. 1315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @param name An array of one string, used to return the name attribute 1316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * of the value's tag. 1317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @return Object The newly generated value object. 1319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 1320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readMapXml 1321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #readListXml 1322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * @see #writeValueXml 1323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 1324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final Object readValueXml(XmlPullParser parser, String[] name) 1325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws XmlPullParserException, java.io.IOException 1326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType = parser.getEventType(); 1328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor do { 1329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.START_TAG) { 1330a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn return readThisValueXml(parser, name, null, false); 1331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.END_TAG) { 1332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag at: " + parser.getName()); 1334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected text: " + parser.getText()); 1337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor eventType = parser.next(); 1339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } while (eventType != parser.END_DOCUMENT); 1340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document"); 1343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1345ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner private static final Object readThisValueXml(XmlPullParser parser, String[] name, 1346a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn ReadMapCallback callback, boolean arrayMap) 1347a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn throws XmlPullParserException, java.io.IOException { 1348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String valueName = parser.getAttributeValue(null, "name"); 1349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String tagName = parser.getName(); 1350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName); 1352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor Object res; 1354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (tagName.equals("null")) { 1356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = null; 1357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("string")) { 1358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String value = ""; 1359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType; 1360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((eventType = parser.next()) != parser.END_DOCUMENT) { 1361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.END_TAG) { 1362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals("string")) { 1363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + value); 1365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return value; 1366087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1367087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1368087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag in <string>: " + parser.getName()); 1369087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1370087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor value += parser.getText(); 1371087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.START_TAG) { 1372087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1373087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected start tag in <string>: " + parser.getName()); 1374087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1375087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1376087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1377087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document in <string>"); 13782ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) { 13792ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko // all work already done by readThisPrimitiveValueXml 1380087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("int-array")) { 1381087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor res = readThisIntArrayXml(parser, "int-array", name); 1382087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1383087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1384087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1385ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("long-array")) { 1386ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisLongArrayXml(parser, "long-array", name); 1387ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1388ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1389ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1390ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("double-array")) { 1391ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisDoubleArrayXml(parser, "double-array", name); 1392ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1393ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1394ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1395ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (tagName.equals("string-array")) { 1396ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = readThisStringArrayXml(parser, "string-array", name); 1397ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1398ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 1399ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 140073bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner } else if (tagName.equals("boolean-array")) { 140173bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner res = readThisBooleanArrayXml(parser, "boolean-array", name); 140273bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner name[0] = valueName; 140373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner //System.out.println("Returning value for " + valueName + ": " + res); 140473bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner return res; 1405087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("map")) { 1406087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.next(); 1407a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn res = arrayMap 1408a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn ? readThisArrayMapXml(parser, "map", name, callback) 1409a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn : readThisMapXml(parser, "map", name, callback); 1410087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1411087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1412087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1413087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (tagName.equals("list")) { 1414087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor parser.next(); 1415a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn res = readThisListXml(parser, "list", name, callback, arrayMap); 1416087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1417087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1418087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1419212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } else if (tagName.equals("set")) { 1420212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell parser.next(); 1421a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn res = readThisSetXml(parser, "set", name, callback, arrayMap); 1422212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell name[0] = valueName; 1423212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell //System.out.println("Returning value for " + valueName + ": " + res); 1424212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return res; 1425ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } else if (callback != null) { 1426ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner res = callback.readThisUnknownObjectXml(parser, tagName); 1427ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner name[0] = valueName; 1428ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner return res; 1429087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 1430ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throw new XmlPullParserException("Unknown tag: " + tagName); 1431087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1432087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1433087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor // Skip through to end tag. 1434087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int eventType; 1435087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((eventType = parser.next()) != parser.END_DOCUMENT) { 1436087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (eventType == parser.END_TAG) { 1437087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (parser.getName().equals(tagName)) { 1438087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor name[0] = valueName; 1439087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //System.out.println("Returning value for " + valueName + ": " + res); 1440087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return res; 1441087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1442087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1443087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end tag in <" + tagName + ">: " + parser.getName()); 1444087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.TEXT) { 1445087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1446087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected text in <" + tagName + ">: " + parser.getName()); 1447087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (eventType == parser.START_TAG) { 1448087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1449087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected start tag in <" + tagName + ">: " + parser.getName()); 1450087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1451087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1452087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException( 1453087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor "Unexpected end of document in <" + tagName + ">"); 1454087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1455087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 14562ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName) 14572ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throws XmlPullParserException, java.io.IOException 14582ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko { 14592ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko try { 14602ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko if (tagName.equals("int")) { 14612ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Integer.parseInt(parser.getAttributeValue(null, "value")); 14622ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("long")) { 14632ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Long.valueOf(parser.getAttributeValue(null, "value")); 14642ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("float")) { 14652ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return new Float(parser.getAttributeValue(null, "value")); 14662ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("double")) { 14672ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return new Double(parser.getAttributeValue(null, "value")); 14682ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else if (tagName.equals("boolean")) { 14692ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return Boolean.valueOf(parser.getAttributeValue(null, "value")); 14702ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } else { 14712ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko return null; 14722ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 14732ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } catch (NullPointerException e) { 14742ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throw new XmlPullParserException("Need value attribute in <" + tagName + ">"); 14752ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } catch (NumberFormatException e) { 14762ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko throw new XmlPullParserException( 14772ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko "Not a number in value attribute in <" + tagName + ">"); 14782ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 14792ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko } 14802ddce3226e2a1f380dfc4ad3f7e962dfdbfc39ddVladimir Marko 1481087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException 1482087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1483087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 1484087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != parser.START_TAG 1485087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && type != parser.END_DOCUMENT) { 1486087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ; 1487087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1488087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1489087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (type != parser.START_TAG) { 1490087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException("No start tag found"); 1491087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1492087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1493087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (!parser.getName().equals(firstElementName)) { 1494087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() + 1495087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ", expected " + firstElementName); 1496087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1497087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1498087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 1499087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException 1500087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor { 1501087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int type; 1502087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while ((type=parser.next()) != parser.START_TAG 1503087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor && type != parser.END_DOCUMENT) { 1504087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ; 1505087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1506087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 1507a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown 1508a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown public static boolean nextElementWithin(XmlPullParser parser, int outerDepth) 1509a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown throws IOException, XmlPullParserException { 1510a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown for (;;) { 1511a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown int type = parser.next(); 1512a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown if (type == XmlPullParser.END_DOCUMENT 1513a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) { 1514a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown return false; 1515a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1516a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown if (type == XmlPullParser.START_TAG 1517a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown && parser.getDepth() == outerDepth + 1) { 1518a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown return true; 1519a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1520a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1521a3bc565882dd3984e995363642b1295fe3d24d10Jeff Brown } 1522ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1523d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) { 1524d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot final String value = in.getAttributeValue(null, name); 1525d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot try { 1526d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return Integer.parseInt(value); 1527d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } catch (NumberFormatException e) { 1528d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return defaultValue; 1529d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 1530d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 1531d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot 1532ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static int readIntAttribute(XmlPullParser in, String name) throws IOException { 1533ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1534ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey try { 1535ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Integer.parseInt(value); 1536ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } catch (NumberFormatException e) { 1537ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throw new ProtocolException("problem parsing " + name + "=" + value + " as int"); 1538ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1539ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1540ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1541ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeIntAttribute(XmlSerializer out, String name, int value) 1542ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1543ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Integer.toString(value)); 1544ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1545ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1546e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) { 1547e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey final String value = in.getAttributeValue(null, name); 1548e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey try { 1549e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey return Long.parseLong(value); 1550e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } catch (NumberFormatException e) { 1551e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey return defaultValue; 1552e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } 1553e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey } 1554e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey 1555ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static long readLongAttribute(XmlPullParser in, String name) throws IOException { 1556ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1557ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey try { 1558ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Long.parseLong(value); 1559ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } catch (NumberFormatException e) { 1560ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); 1561ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1562ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1563ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 1564ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeLongAttribute(XmlSerializer out, String name, long value) 1565ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1566ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Long.toString(value)); 1567ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1568ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 15691cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static float readFloatAttribute(XmlPullParser in, String name) throws IOException { 15701cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final String value = in.getAttributeValue(null, name); 15711cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey try { 15721cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return Float.parseFloat(value); 15731cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } catch (NumberFormatException e) { 15741cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); 15751cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 15761cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 15771cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 15781cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static void writeFloatAttribute(XmlSerializer out, String name, float value) 15791cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throws IOException { 15801cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey out.attribute(null, name, Float.toString(value)); 15811cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 15821cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 1583ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static boolean readBooleanAttribute(XmlPullParser in, String name) { 1584ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey final String value = in.getAttributeValue(null, name); 1585ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey return Boolean.parseBoolean(value); 1586ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1587ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey 158877d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey public static boolean readBooleanAttribute(XmlPullParser in, String name, 158977d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey boolean defaultValue) { 159077d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey final String value = in.getAttributeValue(null, name); 159177d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey if (value == null) { 159277d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey return defaultValue; 159377d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey } else { 159477d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey return Boolean.parseBoolean(value); 159577d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey } 159677d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey } 159777d218e1869e69c8d436b09cd11dcfe45e50b2cfJeff Sharkey 1598ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value) 1599ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey throws IOException { 1600ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey out.attribute(null, name, Boolean.toString(value)); 1601ded7b75d1a353856ad8f126d171d598d15b97760Jeff Sharkey } 1602ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 16031cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static Uri readUriAttribute(XmlPullParser in, String name) { 16041cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final String value = in.getAttributeValue(null, name); 16051cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return (value != null) ? Uri.parse(value) : null; 16061cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16071cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16081cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static void writeUriAttribute(XmlSerializer out, String name, Uri value) 16091cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throws IOException { 16101cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16111cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey out.attribute(null, name, value.toString()); 16121cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16131cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16141cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16151cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static String readStringAttribute(XmlPullParser in, String name) { 16161cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return in.getAttributeValue(null, name); 16171cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16181cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16191cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static void writeStringAttribute(XmlSerializer out, String name, String value) 16201cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throws IOException { 16211cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16221cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey out.attribute(null, name, value); 16231cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16241cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16251cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16261cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static byte[] readByteArrayAttribute(XmlPullParser in, String name) { 16271cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final String value = in.getAttributeValue(null, name); 16281cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16291cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return Base64.decode(value, Base64.DEFAULT); 16301cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } else { 16311cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return null; 16321cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16331cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16341cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16351cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value) 16361cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throws IOException { 16371cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16381cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT)); 16391cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16401cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16411cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 16421cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static Bitmap readBitmapAttribute(XmlPullParser in, String name) { 16431cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final byte[] value = readByteArrayAttribute(in, name); 16441cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16451cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return BitmapFactory.decodeByteArray(value, 0, value.length); 16461cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } else { 16471cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey return null; 16481cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16491cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16501cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 165102bd78490d8594d225ecc70a74b2058cb968a657Jeff Sharkey @Deprecated 16521cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value) 16531cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey throws IOException { 16541cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (value != null) { 16551cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final ByteArrayOutputStream os = new ByteArrayOutputStream(); 16561cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey value.compress(CompressFormat.PNG, 90, os); 16571cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey writeByteArrayAttribute(out, name, os.toByteArray()); 16581cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16591cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 16601cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 1661ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** @hide */ 1662ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public interface WriteMapCallback { 1663ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1664ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Called from writeMapXml when an Object type is not recognized. The implementer 1665ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * must write out the entire element including start and end tags. 1666ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1667ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param v The object to be written out 1668ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param name The mapping key for v. Must be written into the "name" attribute of the 1669ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * start tag. 1670ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param out The XML output stream. 1671ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException on unrecognized Object type. 1672ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws IOException on XmlSerializer serialization errors. 1673ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 1674ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1675ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public void writeUnknownObject(Object v, String name, XmlSerializer out) 1676ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, IOException; 1677ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1678ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 1679ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** @hide */ 1680ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public interface ReadMapCallback { 1681ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner /** 1682ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * Called from readThisMapXml when a START_TAG is not recognized. The input stream 1683ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * is positioned within the start tag so that attributes can be read using in.getAttribute. 1684ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * 1685ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param in the XML input stream 1686ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @param tag the START_TAG that was not recognized. 1687ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @return the Object parsed from the stream which will be put into the map. 1688ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws XmlPullParserException if the START_TAG is not recognized. 1689ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @throws IOException on XmlPullParser serialization errors. 1690ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner * @hide 1691ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner */ 1692ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner public Object readThisUnknownObjectXml(XmlPullParser in, String tag) 1693ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner throws XmlPullParserException, IOException; 1694ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 1695087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor} 1696