recordstorefile.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 477 行
C
477 行
/* * * * 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. */#include <kni.h>#include <commonKNIMacros.h>#include <ROMStructs.h>#include <midpMalloc.h>#include <midpRMS.h>#include <midpUtilKni.h>#include <midpError.h>/** * @file * * Implementation for RMS Java native methods. */#define getMidpRecordStoreFilePtr(__handle) \ (unhand(struct Java_com_sun_midp_rms_RecordStoreFile, __handle))/** * Free all native resources used by this object. * * @param thisObject The <code>RecordStoreFile</code> Object to finalize. */static voidstorageCleanup(KNIDECLARGS jobject thisObject) { int handle; KNI_StartHandles(1); KNI_DeclareHandle(clazz); KNI_GetObjectClass(thisObject, clazz); handle = getMidpRecordStoreFilePtr(thisObject)->handle; if (handle != -1) { char* pszError; recordStoreClose(&pszError, handle); if (pszError != NULL) { recordStoreFreeError(pszError); } getMidpRecordStoreFilePtr(thisObject)->handle = -1; } KNI_EndHandles();}/** * Get the number of record stores for a MIDlet suite. * * @param suiteId ID of the suite * * @return the number of installed suites */KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_rms_RecordStoreFile_getNumberOfStores) { int numberOfStores = 0; KNI_StartHandles(1); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) { numberOfStores = rmsdb_get_number_of_record_stores(&filenameBase); if (numberOfStores == OUT_OF_MEM_LEN) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } } RELEASE_PCSL_STRING_PARAMETER; KNI_EndHandles(); KNI_ReturnInt((jint)numberOfStores);}/** * Retrieves the list of record stores a MIDlet suites owns. * * @param suiteId ID of the suite * @param specifies an empty array of suite store names to fill, call * getNumberOfSuites to know how big to make the array */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_getRecordStoreList) { int numberOfStrings; int numberOfStores; int i; pcsl_string* pStoreNames = NULL; KNI_StartHandles(3); KNI_DeclareHandle(names); KNI_DeclareHandle(tempStringObj); KNI_GetParameterAsObject(2, names); numberOfStrings = (int)KNI_GetArrayLength(names); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) numberOfStores = rmsdb_get_record_store_list(&filenameBase, /* OUT */ &pStoreNames); if (numberOfStores == OUT_OF_MEM_LEN) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } else { do { if (numberOfStores == 0) { break; } if (numberOfStrings > numberOfStores) { numberOfStrings = numberOfStores; } for (i = 0; i < numberOfStrings; i++) { midp_jstring_from_pcsl_string(KNIPASSARGS &pStoreNames[i], tempStringObj); KNI_SetObjectArrayElement(names, (jint)i, tempStringObj); } } while (0); free_pcsl_string_list(pStoreNames, numberOfStores); } RELEASE_PCSL_STRING_PARAMETER KNI_EndHandles(); KNI_ReturnVoid();}/** * Remove all the Record Stores for a suite. * * @param filenameBase filename base of the suite */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_removeRecordStores0) { KNI_StartHandles(1); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) { if (!rmsdb_remove_record_stores_for_suite(&filenameBase, 0)) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } } RELEASE_PCSL_STRING_PARAMETER; KNI_EndHandles(); KNI_ReturnVoid();}/** * Returns true if the suite has created at least one record store. * * @param filenameBase filename base of the suite * * @return true if the suite has at least one record store */KNIEXPORT KNI_RETURNTYPE_BOOLEANKNIDECL(com_sun_midp_rms_RecordStoreFactory_suiteHasRmsData0) { jboolean exists = KNI_FALSE; int status; KNI_StartHandles(1); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) { status = rmsdb_suite_has_rms_data(&filenameBase); if (status == OUT_OF_MEM_LEN) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } else if (status > 0) { exists = KNI_TRUE; } } RELEASE_PCSL_STRING_PARAMETER; KNI_EndHandles(); KNI_ReturnBoolean(exists);}/** * Approximation of remaining space in storage for a new record store. * * Usage Warning: This may be a slow operation if * the platform has to look at the size of each file * stored in the MIDP memory space and include its size * in the total. * * @param suiteId ID of the MIDlet suite that owns the record store * * @return the approximate space available to create a * record store in bytes. */KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_rms_RecordStoreFile_spaceAvailableNewRecordStore0) { long available = 0; int storageId = KNI_GetParameterAsInt(2); KNI_StartHandles(1); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) { available = rmsdb_get_new_record_store_space_available(storageId); if (available == OUT_OF_MEM_LEN) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } } RELEASE_PCSL_STRING_PARAMETER; KNI_EndHandles(); KNI_ReturnInt((jint)available);}/** * Open a native record store file. * * @param suiteId ID of the MIDlet suite that owns the record store * @param name name of the record store * @param extension extension number to add to the end of the file name * * @return handle to a record store file * * @exception IOException if there is an error opening the file. */KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_rms_RecordStoreFile_openRecordStoreFile) { int extension = KNI_GetParameterAsInt(3); int handle = -1; char* pszError; KNI_StartHandles(2); GET_PARAMETER_AS_PCSL_STRING(1, filenameBase) GET_PARAMETER_AS_PCSL_STRING(2, name) { handle = rmsdb_record_store_open(&pszError, &filenameBase, &name, extension); if (pszError != NULL) { if (handle == -2) { KNI_ThrowNew(midpRecordStoreException, pszError); } else { KNI_ThrowNew(midpIOException, pszError); } recordStoreFreeError(pszError); } else if (handle == -1) { KNI_ThrowNew(midpIOException, "cannot get filename"); } } RELEASE_PCSL_STRING_PARAMETER; RELEASE_PCSL_STRING_PARAMETER KNI_EndHandles(); KNI_ReturnInt((jint)handle);}/** * Find how more space is available for a particular record store. * * @param handle handle of an open record store * @param suiteId ID of the owning suite * * @return the approximate space available to grow the * record store in bytes. */KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_rms_RecordStoreFile_spaceAvailableRecordStore) { long available = 0; int handle = KNI_GetParameterAsInt(1); int storageId = KNI_GetParameterAsInt(3); KNI_StartHandles(1); GET_PARAMETER_AS_PCSL_STRING(2, filenameBase) { /* the implementation may ignore the suite id */ available = rmsdb_get_record_store_space_available(handle, storageId); if (available == OUT_OF_MEM_LEN) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } } RELEASE_PCSL_STRING_PARAMETER; KNI_EndHandles(); KNI_ReturnInt((jint)available);}/** * Sets the position within <code>recordStream</code> to * <code>pos</code>. This will implicitly grow * the underlying stream if <code>pos</code> is made greater * than the current length of the storage stream. * * @param handle handle to a record store file * @param pos position within the file to move the current_pos * pointer to. * * @exception IOException if there is a problem with the seek. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_setPosition) { long absolutePosition = (long)KNI_GetParameterAsInt(2); int handle = KNI_GetParameterAsInt(1); char* pszError; recordStoreSetPosition(&pszError, handle, absolutePosition); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_ReturnVoid();}/** * Write <code>buf</code> to <code>recordStream</code>, starting * at <code>offset</code> and continuing for <code>numBytes</code> * bytes. * * @param handle handle to a record store file * @param buf buffer to read out of. * @param offset starting point write offset, from beginning of buffer. * @param numBytes the number of bytes to write. * * @exception IOException if a write error occurs. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_writeBytes) { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); int handle = KNI_GetParameterAsInt(1); char* pszError; KNI_StartHandles(1); KNI_DeclareHandle(buffer); KNI_GetParameterAsObject(2, buffer); recordStoreWrite(&pszError, handle, (char*)&(JavaByteArray(buffer)[offset]), length); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_EndHandles(); KNI_ReturnVoid();}/** * Commit pending writes. * * @param handle * * @exception IOException if an error occurs while flushing * <code>recordStream</code>. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_commitWrite) { int handle = KNI_GetParameterAsInt(1); char* pszError; recordStoreCommitWrite(&pszError, handle); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_ReturnVoid();}/** * Read up to <code>buf.length</code> into <code>buf</code> * starting at offset <code>offset</code> in <code>recordStream * </code> and continuing for up to <code>numBytes</code> bytes. * * @param handle handle to a record store file * @param buf buffer to read in to. * @param offset starting point read offset, from beginning of buffer. * @param numBytes the number of bytes to read. * * @return the number of bytes read. * * @exception IOException if a read error occurs. */KNIEXPORT KNI_RETURNTYPE_INTKNIDECL(com_sun_midp_rms_RecordStoreFile_readBytes) { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); int handle = KNI_GetParameterAsInt(1); int bytesRead; char* pszError; KNI_StartHandles(1); KNI_DeclareHandle(buffer); KNI_GetParameterAsObject(2, buffer); bytesRead = recordStoreRead(&pszError, handle, (char*)&(JavaByteArray(buffer)[offset]), length); KNI_EndHandles(); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_ReturnInt((jint)bytesRead);}/** * Disconnect from <code>recordStream</code> if it is * non null. May be called more than once without error. * * @param handle * * @exception IOException if an error occurs closing * <code>recordStream</code>. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_closeFile) { int handle = KNI_GetParameterAsInt(1); char* pszError; recordStoreClose(&pszError, handle); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_ReturnVoid();}/** * Set the length of the specified <code>RecordStoreFile</code> * to <code>size</code> bytes. If this file was previously * larger than <code>size</code>, the extra data is lost. * * <code>size</code> must be not greater than the current length of * <code>recordStream</code> * * @param handle handle to a record store file * @param size new size for this file * * @exception IOException if an error occurs, or if * <code>size</code> is less than zero. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_truncateFile) { int size = KNI_GetParameterAsInt(2); int handle = KNI_GetParameterAsInt(1); char* pszError; recordStoreTruncate(&pszError, handle, size); if (pszError != NULL) { KNI_ThrowNew(midpIOException, pszError); recordStoreFreeError(pszError); } KNI_ReturnVoid();}/** * Native finalizer to free all native resources used by the * object. * * @param this The <code>RecordStoreFile</code> Object to be finalized. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(com_sun_midp_rms_RecordStoreFile_finalize) { KNI_StartHandles(1); KNI_DeclareHandle(instance); KNI_GetThisPointer(instance); storageCleanup(KNIPASSARGS instance); KNI_EndHandles(); KNI_ReturnVoid();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?