javauis/m2g_qt/javasrc/com/nokia/microedition/m2g/M2GManager.java
author hgs
Fri, 29 Oct 2010 11:49:32 +0300
changeset 87 1627c337e51e
parent 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.21_1

/*
* Copyright (c) 2005-2009 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 com.nokia.microedition.m2g;

import java.lang.ref.WeakReference;
import java.util.Hashtable;
import java.util.Enumeration;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;


public final class M2GManager implements  Listener
{
    //--------------------------------------------------
    // STATIC VARIABLES
    //--------------------------------------------------

    private static WeakReference sWeakManagerProxy = null;
    static Object sQuard = new Object();

    //--------------------------------------------------
    // VARIABLES
    //--------------------------------------------------
    private Hashtable iLiveObjects = new Hashtable();
    private M2GWeakManager iWeakManager = null;
    private int iSVGProxyHandle = M2GObject.INVALID_NATIVE_HANDLE;

    //--------------------------------------------------
    // METHODS
    //--------------------------------------------------

    /**
     * Constructor
     */
    private M2GManager()
    {
        super();

        // Execute in UI thread
        Platform.executeInUIThread(
            new M2GRunnableQt()
        {
            public void doRun()
            {
                iSVGProxyHandle = _createSvgProxy();
            }
        });
        M2GManager.heuristicGC();
    }

    /**
     * Impelements 'handleEvent' from Listener
     */
    public void handleEvent(Event e)
    {
        if (e.type == SWT.Dispose)
        {
            doCleanup();
        }
    }

    /**
     * Does the cleanuping
     */
    protected void doCleanup()
    {
        finalizeObjects();
        synchronized (sQuard)
        {
            _deleteSvgProxy(iSVGProxyHandle);
            iSVGProxyHandle = M2GObject.INVALID_NATIVE_HANDLE;
            sWeakManagerProxy = null;
            iLiveObjects = null;
        }
    }


    /**
     * Find an element from the handle-to-element map.
     * @param aElementHandle Handle
     * @return SVGElement. Null if not found
     */
    synchronized private void finalizeObjects()
    {
        Enumeration objects = iLiveObjects.elements();
        while (objects.hasMoreElements())
        {
            Object weakObject = ((WeakReference)objects.nextElement()).get();
            if (weakObject != null)
            {
                ((M2GObject)weakObject).registeredFinalize();
            }
        }
        // Clear table
        iLiveObjects.clear();
    }


    /**
     * Gets native SVG proxy handle
     * @return SVG proxy handle
     */
    public int getSVGProxyHandle()
    {
        synchronized (sQuard)
        {
            return iSVGProxyHandle;
        }
    }

    /**
     * Gets native SVG proxy handle
     * @return SVG proxy handle
     */
    void init(M2GWeakManager aWeakManager)
    {
        iWeakManager = aWeakManager;
    }

    /**
     * Register an object
     * @param aObject Object
     */
    synchronized public void register(M2GObject aObject)
    {
        if (aObject == null)
        {
            return;
        }
        iLiveObjects.put(new Integer(aObject.getHandle()), new WeakReference(aObject));
    }

    /**
     * Unregister an object
     * @param aHandle Object's native handle
     */
    synchronized public void unregister(Integer aHandle)
    {
        iLiveObjects.remove(aHandle);
    }

    //--------------------------------------------------
    // STATIC METHODS
    //--------------------------------------------------

    /**
     * Gets instance of singleton manager object
     * @return manager object reference
     */
    static public M2GManager getInstance()
    {
        M2GWeakManager weakManager = null;
        synchronized (sQuard)
        {
            if (sWeakManagerProxy != null)
            {

                weakManager = (M2GWeakManager)sWeakManagerProxy.get();
            }
            // Check if object null
            if (weakManager == null)
            {
                // Create a new object and put it into the static member variable

                weakManager = new M2GWeakManager(new M2GManager());
                sWeakManagerProxy = new WeakReference(weakManager);
            }
            return weakManager.getInstance();
        }
    }

    /**
     * Trigger GC every N objects
     */
    static final void heuristicGC()
    {
        //MemoryUtil.ensureMinFreeRAM();
    }

    //--------------------------------------------------
    // NATIVE METHODS
    //--------------------------------------------------
    private static native int _createSvgEngine(int aSvgProxyHandle);

    private static native int _createSvgProxy();

    private static native void _deleteSvgEngine(int aSvgProxyHandle, int aSvgEngineHandle);

    private static native void _deleteSvgProxy(int aSvgProxyHandle);


}

//--------------------------------------------------
// OTHER CLASSES
//--------------------------------------------------

/*
 * M2GWeakManager takes care of carbage colletion of an M2GManager object
 */
class M2GWeakManager
{
    //--------------------------------------------------
    // VARIABLES
    //--------------------------------------------------
    M2GManager iManager;

    //--------------------------------------------------
    // METHODS
    //--------------------------------------------------

    /**
     * Constructor
     * @param aManager Manager object
     */
    public M2GWeakManager(M2GManager aManager)
    {
        reset(aManager);
    }

    /**
     * Return a reference to the manager
     * @return a reference to the manager
     */
    M2GManager getInstance()
    {
        return iManager;
    }

    /**
     * Reset
     * @param aManager
     */
    void reset(M2GManager aManager)
    {
        iManager = aManager;
        if (iManager != null)
        {
            iManager.init(this);
        }
    }
}