1087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/* 2087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Copyright (C) 2006 The Android Open Source Project 3087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 4087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 5087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * you may not use this file except in compliance with the License. 6087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * You may obtain a copy of the License at 7087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 8087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * http://www.apache.org/licenses/LICENSE-2.0 9087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * 10087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * Unless required by applicable law or agreed to in writing, software 11087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 12087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * See the License for the specific language governing permissions and 14087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * limitations under the License. 15087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 16087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 172269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornpackage com.android.internal.util; 18087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 19087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport org.xmlpull.v1.XmlSerializer; 20087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 21087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.IOException; 22087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStream; 23087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.OutputStreamWriter; 24087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.UnsupportedEncodingException; 25087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.io.Writer; 26087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.ByteBuffer; 27087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.CharBuffer; 28087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.charset.Charset; 29087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.charset.CharsetEncoder; 30087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.charset.CoderResult; 31087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.charset.IllegalCharsetNameException; 32087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorimport java.nio.charset.UnsupportedCharsetException; 33087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 34087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor/** 35087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * This is a quick and dirty implementation of XmlSerializer that isn't horribly 36087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * painfully slow like the normal one. It only does what is needed for the 37087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor * specific XML files being written with it. 38087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor */ 39087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylorpublic class FastXmlSerializer implements XmlSerializer { 40087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private static final String ESCAPE_TABLE[] = new String[] { 41087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 0-7 42087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 8-15 43087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 16-23 44087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 24-31 45087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, """, null, null, null, "&", null, // 32-39 46087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 40-47 47087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, null, null, null, null, // 48-55 48087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor null, null, null, null, "<", null, ">", null, // 56-63 49087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor }; 50087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 51087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private static final int BUFFER_LEN = 8192; 52087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 53087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private final char[] mText = new char[BUFFER_LEN]; 54087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private int mPos; 55087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 56087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private Writer mWriter; 57087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 58087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private OutputStream mOutputStream; 59087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private CharsetEncoder mCharset; 60087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN); 61087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 62087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private boolean mInTag; 63087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 64087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void append(char c) throws IOException { 65087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int pos = mPos; 66087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (pos >= (BUFFER_LEN-1)) { 67087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flush(); 68087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor pos = mPos; 69087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 70087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mText[pos] = c; 71087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mPos = pos+1; 72087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 73087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 74087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void append(String str, int i, final int length) throws IOException { 75087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (length > BUFFER_LEN) { 76087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int end = i + length; 77087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i < end) { 78087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int next = i + BUFFER_LEN; 79087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(str, i, next<end ? BUFFER_LEN : (end-i)); 80087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i = next; 81087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 82087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 83087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 84087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int pos = mPos; 85087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ((pos+length) > BUFFER_LEN) { 86087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flush(); 87087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor pos = mPos; 88087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 89087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor str.getChars(i, i+length, mText, pos); 90087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mPos = pos + length; 91087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 92087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 93087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void append(char[] buf, int i, final int length) throws IOException { 94087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (length > BUFFER_LEN) { 95087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int end = i + length; 96087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (i < end) { 97087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int next = i + BUFFER_LEN; 98087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(buf, i, next<end ? BUFFER_LEN : (end-i)); 99087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor i = next; 100087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 101087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 102087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 103087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int pos = mPos; 104087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ((pos+length) > BUFFER_LEN) { 105087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flush(); 106087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor pos = mPos; 107087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 108087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor System.arraycopy(buf, i, mText, pos, length); 109087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mPos = pos + length; 110087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 111087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 112087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void append(String str) throws IOException { 113087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(str, 0, str.length()); 114087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 115087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 116087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void escapeAndAppendString(final String string) throws IOException { 117087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final int N = string.length(); 118087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final char NE = (char)ESCAPE_TABLE.length; 119087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String[] escapes = ESCAPE_TABLE; 120087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int lastPos = 0; 121087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int pos; 122087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (pos=0; pos<N; pos++) { 123087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = string.charAt(pos); 124087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (c >= NE) continue; 125087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String escape = escapes[c]; 126087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (escape == null) continue; 127087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (lastPos < pos) append(string, lastPos, pos-lastPos); 128087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor lastPos = pos + 1; 129087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(escape); 130087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 131087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (lastPos < pos) append(string, lastPos, pos-lastPos); 132087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 133087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 134087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void escapeAndAppendString(char[] buf, int start, int len) throws IOException { 135087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final char NE = (char)ESCAPE_TABLE.length; 136087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor final String[] escapes = ESCAPE_TABLE; 137087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int end = start+len; 138087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int lastPos = start; 139087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int pos; 140087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor for (pos=start; pos<end; pos++) { 141087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor char c = buf[pos]; 142087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (c >= NE) continue; 143087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor String escape = escapes[c]; 144087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (escape == null) continue; 145087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (lastPos < pos) append(buf, lastPos, pos-lastPos); 146087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor lastPos = pos + 1; 147087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(escape); 148087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 149087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (lastPos < pos) append(buf, lastPos, pos-lastPos); 150087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 151087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 152087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public XmlSerializer attribute(String namespace, String name, String value) throws IOException, 153087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 154087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(' '); 155087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (namespace != null) { 156087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(namespace); 157087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(':'); 158087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 159087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(name); 160087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append("=\""); 161087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 162087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor escapeAndAppendString(value); 163087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append('"'); 164087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return this; 165087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 166087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 167087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void cdsect(String text) throws IOException, IllegalArgumentException, 168087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 169087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 170087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 171087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 172087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void comment(String text) throws IOException, IllegalArgumentException, 173087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 174087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 175087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 176087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 177087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void docdecl(String text) throws IOException, IllegalArgumentException, 178087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 179087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 180087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 181087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 182087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void endDocument() throws IOException, IllegalArgumentException, IllegalStateException { 183087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flush(); 184087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 185087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 186087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public XmlSerializer endTag(String namespace, String name) throws IOException, 187087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 188087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mInTag) { 189087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(" />\n"); 190087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 191087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append("</"); 192087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (namespace != null) { 193087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(namespace); 194087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(':'); 195087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 196087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(name); 197087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(">\n"); 198087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 199087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mInTag = false; 200087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return this; 201087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 202087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 203087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void entityRef(String text) throws IOException, IllegalArgumentException, 204087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 205087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 206087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 207087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 208087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor private void flushBytes() throws IOException { 209087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor int position; 210087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if ((position = mBytes.position()) > 0) { 211087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mBytes.flip(); 212087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mOutputStream.write(mBytes.array(), 0, position); 213087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mBytes.clear(); 214087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 215087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 216087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 217087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void flush() throws IOException { 218087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor //Log.i("PackageManager", "flush mPos=" + mPos); 219087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mPos > 0) { 220087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mOutputStream != null) { 221087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos); 222087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor CoderResult result = mCharset.encode(charBuffer, mBytes, true); 223087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor while (true) { 224087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (result.isError()) { 225087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new IOException(result.toString()); 226087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else if (result.isOverflow()) { 227087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flushBytes(); 228087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor result = mCharset.encode(charBuffer, mBytes, true); 229087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor continue; 230087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 231087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor break; 232087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 233087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor flushBytes(); 234087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mOutputStream.flush(); 235087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 236087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mWriter.write(mText, 0, mPos); 237087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mWriter.flush(); 238087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 239087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mPos = 0; 240087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 241087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 242087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 243087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public int getDepth() { 244087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 245087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 246087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 247087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public boolean getFeature(String name) { 248087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 249087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 250087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 251087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public String getName() { 252087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 253087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 254087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 255087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public String getNamespace() { 256087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 257087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 258087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 259087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public String getPrefix(String namespace, boolean generatePrefix) 260087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throws IllegalArgumentException { 261087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 262087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 263087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 264087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public Object getProperty(String name) { 265087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 266087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 267087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 268087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void ignorableWhitespace(String text) throws IOException, IllegalArgumentException, 269087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 270087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 271087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 272087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 273087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void processingInstruction(String text) throws IOException, IllegalArgumentException, 274087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 275087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 276087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 277087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 278087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void setFeature(String name, boolean state) throws IllegalArgumentException, 279087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 280087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) { 281087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return; 282087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 283087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 284087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 285087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 286087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void setOutput(OutputStream os, String encoding) throws IOException, 287087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 288087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (os == null) 289087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new IllegalArgumentException(); 290087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (true) { 291087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor try { 292087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mCharset = Charset.forName(encoding).newEncoder(); 293087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (IllegalCharsetNameException e) { 294087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw (UnsupportedEncodingException) (new UnsupportedEncodingException( 295087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor encoding).initCause(e)); 296087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } catch (UnsupportedCharsetException e) { 297087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw (UnsupportedEncodingException) (new UnsupportedEncodingException( 298087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor encoding).initCause(e)); 299087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 300087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mOutputStream = os; 301087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } else { 302087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor setOutput( 303087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor encoding == null 304087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor ? new OutputStreamWriter(os) 305087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor : new OutputStreamWriter(os, encoding)); 306087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 307087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 308087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 309087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void setOutput(Writer writer) throws IOException, IllegalArgumentException, 310087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 311087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mWriter = writer; 312087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 313087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 314087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void setPrefix(String prefix, String namespace) throws IOException, 315087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 316087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 317087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 318087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 319087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void setProperty(String name, Object value) throws IllegalArgumentException, 320087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 321087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor throw new UnsupportedOperationException(); 322087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 323087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 324087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public void startDocument(String encoding, Boolean standalone) throws IOException, 325087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 326087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append("<?xml version='1.0' encoding='utf-8' standalone='" 327087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor + (standalone ? "yes" : "no") + "' ?>\n"); 328087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 329087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 330087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public XmlSerializer startTag(String namespace, String name) throws IOException, 331087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 332087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mInTag) { 333087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(">\n"); 334087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 335087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append('<'); 336087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (namespace != null) { 337087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(namespace); 338087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(':'); 339087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 340087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(name); 341087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mInTag = true; 342087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return this; 343087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 344087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 345087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public XmlSerializer text(char[] buf, int start, int len) throws IOException, 346087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalArgumentException, IllegalStateException { 347087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mInTag) { 348087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(">"); 349087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mInTag = false; 350087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 351087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor escapeAndAppendString(buf, start, len); 352087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return this; 353087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 354087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 355087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor public XmlSerializer text(String text) throws IOException, IllegalArgumentException, 356087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor IllegalStateException { 357087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor if (mInTag) { 358087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor append(">"); 359087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor mInTag = false; 360087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 361087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor escapeAndAppendString(text); 362087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor return this; 363087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor } 364087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor 365087ff0b93580760bf0c5dd36a0081289224b1cdeTom Taylor} 366