XmlBlock.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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 android.content.res;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.XmlUtils;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Reader;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wrapper around a compiled XML file.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class XmlBlock {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG=false;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlBlock(byte[] data) {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAssets = null;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNative = nativeCreate(data, 0, data.length);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStrings = new StringBlock(nativeGetStringBlock(mNative), false);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlBlock(byte[] data, int offset, int size) {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAssets = null;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNative = nativeCreate(data, offset, size);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStrings = new StringBlock(nativeGetStringBlock(mNative), false);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void close() {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOpen) {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpen = false;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                decOpenCountLocked();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void decOpenCountLocked() {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOpenCount--;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOpenCount == 0) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nativeDestroy(mNative);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAssets != null) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAssets.xmlBlockGone();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser newParser() {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNative != 0) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Parser(nativeCreateParseState(mNative), this);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ final class Parser implements XmlResourceParser {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parser(int parseState, XmlBlock block) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseState = parseState;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlock = block;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block.mOpenCount++;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFeature(String name, boolean state) throws XmlPullParserException {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (FEATURE_PROCESS_NAMESPACES.equals(name) && state) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name) && state) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("Unsupported feature: " + name);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean getFeature(String name) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setProperty(String name, Object value) throws XmlPullParserException {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("setProperty() not supported");
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object getProperty(String name) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setInput(Reader in) throws XmlPullParserException {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("setInput() not supported");
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setInput(InputStream inputStream, String inputEncoding) throws XmlPullParserException {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("setInput() not supported");
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void defineEntityReplacementText(String entityName, String replacementText) throws XmlPullParserException {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("defineEntityReplacementText() not supported");
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNamespacePrefix(int pos) throws XmlPullParserException {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("getNamespacePrefix() not supported");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getInputEncoding() {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNamespace(String prefix) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("getNamespace() not supported");
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getNamespaceCount(int depth) throws XmlPullParserException {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("getNamespaceCount() not supported");
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getPositionDescription() {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Binary XML file line #" + getLineNumber();
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNamespaceUri(int pos) throws XmlPullParserException {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("getNamespaceUri() not supported");
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getColumnNumber() {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getDepth() {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDepth;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getText() {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetText(mParseState);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return id >= 0 ? mStrings.get(id).toString() : null;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getLineNumber() {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nativeGetLineNumber(mParseState);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getEventType() throws XmlPullParserException {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mEventType;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isWhitespace() throws XmlPullParserException {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // whitespace was stripped by aapt.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getPrefix() {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("getPrefix not supported");
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public char[] getTextCharacters(int[] holderForStartAndLength) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String txt = getText();
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char[] chars = null;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (txt != null) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                holderForStartAndLength[0] = 0;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                holderForStartAndLength[1] = txt.length();
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                chars = new char[txt.length()];
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                txt.getChars(0, txt.length(), chars, 0);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return chars;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNamespace() {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetNamespace(mParseState);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return id >= 0 ? mStrings.get(id).toString() : "";
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getName() {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetName(mParseState);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return id >= 0 ? mStrings.get(id).toString() : null;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributeNamespace(int index) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetAttributeNamespace(mParseState, index);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG) System.out.println("getAttributeNamespace of " + index + " = " + id);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (id >= 0) return mStrings.get(id).toString();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (id == -1) return "";
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IndexOutOfBoundsException(String.valueOf(index));
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributeName(int index) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetAttributeName(mParseState, index);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG) System.out.println("getAttributeName of " + index + " = " + id);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (id >= 0) return mStrings.get(id).toString();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IndexOutOfBoundsException(String.valueOf(index));
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributePrefix(int index) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("getAttributePrefix not supported");
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isEmptyElementTag() throws XmlPullParserException {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXX Need to detect this.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeCount() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mEventType == START_TAG ? nativeGetAttributeCount(mParseState) : -1;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributeValue(int index) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetAttributeStringValue(mParseState, index);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG) System.out.println("getAttributeValue of " + index + " = " + id);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (id >= 0) return mStrings.get(id).toString();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // May be some other type...  check and try to convert if so.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, index);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t == TypedValue.TYPE_NULL) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IndexOutOfBoundsException(String.valueOf(index));
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int v = nativeGetAttributeData(mParseState, index);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return TypedValue.coerceToString(t, v);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributeType(int index) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "CDATA";
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isAttributeDefault(int index) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int nextToken() throws XmlPullParserException,IOException {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return next();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getAttributeValue(String namespace, String name) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, name);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG) System.out.println("getAttributeName of "
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + namespace + ":" + name + " index = " + idx);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG) System.out.println(
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Namespace=" + getAttributeNamespace(idx)
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "Name=" + getAttributeName(idx)
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ", Value=" + getAttributeValue(idx));
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeValue(idx);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int next() throws XmlPullParserException,IOException {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mStarted) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarted = true;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return START_DOCUMENT;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseState == 0) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return END_DOCUMENT;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int ev = nativeNext(mParseState);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDecNextDepth) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDepth--;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDecNextDepth = false;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (ev) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case START_TAG:
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDepth++;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case END_TAG:
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDecNextDepth = true;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mEventType = ev;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ev == END_DOCUMENT) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Automatically close the parse when we reach the end of
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a document, since the standard XmlPullParser interface
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // doesn't have such an API so most clients will leave us
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // dangling.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                close();
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void require(int type, String namespace, String name) throws XmlPullParserException,IOException {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type != getEventType()
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || (namespace != null && !namespace.equals( getNamespace () ) )
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || (name != null && !name.equals( getName() ) ) )
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new XmlPullParserException( "expected "+ TYPES[ type ]+getPositionDescription());
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String nextText() throws XmlPullParserException,IOException {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(getEventType() != START_TAG) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               throw new XmlPullParserException(
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 getPositionDescription()
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 + ": parser must be on START_TAG to read next text", this, null);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int eventType = next();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(eventType == TEXT) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               String result = getText();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               eventType = next();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               if(eventType != END_TAG) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 throw new XmlPullParserException(
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getPositionDescription()
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": event TEXT it must be immediately followed by END_TAG", this, null);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if(eventType == END_TAG) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               return "";
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               throw new XmlPullParserException(
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 getPositionDescription()
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 + ": parser must be on START_TAG or TEXT to read text", this, null);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int nextTag() throws XmlPullParserException,IOException {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int eventType = next();
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(eventType == TEXT && isWhitespace()) {   // skip whitespace
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               eventType = next();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (eventType != START_TAG && eventType != END_TAG) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               throw new XmlPullParserException(
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   getPositionDescription()
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   + ": expected start or end tag", this, null);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return eventType;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeNameResource(int index) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nativeGetAttributeResource(mParseState, index);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeListValue(String namespace, String attribute,
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String[] options, int defaultValue) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeListValue(idx, options, defaultValue);
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean getAttributeBooleanValue(String namespace, String attribute,
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean defaultValue) {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeBooleanValue(idx, defaultValue);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeResourceValue(String namespace, String attribute,
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int defaultValue) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeResourceValue(idx, defaultValue);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeIntValue(String namespace, String attribute,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int defaultValue) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeIntValue(idx, defaultValue);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeUnsignedIntValue(String namespace, String attribute,
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                int defaultValue)
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeUnsignedIntValue(idx, defaultValue);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float getAttributeFloatValue(String namespace, String attribute,
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float defaultValue) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = nativeGetAttributeIndex(mParseState, namespace, attribute);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx >= 0) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getAttributeFloatValue(idx, defaultValue);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeListValue(int idx,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String[] options, int defaultValue) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int v = nativeGetAttributeData(mParseState, idx);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t == TypedValue.TYPE_STRING) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return XmlUtils.convertValueToList(
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStrings.get(v), options, defaultValue);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return v;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean getAttributeBooleanValue(int idx,
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean defaultValue) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: don't attempt to convert any other types, because
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to count on appt doing the conversion for us.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t >= TypedValue.TYPE_FIRST_INT &&
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t <= TypedValue.TYPE_LAST_INT) {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return nativeGetAttributeData(mParseState, idx) != 0;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeResourceValue(int idx, int defaultValue) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: don't attempt to convert any other types, because
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to count on appt doing the conversion for us.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t == TypedValue.TYPE_REFERENCE) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return nativeGetAttributeData(mParseState, idx);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeIntValue(int idx, int defaultValue) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: don't attempt to convert any other types, because
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to count on appt doing the conversion for us.
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t >= TypedValue.TYPE_FIRST_INT &&
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t <= TypedValue.TYPE_LAST_INT) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return nativeGetAttributeData(mParseState, idx);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getAttributeUnsignedIntValue(int idx, int defaultValue) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: don't attempt to convert any other types, because
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to count on appt doing the conversion for us.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t >= TypedValue.TYPE_FIRST_INT &&
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t <= TypedValue.TYPE_LAST_INT) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return nativeGetAttributeData(mParseState, idx);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defaultValue;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float getAttributeFloatValue(int idx, float defaultValue) {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int t = nativeGetAttributeDataType(mParseState, idx);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: don't attempt to convert any other types, because
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to count on appt doing the conversion for us.
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t == TypedValue.TYPE_FLOAT) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Float.intBitsToFloat(
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nativeGetAttributeData(mParseState, idx));
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("not a float!");
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getIdAttribute() {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetIdAttribute(mParseState);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return id >= 0 ? mStrings.get(id).toString() : null;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getClassAttribute() {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int id = nativeGetClassAttribute(mParseState);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return id >= 0 ? mStrings.get(id).toString() : null;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getIdAttributeResourceValue(int defaultValue) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //todo: create and use native method
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getAttributeResourceValue(null, "id", defaultValue);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getStyleAttribute() {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nativeGetStyleAttribute(mParseState);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void close() {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBlock) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mParseState != 0) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nativeDestroyParseState(mParseState);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseState = 0;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlock.decOpenCountLocked();
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void finalize() throws Throwable {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            close();
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ final CharSequence getPooledString(int id) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mStrings.get(id);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ int mParseState;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final XmlBlock mBlock;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mStarted = false;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mDecNextDepth = false;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mDepth = 0;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mEventType = START_DOCUMENT;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create from an existing xml block native object.  This is
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -extremely- dangerous -- only use it if you absolutely know what you
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  are doing!  The given native object must exist for the entire lifetime
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  of this newly creating XmlBlock.
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XmlBlock(AssetManager assets, int xmlBlock) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAssets = assets;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNative = xmlBlock;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStrings = new StringBlock(nativeGetStringBlock(xmlBlock), false);
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final AssetManager mAssets;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int mNative;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final StringBlock mStrings;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mOpen = true;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOpenCount = 1;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeCreate(byte[] data,
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 int offset,
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 int size);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetStringBlock(int obj);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeCreateParseState(int obj);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeNext(int state);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetNamespace(int state);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetName(int state);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetText(int state);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetLineNumber(int state);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeCount(int state);
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeNamespace(int state, int idx);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeName(int state, int idx);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeResource(int state, int idx);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeDataType(int state, int idx);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeData(int state, int idx);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeStringValue(int state, int idx);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetIdAttribute(int state);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetClassAttribute(int state);
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetStyleAttribute(int state);
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native int nativeGetAttributeIndex(int state, String namespace, String name);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native void nativeDestroyParseState(int state);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final native void nativeDestroy(int obj);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
516