转载请保持原文的完整性并注明原文出处!
在网上找了很久,没有找到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 *element_name, 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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh, 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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh, 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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh,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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh,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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh, !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, 0, 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, 0, str_len);
sprintf((char*)fg_color, "0x%06x", MMS_FOREGROUND_COLOR);
attr_list[i++] = (U8*) SRV_UC_XML_ATTR_FGCOLOR;
attr_list[i++] = fg_color;
/*-----slide number---------------------------------------------------*/
memset(slide_num, 0, 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, 0, 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, 0, 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, 0, 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, 0, str_len);
sprintf((char*)txt_fit, "%d", 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, 0, str_len);
bg_color[0] = '1'; //只有一张图片, 一个slide
attr_list[i++] = (U8*) SRV_UC_XML_ATTR_INDEX;
attr_list[i++] = bg_color;
/*--------------------------------------------------------------------*/
memset(fg_color, 0, 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, 0, 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, 0, 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, 0, 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, 0, 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, 0, 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, 0, 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, 0, str_len);
obj_num[0] = '0';
attr_list[i++] = (U8*) SRV_UC_XML_ATTR_DRM;
attr_list[i++] = obj_num;
/*-----size-----------------------------------------------------------*/
memset(layout, 0, str_len);
sprintf(layout, "%d", applib_get_file_size(param->picpath));
attr_list[i++] = (U8*) SRV_UC_XML_ATTR_SIZE;
attr_list[i++] = layout;
/*-----offset---------------------------------------------------------*/
memset(txt_fit, 0, str_len);
txt_fit[0] = '0';
attr_list[i++] = (U8*) SRV_UC_XML_ATTR_OFFSET;
attr_list[i++] = txt_fit;
/*-----encoding-------------------------------------------------------*/
memset(img_fit, 0, 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, NULL));
FUNC_FAIL_RETURN(srv_uc_create_xml_data_usc2_to_utf8(fh, (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, 0, 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",
MsgCmd_GetUsableDrive(),
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, 0, sizeof(srv_mms_create_req_struct));
userdata = (MsgCmdMMSUserData*)OslMalloc(sizeof(MsgCmdMMSUserData));
memset(userdata, 0, 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.", __FUNCTION__, 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, 0, length_in_byte);
//先打印路径
kal_wsprintf(
(WCHAR*)pathbuffer,
"%c:\\%w\\",
MsgCmd_GetUsableDrive(),
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.nHour,
mt.nMin,
mt.nSec,
ext_name);
#else
kal_wsprintf(
filename,
"%04d%02d%02d%02d%02d%08X%w",
mt.nYear,
mt.nMonth,
mt.nDay,
mt.nHour,
mt.nMin,
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);
}
好吧,当你看完上面的代码,我就不需要再做什么解说了,相信你已经能够理解了。转载请保持原文的完整性并注明原文出处!