本文共 19936 字,大约阅读时间需要 66 分钟。
修改如下: 1,jam_create.c 新增定义: kal_mutexid g_jam_file_mutex; volatile int j2me_file_mutex_cnt = 0; volatile module_type j2me_file_mutex_tid = MOD_NIL; jam_init()中增加mutex g_jam_file_mutex = kal_create_mutex("J2ME FILE"); 2. jvm_file.c 加入以下接口 extern kal_mutexid g_jam_file_mutex; extern int j2me_file_mutex_cnt; extern module_type j2me_file_mutex_tid; void jvm_file_mutex_lock(void) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if (stack_int_get_active_module_id() != j2me_file_mutex_tid) { while (j2me_file_mutex_cnt > 0) kal_sleep_task(1); kal_take_mutex(g_jam_file_mutex); j2me_file_mutex_tid = stack_int_get_active_module_id(); } ++j2me_file_mutex_cnt; } void jvm_file_mutex_unlock(void) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ ASSERT(j2me_file_mutex_tid == stack_int_get_active_module_id()); --j2me_file_mutex_cnt; if (j2me_file_mutex_cnt == 0) { j2me_file_mutex_tid = MOD_NIL; kal_give_mutex(g_jam_file_mutex); } } 3. 修改到的9个API的源码如下 /***************************************************************************** * FUNCTION * jvm_file_delete * DESCRIPTION * * PARAMETERS * filename [IN] * RETURNS * *****************************************************************************/ int jvm_file_delete(const char *filename) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 err; module_type active_module_id = stack_int_get_active_module_id(); kal_int32 result; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ kal_trace(TRACE_GROUP_9, FUNC_JVM_FILE_DELETE); MMI_PRINT(MOD_JAM,TRACE_GROUP_9,"[file name = %s]",(char * )filename); jvm_file_mutex_lock(); #ifndef __NEMO_VM__ if (active_module_id == MOD_JAM) { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_sys_dir_path, filename ); } else { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_dir_path, filename); } /* this is to prevent removing a read only file */ FS_SetAttributes(WCHARFilename_JAM, 0); if ((err = FS_Delete(WCHARFilename_JAM)) == FS_NO_ERROR) { jvm_file_mutex_unlock(); return 0; } else { g_jvm_file_error_code = err; jvm_file_mutex_unlock(); return -1; } } else { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename, "%s\\%s", work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename, "%s\\%s", work_dir_path, filename); } /* this is to prevent removing a read only file */ FS_SetAttributes(WCHARFilename, 0); if ((err = FS_Delete(WCHARFilename)) == FS_NO_ERROR) { jvm_file_mutex_unlock(); return 0; } else { g_jvm_file_error_code = err; jvm_file_mutex_unlock(); return -1; } } #else /* __NEMO_VM__ */ if (active_module_id == MOD_JAM) { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_sys_dir_path, filename ); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, filename); } result = jvm_mvm_file_delete(jvm_file_name_buffer); jvm_file_mutex_unlock(); return result; } else { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename, "%s\\%s", work_sys_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, filename); } result = jvm_mvm_file_delete(jvm_file_name_buffer); jvm_file_mutex_unlock(); return result; } #endif /*__NEMO_VM__ */ } /***************************************************************************** * FUNCTION * jvm_file_rename * DESCRIPTION * * PARAMETERS * oldfilename [IN] * newfilename [IN] * RETURNS * *****************************************************************************/ int jvm_file_rename(const char *oldfilename, const char *newfilename) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ WCHAR newFilename[MAX_WCHAR_FILENAME_LEN]; int i, file_count = work_info_ptr->virtual_file_info.virtual_file_count; kal_int32 err; module_type active_module_id = stack_int_get_active_module_id(); kal_int32 result; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ /* a real file should not overwrite a pre-install file */ kal_trace(TRACE_GROUP_9, FUNC_JVM_FILE_RENAME); jvm_file_mutex_lock(); /* * for (i = 0; i < file_count; i++) * { * if (strcmp(newfilename, work_info_ptr->virtual_file_info. virtual_file_name[i]) == 0) * { * return -1; * } */ if (active_module_id == MOD_JAM) { if (is_system_file((char*)oldfilename)) { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_sys_dir_path, oldfilename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, oldfilename); } else { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_dir_path, oldfilename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, oldfilename); } if (is_system_file((char*)newfilename)) { kal_wsprintf(newFilename, "%s\\%s", work_sys_dir_path, newfilename ); kal_sprintf((kal_char *)newFilename,"%s\\%s",work_sys_dir_path, newfilename); } else { kal_wsprintf(newFilename, "%s\\%s", work_dir_path, newfilename); kal_sprintf((kal_char *)newFilename,"%s\\%s",work_dir_path, newfilename); } result = jvm_mvm_file_rename((const kal_char *)jvm_file_name_buffer,( const kal_char *)newFilename); jvm_file_mutex_unlock(); return result; } else { if (is_system_file((char*)oldfilename)) { kal_wsprintf(WCHARFilename, "%s\\%s", work_sys_dir_path, oldfilename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, oldfilename); } else { kal_wsprintf(WCHARFilename, "%s\\%s", work_dir_path, oldfilename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, oldfilename); } if (is_system_file((char*)newfilename)) { kal_wsprintf(newFilename, "%s\\%s", work_sys_dir_path, newfilename ); kal_sprintf((kal_char *)newFilename,"%s\\%s",work_dir_path, newfilename); } else { kal_wsprintf(newFilename, "%s\\%s", work_dir_path, newfilename); kal_sprintf((kal_char *)newFilename,"%s\\%s",work_dir_path, newfilename); } result = jvm_mvm_file_rename((const kal_char *)jvm_file_name_buffer,( const kal_char *)newFilename); jvm_file_mutex_unlock(); return result; } } /***************************************************************************** * FUNCTION * jvm_file_open * DESCRIPTION * * PARAMETERS * filename [IN] * flags [IN] * RETURNS * *****************************************************************************/ int jvm_file_open(const char *filename, int flags) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ int handle; int file_count = work_info_ptr->virtual_file_info.virtual_file_count; int i; jvm_file_struct * file; module_type active_module_id = stack_int_get_active_module_id(); kal_int32 result; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ kal_trace(TRACE_GROUP_9, FUNC_JVM_FILE_OPEN, flags); MMI_PRINT(MOD_JAM,TRACE_GROUP_9,"[file name = %s]",(char * )filename); jvm_file_mutex_lock(); /* to avoid jam/jvm task use the same WCHARFilename */ memset(jvm_file_name_buffer,0x00,MAX_WCHAR_FILENAME_LEN); memset(jvm_file_name_buffer_w,0x00,MAX_WCHAR_FILENAME_LEN*2); if (active_module_id == MOD_JAM) { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_sys_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path,filename); } result = jvm_mvm_file_open(jvm_file_name_buffer,flags); jvm_file_mutex_unlock(); return result; } else { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename, "%s\\%s", work_sys_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path,filename); } result = jvm_mvm_file_open(jvm_file_name_buffer,flags); jvm_file_mutex_unlock(); return result; } } /***************************************************************************** * FUNCTION * jvm_file_findfirst * DESCRIPTION * * PARAMETERS * string [?] * RETURNS * *****************************************************************************/ // 20101229: [MAUI_02731591] Changed char *jvm_file_findfirst(char *string) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ FS_DOSDirEntry info; /// WCHAR name_pattern[MAX_WCHAR_FILENAME_LEN]; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ kal_trace(TRACE_GROUP_9, FUNC_JVM_FILE_FIND_FIRST); jvm_file_mutex_lock(); kal_sprintf(jvm_file_name_buffer, "%s\\%s", work_dir_path, string); memset(CHARFilename,0x00,MAX_WCHAR_FILENAME_LEN*sizeof(char)); KVM_FindFilehandle = jvm_mvm_file_findfirst(jvm_file_name_buffer, CHARFilename,MAX_WCHAR_FILENAME_LEN, 0); if(KVM_FindFilehandle > 0){ jvm_file_mutex_unlock(); return CHARFilename; } else{ jvm_file_mutex_unlock(); return NULL; } } /***************************************************************************** * FUNCTION * jvm_file_isexist * DESCRIPTION * * PARAMETERS * filename [?] * RETURNS * *****************************************************************************/ int jvm_file_isexist(char *filename) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ module_type active_module_id = stack_int_get_active_module_id(); kal_int32 result; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ /* system files are files except .db(.rss), .jar files */ jvm_file_mutex_lock(); if (active_module_id == MOD_JAM) { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_sys_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename_JAM, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, filename); } result = jvm_mvm_file_isexist(jvm_file_name_buffer); jvm_file_mutex_unlock(); return result; } else { if (is_system_file((char*)filename)) { kal_wsprintf(WCHARFilename, "%s\\%s", work_sys_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_sys_dir_path, filename); } else { kal_wsprintf(WCHARFilename, "%s\\%s", work_dir_path, filename); kal_sprintf(jvm_file_name_buffer,"%s\\%s",work_dir_path, filename); } result = jvm_mvm_file_isexist(jvm_file_name_buffer); jvm_file_mutex_unlock(); return result; } } /***************************************************************************** * FUNCTION * jvm_mvm_file_open * DESCRIPTION * * PARAMETERS * file_path [IN] * flags [IN] * RETURNS * *****************************************************************************/ kal_int32 jvm_mvm_file_open(const kal_char * file_path ,int flags) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 handle; kal_int32 file_count = work_info_ptr->virtual_file_info.virtual_file_count; kal_int32 i; kal_int32 file_name_length = 0; kal_char * file_name; jvm_file_struct * file; kal_wchar * file_path_w = jvm_file_name_buffer_w; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ jvm_file_mutex_lock(); file = jvm_mvm_file_get_cached_file(file_path); if(file != NULL) { jvm_file_mutex_unlock(); return (int)file; } kal_wsprintf(file_path_w,"%s",file_path); handle = DRM_open_file(file_path_w, flags, DRM_PERMISSION_EXECUTE); #ifdef JVM_FILE_DEBUG_SUPPORT kal_prompt_trace(MOD_J2ME,"[JVM_FILE]jvm_mvm_file_open,file_path=%s,handle =%d",file_path,handle); #endif if (handle < 0) { g_jvm_file_error_code = handle; file_name = jvm_mvm_file_get_file_name(file_path); if(file_name != NULL) { for (i = 0; i < file_count; i++) { if (strcmp(file_name, work_info_ptr->virtual_file_info. virtual_file_name[i]) == 0) { file = (jvm_file_struct *) get_ctrl_buffer(sizeof( jvm_file_struct)); ASSERT(file != NULL); memset(file,0x00,sizeof(jvm_file_struct)); file->type = JVM_FILE_TYPE_VRITUAL; file->position = 0; file->size = work_info_ptr->virtual_file_info. virtual_file_size[i]; file->data = (kal_uint8*) work_info_ptr->virtual_file_info .virtual_file_data[i]; jvm_trace_time("[Performane][TIME] get vritual file", JVM_TRACE_TYPE_DEBUG); jvm_file_mutex_unlock(); return (int)file; } } } /* the file is neigher in real file system nor virtual file system */ jvm_file_mutex_unlock(); return -1; } if(jvm_mvm_file_is_cached_enabled() && strcmp((file_path + strlen( file_path) - 4), ".jar") == 0) { file = (jvm_file_struct *)jvm_mvm_file_cached_open(file_path,handle); if(file != NULL){ jvm_file_mutex_unlock(); return (int)file; } } file = (jvm_file_struct *) get_ctrl_buffer(sizeof(jvm_file_struct)); ASSERT(file != NULL); file->type = JVM_FILE_TYPE_NORMAL; file->handle = handle; #ifdef JVM_FILE_DEBUG_SUPPORT memset(file->filename,0x00,10); file_name_length = strlen(file_path); if(file_name_length < 10) { memcpy(file->filename,file_path,file_name_length); } else { memcpy(file->filename,file_path + file_name_length - 10,10); } #endif /* JVM_FILE_DEBUG_SUPPORT */ #if defined(__DRM_SUPPORT__) if (file->type == JVM_FILE_TYPE_NORMAL && DRM_get_object_method(handle, NULL) != DRM_METHOD_NONE) { file->type = JVM_FILE_TYPE_DRM; } #endif /* defined(__DRM_SUPPORT__) */ #if defined(ENCRYPT_JAR_FILE) if (file->type == JVM_FILE_TYPE_NORMAL && strcmp((file_path + strlen( file_path) - 4), ".jar") == 0) { file->encrypt_code = get_base_code(handle); file->type = JVM_FILE_TYPE_ENCRYPTED_JAR; } #endif /* defined(ENCRYPT_JAR_FILE) */ #ifdef JVM_FILE_DEBUG_SUPPORT kal_prompt_trace(MOD_J2ME,"[JVM_FILE]jvm_mvm_file_open,file_handle=%d", file); #endif if(jam_mvm_get_current_vm_id() >= 0 ) jvm_resource_mgr_register(jam_mvm_get_current_vm_id(), JAVA_SYS_FILE_DEVICE, (kal_int32)file, NULL, NULL, & jvm_mvm_file_finalize_callback); jvm_file_mutex_unlock(); return (kal_int32)file; } /***************************************************************************** * FUNCTION * jvm_mvm_file_delete * DESCRIPTION * * PARAMETERS * file_path [IN] * RETURNS * *****************************************************************************/ kal_int32 jvm_mvm_file_delete(const kal_char *file_path) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 err; kal_wchar * file_path_w = jvm_file_name_buffer_w; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ #ifdef JVM_FILE_DEBUG_SUPPORT kal_prompt_trace(MOD_J2ME,"[JVM_FILE]jvm_mvm_file_delete,handle=%s", file_path); #endif jvm_file_mutex_lock(); kal_wsprintf(file_path_w,"%s",file_path); /* this is to prevent removing a read only file */ FS_SetAttributes(file_path_w, 0); if ((err = FS_Delete(file_path_w)) == FS_NO_ERROR) { jvm_file_mutex_unlock(); return 0; } else { jvm_file_mutex_unlock(); g_jvm_file_error_code = err; return -1; } } /***************************************************************************** * FUNCTION * jvm_mvm_file_isexist * DESCRIPTION * * PARAMETERS * file_path [IN] * RETURNS * *****************************************************************************/ kal_bool jvm_mvm_file_isexist(const kal_char * file_path) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_char * file_name; kal_int32 index; kal_int32 virtual_file_count; kal_wchar * file_path_w = jvm_file_name_buffer_w; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ #ifdef JVM_FILE_DEBUG_SUPPORT kal_prompt_trace(MOD_J2ME,"[JVM_FILE]jvm_mvm_file_isexist,file_path=%s", file_path); #endif jvm_file_mutex_lock(); if(file_path == NULL){ jvm_file_mutex_unlock(); return KAL_FALSE; } file_name = jvm_mvm_file_get_file_name(file_path); if(file_name == NULL){ jvm_file_mutex_unlock(); return KAL_FALSE; } kal_wsprintf(file_path_w,"%s",file_path); if (FS_GetAttributes(file_path_w) < 0) { virtual_file_count = work_info_ptr->virtual_file_info. virtual_file_count; /* if didn't find that, try virtual files */ for (index = 0; index < virtual_file_count; index++) { if (strcmp(file_name, work_info_ptr->virtual_file_info. virtual_file_name[index]) == 0) { jvm_file_mutex_unlock(); return KAL_TRUE; } } jvm_file_mutex_unlock(); return KAL_FALSE; } else { jvm_file_mutex_unlock(); return KAL_TRUE; } } /***************************************************************************** * FUNCTION * jvm_mvm_file_rename * DESCRIPTION * * PARAMETERS * old_file_path [IN] * new_file_path [IN] * RETURNS * *****************************************************************************/ kal_int32 jvm_mvm_file_rename(const char *old_file_path, const char * new_file_path) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 index; kal_int32 file_count = work_info_ptr->virtual_file_info.virtual_file_count; kal_int32 err; kal_char * new_file_name; kal_wchar * old_file_path_w = jvm_file_name_buffer_w; kal_wchar new_file_path_w[MAX_WCHAR_FILENAME_LEN]; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ /* a real file should not overwrite a pre-install file */ #ifdef JVM_FILE_DEBUG_SUPPORT kal_prompt_trace(MOD_J2ME,"[JVM_FILE]jvm_mvm_file_rename,old_file_path=%s, new_file_path",old_file_path,new_file_path); #endif jvm_file_mutex_lock(); new_file_name = jvm_mvm_file_get_file_name(new_file_path); if(new_file_name == NULL) { g_jvm_file_error_code = -1; jvm_file_mutex_unlock(); return -1; } /** //removed for MAUI_02724396 for (index = 0; index < file_count; index++) { if (strcmp(new_file_name, work_info_ptr->virtual_file_info. virtual_file_name[index]) == 0) { return -1; } } */ kal_wsprintf(old_file_path_w,"%s",old_file_path); kal_wsprintf(new_file_path_w,"%s",new_file_path); if ((err = FS_Move(old_file_path_w, new_file_path_w, FS_MOVE_KILL | FS_MOVE_OVERWRITE, NULL, NULL, 0)) == FS_NO_ERROR) { jvm_file_mutex_unlock(); return 0; } else { g_jvm_file_error_code = err; jvm_file_mutex_unlock(); return -1; } }转载地址:http://qsgdi.baihongyu.com/