MTK两个常用函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、域名解析

对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。MTK 对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下

soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的

module_type mod_id, //调用该函数的模块id,也即将来接收消息的模块

kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用

const kal_char *domain_name,//域名

kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的

kal_uint8 *addr_len,//数据长度

kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了

kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白

)//

补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤

实例代码如下:

typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);

static mf_funcOnGetHostByName mf_dnsFunc = NULL;

#define MF_DNS_APPID 1

static void MF_dns_event(void * inMsg)

{

app_soc_get_host_by_name_ind_struct *dns_ind;

if( inMsg )

{

dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;

if (dns_ind->result == KAL_TRUE)

{

mf_u32 ipAddr = 0;

switch (dns_ind->request_id)

{

case MF_DNS_APPID:

ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);

kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);

MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);

if( mf_dnsFunc )

mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);

mf_dnsFunc = NULL;

break;

}

}

}

else if( mf_dnsFunc )

{

mf_dnsFunc(0,0);

}

}

mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func)

{

kal_int8 ret = MF_FALSE;

static kal_uint8 addr_len=0;

kal_uint32 nwk_account_id = mf_skt_account;

static kal_int16 sDNSHandle = MF_DNS_APPID;

static kal_uint32 ipAddr;

mf_dnsFunc = func;

ret = soc_gethostbyname(KAL_FALSE,

MOD_MMI,

(kal_int32)sDNSHandle,

(const kal_char *)server_domain,

(kal_uint8*)&ipAddr,

(kal_uint8*)&addr_len,

(kal_uint8)0,

nwk_account_id);

if (ret == SOC_SUCCESS)

{

kal_uint8 *ptr;

ptr = (kal_uint8*)&ipAddr;

kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);

if(hAddr)

*hAddr = MF_ntohl((mf_u32)ipAddr);

if(nAddr)

*nAddr = (mf_u32)ipAddr;

return MF_TRUE;

}

else if(ret == SOC_WOULDBLOCK)

{

SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);

}

kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);

return ret;

}

2、定制窗口的使用

一般我们创建mtk应用的时候,多多少少会用到Screen,而我们可以使用MTK自带的categories screen,这些封装好的函数,会完成两件重要的事情

第一是绘制我们自己创建的Screen,第二是检测该类型窗口的事件,当然MTK允许你设置一些事件的处理函数(也即钩子函数,Handler)。我们可以

在程序创建时调用EntryNewScreen,然后再调用ShowListCategoryScreen,绘制列表框窗口,并注册自己的highlight handler,当然也可,更进一步

即我们可以在这个screen上再绘制别的类型的窗口,比如ShowCategory74Screen,唯一需要注意的是,你需要把自己注册的钩子函数注销(干净的做法);

并且调用ExitListCategoryScreen(),来停止绘制列表框界面,再调用ShowCategory74Screen 开始绘制文本框。嘿嘿,这个方法很爽的。不过,有一点

需要注意,就是绘图很慢,显示下一个窗口需要延时显示,即调用ExitListCategoryScreen之后,延时一段时间后再调用ShowCategory74Screen,这样才

不会有“重影”。

补充:需要注意的是新窗口的建立撤销方法,我以实例说明,

static void MF_Scr_Exit(void)

{

MF_Exit_LastCategoriesScreen();

//if(new_scr_id == GetActiveScreenId())

// GoBackHistory();

//else

DeleteScreenIfPresent(new_scr_id);

if ( exit_func )

exit_func();

}

static void MF_Scr_Enter(void)

{

EntryNewScreen(new_scr_id, MF_Scr_Exit, MF_Scr_Enter, NULL);

if( enter_func )

enter_func();

}

相关文档
最新文档