微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MTK功能机平台后台发送彩信


转载请保持原文的完整性并注明原文出处!


在网上找了很久,没有找到MMS的发送示例代码,好不容易找来的一个,还是一堆的乱七八糟的代码,看的头晕。后来自己认真的研究了一天,发现MTK下发送彩信所涉及的两个主要的关键函数为:"srv_mms_create" 和 “srv_mms_send” ,其流程为先调用create函数创建一个MMS并返回一个msd_id,然后在send函数中根据这个msg_id来将彩信发送出去。

其实这个msg_id是create函数的回调反馈出来的,那么如何create一个MMS并获得这个msg_id呢?这个是最关键的。我们观察到create函数的唯一的一个参数是一个“srv_mms_create_req_struct”类型的结构体,这个结构体里面有个成员为“xml_filepath”,是的,这个XML文件才是描述这条彩信的是最最关键的东西。所以,我们要做的就是如果构造这个个XML文件,其他的任何东西,基本都是遮眼浮云,唯有XML才是真理。

那么,如何创建这个XML文件呢?不知道有不有朋友从MMI入口开始跟踪过MMS的创建流程,其实那些界面都是为了构造XML而作准备的,你一路跟踪下去,肯定会跟踪到“mmi_uc_create_mms_handler”这个函数,这个时候,你才会发现创建XML函数是“srv_uc_create_mms_xml_description_file”,好了,到了这里,进入这个函数稍微看一看,所有的一切都基本明了了,接下来,我们就是需要知道这个XML文件具体是怎么构建出来的。

好吧,至此,函数“srv_uc_create_mms_xml_description_file”里面的内容,你自己去看了,其实就是描述了这条彩信的各种基本信息,比如说是发送给谁啊,抄送给谁啊,是否需要发送阅读报告啊,是否隐藏发信人啊,发送的优先级啊,标题是什么啊,文字/图片/视频/音频的文件名和文件绝对路径啊,附件的名字和绝对路径啊,他们分了多少个slide啊,每个slide里面是怎么布局的啊等等,就这些内容。这里我暂时贴一段简单的XML文件,建议你先结合彩信,仔细观察下这个XML文件。如果想看更加复杂的,就自己在模拟器上手动编辑一个MMS,然后在“srv_uc_create_mms_xml_description_file”函数加个断点,在“srv_uc_create_mms_xml_description_file”的最后加段自己的复制XML文件到指定地方那个的代码,点击发送,就会进入到“srv_uc_create_mms_xml_description_file”里面了,然后就可以自己慢慢研究了。

<mms>
<header>
<to type="P">13480121234</to>
<rr>1</rr>
<dr>0</dr>
<prio>2</prio>
<expiry>0</expiry>
<delivery>0</delivery>
<visible>1</visible>
</header>
<body bgColor="0xffffff" fgColor="0x000000" slideNum="4" objNum="2" layout="1" imgFit="1" txtFit="2">
<slide index="1" dur="5">
<img id="1" begin="0" end="5"/>
</slide>
<slide index="2" dur="5">
<img id="2" begin="0" end="5"/>
</slide>
<slide index="3" dur="5">
<img id="1" begin="0" end="5"/>
</slide>
<slide index="4" dur="5">
<img id="2" begin="0" end="5"/>
</slide>
<obj id="1" attach="0" vf="0" drm="0" size="33130" offset="0" encoding="0">
<name>201101010000000E7313.jpg</name>
<filepath>E:\Photos\201101010000000E7313.jpg</filepath>
</obj>
<obj id="2" attach="0" vf="0" drm="0" size="32099" offset="0" encoding="0">
<name>20110101000300282986.jpg</name>
<filepath>E:\Photos\20110101000300282986.jpg</filepath>
</obj>
</body>
</mms>

