📄 jam_native_handler.c
字号:
goto errHandle;
} else if (result != FS_NO_ERROR)
{
KNI_ThrowNew("java/lang/RuntimeException", "Move error");
goto errHandle;
}
}
if (work_dir_path != work_sys_dir_path) jam_listmem_free(work_dir_path);
/* will be freed at the end of installation in jam_install_midlet_suite of jam_call_back_handler.c */
work_dir_path = new_path;
}
errHandle:
KNI_EndHandles();
KNI_ReturnInt(return_Value);
}
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_sun_midp_midletsuite_Installer_setAndMoveInstallPathByStorageName(){
SHORTARRAY array;
kal_wchar* buffer;
kal_int32 len;
kal_int32 return_Value = 0;
kal_char * tempPath = NULL;
KNI_StartHandles(1);
KNI_DeclareHandle(storageName);
KNI_GetParameterAsObject(1, storageName);
array = (SHORTARRAY)(*storageName);
len = array->length;
if(Java_mode != JAVA_NORMAL_MODE){
goto errHandle;
}
tempPath = work_dir_path;
buffer = (kal_wchar*)midpMalloc((len + 1) << 1);
if(buffer == NULL){
KNI_ThrowNew("java/lang/OutOfMemoryError", "Runtime memory not enough!");
}else{
memcpy(buffer, array->sdata, (len) << 1);
buffer[len] = '\0';
trans_ucs2_to_utf8((kal_char*)buffer, buffer);
work_dir_path = get_dir_path_from_midsid(getStorageNumberFromName((kal_char*)buffer));
if(work_dir_path == NULL){
work_dir_path = work_sys_dir_path;
}
if(strcmp(work_dir_path, tempPath) != 0){
kal_int32 len = strlen(work_dir_path) + strlen(jar_temp_file_name) + 2;
kal_wchar * source_path;
kal_wchar * dest_path;
kal_int32 result;
source_path = (kal_wchar*)jam_listmem_malloc(len << 1);
if(source_path == NULL){
KNI_ThrowNew("java/lang/RuntimeException", "Out of memory");
goto errHandle;
}
dest_path = (kal_wchar*)jam_listmem_malloc(len << 1);
if(source_path == NULL){
KNI_ThrowNew("java/lang/RuntimeException", "Out of memory");
jam_listmem_free(source_path);
goto errHandle;
}
kal_wsprintf(source_path, "%s\\%s", tempPath, jar_temp_file_name);
kal_wsprintf(dest_path, "%s", work_dir_path);
if(check_and_create_hidden_folder(dest_path) != FS_NO_ERROR){
return_Value = -1;
jam_listmem_free(source_path);
jam_listmem_free(dest_path);
goto errHandle;
}
kal_wsprintf(dest_path, "%s\\%s", work_dir_path, jar_temp_file_name);
result = FS_Move(source_path, dest_path, FS_MOVE_KILL | FS_MOVE_OVERWRITE, NULL, NULL, 0);
jam_listmem_free(source_path);
jam_listmem_free(dest_path);
if(result ==FS_DISK_FULL){
return_Value = -1;
goto errHandle;
}else if(result != FS_NO_ERROR){
KNI_ThrowNew("java/lang/RuntimeException", "Move error");
goto errHandle;
}
}
midpFree(buffer);
}
errHandle:
if(tempPath != j2me_sys_dir_path)
jam_listmem_free(tempPath);
KNI_EndHandles();
KNI_ReturnInt(return_Value);
}
KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_sun_midp_io_j2me_storage_File_storageExists___3B_3B()
{
char* pszAsciiFilename;
char* pszStorageName;
int nameLen;
int storageLen;
int ret = -1;
KNI_StartHandles(2);
KNI_DeclareHandle(filename);
KNI_DeclareHandle(storagename);
KNI_GetParameterAsObject(1, filename);
nameLen = KNI_GetArrayLength(filename);
KNI_GetParameterAsObject(2, storagename);
storageLen = KNI_GetArrayLength(storagename);
pszAsciiFilename = (char*)midpMalloc(nameLen + 1);
if (pszAsciiFilename == NULL)
{
KNI_ThrowNew("java/lang/OutOfMemoryError", "");
} else
{
KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszAsciiFilename);
pszAsciiFilename[nameLen] = '\0';
}
pszStorageName = (char*)midpMalloc(storageLen + 1);
if (pszStorageName == NULL)
{
KNI_ThrowNew("java/lang/OutOfMemoryError", "");
} else if (pszAsciiFilename != NULL)
{
kal_char* tempPath = NULL;
kal_char orgDrive = 0;
kal_int32 storage_id = 0;
KNI_GetRawArrayRegion(storagename, 0, storageLen, (jbyte*)pszStorageName);
pszStorageName[storageLen] = '\0';
storage_id = getStorageNumberFromName(pszStorageName);
if (storage_id >= 0)
{
tempPath= get_dir_path_from_midsid(storage_id);
if (tempPath != NULL)
{
orgDrive = work_dir_path[0];
work_dir_path[0] = tempPath[0];
}
}
ret = storageFileExists(pszAsciiFilename);
if (storage_id >= 0)
{
if (tempPath != NULL)
{
work_dir_path[0] = orgDrive;
jam_listmem_free(tempPath);
}
}
midpFree(pszStorageName);
}
if (pszAsciiFilename != NULL)
{
midpFree(pszAsciiFilename);
}
KNI_EndHandles();
KNI_ReturnBoolean((jboolean)ret);
}
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_sun_midp_io_j2me_storage_RandomAccessStream_open___3B_3BI()
{
int ioMode = KNI_GetParameterAsInt(2);
char* pszAsciiFilename;
int handle = -1;
char* pszError;
int nameLen;
char* pszStorageName;
int storageLen;
KNI_StartHandles(3);
KNI_DeclareHandle(thisObject);
KNI_DeclareHandle(filename);
KNI_DeclareHandle(storagename);
KNI_GetParameterAsObject(2, storagename);
storageLen = KNI_GetArrayLength(storagename);
KNI_GetThisPointer(thisObject);
KNI_GetParameterAsObject(1, filename);
nameLen = KNI_GetArrayLength(filename);
pszAsciiFilename = (char*)midpMalloc(nameLen+1);
if (pszAsciiFilename == NULL)
{
KNI_ThrowNew("java/lang/OutOfMemoryError", "RAS Open");
} else
{
pszStorageName = (char*)midpMalloc(storageLen + 1);
if (pszStorageName == NULL)
{
midpFree(pszAsciiFilename);
KNI_ThrowNew("java/lang/OutOfMemoryError", "");
} else
{
kal_char* tempPath = NULL;
kal_char orgDrive = 0;
kal_int32 storage_id = 0;
KNI_GetRawArrayRegion(filename, 0, nameLen, (jbyte*)pszAsciiFilename);
pszAsciiFilename[nameLen] = '\0';
KNI_GetRawArrayRegion(storagename, 0, storageLen, (jbyte*)pszStorageName);
pszStorageName[storageLen] = '\0';
storage_id = getStorageNumberFromName(pszStorageName);
if (storage_id >= 0)
{
tempPath= get_dir_path_from_midsid(storage_id);
if (tempPath != NULL)
{
orgDrive = work_dir_path[0];
work_dir_path[0] = tempPath[0];
}
}
handle = storageOpen(&pszError, pszAsciiFilename, ioMode);
if (storage_id >= 0)
{
if (tempPath != NULL)
{
work_dir_path[0] = orgDrive;
jam_listmem_free(tempPath);
}
}
midpFree(pszAsciiFilename);
midpFree(pszStorageName);
if (pszError != NULL)
{
KNI_ThrowNew("java/io/IOException", pszError);
storageFreeError(pszError);
} else
{
KNI_registerCleanup(thisObject, storageCleanup);
}
}
}
KNI_EndHandles();
KNI_ReturnInt(handle);
}
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_sun_midp_io_j2me_storage_File_availableStorage___3B()
{
char* pszStorageName;
kal_int32 returnValue = 0;
int storageLen;
KNI_StartHandles(1);
KNI_DeclareHandle(storagename);
KNI_GetParameterAsObject(1, storagename);
storageLen = KNI_GetArrayLength(storagename);
pszStorageName = (char*)midpMalloc(storageLen + 1);
if (pszStorageName == NULL)
{
KNI_ThrowNew("java/lang/OutOfMemoryError", "");
} else
{
kal_char* tempPath = NULL;
kal_char orgDrive = 0;
kal_int32 storage_id = 0;
KNI_GetRawArrayRegion(storagename, 0, storageLen, (jbyte*)pszStorageName);
pszStorageName[storageLen] = '\0';
storage_id = getStorageNumberFromName(pszStorageName);
if (storage_id >= 0)
{
tempPath= get_dir_path_from_midsid(storage_id);
if (tempPath != NULL)
{
orgDrive = work_sys_dir_path[0];
work_sys_dir_path[0] = tempPath[0];
}
}
returnValue = storageGetFreeSpace();
if (storage_id >= 0)
{
if (tempPath != NULL)
{
work_sys_dir_path[0] = orgDrive;
jam_listmem_free(tempPath);
}
}
midpFree(pszStorageName);
}
KNI_EndHandles();
KNI_ReturnInt((jint)returnValue);
}
KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_sun_midp_security_SecurityToken_checkInPause(void)
{
KNI_ReturnBoolean(saved_vm_pause);
}
KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_sun_midp_publickeystore_PublicKeyStore_startGetCA(void)
{
KNI_ReturnBoolean(get_ca_from_wap());
}
KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_sun_midp_publickeystore_PublicKeyStore_CAReady(void)
{
if (install_update_status.is_local_install ||
install_update_status.is_normal_install ||
install_update_status.is_update)
{
clean_event(); /* use this to receive CA message from WAP */
}
KNI_ReturnBoolean(ca_list_ready());
}
static jam_ca_struct* saved_ca = NULL;
KNIEXPORT KNI_RETURNTYPE_BOOLEAN
Java_com_sun_midp_publickeystore_PublicKeyStore_getNextWAPCA(void)
{
saved_ca = jam_ca_list;
if (jam_ca_list == NULL)
{
KNI_ReturnBoolean(KAL_FALSE);
}
else
{
jam_ca_list = jam_ca_list->next_ca;
KNI_ReturnBoolean(KAL_TRUE);
}
}
KNIEXPORT KNI_RETURNTYPE_OBJECT
Java_com_sun_midp_publickeystore_PublicKeyStore_getCADomain(void)
{
KNI_StartHandles(1);
KNI_DeclareHandle(str);
KNI_NewStringUTF(J2ME_CA_DOMAIN, str);
KNI_EndHandlesAndReturnObject(str);
}
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_sun_midp_publickeystore_PublicKeyStore_getCAExponentLength(void)
{
KNI_ReturnInt(saved_ca->cert_pkey.exp_len);
}
KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_sun_midp_publickeystore_PublicKeyStore_getCAExponent(void)
{
KNI_StartHandles(1);
KNI_DeclareHandle(CAExponent);
KNI_GetParameterAsObject(1, CAExponent);
KNI_SetRawArrayRegion(CAExponent, 0, saved_ca->cert_pkey.exp_len, (jbyte*)saved_ca->cert_pkey.rsa_exponent);
KNI_EndHandles();
KNI_ReturnVoid();
}
KNIEXPORT KNI_RETURNTYPE_INT
Java_com_sun_midp_publickeystore_PublicKeyStore_getCAModulusLength(void)
{
KNI_ReturnInt(saved_ca->cert_pkey.mod_len);
}
KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_sun_midp_publickeystore_PublicKeyStore_getCAModulus(void)
{
KNI_StartHandles(1);
KNI_DeclareHandle(CAModulus);
KNI_GetParameterAsObject(1, CAModulus);
KNI_SetRawArrayRegion(CAModulus, 0, saved_ca->cert_pkey.mod_len, (jbyte*)saved_ca->cert_pkey.rsa_modulus);
KNI_EndHandles();
KNI_ReturnVoid();
}
KNIEXPORT KNI_RETURNTYPE_LONG
Java_com_sun_midp_publickeystore_PublicKeyStore_getCANotAfter(void)
{
long64 not_after = saved_ca->cert_content.not_after;
not_after *= 1000;
KNI_ReturnLong(not_after);
}
KNIEXPORT KNI_RETURNTYPE_LONG
Java_com_sun_midp_publickeystore_PublicKeyStore_getCANotBefore(void)
{
long64 not_before = saved_ca->cert_content.not_before;
not_before *= 1000;
KNI_ReturnLong(not_before);
}
KNIEXPORT KNI_RETURNTYPE_OBJECT
Java_com_sun_midp_publickeystore_PublicKeyStore_getCAOwner(void)
{
KNI_StartHandles(1);
KNI_DeclareHandle(str);
if (saved_ca->cert_content.issuer != NULL)
{
if (saved_ca->cert_content.issuer_len == 255)
{
saved_ca->cert_content.issuer[255] = 0;
} else
{
saved_ca->cert_content.issuer[saved_ca->cert_content.issuer_len] = 0;
}
KNI_NewStringUTF((const char*)saved_ca->cert_content.issuer, str);
} else
{
KNI_ReleaseHandle(str); /* Set 'str' to null String object */
}
KNI_EndHandlesAndReturnObject(str);
}
KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_sun_midp_midlet_MIDletState_notifyPauseNative(void)
{
if(!notify_pause)
{
jvm_send_pause_ind();
notify_pause = KAL_TRUE;
last_resume_request_time = 0;
}
KNI_ReturnVoid();
}
KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_sun_midp_midlet_MIDletState_resumeRequestNative(void)
{
if(notify_pause && (jvm_get_currenttime_tick() - last_resume_request_time > 400 ))
{
last_resume_request_time = jvm_get_currenttime_tick();
jvm_send_resume_ind();
}
KNI_ReturnVoid();
}
/*************************************************************************
* FUNCTION
* save midletsuite setting ($suitename.bin)
*
* DESCRIPTION
* Save setting after VM shutdown.
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
KNIEXPORT KNI_RETURNTYPE_VOID
Java_com_sun_midp_midletsuite_Installer_saveSetting0(void) {
BYTEARRAY barray;
int file_handle;
char* pszAsciiFilename;
SHORTARRAY name_array;
/* Declare Size and Handlers */
KNI_StartHandles(2);
KNI_DeclareHandle(filename);
KNI_DeclareHandle(input_buffer_Handle);
/* Get Parameter 1 */
KNI_GetParameterAsObject(1, filename);
KNI_GetParameterAsObject(2, input_buffer_Handle);
name_array = (SHORTARRAY)(*filename);
barray = (BYTEARRAY)(*input_buffer_Handle);
if(barray->length)
{
trans_ucs2_to_utf8((kal_char*)name_array->sdata, (kal_wchar*)name_array->sdata);
pszAsciiFilename = midpMalloc(name_array->length + 1);
if (pszAsciiFilename == NULL) {
KNI_ThrowNew("java/lang/OutOfMemoryError", "");
} else {
Kmemcpy(pszAsciiFilename, name_array->sdata, name_array->length);
pszAsciiFilename[name_array->length] = '\0';
}
if((file_handle = jvm_file_open(pszAsciiFilename, O_CREAT | O_TRUNC)) != -1) {
jvm_file_write(file_handle, barray->bdata, barray->length);
jvm_file_close(file_handle);
}
midpFree(pszAsciiFilename);
}
KNI_EndHandles();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -