/* * Copyright (C) 2007 Esmertec AG. * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.im.imps; import java.io.IOException; import java.io.OutputStream; import com.android.im.imps.ImpsConstants.ImpsVersion; /* * NOT thread-safe. Always use this in one thread. */ final class WbxmlSerializer { private OutputStream mOut; private int mNativeHandle; private static int PUBLIC_ID_IMPS_11 = 0x10; private static int PUBLIC_ID_IMPS_12 = 0x11; private static int PUBLIC_ID_IMPS_13 = 0x12; public WbxmlSerializer(ImpsVersion impsVersion) { if (impsVersion == ImpsVersion.IMPS_VERSION_11) { mNativeHandle = nativeCreate(PUBLIC_ID_IMPS_11); } else if (impsVersion == ImpsVersion.IMPS_VERSION_12) { mNativeHandle = nativeCreate(PUBLIC_ID_IMPS_12); } else if (impsVersion == ImpsVersion.IMPS_VERSION_13) { mNativeHandle = nativeCreate(PUBLIC_ID_IMPS_13); } else { throw new IllegalArgumentException("Unsupported IMPS version"); } if (mNativeHandle == 0) { throw new OutOfMemoryError(); } } @Override protected void finalize() { if (mNativeHandle != 0) { nativeRelease(mNativeHandle); } } public void reset() { nativeReset(mNativeHandle); mOut = null; } public void setOutput(OutputStream out) { mOut = out; } // XXX: These should throw ParserException but the dalvik seems to have // problem throwing non-system exceptions from JNI code. Use IAE for now // and file a bug report for this. public void startElement(String name, String[] atts) throws IOException, SerializerException { try { nativeStartElement(mNativeHandle, name, atts); } catch (IllegalArgumentException e) { throw new SerializerException(e); } } public void characters(String chars) throws IOException, SerializerException { try { nativeCharacters(mNativeHandle, chars); } catch (IllegalArgumentException e) { throw new SerializerException(e); } } public void endElement() throws IOException, SerializerException { try { nativeEndElement(mNativeHandle); } catch (IllegalArgumentException e) { throw new SerializerException(e); } } /** * Called by native encoder to send result data. * @param data * @param len * @throws IOException */ void onWbxmlData(byte[] data, int len) throws IOException { if (mOut != null) { mOut.write(data, 0, len); } } native int nativeCreate(int publicId); native void nativeReset(int nativeHandle); native void nativeRelease(int nativeHandle); // FIXME: These should throw ParserException but the dalvik seems to have // problem throwing non-system exceptions from JNI code. Use IAE for now // and file a bug report for this. native void nativeStartElement(int nativeHandle, String name, String[] atts) throws IOException, IllegalArgumentException; native void nativeCharacters(int nativeHandle, String characters) throws IOException, IllegalArgumentException; native void nativeEndElement(int nativeHandle) throws IOException, IllegalArgumentException; static { try { System.loadLibrary("wbxml_jni"); }catch(UnsatisfiedLinkError ule) { System.err.println("WARNING: Could not load library libwbxml_jni.so"); } } }