看完上面的代码了,我们就要自己手动构造一个XML文件了。好吧,不说多了,下面,请看代码,再做解释。
#if 1//MMS 发送示例 //转载请保持原文的完整性并注明原文出处!
/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_element_start
 * DESCRIPTION
 *  Create the xml start element
 * ParaMETERS
 *  fh                  [IN]        
 *  element_name        [?]         
 *  attr_list           [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_element_start(FS_HANDLE fh,U8 *element_name,U8 **attr_list);

/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_element_end
 * DESCRIPTION
 *  Create the xml end element
 * ParaMETERS
 *  fh                  [IN]        
 *  element_name        [?]         
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_element_end(FS_HANDLE fh,U8 *element_name);

/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_new_line
 * DESCRIPTION
 *  Insert new line
 * ParaMETERS
 *  fh      [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_new_line(FS_HANDLE fh);

/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_data
 * DESCRIPTION
 *  Add data
 * ParaMETERS
 *  fh          [IN]        
 *  data        [?]         
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_data(FS_HANDLE fh,U8 *data);

/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_data_numeric_to_char
 * DESCRIPTION
 *  Add numeric data
 * ParaMETERS
 *  fh          [IN]        
 *  value       [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_data_numeric_to_char(FS_HANDLE fh,U32 value);

/*****************************************************************************
 * FUNCTION
 *  srv_uc_create_xml_element_single
 * DESCRIPTION
 *  Create the xml single element
 * ParaMETERS
 *  fh                  [IN]        
 *  element_name        [?]         
 *  attr_list           [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
extern S32 srv_uc_create_xml_element_single(FS_HANDLE fh,U8 **attr_list);

/*******************************************************************************
** 函数: MsgCmd_GetUsableDrive
** 功能: 获取系统可用的存储设备盘符
** 参数: 
** 返回: 返回盘符 0x43~0x47
** 作者: wasfayu
*******/
S32 MsgCmd_GetUsableDrive(void);

#define MSGCMD_FILE_PATH_LENGTH   127
#define MSGCMD_FILE_NAME_LENGTH   63

#define mc_trace(fmt,...) kal_prompt_trace(0,fmt,##__VA_ARGS__)

/* 自定义彩信发送请求结构 */
typedef struct {
	char     sendto[MMI_PHB_NUMBER_LENGTH+1];
	WCHAR    xmlpath[MSGCMD_FILE_PATH_LENGTH+1];
	WCHAR    subject[SRV_UC_MAX_SUBJECT_LEN+1];
	WCHAR    picname[MSGCMD_FILE_NAME_LENGTH+1];
	WCHAR    picpath[MSGCMD_FILE_PATH_LENGTH+1];
	
	U8    priority;          /* mma_priority_enum */
	U8    expiry_time;       /* srv_uc_expiry_time_enum */
    U8    delivery_time;     /* srv_uc_delivery_time_enum */
    BOOL  read_report;       /* Read report flag */
    BOOL  delivery_report;   /* Delivery report flag */
    BOOL  hide_sender;       /* Hide sender flag */
}MsgCmdMMSXmlData;

typedef struct {
    WCHAR    xmlpath[MSGCMD_FILE_PATH_LENGTH+1];
    mma_sim_id_enum  sim;
}MsgCmdMMSUserData;

typedef struct {
	LOCAL_Para_HDR
	char     sendto[MMI_PHB_NUMBER_LENGTH+1];
	WCHAR    subject[SRV_UC_MAX_SUBJECT_LEN+1];
	WCHAR    picpath[MSGCMD_FILE_PATH_LENGTH+1];
    WCHAR   *picname; //这个指针其实就是指向picpath里面的某个元素    
    mma_sim_id_enum  sim;
}MsgCmdMMSReq;


/*
wap_mma_set_profile_req_struct
srv_nw_usab_is_any_network_available
srv_ucm_is_any_call
[srv_uc_create_mms_xml_description_file]
*/
/*******************************************************************************
** 函数: msgcmd_CreatemmSXMLFile
** 功能: 创建MMS发送时需要的XML文件
** 入参: MsgCmdMMSXmlData -- 创建XML文件的依据
** 返回: 是否成功
** 说明: 调用srv_uc_create_mms_xml_description_file函数中类似的功能来完成布局
** 作者: wasfayu
*******/
static MMI_BOOL msgcmd_CreatemmSXMLFile(MsgCmdMMSXmlData *param)
{
#define FUNC_FAIL_RETURN(exp) if ((exp) < FS_NO_ERROR) { FS_Close(fh); return MMI_FALSE;}
#define MMS_BACKGROUND_COLOR  0xFFFFFF
#define MMS_FOREGROUND_COLOR  0x000000

    FS_HANDLE fh;
    
    if (NULL == param)
        return MMI_FALSE;

    if (0 == strlen(param->sendto))
        return MMI_FALSE;
    
    if (0 == app_ucs2_strlen((const kal_int8 *)param->xmlpath))
        return MMI_FALSE;
    
    if (0 == app_ucs2_strlen((const kal_int8 *)param->picname))
        return MMI_FALSE;

    if (0 == app_ucs2_strlen((const kal_int8 *)param->picpath))
        return MMI_FALSE;

    // ready,go!
    if ((fh = FS_Open(param->xmlpath,FS_READ_WRITE|FS_CREATE_ALWAYS)) < FS_NO_ERROR)
        return MMI_FALSE;

    /* <mms> */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_MMS,NULL));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    /* <header> */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_HEADER,NULL));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    
    /* To address */
    if (MMI_TRUE)
    {
    U8 *attr_list[3] = {SRV_UC_XML_ATTR_TYPE,SRV_UC_XML_ATTR_POHNE_NUMBER,NULL};
    
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,SRV_UC_XML_ELEMENT_TO,attr_list));
    FUNC_FAIL_RETURN(srv_uc_create_xml_data(fh,(U8*)param->sendto));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,SRV_UC_XML_ELEMENT_TO));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    }
    
    /* subject */
    if (mmi_ucs2strlen((S8*)param->subject))
    {
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_SUBJECT,NULL));
        FUNC_FAIL_RETURN(srv_uc_create_xml_data_usc2_to_utf8_to_base64(fh,(U8*)param->subject));
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_SUBJECT));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    }

    /* Read Report */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_READ_REPORT,NULL));
    FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh,param->read_report));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_READ_REPORT));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    /* Delivery Report */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_REPORT,param->delivery_report));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_REPORT));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    /* Priority */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_PRIORITY,param->priority));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_PRIORITY));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    
    /* Expiry time */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_EXPIRY,srv_uc_convert_to_mms_expiry_time(param->expiry_time)));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_EXPIRY));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    
    /* Delivery time */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_TIME,srv_uc_convert_to_mms_delivery_time(param->delivery_time)));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_TIME));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    /* Sender visibility */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_VISIBLE,!param->hide_sender));
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_VISIBLE));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    
    /* </header> */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_HEADER));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    if (MMI_TRUE)
    {
        U16 str_len = SRV_UC_XML_STR_LEN;   /* size of slide_num,obj_num,layout,bg_color and fg_color */
        U16 attr_num = 7;                   /* size of arrt_list would be attr_num * 2 + 1 */
        U8 bg_color[SRV_UC_XML_STR_LEN];
        U8 fg_color[SRV_UC_XML_STR_LEN];
        U8 slide_num[SRV_UC_XML_STR_LEN];
        U8 obj_num[SRV_UC_XML_STR_LEN];
        U8 layout[SRV_UC_XML_STR_LEN];
        U8 txt_fit[SRV_UC_XML_STR_LEN];
        U8 img_fit[SRV_UC_XML_STR_LEN];
        U8 *attr_list[7 * 2 + 1];           /* 7= bg_color....img_fit */
        U8 i = 0;

        /* body */
        i = 0;
        /*-----background color-----------------------------------------------*/
        memset(bg_color,str_len);
        sprintf((char*)bg_color,"0x%06x",MMS_BACKGROUND_COLOR);
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_BGCOLOR;
        attr_list[i++] = bg_color;
        /*-----foregrount color----------------------------------------------*/
        memset(fg_color,str_len);
        sprintf((char*)fg_color,MMS_FOREGROUND_COLOR);
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_FGCOLOR;
        attr_list[i++] = fg_color;
        /*-----slide number---------------------------------------------------*/
        memset(slide_num,str_len);
        slide_num[0] = '1'; //只有一个slide
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_SLIDE_NUM;
        attr_list[i++] = slide_num;
        /*-----object number--------------------------------------------------*/
        memset(obj_num,str_len);
        obj_num[0] = '1'; //只有一个object
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_OBJ_NUM;
        attr_list[i++] = obj_num;
        /*-----layout type----------------------------------------------------*/
        memset(layout,str_len);
        layout[0] = '1'; //布局,参见mma_slide_layout_enum
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_LAYOUT;
        attr_list[i++] = layout;
        /*-----image fit------------------------------------------------------*/
        memset(img_fit,str_len);
        sprintf((char*)img_fit,"%d",MMA_REGION_FIT_MEET);    /* Always set to MEET for img,because current mms can not support other type */
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_IMGFIT;
        attr_list[i++] = img_fit;
        /*-----text fit-------------------------------------------------------*/
        memset(txt_fit,str_len);
        sprintf((char*)txt_fit,MMA_REGION_FIT_SCROLL);  /* Always set to SCROLL for text,because current mms can not support other type */
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_TXTFIT;
        attr_list[i++] = txt_fit;
        /*--------------------------------------------------------------------*/
        attr_list[i++] = NULL;
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_BODY,attr_list));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

        /* Slide */
        i = 0;
        /*--------------------------------------------------------------------*/
        memset(bg_color,str_len);
        bg_color[0] = '1'; //只有一张图片,一个slide
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_INDEX;
        attr_list[i++] = bg_color;
        /*--------------------------------------------------------------------*/
        memset(fg_color,str_len);
        fg_color[0] = '5'; //只有5秒钟
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_DURATION;
        attr_list[i++] = fg_color;
        /*--------------------------------------------------------------------*/
        attr_list[i++] = NULL;
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_SLIDE,attr_list));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
        
        /*--------------------------------------------------------------------*/
        i = 0;
        /*-----slide index----------------------------------------------------*/
        memset(slide_num,str_len);
        sprintf((char*)slide_num,"1"); //只有一张图片,因此就只有一个slide,所以直接给定slide index为1
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ID;
        attr_list[i++] = slide_num;
        /*-----start time-----------------------------------------------------*/
        memset(obj_num,str_len);
        sprintf((char*)obj_num,"0"); //只有一张图片,从0秒开始
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_BEGIN;
        attr_list[i++] = obj_num;
        /*-----end time-------------------------------------------------------*/
        memset(layout,str_len);
        sprintf((char*)layout,"5"); //只有一张图片,到5秒种结束
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_END;
        attr_list[i++] = layout;
        /*--------------------------------------------------------------------*/
        attr_list[i] = NULL;
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_single(fh,SRV_UC_XML_ELEMENT_IMAGE,attr_list));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_SLIDE));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

        /* Object */
        i = 0;
        /*-----object index---------------------------------------------------*/
        memset(bg_color,str_len);
        bg_color[0] = '1'; //只有一个object,强制给定为1
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ID;
        attr_list[i++] = bg_color;
        /*-----attach---------------------------------------------------------*/
        memset(fg_color,str_len);
        fg_color[0] = '0';
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ATTACH;
        attr_list[i++] = fg_color;
        /*-----virtual file---------------------------------------------------*/
        memset(slide_num,str_len);
        slide_num[0] = '0';
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_VIRTUAL_FILE;
        attr_list[i++] = slide_num;
        /*-----drm------------------------------------------------------------*/
        memset(obj_num,str_len);
        obj_num[0] = '0';
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_DRM;
        attr_list[i++] = obj_num;
        /*-----size-----------------------------------------------------------*/
        memset(layout,str_len);
        sprintf(layout,applib_get_file_size(param->picpath));
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_SIZE;
        attr_list[i++] = layout;
        /*-----offset---------------------------------------------------------*/
        memset(txt_fit,str_len);
        txt_fit[0] = '0';
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_OFFSET;
        attr_list[i++] = txt_fit;
        /*-----encoding-------------------------------------------------------*/
        memset(img_fit,str_len);
        img_fit[0] = '0';
        attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ENCODING;
        attr_list[i++] = img_fit;
        
        attr_list[i++] = NULL;
        /* <obj> */
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_OBJECT,attr_list));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
        /* name */
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_NAME,NULL));
        FUNC_FAIL_RETURN(srv_uc_create_xml_data_usc2_to_utf8(fh,(U8*)param->picname));
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_NAME));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
        /* file path */
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_FILE_PATH,(U8*)param->picpath));
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_FILE_PATH));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
        /* </obj> */
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_OBJECT));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));
    
        /* it possible that the case happens: no object,but user press end key,Uc will save postcard in background,still need to create a empty postcard text object */

        /* </body> */
        FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_BODY));
        FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));        
    }

    /* </mms> */
    FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_MMS));
    FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh));

    FS_Close(fh);

    return MMI_TRUE;
