javauis/lcdui_akn/javalcdui/javasrc/javax/microedition/lcdui/ImageLoader.java
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 16:30:29 +0300
branchRCL_3
changeset 19 04becd199f91
permissions -rw-r--r--
Revision: v2.1.22 Kit: 201017

/*
* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

package javax.microedition.lcdui;

import java.io.InputStream;
import com.nokia.mj.impl.rt.legacy.NativeError;
import com.nokia.mj.impl.rt.legacy.ToolkitObserver;
import com.nokia.mj.impl.rt.support.Finalizer;

class ImageLoader
{
    final Toolkit iToolkit;
    private ToolkitObserver iObserver;
    private int iHandle;
    private AsyncCall iStatus;
    private Finalizer mFinalizer;

    ImageLoader(Toolkit aToolkit)
    {
        iToolkit = aToolkit;
        iStatus  = new AsyncCall();
        //
        // Initialize cleanup: Register this object with the finalizer and with
        // the toolkit.
        //
        iObserver = new ToolkitObserver()
        {
            public void destroyNotify()
            {
                dispose();
            }
        };
        iToolkit.addObserver(iObserver);
        mFinalizer = new Finalizer()
        {
            public void finalizeImpl()
            {
                doFinalize();
            }
        };

        synchronized (iToolkit)
        {
            iHandle = NativeError.check(_create(iToolkit.getEventServerHandle(), iToolkit.getHandle()));
        }
    }

    synchronized boolean append(byte[] aByteArray, int aOffset, int aCount)
    {
        if (iHandle == 0)
            return false;

        synchronized (this)
        {
            NativeError.check(_append(iHandle, aByteArray, aOffset, aCount));
        }
        return true;
    }

    /**
     * Blocking decode, streams encoded data to native decoder.
     */
    void decode()
    {
        synchronized (iStatus)
        {
            synchronized (this)
            {
                synchronized (iToolkit)
                {
                    NativeError.check(_decode(iHandle));
                }
                iStatus.request();
            }
            NativeError.check(iStatus.waitForRequest());
        }
    }

    /**
     * WARNING - converters may be disposed on toolkit shutdown.
     * Handle could become invalid unless toolkit is locked down
     * over duration of use.
     */
    int getHandle()
    {
        return iHandle;
    }

    private void doFinalize()
    {
        if (mFinalizer != null)
        {
            registeredFinalize();
            mFinalizer = null;
        }
    }

    private void registeredFinalize()
    {
        dispose();
    }

    synchronized void dispose()
    {

        if (iStatus.isPending())
        {
            iStatus.complete(-1);   // unblock waiting thread(s)
        }
        if (iObserver != null)
        {
            iToolkit.removeObserver(iObserver); // never throws
            iObserver = null;
        }
        final int handle = iHandle;
        iHandle = 0;
        if (0 != handle)
        {
            _destroy(handle);
        }
    }

    /**
     * upcall.
     */
    private void signal(int aError)
    {
        iStatus.complete(aError);
    }

    private native int  _create(int aEventServer, int aToolkitHandle);
    private native void _destroy(int aHandle);
    private native int  _append(int aHandle, byte[] aArray, int aOffset, int aCount);
    private native int  _decode(int aHandle);
}