134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen/* 234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Copyright (C) 2016 The Android Open Source Project 334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Licensed under the Apache License, Version 2.0 (the "License"); 534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * you may not use this file except in compliance with the License. 634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * You may obtain a copy of the License at 734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * http://www.apache.org/licenses/LICENSE-2.0 934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 1034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Unless required by applicable law or agreed to in writing, software 1134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * distributed under the License is distributed on an "AS IS" BASIS, 1234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * See the License for the specific language governing permissions and 1434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * limitations under the License. 1534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen */ 1634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 1734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenpackage com.android.phone.vvm.omtp.utils; 1834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 1934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport android.util.ArrayMap; 2034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 2134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport org.xmlpull.v1.XmlPullParser; 2234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport org.xmlpull.v1.XmlPullParserException; 2334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 2434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport java.io.IOException; 2534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport java.util.ArrayList; 2634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenimport java.util.List; 2734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 2834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yenpublic class XmlUtils { 2934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 3034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag, 3134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen String[] name, ReadMapCallback callback) 3234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throws XmlPullParserException, java.io.IOException { 3334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen ArrayMap<String, Object> map = new ArrayMap<>(); 3434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 3534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen int eventType = parser.getEventType(); 3634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen do { 3734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (eventType == XmlPullParser.START_TAG) { 3834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen Object val = readThisValueXml(parser, name, callback, true); 3934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen map.put(name[0], val); 4034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.END_TAG) { 4134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals(endTag)) { 4234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return map; 4334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 4434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 4534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Expected " + endTag + " end tag at: " + parser.getName()); 4634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 4734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen eventType = parser.next(); 4834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } while (eventType != XmlPullParser.END_DOCUMENT); 4934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 5034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 5134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Document ended before " + endTag + " end tag"); 5234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 5334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 5434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen /** 5534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Read an ArrayList object from an XmlPullParser. The XML data could previously have been 5634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * generated by writeListXml(). The XmlPullParser must be positioned <em>after</em> the tag 5734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * that begins the list. 5834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 5934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param parser The XmlPullParser from which to read the list data. 6034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param endTag Name of the tag that will end the list, usually "list". 6134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param name An array of one string, used to return the name attribute of the list's tag. 6234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @return HashMap The newly generated list. 6334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen */ 6434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, 6534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen String[] name, ReadMapCallback callback, boolean arrayMap) 6634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throws XmlPullParserException, java.io.IOException { 6734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen ArrayList list = new ArrayList(); 6834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 6934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen int eventType = parser.getEventType(); 7034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen do { 7134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (eventType == XmlPullParser.START_TAG) { 7234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen Object val = readThisValueXml(parser, name, callback, arrayMap); 7334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen list.add(val); 7434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.END_TAG) { 7534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals(endTag)) { 7634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return list; 7734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 7834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 7934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Expected " + endTag + " end tag at: " + parser.getName()); 8034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 8134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen eventType = parser.next(); 8234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } while (eventType != XmlPullParser.END_DOCUMENT); 8334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 8434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 8534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Document ended before " + endTag + " end tag"); 8634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 8734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 8834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen /** 8934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Read a String[] object from an XmlPullParser. The XML data could previously have been 9034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * generated by writeStringArrayXml(). The XmlPullParser must be positioned <em>after</em> the 9134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * tag that begins the list. 9234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 9334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param parser The XmlPullParser from which to read the list data. 9434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param endTag Name of the tag that will end the list, usually "string-array". 9534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param name An array of one string, used to return the name attribute of the list's tag. 9634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @return Returns a newly generated String[]. 9734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen */ 9834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen public static String[] readThisStringArrayXml(XmlPullParser parser, String endTag, 9934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen String[] name) throws XmlPullParserException, java.io.IOException { 10034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 10134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen parser.next(); 10234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 10334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen List<String> array = new ArrayList<>(); 10434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 10534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen int eventType = parser.getEventType(); 10634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen do { 10734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (eventType == XmlPullParser.START_TAG) { 10834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals("item")) { 10934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen try { 11034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen array.add(parser.getAttributeValue(null, "value")); 11134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } catch (NullPointerException e) { 11234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Need value attribute in item"); 11334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } catch (NumberFormatException e) { 11434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Not a number in value attribute in item"); 11534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 11634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else { 11734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Expected item tag at: " + parser.getName()); 11834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 11934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.END_TAG) { 12034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals(endTag)) { 12134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return array.toArray(new String[0]); 12234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (parser.getName().equals("item")) { 12334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 12434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else { 12534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Expected " + endTag + " end tag at: " + 12634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen parser.getName()); 12734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 12834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 12934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen eventType = parser.next(); 13034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } while (eventType != XmlPullParser.END_DOCUMENT); 13134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 13234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Document ended before " + endTag + " end tag"); 13334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 13434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 13534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen private static Object readThisValueXml(XmlPullParser parser, String[] name, 13634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen ReadMapCallback callback, boolean arrayMap) 13734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throws XmlPullParserException, java.io.IOException { 13834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen final String valueName = parser.getAttributeValue(null, "name"); 13934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen final String tagName = parser.getName(); 14034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 14134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen Object res; 14234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 14334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (tagName.equals("null")) { 14434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen res = null; 14534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("string")) { 14634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen String value = ""; 14734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen int eventType; 14834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { 14934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (eventType == XmlPullParser.END_TAG) { 15034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals("string")) { 15134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen name[0] = valueName; 15234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return value; 15334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 15434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 15534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected end tag in <string>: " + parser.getName()); 15634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.TEXT) { 15734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen value += parser.getText(); 15834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.START_TAG) { 15934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 16034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected start tag in <string>: " + parser.getName()); 16134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 16234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 16334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 16434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected end of document in <string>"); 16534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) { 16634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen // all work already done by readThisPrimitiveValueXml 16734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("string-array")) { 16834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen res = readThisStringArrayXml(parser, "string-array", name); 16934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen name[0] = valueName; 17034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return res; 17134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("list")) { 17234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen parser.next(); 17334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen res = readThisListXml(parser, "list", name, callback, arrayMap); 17434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen name[0] = valueName; 17534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return res; 17634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (callback != null) { 17734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen res = callback.readThisUnknownObjectXml(parser, tagName); 17834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen name[0] = valueName; 17934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return res; 18034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else { 18134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Unknown tag: " + tagName); 18234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 18334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 18434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen // Skip through to end tag. 18534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen int eventType; 18634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { 18734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (eventType == XmlPullParser.END_TAG) { 18834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (parser.getName().equals(tagName)) { 18934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen name[0] = valueName; 19034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return res; 19134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 19234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 19334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected end tag in <" + tagName + ">: " + parser.getName()); 19434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.TEXT) { 19534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 19634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected text in <" + tagName + ">: " + parser.getName()); 19734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (eventType == XmlPullParser.START_TAG) { 19834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 19934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected start tag in <" + tagName + ">: " + parser.getName()); 20034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 20134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 20234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 20334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Unexpected end of document in <" + tagName + ">"); 20434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 20534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 20634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName) 20734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throws XmlPullParserException, java.io.IOException { 20834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen try { 20934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen if (tagName.equals("int")) { 21034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return Integer.parseInt(parser.getAttributeValue(null, "value")); 21134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("long")) { 21234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return Long.valueOf(parser.getAttributeValue(null, "value")); 21334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("float")) { 21434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return Float.valueOf(parser.getAttributeValue(null, "value")); 21534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("double")) { 21634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return Double.valueOf(parser.getAttributeValue(null, "value")); 21734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else if (tagName.equals("boolean")) { 21834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return Boolean.valueOf(parser.getAttributeValue(null, "value")); 21934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } else { 22034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen return null; 22134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 22234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } catch (NullPointerException e) { 22334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException("Need value attribute in <" + tagName + ">"); 22434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } catch (NumberFormatException e) { 22534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throw new XmlPullParserException( 22634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen "Not a number in value attribute in <" + tagName + ">"); 22734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 22834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 22934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 23034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen public interface ReadMapCallback { 23134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen 23234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen /** 23334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * Called from readThisMapXml when a START_TAG is not recognized. The input stream is 23434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * positioned within the start tag so that attributes can be read using in.getAttribute. 23534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * 23634d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param in the XML input stream 23734d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @param tag the START_TAG that was not recognized. 23834d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @return the Object parsed from the stream which will be put into the map. 23934d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @throws XmlPullParserException if the START_TAG is not recognized. 24034d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen * @throws IOException on XmlPullParser serialization errors. 24134d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen */ 24234d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen Object readThisUnknownObjectXml(XmlPullParser in, String tag) 24334d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen throws XmlPullParserException, IOException; 24434d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen } 24534d3b56c750fb3d9bb1c47b7f7a392bc4f2e1a01Ta-wei Yen}