#undef FUNC_FAIL_RETURN
}

/*******************************************************************************
** 函数: msgcmd_SendMMSResponse
** 功能: 创建并且发送MMS的回调函数
** 入参: result   -- 
**       rsp_data -- srv_mms_create_rsp_struct
**       user_data-- 
** 返回: 是否成功
** 作者: wasfayu
*******/
static MMI_BOOL msgcmd_SendMMSResponse(void *param)
{
    MsgCmdMMSReq     *rsp = (MsgCmdMMSReq*)param;
    MsgCmdMMSXmlData *xml = (MsgCmdMMSXmlData*)OslMalloc(sizeof(MsgCmdMMSXmlData));

	memset(xml,sizeof(MsgCmdMMSXmlData));
    //send to
    memcpy(xml->sendto,rsp->sendto,MMI_PHB_NUMBER_LENGTH+1);
    //subject
    memcpy(xml->subject,rsp->subject,sizeof(WCHAR)*(SRV_UC_MAX_SUBJECT_LEN+1));
    //file name
    memcpy(xml->picname,rsp->picname,sizeof(WCHAR)*(MSGCMD_FILE_NAME_LENGTH+1));
    //file full path
    memcpy(xml->picpath,rsp->picpath,sizeof(WCHAR)*(MSGCMD_FILE_PATH_LENGTH+1));
    //other
  	xml->priority         = MMA_PRIORITY_MEDIUM;
    xml->expiry_time      = SRV_UC_EXPIRY_NOT_SET;
    xml->delivery_report  = SRV_UC_DELIVERY_IMMEDIATE;
    xml->read_report      = FALSE;
    xml->hide_sender      = FALSE;
    xml->delivery_report  = FALSE;
    //xml file abs path
#if defined(WIN32)
{
    applib_time_struct mt;
	applib_dt_get_date_time(&mt);
    
    kal_wsprintf(xml->xmlpath,"%c:\\mc_%d%d%d.xml",MsgCmd_GetUsableDrive(),mt.nHour,mt.nMin,mt.nSec);
}
#else
    kal_wsprintf(xml->xmlpath,"%c:\\mc_%d.xml",drv_get_current_time());
#endif

    if (msgcmd_CreatemmSXMLFile(xml))
    {
        MsgCmd_CreateAndSendMMS(rsp->sim,xml->xmlpath);
    }

    OslMfree(xml);
}

