FastXmlSerializer.java revision 087ff0b93580760bf0c5dd36a0081289224b1cde
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlSerializer;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Writer;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteBuffer;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.CharBuffer;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.charset.Charset;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.charset.CharsetEncoder;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.charset.CoderResult;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.charset.IllegalCharsetNameException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.charset.UnsupportedCharsetException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a quick and dirty implementation of XmlSerializer that isn't horribly
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * painfully slow like the normal one.  It only does what is needed for the
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specific XML files being written with it.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class FastXmlSerializer implements XmlSerializer {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ESCAPE_TABLE[] = new String[] {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 0-7
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 8-15
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 16-23
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 24-31
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     """, null,     null,     null,     "&",  null,  // 32-39
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 40-47
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     null,     null,     null,     null,  // 48-55
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        null,     null,     null,     null,     "<",   null,     ">",   null,  // 56-63
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int BUFFER_LEN = 8192;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final char[] mText = new char[BUFFER_LEN];
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mPos;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Writer mWriter;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OutputStream mOutputStream;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharsetEncoder mCharset;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mInTag;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void append(char c) throws IOException {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mPos;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= (BUFFER_LEN-1)) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            flush();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = mPos;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mText[pos] = c;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPos = pos+1;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void append(String str, int i, final int length) throws IOException {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (length > BUFFER_LEN) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int end = i + length;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i < end) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int next = i + BUFFER_LEN;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append(str, i, next<end ? BUFFER_LEN : (end-i));
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i = next;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mPos;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((pos+length) > BUFFER_LEN) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            flush();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = mPos;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str.getChars(i, i+length, mText, pos);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPos = pos + length;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void append(char[] buf, int i, final int length) throws IOException {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (length > BUFFER_LEN) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int end = i + length;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i < end) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int next = i + BUFFER_LEN;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append(buf, i, next<end ? BUFFER_LEN : (end-i));
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i = next;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mPos;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((pos+length) > BUFFER_LEN) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            flush();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = mPos;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.arraycopy(buf, i, mText, pos, length);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPos = pos + length;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void append(String str) throws IOException {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append(str, 0, str.length());
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void escapeAndAppendString(final String string) throws IOException {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = string.length();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final char NE = (char)ESCAPE_TABLE.length;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] escapes = ESCAPE_TABLE;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lastPos = 0;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (pos=0; pos<N; pos++) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c = string.charAt(pos);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c >= NE) continue;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String escape = escapes[c];
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (escape == null) continue;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (lastPos < pos) append(string, lastPos, pos-lastPos);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastPos = pos + 1;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(escape);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lastPos < pos) append(string, lastPos, pos-lastPos);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void escapeAndAppendString(char[] buf, int start, int len) throws IOException {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final char NE = (char)ESCAPE_TABLE.length;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] escapes = ESCAPE_TABLE;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int end = start+len;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lastPos = start;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (pos=start; pos<end; pos++) {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c = buf[pos];
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c >= NE) continue;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String escape = escapes[c];
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (escape == null) continue;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (lastPos < pos) append(buf, lastPos, pos-lastPos);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastPos = pos + 1;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(escape);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lastPos < pos) append(buf, lastPos, pos-lastPos);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlSerializer attribute(String namespace, String name, String value) throws IOException,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append(' ');
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (namespace != null) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(namespace);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(':');
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append(name);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append("=\"");
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        escapeAndAppendString(value);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append('"');
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cdsect(String text) throws IOException, IllegalArgumentException,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void comment(String text) throws IOException, IllegalArgumentException,
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void docdecl(String text) throws IOException, IllegalArgumentException,
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endDocument() throws IOException, IllegalArgumentException, IllegalStateException {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        flush();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlSerializer endTag(String namespace, String name) throws IOException,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInTag) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(" />\n");
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append("</");
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (namespace != null) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append(namespace);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append(':');
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(name);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(">\n");
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInTag = false;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void entityRef(String text) throws IOException, IllegalArgumentException,
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void flushBytes() throws IOException {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int position;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((position = mBytes.position()) > 0) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBytes.flip();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOutputStream.write(mBytes.array(), 0, position);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBytes.clear();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void flush() throws IOException {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i("PackageManager", "flush mPos=" + mPos);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPos > 0) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOutputStream != null) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                CoderResult result = mCharset.encode(charBuffer, mBytes, true);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (true) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (result.isError()) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new IOException(result.toString());
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (result.isOverflow()) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        flushBytes();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        result = mCharset.encode(charBuffer, mBytes, true);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flushBytes();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOutputStream.flush();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWriter.write(mText, 0, mPos);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWriter.flush();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPos = 0;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDepth() {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getFeature(String name) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getName() {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getNamespace() {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPrefix(String namespace, boolean generatePrefix)
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalArgumentException {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getProperty(String name) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void ignorableWhitespace(String text) throws IOException, IllegalArgumentException,
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void processingInstruction(String text) throws IOException, IllegalArgumentException,
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFeature(String name, boolean state) throws IllegalArgumentException,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutput(OutputStream os, String encoding) throws IOException,
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (os == null)
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (true) {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCharset = Charset.forName(encoding).newEncoder();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IllegalCharsetNameException e) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw (UnsupportedEncodingException) (new UnsupportedEncodingException(
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        encoding).initCause(e));
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (UnsupportedCharsetException e) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw (UnsupportedEncodingException) (new UnsupportedEncodingException(
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        encoding).initCause(e));
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOutputStream = os;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setOutput(
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                encoding == null
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? new OutputStreamWriter(os)
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : new OutputStreamWriter(os, encoding));
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutput(Writer writer) throws IOException, IllegalArgumentException,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWriter = writer;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPrefix(String prefix, String namespace) throws IOException,
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setProperty(String name, Object value) throws IllegalArgumentException,
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startDocument(String encoding, Boolean standalone) throws IOException,
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append("<?xml version='1.0' encoding='utf-8' standalone='"
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (standalone ? "yes" : "no") + "' ?>\n");
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlSerializer startTag(String namespace, String name) throws IOException,
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInTag) {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(">\n");
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append('<');
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (namespace != null) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(namespace);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(':');
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        append(name);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInTag = true;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlSerializer text(char[] buf, int start, int len) throws IOException,
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalArgumentException, IllegalStateException {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInTag) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(">");
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTag = false;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        escapeAndAppendString(buf, start, len);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlSerializer text(String text) throws IOException, IllegalArgumentException,
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalStateException {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInTag) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(">");
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTag = false;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        escapeAndAppendString(text);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
366