WbxmlParser.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:6k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007 Esmertec AG.
  3.  * Copyright (C) 2007 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.imps;
  18. import java.io.IOException;
  19. import java.io.InputStream;
  20. import org.xml.sax.Attributes;
  21. import org.xml.sax.ContentHandler;
  22. import org.xml.sax.InputSource;
  23. import org.xml.sax.SAXException;
  24. /*
  25.  * NOT thread-safe. Always use this in one thread.
  26.  */
  27. final class WbxmlParser {
  28.     private static final int BUFFER_SIZE = 1024;
  29.     private ContentHandler mContentHandler;
  30.     private int mNativeParser;
  31.     private AttributesImpl atts;
  32.     public WbxmlParser() {
  33.         atts = new AttributesImpl();
  34.         mNativeParser = nativeCreate("UTF-8");
  35.         if (mNativeParser == 0) {
  36.             throw new OutOfMemoryError();
  37.         }
  38.     }
  39.     @Override
  40.     protected void finalize() {
  41.         if (mNativeParser != 0) {
  42.             nativeRelease(mNativeParser);
  43.         }
  44.     }
  45.     public void setContentHandler(ContentHandler contentHandler) {
  46.         mContentHandler = contentHandler;
  47.     }
  48.     public void reset() {
  49.         if (mNativeParser != 0) {
  50.             nativeReset(mNativeParser);
  51.         }
  52.         atts.names = null;
  53.         atts.values = null;
  54.         mContentHandler = null;
  55.     }
  56.     public void parse(InputSource in) throws ParserException, SAXException, IOException {
  57.         InputStream byteStream = in.getByteStream();
  58.         byte[] buffer = new byte[BUFFER_SIZE];
  59.         int length;
  60.         // FIXME: nativeParse should throw ParserException but the dalvik
  61.         // seems to have problem throwing non-system exceptions from JNI
  62.         // code. Use IAE for now and file a bug report for this.
  63.         try {
  64.             while ((length = byteStream.read(buffer)) != -1) {
  65.                 nativeParse(mNativeParser, buffer, length, false);
  66.             }
  67.             nativeParse(mNativeParser, new byte[1], 0, true);
  68.         } catch (IllegalArgumentException e) {
  69.             throw new ParserException(e);
  70.         }
  71.     }
  72.     void startElement(String name, String[] attrNames, String[] attrValues)
  73.             throws SAXException {
  74.         atts.names = attrNames;
  75.         atts.values = attrValues;
  76.         if(mContentHandler != null) {
  77.             mContentHandler.startElement("", name, name, atts);
  78.         }
  79.     }
  80.     void endElement(String name) throws SAXException {
  81.         if(mContentHandler != null) {
  82.             mContentHandler.endElement("", name, name);
  83.         }
  84.     }
  85.     void characters(char[] ch, int length) throws SAXException {
  86.         if(mContentHandler != null) {
  87.             mContentHandler.characters(ch, 0, length);
  88.         }
  89.     }
  90.     static native void nativeStaticInitialize();
  91.     native int nativeCreate(String encoding);
  92.     native void nativeRelease(int nativeParser);
  93.     native void nativeReset(int nativeParser);
  94.     // XXX: nativeParse should throw ParserException but the dalvik seems to
  95.     // have problem throwing non-system exceptions from JNI code. Use IAE
  96.     // for now and file a bug report for this.
  97.     native void nativeParse(int nativeParser, byte[] ch, int length,
  98.             boolean isEnd) throws IllegalArgumentException, SAXException, IOException;
  99.     static {
  100.         try {
  101.             System.loadLibrary("wbxml_jni");
  102.             nativeStaticInitialize();
  103.         } catch (UnsatisfiedLinkError ule) {
  104.             System.err.println("WARNING: Could not load library libwbxml_jni.so");
  105.         }
  106.     }
  107.     static class AttributesImpl implements Attributes {
  108.         String[] names = null;
  109.         String[] values = null;
  110.         public int getIndex(String qName) {
  111.             if(names == null) {
  112.                 return -1;
  113.             }
  114.             for (int i = 0; i < names.length; i++) {
  115.                 if (names[i].equals(qName)) {
  116.                     return i;
  117.                 }
  118.             }
  119.             return -1;
  120.         }
  121.         public int getIndex(String uri, String localName) {
  122.             if(!"".equals(uri)) {
  123.                 return -1;
  124.             }
  125.             return getIndex(localName);
  126.         }
  127.         public int getLength() {
  128.             return names == null ? 0 : names.length;
  129.         }
  130.         public String getLocalName(int index) {
  131.             if(index < 0 || index >= getLength()) {
  132.                 return null;
  133.             }
  134.             return names[index];
  135.         }
  136.         public String getQName(int index) {
  137.             if(index < 0 || index >= getLength()) {
  138.                 return null;
  139.             }
  140.             return names[index];
  141.         }
  142.         public String getType(int index) {
  143.             if(index < 0 || index >= getLength()) {
  144.                 return null;
  145.             }
  146.             return "CDATA";
  147.         }
  148.         public String getType(String qName) {
  149.             return getIndex(qName) == -1 ? null : "CDATA";
  150.         }
  151.         public String getType(String uri, String localName) {
  152.             return getIndex(uri, localName) == -1 ? null : "CDATA";
  153.         }
  154.         public String getURI(int index) {
  155.             if(index < 0 || index >= getLength()) {
  156.                 return null;
  157.             }
  158.             return "";
  159.         }
  160.         public String getValue(int index) {
  161.             if(index < 0 || index >= getLength()) {
  162.                 return null;
  163.             }
  164.             return values[index];
  165.         }
  166.         public String getValue(String qName) {
  167.             int index = getIndex(qName);
  168.             return index == -1 ? null : values[index];
  169.         }
  170.         public String getValue(String uri, String localName) {
  171.             int index = getIndex(uri, localName);
  172.             return index == -1 ? null : values[index];
  173.         }
  174.     }
  175. }