/*******************************************************************************
** 函数: MsgCmd_CreateAndSendMMSCb
** 功能: 创建并且发送MMS的回调函数
** 入参: result   -- 
**       rsp_data -- srv_mms_create_rsp_struct
**       user_data-- 
** 返回: 是否成功
** 作者: wasfayu
*******/
static void msgcmd_CreateAndSendMMSCb(
    srv_mms_result_enum result,void *rsp_data,S32 user_data)
{
	srv_mms_create_rsp_struct *rsp = (srv_mms_create_rsp_struct*)rsp_data;
    MsgCmdMMSUserData         *usd = (MsgCmdMMSUserData*)user_data;

	if (SRV_MMS_RESULT_OK == result)
	{
		srv_mms_send_req_struct req;
        
		req.msg_id       = rsp->msg_id;
		req.send_setting = SRV_MMS_SETTING_SEND_ONLY;
		req.sim_id       = (usd->sim==MMA_SIM_ID_SIM2) ? MMI_SIM_ID_SIM2 : MMI_SIM_ID_SIM1;
		req.storage_type = MMA_MSG_STORAGE_CARD1;
		req.is_rr        = MMI_TRUE;
		srv_mms_send(&req);
	}

    //FS_Delete(usd->xmlpath);
    OslMfree(usd);
        
	mc_trace("%s,result=%d,msg_id=%d. rsp->result=%d.",__FUNCTION__,result,rsp->msg_id,rsp->result);
}

