/*
 * Copyright  1990-2006 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation. 
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt). 
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA 
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions. 
 */
package com.sun.mmedia;

import com.sun.midp.security.Permissions;
import com.sun.midp.midlet.Scheduler;
import com.sun.midp.midlet.MIDletSuite;

/**
 * A Wrapper class for platform/product specific permission management.
 * This file contains CLDC/MIDP speecific version of the class.
 */
public final class PermissionAccessor {
    
    public static final int PERMISSION_SYSTEM = 0;
    
    public static final int PERMISSION_HTTP_READ = 1;
    public static final int PERMISSION_HTTP_WRITE = 2;
    public static final int PERMISSION_FILE_READ = 3;
    public static final int PERMISSION_FILE_WRITE = 4;
    public static final int PERMISSION_SOCKET_READ = 5;
    public static final int PERMISSION_SOCKET_WRITE = 6;
    
    public static final int PERMISSION_IMAGE_CAPTURE = 7;
    public static final int PERMISSION_VIDEO_CAPTURE = 8;
    public static final int PERMISSION_AUDIO_CAPTURE = 9;
    
    public static final int PERMISSION_VIDEO_RECORDING = 10;
    public static final int PERMISSION_AUDIO_RECORDING = 11;    
       
    public static final int PERMISSION_VIDEO_SNAPSHOT = 12;
    
    public static final int PERMISSION_VIDEO_CAMERA_SHUTTER_FEEDBACK = 13;    
    public static final int PERMISSION_RADIO_TUNER_SET_PRESET = 14;
    
    private static final int mapPermissions [] = {
        /* PERMISSION_SYSTEM                        */ Permissions.MIDP,
                
        /* PERMISSION_HTTP_READ                     */ Permissions.HTTP,
        /* PERMISSION_HTTP_WRITE                    */ Permissions.HTTP,
        /* PERMISSION_FILE_READ                     */ Permissions.FILE_CONNECTION_READ,
        /* PERMISSION_FILE_WRITE                    */ Permissions.FILE_CONNECTION_WRITE,
        /* PERMISSION_SOCKET_READ                   */ Permissions.TCP,
        /* PERMISSION_SOCKET_WRITE                  */ Permissions.TCP,
                
        /* PERMISSION_IMAGE_CAPTURE                 */ Permissions.MM_IMAGE_CAPTURING,
        /* PERMISSION_VIDEO_CAPTURE                 */ Permissions.MM_RECORD,
        /* PERMISSION_AUDIO_CAPTURE                 */ Permissions.MM_RECORD,
                
        /* PERMISSION_VIDEO_RECORDING               */ Permissions.MM_RECORD,
        /* PERMISSION_AUDIO_RECORDING               */ Permissions.MM_RECORD,
                
        /* PERMISSION_VIDEO_SNAPSHOT                */ Permissions.MM_IMAGE_CAPTURING,
                
        //ATTENTION: THE FOLLOWING AMMS PERMISSIONS ARE NOT DEFINED YET
        /* PERMISSION_VIDEO_CAMERA_SHUTTER_FEEDBACK */ //Permissions.AMMS_CAMERA_SHUTTERFEEDBACK,
        /* PERMISSION_RADIO_TUNER_SET_PRESET        */ //Permissions.AMMS_TUNER_SETPRESET
    };
    
    /**
     * Method indended to be called by Players & Controls to check
     * if user application has enough permissions to perform
     * a secured operation ...
     *
     * @param thePermission - one of PERMISSION_* constants that 
     *        define permissions in an product-independent form.
     */
    public static void checkPermissions(int thePermission) throws SecurityException {
        try {
            /* 
             * Map between PermissionAccessor.* permission constants
             * and Permissions.* ...
             * Any incorrect permission constant will result in 
             * ArrayIndexOutOfBoundsException -> 
             * a SecurityException will be thrown !
             */
            int permission = mapPermissions[thePermission];
        
            MIDletSuite midletSuite = Scheduler.getScheduler().getMIDletSuite();
            midletSuite.checkIfPermissionAllowed( permission );
        } catch (SecurityException se) {
            ///*DEBUG:*/ se.printStackTrace();
            throw se;
        } catch (Exception e) {
            ///*DEBUG:*/ e.printStackTrace();
            throw new SecurityException(
                "Failed to check user permission");
        }
    }
    
    private static final String locatorTypes[] = {
        "capture://audio",
        "capture://video",
        "capture://radio",
        "capture://",
        "device://",
        "file://",
        "http://"
    };
    
    // inidicates that corresponding locator type needs no special permissions.
    private static final int NEED_NO_PERMISSIONS = 0;
    private static final int FAILED_PERMISSIONS = -1;
            
    private static final int mapLocatorPermissions[] = {
        /* "capture://audio" */ NEED_NO_PERMISSIONS,
        /* "capture://video" */ NEED_NO_PERMISSIONS,
        /* "capture://radio" */ NEED_NO_PERMISSIONS,
        /* "capture://"      */ NEED_NO_PERMISSIONS,
        /* "device://"       */ NEED_NO_PERMISSIONS,
        /* "file://"         */ Permissions.FILE_CONNECTION_READ,
        /* "http://"         */ Permissions.HTTP
    };
    
    /**
     * Method indended to be called by Manager.createDataSource(locator)
     * and checks if user application has enough permissions to use given type
     * of locators to play media contents.
     *
     * @param locator - the URL to be used as media source for player
     */
    public static void checkLocatorPermissions(String locator) throws SecurityException {
        int permission = FAILED_PERMISSIONS;
        try {
            /* 
             * Find Locator type, and map this type to permission.
             * Any incorrect locator will result in 
             * ArrayIndexOutOfBoundsException or NullPointerException -> 
             * a SecurityException will be thrown !
             */
            String locStr = locator.toLowerCase();
            for (int i = 0; i < locatorTypes.length; ++i) {
                if (locStr.startsWith(locatorTypes[i])) {
                    permission = mapLocatorPermissions[i];
                    if (permission == NEED_NO_PERMISSIONS)
                        return; 
                    break;
                }
            }
            
            MIDletSuite midletSuite = Scheduler.getScheduler().getMIDletSuite();
            midletSuite.checkIfPermissionAllowed( permission );
        } catch (SecurityException se) {
            ///*DEBUG:*/ se.printStackTrace();
            throw se;
        } catch (Exception e) {
            ///*DEBUG:*/ e.printStackTrace();
            throw new SecurityException(
                "Failed to check locator permission");
        }
    }

    /**
     * Method indended to be called by Manager.createPlayer(DataSource)
     * and checks if user application has enough permissions to playback 
     * media of a given content-type using given type
     * of locators.
     *
     * @param locator - the URL to be used as media source for player, 
     *        can be null if DataSOurce has been created not from locator
     * @param contentType - content-type boolean of the media
     */
    public static void checkContentTypePermissions(
            String locator, String contentType) throws SecurityException {
        /*
         * THIS IS A STUB
         */
    }
}
