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