1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the Software without restriction, including without limitation the rights 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sell copies of the Software, and to permit persons to whom the Software is 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * furnished to do so, subject to the following conditions: 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The above copyright notice and this permission notice shall be included in 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * all copies or substantial portions of the Software. 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IN THE SOFTWARE. */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.kxml2.kdom; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.*; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.xmlpull.v1.*; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** The document consists of some legacy events and a single root 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project element. This class basically adds some consistency checks to 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Node. */ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Document extends Node { 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int rootIndex = -1; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String encoding; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Boolean standalone; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** returns "#document" */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getEncoding () { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return encoding; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setEncoding(String enc) { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.encoding = enc; 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setStandalone (Boolean standalone) { 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.standalone = standalone; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Boolean getStandalone() { 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return standalone; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getName() { 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "#document"; 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Adds a child at the given index position. Throws 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project an exception when a second root element is added */ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addChild(int index, int type, Object child) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type == ELEMENT) { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // if (rootIndex != -1) 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // throw new RuntimeException("Only one document root element allowed"); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rootIndex = index; 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (rootIndex >= index) 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rootIndex++; 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super.addChild(index, type, child); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** reads the document and checks if the last event 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project is END_DOCUMENT. If not, an exception is thrown. 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project The end event is consumed. For parsing partial 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project XML structures, consider using Node.parse (). */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void parse(XmlPullParser parser) 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IOException, XmlPullParserException { 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.require(XmlPullParser.START_DOCUMENT, null, null); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project parser.nextToken (); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project encoding = parser.getInputEncoding(); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project standalone = (Boolean)parser.getProperty ("http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone"); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super.parse(parser); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (parser.getEventType() != XmlPullParser.END_DOCUMENT) 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("Document end expected!"); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void removeChild(int index) { 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (index == rootIndex) 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rootIndex = -1; 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (index < rootIndex) 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rootIndex--; 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super.removeChild(index); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** returns the root element of this document. */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Element getRootElement() { 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (rootIndex == -1) 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("Document has no root element!"); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (Element) getChild(rootIndex); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** Writes this node to the given XmlWriter. For node and document, 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this method is identical to writeChildren, except that the 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project stream is flushed automatically. */ 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void write(XmlSerializer writer) 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IOException { 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.startDocument(encoding, standalone); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writeChildren(writer); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project writer.endDocument(); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}