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