/*******************************************************************************
** 函数: MsgCmd_CreateAndSendMMS
** 功能: 创建并且发送MMS
** 入参: xml_path  -- MMS布局文件,里面已经包含有电话号码这些了
**       sim       -- mma_sim_id_enum
** 返回: 是否成功
** 作者: wasfayu
*******/
MMI_BOOL MsgCmd_CreateAndSendMMS(
    mma_sim_id_enum sim,WCHAR          *xml_path)
{
	MMI_BOOL result = MMI_FALSE;

    if (mms_is_ready() && srv_nw_usab_is_any_network_available())
    {
        srv_mms_create_req_struct createReq;
        MsgCmdMMSUserData        *userdata;

        memset(&createReq,sizeof(srv_mms_create_req_struct));
        userdata = (MsgCmdMMSUserData*)OslMalloc(sizeof(MsgCmdMMSUserData));
		memset(userdata,sizeof(MsgCmdMMSUserData));
        userdata->sim = sim;
        app_ucs2_strcpy((S8*)userdata->xmlpath,(const S8*)xml_path);
        
        //createReq.msg_file_path[MMA_MAX_INTERNAL_FILENAME_LENGTH];
        app_ucs2_strcpy((S8*)createReq.xml_filepath,(const S8*)xml_path);
        createReq.user_data = (S32)userdata;
        createReq.msg_id    = 0;
        createReq.app_id    = MMA_APP_ID_BGSR; //这个app id可以忽略
        createReq.mode      = MMA_MODE_EDIT; //这里必须是edit
        createReq.sim_id    = sim;
        createReq.xml_size  = applib_get_file_size(createReq.xml_filepath);
        createReq.call_back = msgcmd_CreateAndSendMMSCb;
        
        result = (MMI_BOOL)(SRV_MMS_RESULT_OK == srv_mms_create(&createReq));
    }
	
	mc_trace("%s,result=%d.",result);
    return result;
}
#endif

