midpjar.c

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

C
341
字号
/* *    * * 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.  */#include <stdio.h>#include <string.h>#include <jar.h>#include <midpMalloc.h>#include <midpStorage.h>#include <midpJar.h>#include <pcsl_string.h>typedef struct _MidpJarInfo {    FileObj fileObj;    HeapManObj heapManObj;    int status;    JarInfo jarInfo;} MidpJarInfo;static longsizeOfFile(void* state) {    long size;    char* pszError;    size = storageSizeOf(&pszError,(int)state);    storageFreeError(pszError);    return size;}static longreadChars(void* state, unsigned char* buffer, long n) {    long size;    char* pszError;     size = storageRead(&pszError, (int)state, (char*)buffer, n);    storageFreeError(pszError);    return size;}static intseekChars(void* state, long offset, int whence) {    long absPos;    char* pszError;    switch (whence) {    case SEEK_SET:        absPos = offset;        storagePosition(&pszError, (int)state, absPos);        break;    case SEEK_END:        absPos = sizeOfFile(state) + offset;        storagePosition(&pszError, (int)state, absPos);        break;    case SEEK_CUR:        absPos = storageRelativePosition(&pszError, (int)state, offset);        break;    default:        return -1;    }    storageFreeError(pszError);    return absPos;}static intreadChar(void* state) {    long size;    unsigned char temp;    size = readChars(state, &temp, 1);    if (size < 1) {        return size;    }    return temp;}static void*allocFunction(void* state, int n) {    (void)state; /* No-op */    /* alloc function just returns the address. */    return midpMalloc(n);}static voidfreeFunction(void* state, void* handle) {    (void)state; /* No-op */    /* alloc function just returns the address. */    midpFree(handle);}static void*addrFromHandleFunction(void* state, void* handle) {    (void)state; /* No-op */    /* This is not a heap that compacts memory, so just return the address. */    return handle;}void*midpOpenJar(int* pError, const pcsl_string * name) {    MidpJarInfo* pJarInfo;    char* pszError;    *pError = 0;    pJarInfo = (MidpJarInfo*)midpMalloc(sizeof (MidpJarInfo));    if (pJarInfo == NULL) {        *pError = MIDP_JAR_OUT_OF_MEM_ERROR;        return NULL;    }    memset(pJarInfo, 0, sizeof (MidpJarInfo));    pJarInfo->fileObj.state = (void*)storage_open(&pszError, name, OPEN_READ);    if (pszError != NULL) {        midpFree(pJarInfo);        *pError = MIDP_JAR_IO_ERROR;        return NULL;    }    pJarInfo->fileObj.size = sizeOfFile;    pJarInfo->fileObj.read = readChars;    pJarInfo->fileObj.seek = seekChars;    pJarInfo->fileObj.readChar = readChar;    pJarInfo->heapManObj.alloc = allocFunction;    pJarInfo->heapManObj.free = freeFunction;    pJarInfo->heapManObj.addrFromHandle = addrFromHandleFunction;    pJarInfo->jarInfo = getJarInfo(&pJarInfo->fileObj);    if (pJarInfo->jarInfo.status != 0) {        midpFree(pJarInfo);        *pError = MIDP_JAR_CORRUPT_ERROR;        return NULL;    }    return pJarInfo;}voidmidpCloseJar(void* handle) {    MidpJarInfo* pJarInfo = (MidpJarInfo*)handle;    char* pszError;    if (handle == NULL) {        return;    }    storageClose(&pszError, (int)(pJarInfo->fileObj.state));    storageFreeError(pszError);    midpFree(pJarInfo);}/* If the jar size is less than zero it is an error code. */longmidpGetJarSize(void* handle) {    MidpJarInfo* pJarInfo = (MidpJarInfo*)handle;    long size;    size = sizeOfFile(pJarInfo->fileObj.state);    if (size < 0) {        return MIDP_JAR_IO_ERROR;    }    return size;}/* Returns the entry size or less than zero if error. *  If the entry does not exist, size is 0 and *ppEntry is NULL */longmidpGetJarEntry(void* handle, const pcsl_string * name,                unsigned char** ppEntry) {    MidpJarInfo* pJarInfo = (MidpJarInfo*)handle;    JarEntryInfo entryInfo;    char*  entryData = NULL;    int status;    unsigned char* pName;    int nameLen;    unsigned char* pCompBuffer;    *ppEntry = NULL;    /* Jar entry names are UTF-8 */    pName = (unsigned char *)pcsl_string_get_utf8_data(name);    if (pName == NULL) {        return MIDP_JAR_OUT_OF_MEM_ERROR;    }    nameLen = pcsl_string_utf8_length(name);    pCompBuffer = midpMalloc(nameLen);    if (pCompBuffer == NULL) {        pcsl_string_release_utf8_data((jbyte*)pName, name);        return MIDP_JAR_OUT_OF_MEM_ERROR;    }        entryInfo = findJarEntryInfo(&pJarInfo->fileObj, &pJarInfo->jarInfo,                pName, nameLen, pCompBuffer);    pcsl_string_release_utf8_data((jbyte*)pName, name);    midpFree(pCompBuffer);    if (entryInfo.status == JAR_ENTRY_NOT_FOUND) {        return 0;    }        if (entryInfo.status != 0) {        return MIDP_JAR_CORRUPT_ERROR;    }    entryData = midpMalloc((size_t)entryInfo.decompLen);    if (entryData == NULL) {        return MIDP_JAR_OUT_OF_MEM_ERROR;    }    status = inflateJarEntry(&pJarInfo->fileObj, &pJarInfo->heapManObj,                             &entryInfo, (unsigned char*)entryData, 0);    if (status != 0) {        midpFree(entryData);        return MIDP_JAR_CORRUPT_ERROR;    }    *ppEntry = (unsigned char*)entryData;    return entryInfo.decompLen;}intmidpJarEntryExists(void* handle, const pcsl_string * name) {    MidpJarInfo* pJarInfo = (MidpJarInfo*)handle;    JarEntryInfo entryInfo;    unsigned char* pName;    int nameLen;    unsigned char* pCompBuffer;    /* Jar entry names are UTF-8 */    pName = (unsigned char *)pcsl_string_get_utf8_data(name);    if (NULL == pName) {        return MIDP_JAR_OUT_OF_MEM_ERROR;    }    nameLen = pcsl_string_utf8_length(name);    pCompBuffer = midpMalloc(nameLen);    if (NULL == pCompBuffer) {        pcsl_string_release_utf8_data((jbyte*)pName, name);        return MIDP_JAR_OUT_OF_MEM_ERROR;    }        entryInfo = findJarEntryInfo(&pJarInfo->fileObj, &pJarInfo->jarInfo,                pName, nameLen, pCompBuffer);    pcsl_string_release_utf8_data((jbyte*)pName, name);    midpFree(pCompBuffer);    if (JAR_ENTRY_NOT_FOUND == entryInfo.status) {        return 0;    }    if (entryInfo.status != 0) {        return MIDP_JAR_CORRUPT_ERROR;    }    return 1;}int midpIterateJarEntries(void *handle, filterFuncT *filter, actionFuncT *action) {    MidpJarInfo *pJarInfo = (MidpJarInfo*)handle;    JarEntryInfo entryInfo;    pcsl_string entryName;    unsigned char *nameBuf;    int status = 1;    pcsl_string_status res;    entryInfo = getFirstJarEntryInfo(&pJarInfo->fileObj, &pJarInfo->jarInfo);    while (entryInfo.status == 0) {                nameBuf =  (unsigned char*) midpMalloc(entryInfo.nameLen);        if (nameBuf == NULL) {            status = MIDP_JAR_OUT_OF_MEM_ERROR;            break;        }                entryInfo.status = getJarEntryName(&pJarInfo->fileObj, &entryInfo, nameBuf);        if (entryInfo.status != 0) {            status = MIDP_JAR_CORRUPT_ERROR;            midpFree(nameBuf);            break;        }        res = pcsl_string_convert_from_utf8((jbyte*)nameBuf, entryInfo.nameLen,                                            &entryName);        midpFree(nameBuf);        if (PCSL_STRING_OK != res) {            status = MIDP_JAR_OUT_OF_MEM_ERROR;            break;        }               if ((*filter)(&entryName)) {            /* name match: call action */               if (!(*action)(&entryName)) {                status = 0;                pcsl_string_free(&entryName);                break;            }        }                pcsl_string_free(&entryName);                entryInfo = getNextJarEntryInfo(&pJarInfo->fileObj, &pJarInfo->jarInfo,                                         &entryInfo);            }           return status;}

⌨️ 快捷键说明

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