1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* -*-             c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.xmlpull.v1.sax2;
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Reader;
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// not J2ME classes -- remove if you want to run in MIDP devices
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.MalformedURLException;
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// not J2ME classes
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileInputStream;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileNotFoundException;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.Attributes;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.DTDHandler;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.ContentHandler;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.EntityResolver;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.ErrorHandler;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.InputSource;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.Locator;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXException;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXParseException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXNotRecognizedException;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.SAXNotSupportedException;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.XMLReader;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xml.sax.helpers.DefaultHandler;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.xmlpull.v1.XmlPullParserFactory;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * SAX2 Driver that pulls events from XmlPullParser
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and comverts them into SAX2 callbacks.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Driver implements Locator, XMLReader, Attributes
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String DECLARATION_HANDLER_PROPERTY =
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://xml.org/sax/properties/declaration-handler";
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String LEXICAL_HANDLER_PROPERTY =
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://xml.org/sax/properties/lexical-handler";
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String NAMESPACES_FEATURE =
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://xml.org/sax/features/namespaces";
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String NAMESPACE_PREFIXES_FEATURE =
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://xml.org/sax/features/namespace-prefixes";
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String VALIDATION_FEATURE =
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://xml.org/sax/features/validation";
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String APACHE_SCHEMA_VALIDATION_FEATURE =
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://apache.org/xml/features/validation/schema";
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected static final String APACHE_DYNAMIC_VALIDATION_FEATURE =
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        "http://apache.org/xml/features/validation/dynamic";
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected ContentHandler contentHandler = new DefaultHandler();
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected ErrorHandler errorHandler = new DefaultHandler();;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected String systemId;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected XmlPullParser pp;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //private final static boolean DEBUG = false;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Driver() throws XmlPullParserException {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        factory.setNamespaceAware(true);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pp = factory.newPullParser();
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Driver(XmlPullParser pp) throws XmlPullParserException {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.pp = pp;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // -- Attributes interface
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLength() { return pp.getAttributeCount(); }
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getURI(int index) { return pp.getAttributeNamespace(index); }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getLocalName(int index) { return pp.getAttributeName(index); }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getQName(int index) {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String prefix = pp.getAttributePrefix(index);
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(prefix != null) {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return prefix+':'+pp.getAttributeName(index);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getAttributeName(index);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getType(int index) { return pp.getAttributeType(index); }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(int index) { return pp.getAttributeValue(index); }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getIndex(String uri, String localName) {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < pp.getAttributeCount(); i++)
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getAttributeNamespace(i).equals(uri)
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project               && pp.getAttributeName(i).equals(localName))
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return i;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return -1;
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getIndex(String qName) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < pp.getAttributeCount(); i++)
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getAttributeName(i).equals(qName))
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return i;
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return -1;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getType(String uri, String localName) {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < pp.getAttributeCount(); i++)
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getAttributeNamespace(i).equals(uri)
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project               && pp.getAttributeName(i).equals(localName))
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return pp.getAttributeType(i);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getType(String qName) {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < pp.getAttributeCount(); i++)
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getAttributeName(i).equals(qName))
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return pp.getAttributeType(i);
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(String uri, String localName) {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return pp.getAttributeValue(uri, localName);
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(String qName) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return pp.getAttributeValue(null, qName);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // -- Locator interface
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getPublicId() { return null; }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSystemId() { return systemId; }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLineNumber() { return pp.getLineNumber(); }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getColumnNumber() { return pp.getColumnNumber(); }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // --- XMLReader interface
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getFeature(String name)
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(NAMESPACES_FEATURE.equals(name)) {
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES);
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if(NAMESPACE_PREFIXES_FEATURE.equals(name)) {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES);
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if(VALIDATION_FEATURE.equals(name)) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getFeature(XmlPullParser.FEATURE_VALIDATION);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //        } else if(APACHE_SCHEMA_VALIDATION_FEATURE.equals(name)) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //            return false;  //TODO
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //        } else if(APACHE_DYNAMIC_VALIDATION_FEATURE.equals(name)) {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //            return false; //TODO
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getFeature(name);
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //throw new SAXNotRecognizedException("unrecognized feature "+name);
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFeature (String name, boolean value)
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(NAMESPACES_FEATURE.equals(name)) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, value);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else if(NAMESPACE_PREFIXES_FEATURE.equals(name)) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if(pp.getFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES) != value) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    pp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, value);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else if(VALIDATION_FEATURE.equals(name)) {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setFeature(XmlPullParser.FEATURE_VALIDATION, value);
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //          } else if(APACHE_SCHEMA_VALIDATION_FEATURE.equals(name)) {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              // can ignore as validation must be false ...
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              //              if(true == value) {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              //                  throw new SAXNotSupportedException("schema validation is not supported");
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              //              }
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //          } else if(APACHE_DYNAMIC_VALIDATION_FEATURE.equals(name)) {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              if(true == value) {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                  throw new SAXNotSupportedException("dynamic validation is not supported");
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //              }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setFeature(name, value);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //throw new SAXNotRecognizedException("unrecognized feature "+name);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch(XmlPullParserException ex) {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           // throw new SAXNotSupportedException("problem with setting feature "+name+": "+ex);
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getProperty (String name)
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(DECLARATION_HANDLER_PROPERTY.equals(name)) {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if(LEXICAL_HANDLER_PROPERTY.equals(name)) {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return pp.getProperty(name);
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //throw new SAXNotRecognizedException("not recognized get property "+name);
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setProperty (String name, Object value)
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if(DECLARATION_HANDLER_PROPERTY.equals(name)) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SAXNotSupportedException("not supported setting property "+name);//+" to "+value);
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if(LEXICAL_HANDLER_PROPERTY.equals(name)) {
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SAXNotSupportedException("not supported setting property "+name);//+" to "+value);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setProperty(name, value);
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch(XmlPullParserException ex) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SAXNotSupportedException("not supported set property "+name+": "+ ex);
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //throw new SAXNotRecognizedException("not recognized set property "+name);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setEntityResolver (EntityResolver resolver) {}
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public EntityResolver getEntityResolver () { return null; }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDTDHandler (DTDHandler handler) {}
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DTDHandler getDTDHandler () { return null; }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setContentHandler (ContentHandler handler)
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.contentHandler = handler;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ContentHandler getContentHandler() { return contentHandler; }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setErrorHandler(ErrorHandler handler) {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.errorHandler = handler;
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ErrorHandler getErrorHandler() { return errorHandler; }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void parse(InputSource source) throws SAXException, IOException
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        systemId = source.getSystemId();
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        contentHandler.setDocumentLocator(this);
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final Reader reader = source.getCharacterStream();
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (reader == null) {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                InputStream stream = source.getByteStream();
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                final String encoding = source.getEncoding();
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (stream == null) {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    systemId = source.getSystemId();
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if(systemId == null) {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        SAXParseException saxException = new SAXParseException(
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            "null source systemId" , this);
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        errorHandler.fatalError(saxException);
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // NOTE: replace with Connection to run in J2ME environment
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    try {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        final URL url = new URL(systemId);
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        stream = url.openStream();
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } catch (MalformedURLException nue) {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        try {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            stream = new FileInputStream(systemId);
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } catch (FileNotFoundException fnfe) {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final SAXParseException saxException = new SAXParseException(
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                "could not open file with systemId "+systemId, this, fnfe);
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            errorHandler.fatalError(saxException);
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return;
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setInput(stream, encoding);
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                pp.setInput(reader);
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (XmlPullParserException ex)  {
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final SAXParseException saxException = new SAXParseException(
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "parsing initialization error: "+ex, this, ex);
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //if(DEBUG) ex.printStackTrace();
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            errorHandler.fatalError(saxException);
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // start parsing - move to first start tag
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contentHandler.startDocument();
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // get first event
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            pp.next();
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // it should be start tag...
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getEventType() != XmlPullParser.START_TAG) {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                final SAXParseException saxException = new SAXParseException(
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "expected start tag not"+pp.getPositionDescription(), this);
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //throw saxException;
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                errorHandler.fatalError(saxException);
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (XmlPullParserException ex)  {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final SAXParseException saxException = new SAXParseException(
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "parsing initialization error: "+ex, this, ex);
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //ex.printStackTrace();
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            errorHandler.fatalError(saxException);
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // now real parsing can start!
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        parseSubTree(pp);
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // and finished ...
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        contentHandler.endDocument();
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void parse(String systemId) throws SAXException, IOException {
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        parse(new InputSource(systemId));
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void parseSubTree(XmlPullParser pp) throws SAXException, IOException {
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.pp = pp;
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final boolean namespaceAware = pp.getFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES);
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if(pp.getEventType() != XmlPullParser.START_TAG) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SAXException(
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "start tag must be read before skiping subtree"+pp.getPositionDescription());
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final int[] holderForStartAndLength = new int[2];
3618216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes            final StringBuilder rawName = new StringBuilder(16);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String prefix = null;
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String name = null;
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int level = pp.getDepth() - 1;
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int type = XmlPullParser.START_TAG;
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            LOOP:
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            do {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                switch(type) {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    case XmlPullParser.START_TAG:
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if(namespaceAware) {
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final int depth = pp.getDepth() - 1;
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final int countPrev =
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                (level > depth) ? pp.getNamespaceCount(depth) : 0;
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            //int countPrev = pp.getNamespaceCount(pp.getDepth() - 1);
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final int count = pp.getNamespaceCount(depth + 1);
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            for (int i = countPrev; i < count; i++)
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            {
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                contentHandler.startPrefixMapping(
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    pp.getNamespacePrefix(i),
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    pp.getNamespaceUri(i)
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                );
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            name = pp.getName();
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            prefix = pp.getPrefix();
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            if(prefix != null) {
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.setLength(0);
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(prefix);
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(':');
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(name);
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            startElement(pp.getNamespace(),
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                         name,
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                         // TODO Fixed this. Was "not equals".
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                         prefix == null ? name : rawName.toString());
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            startElement(pp.getNamespace(),
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                         pp.getName(),
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                         pp.getName());
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        //++level;
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    case XmlPullParser.TEXT:
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        final char[] chars = pp.getTextCharacters(holderForStartAndLength);
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        contentHandler.characters(chars,
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                  holderForStartAndLength[0], //start
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                  holderForStartAndLength[1] //len
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                 );
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    case XmlPullParser.END_TAG:
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        //--level;
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if(namespaceAware) {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            name = pp.getName();
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            prefix = pp.getPrefix();
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            if(prefix != null) {
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.setLength(0);
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(prefix);
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(':');
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                rawName.append(name);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            contentHandler.endElement(pp.getNamespace(),
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                      name,
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                      prefix != null ? name : rawName.toString()
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                     );
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            // when entering show prefixes for all levels!!!!
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final int depth = pp.getDepth();
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            final int countPrev =
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                (level > depth) ? pp.getNamespaceCount(pp.getDepth()) : 0;
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            int count = pp.getNamespaceCount(pp.getDepth() - 1);
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            // undeclare them in reverse order
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            for (int i = count - 1; i >= countPrev; i--)
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            {
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                contentHandler.endPrefixMapping(
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    pp.getNamespacePrefix(i)
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                );
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            contentHandler.endElement(pp.getNamespace(),
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                      pp.getName(),
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                      pp.getName()
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                     );
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break;
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    case XmlPullParser.END_DOCUMENT:
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        break LOOP;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                type = pp.next();
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } while(pp.getDepth() > level);
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (XmlPullParserException ex)  {
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final SAXParseException saxException = new SAXParseException("parsing error: "+ex, this, ex);
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ex.printStackTrace();
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            errorHandler.fatalError(saxException);
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Calls {@link ContentHandler#startElement(String, String, String, Attributes) startElement}
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on the <code>ContentHandler</code> with <code>this</code> driver object as the
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Attributes} implementation. In default implementation
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Attributes} object is valid only during this method call and may not
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be stored. Sub-classes can overwrite this method to cache attributes.
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void startElement(String namespace, String localName, String qName) throws SAXException {
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        contentHandler.startElement(namespace, localName, qName, this);
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
470