/*******************************************************************************
** 函数: MsgCmd_GetUsableDrive
** 功能: 获取系统可用的存储设备盘符
** 参数: 
** 返回: 返回盘符 0x43~0x47
** 作者: wasfayu
*******/
S32 MsgCmd_GetUsableDrive(void)
{
    S32 drive = SRV_FMGR_CARD_DRV;

    if(!srv_fmgr_drv_is_accessible(drive))
    {
        drive = SRV_FMGR_PUBLIC_DRV;
    }

    return drive;
}


/*******************************************************************************
** 函数: MsgCmd_CombineFilePath
** 功能: 组成文件绝对路径,目录深度为一级
** 参数: pathbuffer     -- 装载输出路径的buffer
**       length_in_byte -- out的长度,以字节为单位,长度应该大于32个字节以上
**       folder         -- 文件夹的名字,如 L"audio"
**       ext_name       -- 扩展名的名字,如 L".mp3"
** 返回: 返回文件名地址,即没有前面的path,指向pathbuffer中某个元素的地址
** 作者: wasfayu
*******/
WCHAR *MsgCmd_CombineFilePath(
    WCHAR *pathbuffer,U16   length_in_byte,const WCHAR *folder,const WCHAR *ext_name)
{	
	applib_time_struct mt;
    WCHAR *filename;

    ASSERT(NULL != pathbuffer);
    ASSERT(NULL != folder);
    ASSERT(NULL != ext_name);
    
	memset(pathbuffer,length_in_byte);

    //先打印路径
	kal_wsprintf(
		(WCHAR*)pathbuffer,"%c:\\%w\\",folder);

    //再打印文件名
    filename = pathbuffer + app_ucs2_strlen((const kal_int8 *)pathbuffer);
	applib_dt_get_date_time(&mt);
#if defined(WIN32)
    kal_wsprintf(
        filename,"%04d-%02d-%02d %02d%02d%02d%w",mt.nYear,mt.nMonth,mt.nDay,mt.nSec,ext_name);
#else
    kal_wsprintf(
        filename,"%04d%02d%02d%02d%02d%08X%w",drv_get_current_time(),ext_name);	
#endif

	return filename;
}

