打开了一个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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值