1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the Software without restriction, including without limitation the rights 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sell copies of the Software, and to permit persons to whom the Software is 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * furnished to do so, subject to the following conditions: 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The above copyright notice and this permission notice shall be included in 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * all copies or substantial portions of the Software. 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * IN THE SOFTWARE. */ 20f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.kxml2.io; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.*; 2578e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughesimport java.util.Locale; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xmlpull.v1.*; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KXmlSerializer implements XmlSerializer { 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // static final String UNDEFINED = ":"; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** size (in characters) for the write buffer */ 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int WRITE_BUFFER_SIZE = 500; 35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes // END android-added 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // (Guarantee that the writer is always buffered.) 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private BufferedWriter writer; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean pending; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int auto; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int depth; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String[] elementStack = new String[12]; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //nsp/prefix/name 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int[] nspCounts = new int[4]; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String[] nspStack = new String[8]; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //prefix/nsp; both empty are "" 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean[] indent = new boolean[4]; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean unicode; 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String encoding; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final void check(boolean close) throws IOException { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!pending) 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project depth++; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pending = false; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (indent.length <= depth) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean[] hlp = new boolean[depth + 4]; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(indent, 0, hlp, 0, depth); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indent = hlp; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indent[depth] = indent[depth - 1]; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 6980a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes for (int i = nspCounts[depth - 1]; i < nspCounts[depth]; i++) { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(' '); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("xmlns"); 7280a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (!nspStack[i * 2].isEmpty()) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(':'); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(nspStack[i * 2]); 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 7680a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes else if (getNamespace().isEmpty() && !nspStack[i * 2 + 1].isEmpty()) 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException("Cannot set default namespace for elements in no namespace"); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("=\""); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writeEscaped(nspStack[i * 2 + 1], '"'); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('"'); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nspCounts.length <= depth + 1) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int[] hlp = new int[depth + 8]; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(nspCounts, 0, hlp, 0, depth + 1); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspCounts = hlp; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspCounts[depth + 1] = nspCounts[depth]; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // nspCounts[depth + 2] = nspCounts[depth]; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(close ? " />" : ">"); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95866e7ae17a3da81a02b0b144e0c9c2b3196d293aElliott Hughes private final void writeEscaped(String s, int quot) throws IOException { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < s.length(); i++) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char c = s.charAt(i); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (c) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\n': 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\r': 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '\t': 102f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes if(quot == -1) 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(c); 104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes else 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("&#"+((int) c)+';'); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '&' : 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("&"); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '>' : 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(">"); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case '<' : 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<"); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 116866e7ae17a3da81a02b0b144e0c9c2b3196d293aElliott Hughes default: 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == quot) { 118866e7ae17a3da81a02b0b144e0c9c2b3196d293aElliott Hughes writer.write(c == '"' ? """ : "'"); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // BEGIN android-changed: refuse to output invalid characters 122ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // See http://www.w3.org/TR/REC-xml/#charsets for definition. 123ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // No other Java XML writer we know of does this, but no Java 124ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // XML reader we know of is able to parse the bad output we'd 125ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // otherwise generate. 126ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // Note: tab, newline, and carriage return have already been 127ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // handled above. 128ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes boolean valid = (c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd); 129ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes if (!valid) { 130ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes reportInvalidCharacter(c); 131ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } 132ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes if (unicode || c < 127) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(c); 134ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } else { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("&#" + ((int) c) + ";"); 136ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } 137ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // END android-changed 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // BEGIN android-added 143ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes private static void reportInvalidCharacter(char ch) { 144ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes throw new IllegalArgumentException("Illegal character (" + Integer.toHexString((int) ch) + ")"); 145ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } 146ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // END android-added 147ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final void writeIndent() throws IOException { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("\r\n"); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < depth; i++) 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(' '); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }*/ 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void docdecl(String dd) throws IOException { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<!DOCTYPE"); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(dd); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(">"); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void endDocument() throws IOException { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (depth > 0) { 163866e7ae17a3da81a02b0b144e0c9c2b3196d293aElliott Hughes endTag(elementStack[depth * 3 - 3], elementStack[depth * 3 - 1]); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project flush(); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void entityRef(String name) throws IOException { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('&'); 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(name); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(';'); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getFeature(String name) { 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //return false; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ( 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://xmlpull.org/v1/doc/features.html#indent-output" 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .equals( 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name)) 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ? indent[depth] 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : false; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getPrefix(String namespace, boolean create) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getPrefix(namespace, false, create); 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (IOException e) { 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e.toString()); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String getPrefix( 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String namespace, 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean includeDefault, 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean create) 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = nspCounts[depth + 1] * 2 - 2; 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i >= 0; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i -= 2) { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nspStack[i + 1].equals(namespace) 20480a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes && (includeDefault || !nspStack[i].isEmpty())) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String cand = nspStack[i]; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int j = i + 2; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project j < nspCounts[depth + 1] * 2; 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project j++) { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nspStack[j].equals(cand)) { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cand = null; 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cand != null) 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return cand; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!create) 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix; 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22480a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (namespace.isEmpty()) 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = ""; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = "n" + (auto++); 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = nspCounts[depth + 1] * 2 - 2; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i >= 0; 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i -= 2) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefix.equals(nspStack[i])) { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = null; 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (prefix == null); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean p = pending; 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pending = false; 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setPrefix(prefix, namespace); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pending = p; 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return prefix; 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getProperty(String name) { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException("Unsupported property"); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void ignorableWhitespace(String s) 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project text(s); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setFeature(String name, boolean value) { 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("http://xmlpull.org/v1/doc/features.html#indent-output" 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .equals(name)) { 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indent[depth] = value; 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException("Unsupported Feature"); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setProperty(String name, Object value) { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException( 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "Unsupported Property:" + value); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setPrefix(String prefix, String namespace) 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefix == null) 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = ""; 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (namespace == null) 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespace = ""; 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String defined = getPrefix(namespace, true, false); 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // boil out if already defined 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefix.equals(defined)) 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int pos = (nspCounts[depth + 1]++) << 1; 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nspStack.length < pos + 1) { 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String[] hlp = new String[nspStack.length + 16]; 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(nspStack, 0, hlp, 0, pos); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack = hlp; 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[pos++] = prefix; 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[pos] = namespace; 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOutput(Writer writer) { 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Guarantee that the writer is always buffered. 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (writer instanceof BufferedWriter) { 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.writer = (BufferedWriter) writer; 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.writer = new BufferedWriter(writer, WRITE_BUFFER_SIZE); 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // elementStack = new String[12]; //nsp/prefix/name 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //nspCounts = new int[4]; 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //nspStack = new String[8]; //prefix/nsp 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //indent = new boolean[4]; 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspCounts[0] = 2; 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspCounts[1] = 2; 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[0] = ""; 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[1] = ""; 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[2] = "xml"; 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspStack[3] = "http://www.w3.org/XML/1998/namespace"; 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pending = false; 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project auto = 0; 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project depth = 0; 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unicode = false; 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOutput(OutputStream os, String encoding) 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (os == null) 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOutput( 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project encoding == null 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ? new OutputStreamWriter(os) 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : new OutputStreamWriter(os, encoding)); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.encoding = encoding; 33678e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes if (encoding != null && encoding.toLowerCase(Locale.US).startsWith("utf")) { 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unicode = true; 33878e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes } 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34178e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes public void startDocument(String encoding, Boolean standalone) throws IOException { 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<?xml version='1.0' "); 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (encoding != null) { 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.encoding = encoding; 34678e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes if (encoding.toLowerCase(Locale.US).startsWith("utf")) { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project unicode = true; 34878e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this.encoding != null) { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("encoding='"); 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(this.encoding); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("' "); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (standalone != null) { 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("standalone='"); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write( 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project standalone.booleanValue() ? "yes" : "no"); 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("' "); 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("?>"); 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public XmlSerializer startTag(String namespace, String name) 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if (namespace == null) 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // namespace = ""; 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (indent[depth]) { 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("\r\n"); 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < depth; i++) 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(" "); 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int esp = depth * 3; 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (elementStack.length < esp + 3) { 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String[] hlp = new String[elementStack.length + 12]; 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(elementStack, 0, hlp, 0, esp); 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementStack = hlp; 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespace == null 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ? "" 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : getPrefix(namespace, true, true); 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 392b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes if (namespace != null && namespace.isEmpty()) { 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = nspCounts[depth]; 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i < nspCounts[depth + 1]; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i++) { 39680a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (nspStack[i * 2].isEmpty() && !nspStack[i * 2 + 1].isEmpty()) { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException("Cannot set default namespace for elements in no namespace"); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementStack[esp++] = namespace; 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementStack[esp++] = prefix; 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementStack[esp] = name; 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('<'); 40780a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (!prefix.isEmpty()) { 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(prefix); 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(':'); 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(name); 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pending = true; 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public XmlSerializer attribute( 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String namespace, 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String name, 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String value) 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!pending) 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException("illegal position for attribute"); 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // int cnt = nspCounts[depth]; 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (namespace == null) 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespace = ""; 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // depth--; 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // pending = false; 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = 43680a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes namespace.isEmpty() 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ? "" 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : getPrefix(namespace, false, true); 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // pending = true; 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // depth++; 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* if (cnt != nspCounts[depth]) { 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(' '); 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("xmlns"); 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nspStack[cnt * 2] != null) { 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(':'); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(nspStack[cnt * 2]); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("=\""); 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writeEscaped(nspStack[cnt * 2 + 1], '"'); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('"'); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(' '); 45780a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (!prefix.isEmpty()) { 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(prefix); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(':'); 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(name); 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('='); 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char q = value.indexOf('"') == -1 ? '"' : '\''; 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(q); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writeEscaped(value, q); 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(q); 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void flush() throws IOException { 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.flush(); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(); 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.close(); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public XmlSerializer endTag(String namespace, String name) 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!pending) 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project depth--; 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if (namespace == null) 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // namespace = ""; 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((namespace == null 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && elementStack[depth * 3] != null) 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (namespace != null 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && !namespace.equals(elementStack[depth * 3])) 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || !elementStack[depth * 3 + 2].equals(name)) 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException("</{"+namespace+"}"+name+"> does not match start"); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (pending) { 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(true); 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project depth--; 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (indent[depth + 1]) { 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("\r\n"); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < depth; i++) 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(" "); 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("</"); 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = elementStack[depth * 3 + 1]; 50980a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes if (!prefix.isEmpty()) { 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(prefix); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(':'); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(name); 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write('>'); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nspCounts[depth + 1] = nspCounts[depth]; 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getNamespace() { 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getDepth() == 0 ? null : elementStack[getDepth() * 3 - 3]; 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getName() { 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getDepth() == 0 ? null : elementStack[getDepth() * 3 - 1]; 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getDepth() { 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return pending ? depth + 1 : depth; 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public XmlSerializer text(String text) throws IOException { 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project indent[depth] = false; 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writeEscaped(text, -1); 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public XmlSerializer text(char[] text, int start, int len) 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project text(new String(text, start, len)); 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void cdsect(String data) throws IOException { 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 548ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // BEGIN android-changed: ]]> is not allowed within a CDATA, 549ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // so break and start a new one when necessary. 550ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes data = data.replace("]]>", "]]]]><![CDATA[>"); 551ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes char[] chars = data.toCharArray(); 552ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // We also aren't allowed any invalid characters. 553ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes for (char ch : chars) { 554ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes boolean valid = (ch >= 0x20 && ch <= 0xd7ff) || 555ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes (ch == '\t' || ch == '\n' || ch == '\r') || 556ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes (ch >= 0xe000 && ch <= 0xfffd); 557ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes if (!valid) { 558ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes reportInvalidCharacter(ch); 559ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } 560ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes } 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<![CDATA["); 562ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes writer.write(chars, 0, chars.length); 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("]]>"); 564ff42219e3ea3d712f931ae7f26af236339b5cf23Elliott Hughes // END android-changed 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void comment(String comment) throws IOException { 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<!--"); 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(comment); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("-->"); 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void processingInstruction(String pi) 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project check(false); 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("<?"); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write(pi); 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project writer.write("?>"); 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 582