📄 jam_msg_util.c
字号:
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] file get ext"));
ansii_ext = DRM_get_content_ext(NULL, storage_name);
if (ansii_ext != NULL)
{
app_asc_str_to_ucs2_str((kal_int8*) ext, (kal_int8*) ansii_ext);
}
else
{
app_ucs2_strcpy((kal_int8*)ext, (kal_int8*)"");
}
#endif /* __DRM_SUPPORT__ */
}
static kal_int32 midlet_consume_id = -1;
extern kal_mutexid J2ME_drm_mutex;
/*****************************************************************************
* FUNCTION
* jam_drm_midlet_consume_callback
* DESCRIPTION
* PARAMETERS
* RETURNS
*****************************************************************************/
void jam_drm_midlet_consume_callback(kal_int32 result, kal_int32 id)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if( id == midlet_consume_id)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet consume callback"));
jvm_stopVMExternal();
}
else
{
ASSERT(0);
}
}
/*****************************************************************************
* FUNCTION
* jam_drm_midlet_start_consume
* DESCRIPTION
* Use this function to check if the input file is a DRM file with
* executable prmission and consume the executino right.
* PARAMETERS
* storage_name [IN] filename
* permission [IN] permission
* RETURNS
* KAL_FALSE : the file dose not have executable permission
* KAL_TRUE : the file does not exist or the file can be executed.
*****************************************************************************/
kal_int32 jam_drm_midlet_start_consume(kal_wchar *storage_name)
{
#ifdef __DRM_SUPPORT__
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_take_mutex(J2ME_drm_mutex);
if( midlet_consume_id != -1 )
{
ASSERT(0);
}
if( jam_drm_is_drm_file(storage_name) )
{
if( jam_drm_check_right(storage_name, DRM_PERMISSION_EXECUTE))
{
midlet_consume_id = jam_drm_start_consume(storage_name, DRM_PERMISSION_EXECUTE, jam_drm_midlet_consume_callback);
if( midlet_consume_id >= 0)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet start cosume %d", midlet_consume_id ));
kal_give_mutex(J2ME_drm_mutex);
return J2ME_NO_ERROR;
}
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet start cosume fail %d", midlet_consume_id ));
}
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet no right %d", midlet_consume_id ));
kal_give_mutex(J2ME_drm_mutex);
return J2ME_DRM_PROHIBIT;
}
kal_give_mutex(J2ME_drm_mutex);
return J2ME_NO_ERROR;
#else
return J2ME_NO_ERROR;
#endif
}
/*****************************************************************************
* FUNCTION
* jam_drm_stop_consume
* DESCRIPTION
* Use this function to stop consume
* PARAMETERS
* RETURNS
* void
*****************************************************************************/
kal_int32 jam_drm_midlet_stop_consume(void)
{
#ifdef __DRM_SUPPORT__
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_take_mutex(J2ME_drm_mutex);
if( midlet_consume_id >= 0)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet stop consume"));
DRM_stop_consume(midlet_consume_id);
midlet_consume_id = -1;
}
kal_give_mutex(J2ME_drm_mutex);
return J2ME_NO_ERROR;
#else /* __DRM_SUPPORT__ */
return J2ME_NO_ERROR;
#endif /* __DRM_SUPPORT__ */
}
/*****************************************************************************
* FUNCTION
* jam_drm_pause_consume
* DESCRIPTION
* Use this function to pause consume
* PARAMETERS
* drm_id [IN] drm_id
* RETURNS
* Void
*****************************************************************************/
kal_int32 jam_drm_midlet_pause_consume(void)
{
#ifdef __DRM_SUPPORT__
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_take_mutex(J2ME_drm_mutex);
if( midlet_consume_id >= 0)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet pause consume"));
DRM_pause_consume(midlet_consume_id);
}
kal_give_mutex(J2ME_drm_mutex);
return J2ME_NO_ERROR;
#else /* __DRM_SUPPORT__ */
return J2ME_NO_ERROR;
#endif /* __DRM_SUPPORT__ */
}
/*****************************************************************************
* FUNCTION
* jam_drm_resume_consume
* DESCRIPTION
* Use this function to resume consume
* PARAMETERS
* drm_id [IN] drm_id
* RETURNS
* void
*****************************************************************************/
kal_int32 jam_drm_midlet_resume_consume(void)
{
#ifdef __DRM_SUPPORT__
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_take_mutex(J2ME_drm_mutex);
if( midlet_consume_id >= 0)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] midlet resume consume"));
DRM_resume_consume(midlet_consume_id);
}
kal_give_mutex(J2ME_drm_mutex);
return J2ME_NO_ERROR;
#else /* __DRM_SUPPORT__ */
return J2ME_NO_ERROR;
#endif /* __DRM_SUPPORT__ */
}
#ifdef __DRM_SUPPORT__
#define JAVA_RIGHT_FILENAME "j#a#v#a#_#r#i#g#h#t.dr"
/*****************************************************************************
* FUNCTION
* jam_process_drm_callback
* DESCRIPTION
* PARAMETERS
* RETURNS
*****************************************************************************/
static kal_int32 drm_process_serial = -1;
static kal_int32 drm_process_result = DRM_RESULT_OK;
static void jam_drm_process_callback(kal_uint8 serial, kal_int32 result, applib_mime_type_struct *mime_type)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if( serial != drm_process_serial )
{
return;
}
drm_process_result = result;
}
/*****************************************************************************
* FUNCTION
* jam_process_drm_async
* DESCRIPTION
* This function is only used by jam_drm_decode_jar_file for asynchronous DRM processing.
* PARAMETERS
* file_path [IN] Not processed DRM file.
* new_path [IN] The file path to put processed DRM file.
* RETURNS
* J2ME_USER_CANCEL if user cancel the DRM decoding process
* DRM_PROC_RESULT_OK if the DRM file is processed successfully.
* Other DRM error code may be returned also.
*****************************************************************************/
static kal_int32 jam_drm_process(kal_wchar *file_path, kal_wchar *new_path, kal_int32 buffer_size)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint8 serial;
drm_proc_enum process_result;
kal_bool first = KAL_TRUE;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
process:
/* process two times */
if( first )
{
process_result = DRM_install_object((kal_uint8*) "application/vnd.oma.drm.message",
file_path, KAL_FALSE, new_path, buffer_size, &serial, NULL, jam_drm_process_callback);
}
else
{
process_result = DRM_install_object((kal_uint8*) "application/vnd.oma.drm.content",
file_path, KAL_FALSE, new_path, buffer_size, &serial, NULL, jam_drm_process_callback);
}
drm_process_serial = serial;
if(process_result == DRM_PROC_ENCRYPT_BUSY)
{
drm_process_result = DRM_PROC_ENCRYPT_BUSY;
while(1){
if (clean_event() == J2ME_GET_NEXT_EVENT_ABORT)
{
if( DRM_async_cancel_process(serial) == KAL_FALSE )
{
kal_prompt_trace(MOD_J2ME, "race condition between DRM and Java %d", serial);
}
kal_sleep_task(10);
if ( new_path )
{
FS_Delete(new_path);
}
drm_process_serial = -1;
return -(J2ME_USER_CANCEL);
}
if( drm_process_result != DRM_PROC_ENCRYPT_BUSY)
{
process_result = drm_process_result;
break;
}
/* sleep a while to give FMT CPU resource for processing file */
kal_sleep_task(100);
}
}
drm_process_serial = -1;
if( process_result == DRM_RESULT_OK )
{
return DRM_RESULT_OK;
}
if( first )
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] process fail, first phase, error code = %d\n", process_result));
first = KAL_FALSE;
goto process;
}
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] process fail, second phase, error code = %d\n", process_result));
return process_result;
}
/*****************************************************************************
* FUNCTION
*
* DESCRIPTION
*
* PARAMETERS
*
* RETURNS
* void
*****************************************************************************/
kal_int32 jam_drm_check_and_get_right(kal_int32 handle)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_bool permission = KAL_TRUE;
kal_wchar *rights_issuer = NULL;
kal_wchar *right_filename = NULL;
kal_char *buffer = NULL;
kal_uint32 buffer_size = 0;
kal_int32 returnCode = FS_NO_ERROR;
kal_uint8 serial;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
ASSERT( handle >= 0 );
permission = DRM_validate_permission(handle, NULL, DRM_PERMISSION_EXECUTE);
if( permission )
{
/* permission OK */
returnCode = J2ME_NO_ERROR;
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] permission ok\n"));
goto success;
}
if ( DRM_get_object_method(handle, NULL) != DRM_METHOD_SEPARATE_DELIVERY &&
DRM_get_object_method(handle, NULL) != DRM_METHOD_V2)
{
/* no permission , and cannot get rihgt */
returnCode = DRM_PROCESS_ERROR;
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] no permission and cannot get right\n"));
goto fail;
}
if( DRM_get_rights_issuer(handle, NULL, &buffer_size) != DRM_RESULT_OK || buffer_size == 0 )
{
returnCode = DRM_PROCESS_ERROR;
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] no right issuer\n"));
goto fail;
}
buffer = (kal_char*)get_ctrl_buffer(buffer_size);
DRM_get_rights_issuer(handle, buffer, &buffer_size);
if (strncmp(buffer, "http", 4) != 0) /* no http:// */
{
rights_issuer = (kal_wchar*) get_ctrl_buffer( (buffer_size+7) * 2 );
kal_wsprintf(rights_issuer, "%s%s","http://", buffer);
}
else
{
rights_issuer = (kal_wchar*) get_ctrl_buffer( buffer_size * 2 );
kal_wsprintf(rights_issuer, "%s", buffer);
}
right_filename = (kal_wchar*)get_ctrl_buffer( (strlen(work_sys_dir_path) + strlen(JAVA_RIGHT_FILENAME) + 1 + 1) * ENCODING_LENGTH);
kal_wsprintf(right_filename, "%s\\%s",work_sys_dir_path, JAVA_RIGHT_FILENAME);
returnCode = jam_request_http_and_save_to_file(0, rights_issuer, right_filename, NULL, 0);
if (returnCode != JAM_HTTP_NO_ERROR)
{
JAVA_DRM_DEBUG((_kvmLogStr,"[JAVA DRM PROCESS] download right fail, error_code = %d\n", returnCode));
if (returnCode == JAM_HTTP_USER_CANCEL)
{
returnCode = -J2ME_USER_CANCEL;
}
else
{
returnCode = DRM_PROCESS_ERROR;
}
goto fail;
}
/* process right */
returnCode = DRM_install_object( (kal_uint8*) "application/vnd.oma.drm.rights+wbxml" ,(kal_wchar*) right_filename, KAL_FALSE,
NULL, 0, &serial, NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -