19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xml.sax.Attributes;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xml.sax.Locator;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xml.sax.SAXException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Stack;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts default data from InputStream, should be in XML format.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the provider syncs data to the server, the imported data will be synced to the server.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Samples:</p>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Insert one row:
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;row uri="content://contacts/people">
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;Col column = "name" value = "foo feebe "/>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;Col column = "addr" value = "Tx"/>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/row></pre>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Delete, it must be in order of uri, select, and arg:
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;del uri="content://contacts/people" select="name=? and addr=?"
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  arg1 = "foo feebe" arg2 ="Tx"/></pre>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Use first row's uri to insert into another table,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  content://contacts/people/1/phones:
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;row uri="content://contacts/people">
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;col column = "name" value = "foo feebe"/>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;col column = "addr" value = "Tx"/>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;row postfix="phones">
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    &lt;col column="number" value="512-514-6535"/>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;/row>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;row postfix="phones">
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *    &lt;col column="cell" value="512-514-6535"/>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;/row>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/row></pre>
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/>
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Insert multiple rows in to same table and same attributes:
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;row uri="content://contacts/people" >
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;row>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   &lt;col column= "name" value = "foo feebe"/>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   &lt;col column= "addr" value = "Tx"/>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;/row>
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;row>
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  &lt;/row>
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/row></pre>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DefaultDataHandler implements ContentInsertHandler {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String ROW = "row";
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String COL = "col";
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String URI_STR = "uri";
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String POSTFIX = "postfix";
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String DEL = "del";
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String SELECT = "select";
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String ARG = "arg";
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Stack<Uri> mUris = new Stack<Uri>();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ContentValues mValues;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ContentResolver mContentResolver;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void insert(ContentResolver contentResolver, InputStream in)
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, SAXException {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = contentResolver;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Xml.parse(in, Xml.Encoding.UTF_8, this);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void insert(ContentResolver contentResolver, String in)
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws SAXException {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = contentResolver;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Xml.parse(in, this);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void parseRow(Attributes atts) throws SAXException {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String uriStr = atts.getValue(URI_STR);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri uri;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (uriStr != null) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 1
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uri = Uri.parse(uriStr);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (uri == null) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SAXException("attribute " +
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        atts.getValue(URI_STR) + " parsing failure");
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mUris.size() > 0){
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 2
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String postfix = atts.getValue(POSTFIX);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (postfix != null) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uri = Uri.withAppendedPath(mUris.lastElement(),
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        postfix);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uri = mUris.lastElement();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SAXException("attribute parsing failure");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUris.push(uri);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Uri insertRow() {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri u = mContentResolver.insert(mUris.lastElement(), mValues);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mValues = null;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startElement(String uri, String localName, String name,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Attributes atts) throws SAXException {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ROW.equals(localName)) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mValues != null) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // case 2, <Col> before <Row> insert last uri
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mUris.empty()) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new SAXException("uri is empty");
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri nextUri = insertRow();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (nextUri == null) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new SAXException("insert to uri " +
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mUris.lastElement().toString() + " failure");
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // make sure the stack lastElement save uri for more than one row
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUris.pop();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUris.push(nextUri);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parseRow(atts);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int attrLen = atts.getLength();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrLen == 0) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // case 3, share same uri as last level
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUris.push(mUris.lastElement());
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parseRow(atts);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (COL.equals(localName)) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrLen = atts.getLength();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrLen != 2) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SAXException("illegal attributes number " + attrLen);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String key = atts.getValue(0);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String value = atts.getValue(1);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (key != null && key.length() > 0 && value != null && value.length() > 0) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mValues == null) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mValues = new ContentValues();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mValues.put(key, value);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SAXException("illegal attributes value");
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (DEL.equals(localName)){
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri u = Uri.parse(atts.getValue(URI_STR));
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u == null) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SAXException("attribute " +
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        atts.getValue(URI_STR) + " parsing failure");
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrLen = atts.getLength() - 2;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrLen > 0) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String[] selectionArgs = new String[attrLen];
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < attrLen; i++) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    selectionArgs[i] = atts.getValue(i+2);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContentResolver.delete(u, atts.getValue(1), selectionArgs);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrLen == 0){
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContentResolver.delete(u, atts.getValue(1), null);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContentResolver.delete(u, null, null);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SAXException("unknown element: " + localName);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endElement(String uri, String localName, String name)
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SAXException {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ROW.equals(localName)) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mUris.empty()) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SAXException("uri mismatch");
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mValues != null) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                insertRow();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUris.pop();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void characters(char[] ch, int start, int length)
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SAXException {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endDocument() throws SAXException {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endPrefixMapping(String prefix) throws SAXException {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void ignorableWhitespace(char[] ch, int start, int length)
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SAXException {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void processingInstruction(String target, String data)
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SAXException {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDocumentLocator(Locator locator) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void skippedEntity(String name) throws SAXException {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startDocument() throws SAXException {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startPrefixMapping(String prefix, String uri)
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws SAXException {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO Auto-generated method stub
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
263