KXmlSerializer.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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. */
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
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.*;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xmlpull.v1.*;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KXmlSerializer implements XmlSerializer {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //    static final String UNDEFINED = ":";
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-added
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** size (in characters) for the write buffer */
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int WRITE_BUFFER_SIZE = 500;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-added
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-changed
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // (Guarantee that the writer is always buffered.)
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private BufferedWriter writer;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-changed
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean pending;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int auto;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int depth;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String[] elementStack = new String[12];
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //nsp/prefix/name
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int[] nspCounts = new int[4];
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String[] nspStack = new String[8];
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //prefix/nsp; both empty are ""
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean[] indent = new boolean[4];
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean unicode;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String encoding;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final void check(boolean close) throws IOException {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!pending)
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        depth++;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pending = false;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (indent.length <= depth) {
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            boolean[] hlp = new boolean[depth + 4];
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(indent, 0, hlp, 0, depth);
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            indent = hlp;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        indent[depth] = indent[depth - 1];
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = nspCounts[depth - 1];
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i < nspCounts[depth];
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i++) {
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(' ');
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("xmlns");
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!"".equals(nspStack[i * 2])) {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write(':');
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write(nspStack[i * 2]);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else if ("".equals(getNamespace()) && !"".equals(nspStack[i * 2 + 1]))
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalStateException("Cannot set default namespace for elements in no namespace");
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("=\"");
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writeEscaped(nspStack[i * 2 + 1], '"');
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write('"');
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (nspCounts.length <= depth + 1) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int[] hlp = new int[depth + 8];
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(nspCounts, 0, hlp, 0, depth + 1);
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nspCounts = hlp;
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspCounts[depth + 1] = nspCounts[depth];
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //   nspCounts[depth + 2] = nspCounts[depth];
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(close ? " />" : ">");
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final void writeEscaped(String s, int quot)
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < s.length(); i++) {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            char c = s.charAt(i);
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            switch (c) {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '\n':
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '\r':
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '\t':
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if(quot == -1)
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write(c);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    else
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write("&#"+((int) c)+';');
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '&' :
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("&amp;");
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '>' :
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("&gt;");
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '<' :
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("&lt;");
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '"' :
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                case '\'' :
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (c == quot) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write(
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            c == '"' ? "&quot;" : "&apos;");
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                default :
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    //if(c < ' ')
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    //    throw new IllegalArgumentException("Illegal control code:"+((int) c));
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (c >= ' ' && c !='@' && (c < 127 || unicode))
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write(c);
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    else
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write("&#" + ((int) c) + ";");
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final void writeIndent() throws IOException {
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("\r\n");
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < depth; i++)
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write(' ');
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }*/
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void docdecl(String dd) throws IOException {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("<!DOCTYPE");
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(dd);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(">");
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void endDocument() throws IOException {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (depth > 0) {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            endTag(
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                elementStack[depth * 3 - 3],
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                elementStack[depth * 3 - 1]);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        flush();
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void entityRef(String name) throws IOException {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write('&');
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(name);
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(';');
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getFeature(String name) {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //return false;
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            "http://xmlpull.org/v1/doc/features.html#indent-output"
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .equals(
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                name))
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ? indent[depth]
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            : false;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPrefix(String namespace, boolean create) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getPrefix(namespace, false, create);
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        catch (IOException e) {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(e.toString());
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String getPrefix(
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String namespace,
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean includeDefault,
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean create)
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = nspCounts[depth + 1] * 2 - 2;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i >= 0;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i -= 2) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (nspStack[i + 1].equals(namespace)
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && (includeDefault || !nspStack[i].equals(""))) {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String cand = nspStack[i];
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int j = i + 2;
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    j < nspCounts[depth + 1] * 2;
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    j++) {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (nspStack[j].equals(cand)) {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        cand = null;
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (cand != null)
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return cand;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!create)
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prefix;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ("".equals(namespace))
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            prefix = "";
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        else {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            do {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                prefix = "n" + (auto++);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = nspCounts[depth + 1] * 2 - 2;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    i >= 0;
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    i -= 2) {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (prefix.equals(nspStack[i])) {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        prefix = null;
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (prefix == null);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean p = pending;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pending = false;
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setPrefix(prefix, namespace);
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pending = p;
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return prefix;
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getProperty(String name) {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new RuntimeException("Unsupported property");
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void ignorableWhitespace(String s)
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        text(s);
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFeature(String name, boolean value) {
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ("http://xmlpull.org/v1/doc/features.html#indent-output"
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            .equals(name)) {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            indent[depth] = value;
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        else
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException("Unsupported Feature");
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setProperty(String name, Object value) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new RuntimeException(
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            "Unsupported Property:" + value);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPrefix(String prefix, String namespace)
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prefix == null)
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            prefix = "";
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (namespace == null)
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            namespace = "";
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String defined = getPrefix(namespace, true, false);
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // boil out if already defined
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prefix.equals(defined))
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int pos = (nspCounts[depth + 1]++) << 1;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (nspStack.length < pos + 1) {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String[] hlp = new String[nspStack.length + 16];
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(nspStack, 0, hlp, 0, pos);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nspStack = hlp;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[pos++] = prefix;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[pos] = namespace;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setOutput(Writer writer) {
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-changed
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Guarantee that the writer is always buffered.
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (writer instanceof BufferedWriter) {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.writer = (BufferedWriter) writer;
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.writer = new BufferedWriter(writer, WRITE_BUFFER_SIZE);
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-changed
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // elementStack = new String[12]; //nsp/prefix/name
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //nspCounts = new int[4];
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //nspStack = new String[8]; //prefix/nsp
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //indent = new boolean[4];
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspCounts[0] = 2;
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspCounts[1] = 2;
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[0] = "";
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[1] = "";
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[2] = "xml";
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspStack[3] = "http://www.w3.org/XML/1998/namespace";
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pending = false;
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        auto = 0;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        depth = 0;
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        unicode = false;
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setOutput(OutputStream os, String encoding)
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (os == null)
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setOutput(
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            encoding == null
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ? new OutputStreamWriter(os)
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : new OutputStreamWriter(os, encoding));
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.encoding = encoding;
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (encoding != null
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            && encoding.toLowerCase().startsWith("utf"))
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            unicode = true;
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void startDocument(
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String encoding,
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Boolean standalone)
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("<?xml version='1.0' ");
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (encoding != null) {
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.encoding = encoding;
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (encoding.toLowerCase().startsWith("utf"))
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                unicode = true;
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.encoding != null) {
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("encoding='");
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(this.encoding);
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("' ");
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (standalone != null) {
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("standalone='");
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                standalone.booleanValue() ? "yes" : "no");
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("' ");
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("?>");
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public XmlSerializer startTag(String namespace, String name)
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        if (namespace == null)
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //            namespace = "";
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (indent[depth]) {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("\r\n");
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < depth; i++)
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write("  ");
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int esp = depth * 3;
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (elementStack.length < esp + 3) {
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String[] hlp = new String[elementStack.length + 12];
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(elementStack, 0, hlp, 0, esp);
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            elementStack = hlp;
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prefix =
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            namespace == null
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ? ""
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : getPrefix(namespace, true, true);
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ("".equals(namespace)) {
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = nspCounts[depth];
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i < nspCounts[depth + 1];
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i++) {
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if ("".equals(nspStack[i * 2]) && !"".equals(nspStack[i * 2 + 1])) {
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IllegalStateException("Cannot set default namespace for elements in no namespace");
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elementStack[esp++] = namespace;
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elementStack[esp++] = prefix;
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elementStack[esp] = name;
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write('<');
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!"".equals(prefix)) {
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(prefix);
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(':');
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(name);
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pending = true;
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public XmlSerializer attribute(
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String namespace,
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String name,
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String value)
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!pending)
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException("illegal position for attribute");
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        int cnt = nspCounts[depth];
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (namespace == null)
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            namespace = "";
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        depth--;
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        pending = false;
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prefix =
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            "".equals(namespace)
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ? ""
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : getPrefix(namespace, false, true);
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        pending = true;
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        depth++;
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*        if (cnt != nspCounts[depth]) {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write(' ');
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("xmlns");
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (nspStack[cnt * 2] != null) {
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write(':');
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        writer.write(nspStack[cnt * 2]);
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("=\"");
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writeEscaped(nspStack[cnt * 2 + 1], '"');
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write('"');
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                */
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(' ');
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!"".equals(prefix)) {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(prefix);
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(':');
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(name);
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write('=');
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char q = value.indexOf('"') == -1 ? '"' : '\'';
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(q);
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writeEscaped(value, q);
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(q);
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void flush() throws IOException {
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.flush();
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void close() throws IOException {
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            check();
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.close();
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    */
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public XmlSerializer endTag(String namespace, String name)
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!pending)
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            depth--;
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //        if (namespace == null)
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //          namespace = "";
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((namespace == null
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            && elementStack[depth * 3] != null)
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            || (namespace != null
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && !namespace.equals(elementStack[depth * 3]))
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            || !elementStack[depth * 3 + 2].equals(name))
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException("</{"+namespace+"}"+name+"> does not match start");
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (pending) {
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            check(true);
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            depth--;
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        else {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (indent[depth + 1]) {
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write("\r\n");
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = 0; i < depth; i++)
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    writer.write("  ");
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write("</");
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String prefix = elementStack[depth * 3 + 1];
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!"".equals(prefix)) {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write(prefix);
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                writer.write(':');
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write(name);
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            writer.write('>');
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        nspCounts[depth + 1] = nspCounts[depth];
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getNamespace() {
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDepth() == 0 ? null : elementStack[getDepth() * 3 - 3];
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDepth() == 0 ? null : elementStack[getDepth() * 3 - 1];
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getDepth() {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return pending ? depth + 1 : depth;
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public XmlSerializer text(String text) throws IOException {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        indent[depth] = false;
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writeEscaped(text, -1);
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public XmlSerializer text(char[] text, int start, int len)
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        text(new String(text, start, len));
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void cdsect(String data) throws IOException {
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("<![CDATA[");
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(data);
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("]]>");
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void comment(String comment) throws IOException {
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("<!--");
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(comment);
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("-->");
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void processingInstruction(String pi)
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws IOException {
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        check(false);
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("<?");
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write(pi);
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        writer.write("?>");
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
563