lfj_cskin.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 495 行

C
495
字号
/* *   * * Copyright  1990-2007 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. *//* * This file contains the calls to use VM's resource sharing  * api. It holds a static shared object reference that can be * retrieved by all isolates. */#include <stdio.h>#include <string.h>#include <jvmconfig.h>#include <kni.h>#include <jvm.h>#include <sni.h>#include <midpError.h>#include <ROMStructs.h>#include <midpMidletSuiteUtils.h>#include <midpStorage.h>#include <midpUtilKni.h>#include <commonKNIMacros.h>#include <kni_globals.h>#include <midpMalloc.h>#include <midp_logging.h>#include <lfj_image_rom.h>#include <lcdlf_export.h>/* IMPL_NOTE : Initialize this constant each time the vm restarts! */#if ENABLE_MULTIPLE_ISOLATES    static int resourcePool = -1;static int skinProperties = -1;#endif/* String encoding constants from SkinResourcesConstants */static unsigned char STRING_ENCODING_USASCII;static unsigned char STRING_ENCODING_UTF8;/* Binary skin file data array pointers *//* * These buffers may contain the following types of values: * - unsigned values for data length and encoding * - US-ASCII characters in the range 0..127 * - UTF-8 octets in the range 0..255 */static unsigned char* gsSkinFileDataStart = NULL;static unsigned char* gsSkinFileDataEnd = NULL;static unsigned char* gsSkinFileDataPos = NULL;/* * Macro to ensure that we aren't reading past * the end of skin data */#define ENSURE_SKIN_DATA_AVAILABILITY(size) \    if (gsSkinFileDataPos + (size) > gsSkinFileDataEnd) { \        KNI_ThrowNew(midpIllegalStateException, \                "Unexpected end of skin data file"); \        break; \    }KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_shareResourcePool) {#if ENABLE_MULTIPLE_ISOLATES        KNI_StartHandles(1);    KNI_DeclareHandle(obj);    KNI_GetParameterAsObject(1, obj);        if (resourcePool == -1) {        /*          * We only ever allow a single resource pool to be stored.          * Any future attempts at storing a new one are ignored         */        resourcePool = SNI_AddStrongReference(obj);    }        KNI_EndHandles();                                                                                                #endif    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_shareSkinData) {#if ENABLE_MULTIPLE_ISOLATES        KNI_StartHandles(1);    KNI_DeclareHandle(obj);    KNI_GetParameterAsObject(1, obj);        if (skinProperties == -1) {        /*          * We only ever allow a single resource pool to be stored.          * Any future attempts at storing a new one are ignored.         */        skinProperties = SNI_AddStrongReference(obj);    }        KNI_EndHandles();                                                                                                #endif    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_OBJECTKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_getSharedResourcePool) {    #if ENABLE_MULTIPLE_ISOLATES    KNI_StartHandles(1);    KNI_DeclareHandle(obj);    if (resourcePool >= 0) {        SNI_GetReference(resourcePool, obj);    }    KNI_EndHandlesAndReturnObject(obj);#else    KNI_StartHandles(1);    KNI_DeclareHandle(tempHandle);    KNI_EndHandlesAndReturnObject(tempHandle);#endif}KNIEXPORT KNI_RETURNTYPE_OBJECTKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_getSharedSkinData) {    #if ENABLE_MULTIPLE_ISOLATES    KNI_StartHandles(1);    KNI_DeclareHandle(obj);    if (skinProperties >= 0) {        SNI_GetReference(skinProperties, obj);    }    KNI_EndHandlesAndReturnObject(obj);#else    KNI_StartHandles(1);    KNI_DeclareHandle(tempHandle);    KNI_EndHandlesAndReturnObject(tempHandle);#endif}                                                                                                        KNIEXPORT KNI_RETURNTYPE_BOOLEANKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_ifLoadAllResources0) {    #if ENABLE_MULTIPLE_ISOLATES    /*      * There is no need to load all images for non AMS      * isolates, they are to be loaded later on demand     */    if (JVM_CurrentIsolateID() == midpGetAmsIsolateId()) {        KNI_ReturnBoolean(KNI_TRUE);    } else {        KNI_ReturnBoolean(KNI_FALSE);    }#else    KNI_ReturnBoolean(KNI_FALSE);#endif}KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinResources_finalize) {#if ENABLE_MULTIPLE_ISOLATES    if ((JVM_CurrentIsolateID() == midpGetAmsIsolateId()) &&        (resourcePool >= 0)) {        SNI_DeleteReference(resourcePool);        resourcePool = -1;    }#endif    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_finalize) {#if ENABLE_MULTIPLE_ISOLATES    if ((JVM_CurrentIsolateID() == midpGetAmsIsolateId()) &&        (skinProperties >= 0)) {        SNI_DeleteReference(skinProperties);        skinProperties = -1;    }#endif    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_getRomizedImageDataArrayPtr) {    jint imageId = KNI_GetParameterAsInt(1);        unsigned char* imageData;    lfj_load_image_from_rom(imageId, &imageData);    KNI_ReturnInt((int)(void*)imageData);}KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_chameleon_skins_resources_SkinResourcesImpl_getRomizedImageDataArrayLength) {    jint imageId = KNI_GetParameterAsInt(1);        unsigned char* imageData;    int len = lfj_load_image_from_rom(imageId, &imageData);    KNI_ReturnInt(len);}KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_beginReadingSkinFile) {    const unsigned char* skin_description = lfj_get_skin_description();    if (skin_description != NULL) {        gsSkinFileDataStart = gsSkinFileDataPos =            (unsigned char*)skin_description;        gsSkinFileDataEnd = gsSkinFileDataStart +            lfj_get_skin_description_size();    } else {        char* errorStr = NULL;        int fileHandle = -1;        int fileSize;        int bytesRead;        jfieldID fid;        KNI_StartHandles(2);        KNI_DeclareHandle(classHandle);        KNI_GetClassPointer(classHandle);        fid = KNI_GetStaticFieldID(classHandle, "STRING_ENCODING_USASCII", "B");        STRING_ENCODING_USASCII = (unsigned char)            KNI_GetStaticByteField(classHandle, fid);        fid = KNI_GetStaticFieldID(classHandle, "STRING_ENCODING_UTF8", "B");        STRING_ENCODING_UTF8 = (unsigned char)            KNI_GetStaticByteField(classHandle, fid);        GET_PARAMETER_AS_PCSL_STRING(1, fileName);        do {            /*             * Open skin file             */            fileHandle = storage_open(&errorStr, &fileName, OPEN_READ);            if (errorStr != NULL) {                KNI_ThrowNew(midpIOException, errorStr);                storageFreeError(errorStr);                break;            }            /*             * Obtain file size             */            fileSize = storageSizeOf(&errorStr, fileHandle);            if (errorStr != NULL) {                KNI_ThrowNew(midpIOException, errorStr);                storageFreeError(errorStr);                break;            }            /*             * Read whole file into heap memory             */            gsSkinFileDataStart = (unsigned char*)midpMalloc(fileSize);            if (gsSkinFileDataStart == NULL) {                KNI_ThrowNew(midpOutOfMemoryError, NULL);                break;            }            bytesRead = storageRead(&errorStr, fileHandle,                    (char*)gsSkinFileDataStart, fileSize);            if (errorStr != NULL) {                KNI_ThrowNew(midpIOException, errorStr);                storageFreeError(errorStr);                midpFree(gsSkinFileDataStart);                gsSkinFileDataStart = NULL;                break;            }            if (bytesRead != fileSize) {                KNI_ThrowNew(midpIOException, "Failed to read whole file");                midpFree(gsSkinFileDataStart);                gsSkinFileDataStart = NULL;                break;            }            gsSkinFileDataPos = gsSkinFileDataStart;            gsSkinFileDataEnd = gsSkinFileDataStart + fileSize;        } while (0);        RELEASE_PCSL_STRING_PARAMETER;        /*         * Close skin file         */        if (fileHandle != -1) {            storageClose(&errorStr, fileHandle);        }        KNI_EndHandles();    }    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_finishReadingSkinFile) {    if (lfj_get_skin_description_size() < 0) {        /* skin data file was not romized, so free memory allocated for it */        midpFree(gsSkinFileDataStart);    }    gsSkinFileDataStart = NULL;    gsSkinFileDataPos = NULL;    gsSkinFileDataEnd = NULL;    KNI_ReturnVoid();}KNIEXPORT KNI_RETURNTYPE_OBJECTKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_readByteArray) {    int arrayLength = KNI_GetParameterAsInt(1);    KNI_StartHandles(1);    KNI_DeclareHandle(returnArray);    do {        ENSURE_SKIN_DATA_AVAILABILITY(arrayLength);        SNI_NewArray(SNI_BYTE_ARRAY, arrayLength, returnArray);        if (KNI_IsNullHandle(returnArray)) {            KNI_ThrowNew(midpOutOfMemoryError, NULL);            break;        }        KNI_SetRawArrayRegion(returnArray, 0, arrayLength, (jbyte*)gsSkinFileDataPos);        gsSkinFileDataPos += arrayLength;    } while (0);    KNI_EndHandlesAndReturnObject(returnArray);}KNIEXPORT KNI_RETURNTYPE_OBJECTKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_readIntArray) {    int arrayLength;    int totalBytes;    KNI_StartHandles(1);    KNI_DeclareHandle(returnArray);    do {        /*         * First, read array length         */        ENSURE_SKIN_DATA_AVAILABILITY(sizeof(jint));        memcpy((void*)&arrayLength, (void*)gsSkinFileDataPos, sizeof(jint));        gsSkinFileDataPos += sizeof(jint);        /*         * Then create array         */        totalBytes = arrayLength * sizeof(jint);        ENSURE_SKIN_DATA_AVAILABILITY(totalBytes);        SNI_NewArray(SNI_INT_ARRAY, arrayLength, returnArray);        if (KNI_IsNullHandle(returnArray)) {            KNI_ThrowNew(midpOutOfMemoryError, NULL);            break;        }        /*         * And finally read data into it         */        KNI_SetRawArrayRegion(returnArray, 0, totalBytes, (jbyte*)gsSkinFileDataPos);        gsSkinFileDataPos += totalBytes;    } while (0);    KNI_EndHandlesAndReturnObject(returnArray);}KNIEXPORT KNI_RETURNTYPE_OBJECTKNIDECL(com_sun_midp_chameleon_skins_resources_LoadedSkinData_readStringArray) {    int arrayLength;    int i;    KNI_StartHandles(2);    KNI_DeclareHandle(returnArray);    KNI_DeclareHandle(stringHandle);    do {        /*         * First, read array length         */        ENSURE_SKIN_DATA_AVAILABILITY(sizeof(jint));        memcpy((void*)&arrayLength, (void*)gsSkinFileDataPos, sizeof(jint));        gsSkinFileDataPos += sizeof(jint);        /*         * Then create array         */        SNI_NewArray(SNI_STRING_ARRAY, arrayLength, returnArray);        if (KNI_IsNullHandle(returnArray)) {            KNI_ThrowNew(midpOutOfMemoryError, NULL);            break;        }        /*         * And finally populate it with strings         */        for (i = 0; i < arrayLength; ++i) {            unsigned char dataLength;            unsigned char encoding;            /* read data length */            ENSURE_SKIN_DATA_AVAILABILITY(sizeof(char));            dataLength = *((unsigned char*)gsSkinFileDataPos);            gsSkinFileDataPos += 1;            /* read encoding */            ENSURE_SKIN_DATA_AVAILABILITY(sizeof(char));            encoding = *((unsigned char*)gsSkinFileDataPos);            gsSkinFileDataPos += 1;            ENSURE_SKIN_DATA_AVAILABILITY(dataLength * sizeof(char));            if (encoding == STRING_ENCODING_USASCII) {                    int j;                /*                  * In case of USASCII encoding, each byte of                  * string data corresponds to one string char                 */                int stringLength = dataLength;                /* use gKNIBuffer for storing string chars */                jchar* stringChars = (jchar*)gKNIBuffer;                                /*                  * Safety measure to prevent gKNIBuffer overflow                  * (which should never happens unless something is broken)                  */                if (stringLength > (int)(KNI_BUFFER_SIZE/sizeof(jchar))) {                    stringLength = (int)(KNI_BUFFER_SIZE/sizeof(jchar));                    REPORT_WARN(LC_HIGHUI,                             "gKNIBuffer is too small for skin string");                }                /* fill string chars array */                for (j = 0; j < stringLength; ++j) {                    stringChars[j] = gsSkinFileDataPos[j];                }                /* and create string from it */                KNI_NewString(stringChars, stringLength, stringHandle);            } else if (encoding == STRING_ENCODING_UTF8) {                KNI_NewStringUTF((char*)gsSkinFileDataPos, stringHandle);            } else {                KNI_ThrowNew(midpIllegalStateException,                         "Illegal skin string encoding");                break;            }                        KNI_SetObjectArrayElement(returnArray, i, stringHandle);            gsSkinFileDataPos += dataLength;        }    } while (0);    KNI_EndHandlesAndReturnObject(returnArray);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?