/*******************************************************************************
** 函数: MsgCmd_SendIlm2Mmi
** 功能: 发送消息到MMI模块
** 参数: msgid  -- 消息ID
**       msg    -- 消息
** 返回: 无
** 作者: wasfayu
*******/
void MsgCmd_SendIlm2Mmi(msg_type msgid,void *msg)
{
    MYQUEUE message;
    
    message.oslMsgid = msgid;
    message.oslDataPtr = (local_para_struct *)msg;
    message.oslPeerBuffPtr = NULL;
    message.oslSrcId = MOD_MMI;
    message.oslDestId = MOD_MMI;
    mmi_msg_send_ext_queue(&message);  
}


/*******************************************************************************
** 函数: TestMMSEntrance
** 功能: MMS发送测试入口
** 参数: msgid  -- 消息ID
**       msg    -- 消息
** 返回: 无
** 作者: wasfayu
*******/
void TestMMSEntrance(char *number)
{
	MsgCmdMMSReq *req;

	if (NULL == number)
		return;
	
	req = (MsgCmdMMSReq*)construct_local_para(sizeof(MsgCmdMMSReq),TD_CTRL | TD_RESET);
	
    //自己定义一个消息ID -- MSG_ID_MC_SEND_MMS_REQ
#error please define one message ID.
	mmi_frm_set_protocol_event_handler(
	        MSG_ID_MC_SEND_MMS_REQ,(PsIntFuncPtr)msgcmd_SendMMSResponse,MMI_FALSE);

	//这里请自己combine一个文件名字,目前仅仅是用来测试jpg图片的,暂时不支持其他
#error please modify code here -- req->picpath.
	req->picname = MsgCmd_CombineFilePath(
                    req->picpath,MSGCMD_FILE_PATH_LENGTH*sizeof(WCHAR),MSGCMD_PHOTOS_FOLDER_NAME,L".jpg");
		
	req->sim = MMA_SIM_ID_SIM1;
    strcpy(req->sendto,number);            
    kal_wsprintf(req->subject,"%w",req->picname);
    MsgCmd_SendIlm2Mmi((msg_type)MSG_ID_MC_SEND_MMS_REQ,(void *)req);
}
好吧,当你看完上面的代码,我就不需要再做什么解说了,相信你已经能够理解了。转载请保持原文的完整性并注明原文出处!

原文地址:https://www.jb51.cc/xml/300141.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。