⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jam_msg_util.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 5 页
字号:
    /*----------------------------------------------------------------*/
    /* 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 + -