0
点赞
收藏
分享

微信扫一扫

打开了一个size不为零的文件,读取到的值却为零的一种分析和解决方法

修改如下:

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;

}

}

举报

相关推荐

0 条评论