FileDocCategorySizeDatePackage
WbxmlSerializer.javaAPI DocAndroid 1.5 API4214Wed May 06 22:42:46 BST 2009com.android.im.imps

WbxmlSerializer.java

/*
 * 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");
        }
    }
}