2009年1月8日 星期四

Mtk PhoneBook BackUp Case

MTK learn

平台: MTK 6225, PC VC6.0





A. SMS Send

void send_shortmsg(const char* szNumber, const char* szMsg)

{

mmi_sms_send_msg_req_struct* sendSms;

unsigned char dyn_ref_count;

unsigned short dyn_msg_len;

sendSms = (mmi_sms_send_msg_req_struct*) OslConstructDataPtr(sizeof(mmi_sms_send_msg_req_struct));

dyn_ref_count = sendSms->ref_count;

dyn_msg_len = sendSms->msg_len;

memset(sendSms, 0, sizeof(mmi_sms_send_msg_req_struct));

sendSms->ref_count = dyn_ref_count;

sendSms->msg_len = dyn_msg_len;

sendSms->reply_index= 0xffff; //MMI_FRM_SMS_INVALID_INDEX;

sendSms->dest.type = 129;

sendSms->dest.length = strlen((char *)szNumber);

memcpy((S8*)sendSms->dest.number, szNumber, sendSms->dest.length);

sendSms->dcs = SMSAL_DEFAULT_DCS;

sendSms->length = strlen(szMsg);

memcpy((S8*)sendSms->msg, (S8*)szMsg, sendSms->length);

SetProtocolEventHandler(msg_send_msg_rsp, PRT_MSG_ID_MMI_SMS_SEND_MSG_RSP);

mmi_frm_sms_send_message(MOD_MMI, MOD_L4C, 0, PRT_MSG_ID_MMI_SMS_SEND_MSG_REQ, (oslParaType*)sendSms, NULL);

}

void msg_send_msg_rsp (void* sendSms)

{

mmi_sms_send_msg_rsp_struct *msgRsp = (mmi_sms_send_msg_rsp_struct *)sendSms;

if((msgRsp->result) == TRUE)

{

// Add Program;

return;

}

else

{

// Add Program

OnPaint();

return;

}

}




B. Socket



1. 使用gineerModeSocketDemoApp.c mmi_soc_demo_app_request() Function , 可以做到 Http Get 功能,

但移動手機上網必須透過代理服務器. 所以必須修改部分程式.

手機上運行時連接到 10.0.0.172:80(移動網關) 要連上的網頁放在 GET 後面\

const char* url = {"http://10.0.0.172:80 GET http://www.abc.com/upload.asp?data="};

電腦模擬器上運行, 需先把模擬器中的手機裡移動網關設為 0.0.0.0:0

url 也改為如下直連的設置方式

const char* d1 = {"http://www.abc.com:80 GET /upload.asp?data="};

程序中調用MTKHTTP GET 程序, 第一個參數設為HTTP, 代表使用HTTP GET.

第二個參數10, 代表要使用的 gprs network account id.

目前使用的手機在網路連接方式的設定中 GSM數據裡面有10, GPRS 里有10.

我的手機裡GPRS里第1項是 cmwap. 設定為10就是選用這個cmwap連接方式.

TestEmSocketRsp 為回調函數

mmi_soc_demo_app_request(HTTP,10,NULL,Data_url,strlen(Data_url),NULL,0,TestEmSocketRsp);

執行這個程式後會返回server return 的值.

如果是在PC上運行可以得到server回應的數據. 但如果是真實的手機上運行因為連接的是移動網關

所以retrun的值中 的內容為重定向的網址, 再發一個HTTP GET 後接 go href 的內容,

便可以下載server回應的資料.

http://10.0.0.172:80 GET //www.abc.com /upload.asp?data=&t=70104

mmi_soc_demo_app_request 程式在接收到 return value, 呼叫 TestEmSocketRsp 後便會 close

socket connect,

所以必須修改這地方檢查到有 go Href , 不要 close socket connect,

此時再發上面所列的url, 便可以得到真正的值.


PS: mtk bug 提醒.

我所使用的6225 source code, en_soc_demo_http_send_request 函數中有一 Bug:

原程序中

if (soc_demo_transaction->url_parsed_info->url_link)

{

strcat((char*)soc_demo_transaction->snd_buffer,

(char*)soc_demo_transaction->url_parsed_info->url_link);

soc_demo_transaction->snd_data_len += soc_demo_transaction->url_parsed_info->url_link_len;

strcat((char*)soc_demo_transaction->snd_buffer, " ");

soc_demo_transaction->snd_data_len += 2;

}

else

{

strcat((char*)soc_demo_transaction->snd_buffer, "/ ");

soc_demo_transaction->snd_data_len += 2;

}

紅字的2應改為1, 這裡程序多加了1byte, 導致發出的訊息多了1byte,

http的命令是以兩個CRLF為結束判斷,多發一個byte,

HTTP serve 將誤認為有新的 http command, 等待輸入,

產生 Http Error 400, 以及 連線中斷.




C. PhoneBook


1. 存電話號碼


將資料放到以下變數中執行程式便可:

------------------------------------------------------------------------------

姓名 pbName

电话号码 pbNumber

家庭电话 pbHomeNumber

公司名称 pbCompanyName

电子信箱 pbEmailAddress

公司电话 pbOfficeNumber

传真号码 pbFaxNumber

birthday pbBday

------------------------------------------------------------------------------


int jun_put_phb_entry(void) {

MSG_PHB_SET_ENRTY_REQ_STRUCT *myMsgPtr;

MYQUEUE Message;

myMsgPtr = (MSG_PHB_SET_ENRTY_REQ_STRUCT*) OslConstructDataPtr(sizeof(MSG_PHB_SET_ENRTY_REQ_STRUCT));

myMsgPtr->type = MMI_PHB_PHONEBOOK;

myMsgPtr->no_data = 1;

myMsgPtr->list.storage = 2; //根據各手機, 設定值可能不同

myMsgPtr->list.index = 0xFFFF;

myMsgPtr->list.record_index = 0xFFFF;

mmi_phb_op_set_entry_prepare_name_number(&myMsgPtr->list, pbName, pbNumber);

Message.oslSrcId = MOD_MMI;

Message.oslDestId = MOD_L4C;

Message.oslMsgId = PRT_PHB_SET_ENTRY_REQ;

Message.oslDataPtr = (oslParaType*) myMsgPtr;

Message.oslPeerBuffPtr = NULL;

SetProtocolEventHandler(mmi_phb_op_add_entry_rsp, PRT_PHB_SET_ENTRY_RSP);

OslMsgSendExtQueue(&Message);

}


2. 讀電話號碼


程序如下, 讀到的資料存在上面所列的變數中:

int jun_get_phb_entry(int index)

{

/*----------------------------------------------------------------*/

/* Local Variables */

/*----------------------------------------------------------------*/

int t0;

U8 t1;

S8 *pbEntry[JUN_MAX_PB_FIELDS];

U16 DetailPbNameImageList[JUN_MAX_PB_FIELDS];

U8 *guiBuffer;

U8 field_index, item_index = 0;

#if !defined(__MMI_PHB_NO_OPTIONAL_FIELD__)

S16 pError;

#endif

U16 store_index;

U16 image_id;

PHB_OPTIONAL_IDS_STRUCT *opt_ids = NULL;

#if defined(__MMI_INCOMING_CALL_VIDEO__)

U16 video_id;

#endif

#if defined(__MMI_DOWNLOADABLE_THEMES_SUPPORT__)

BOOL found_theme_tone = TRUE;

#endif

g_phb_cntx.active_index = index;

/*----------------------------------------------------------------*/

/* Code Body */

/*----------------------------------------------------------------*/

if(index >= PhoneBookEntryCount )

return -1; //無資料

store_index = g_phb_name_index[g_phb_cntx.active_index];

mmi_ucs2cpy(pbName, (PS8) PhoneBook[store_index].alpha_id.name);

mmi_phb_convert_get_ucs2_number(pbNumber, store_index);

jun_mmi_phb_op_view_fill_item(

MMI_PHB_FIELD_NAME,

item_index,

&pbEntry[item_index],

TitleStrings,

DetailPbNameImageList);

item_index++;

jun_mmi_phb_op_view_fill_item(

MMI_PHB_FIELD_NUMBER,

item_index,

&pbEntry[item_index],

TitleStrings,

DetailPbNameImageList);

item_index++;

gPictureItemIndex = 0xff; /* Set to default before use. */

g_phb_cntx.selected_pic_index = 0;

gRingtoneItemIndex = 0xff;

g_phb_cntx.selected_ring_index = 0;

#if defined(__MMI_PHB_IMPS_FIELD__)

phb_imps_item_index = 0xff;

#endif

if (store_index >= MAX_PB_PHONE_ENTRIES) /* Record store in SIM, SIM index is begin from "MAX_PB_PHONE_ENTRIES" */

{

#if defined(__MMI_PHB_CALLERGROUP_IN_SIM__) /* Associate caller group in SIM card entry */

mmi_phb_build_caller_group_list();

mmi_phb_read_optional_ids(store_index);

opt_ids = (PHB_OPTIONAL_IDS_STRUCT*) g_phb_cntx.optional_ids;

g_phb_cntx.selected_grp_index = opt_ids->callerGroupID;

if (jun_mmi_phb_op_view_fill_item

(MMI_PHB_FIELD_GROUP, item_index, &pbEntry[item_index], TitleStrings, DetailPbNameImageList))

{

item_index++;

}

#elif defined(__MMI_PHB_USIM_FIELD__)

if (guiBuffer == NULL) /* First Time Enter */

{

mmi_phb_convert_get_ucs2_anr(pbHomeNumber, pbOfficeNumber, pbFaxNumber, store_index);

mmi_asc_to_ucs2(pbEmailAddress, (S8*) phb_email[store_index - MAX_PB_PHONE_ENTRIES].email_address);

}

mmi_phb_build_usim_group_list();

g_phb_cntx.selected_grp_index = g_phb_cntx.group_type[store_index - MAX_PB_PHONE_ENTRIES];

/* Fill inline item for each field */

for (field_index = (MMI_PHB_USIM_FIELD_ANRA); field_index <>

{

if (g_phb_cntx.support_field[field_index])

{

if (mmi_phb_op_view_fill_usim_item

(field_index, item_index, &pbEntry[item_index], TitleStrings, DetailPbNameImageList))

{

item_index++;

}

}

}

#endif

#ifdef __MMI_DUAL_SIM_MASTER__

if (store_index >= (MAX_PB_PHONE_ENTRIES + MAX_PB_SIM_ENTRIES))

{

image_id = IMG_ID_CARD2_PHB_STORAGE_SIM;

}

else

{

image_id = IMG_ID_CARD1_PHB_STORAGE_SIM;

}

#else /* __MMI_DUAL_SIM_MASTER__ */

image_id = IMG_STORAGE_SIM;

#endif /* __MMI_DUAL_SIM_MASTER__ */

}

else

{

mmi_phb_read_optional_ids(store_index);

opt_ids = (PHB_OPTIONAL_IDS_STRUCT*) g_phb_cntx.optional_ids;

ReadRecord(

NVRAM_EF_PHB_FIELDS_LID,

(U16) (store_index + 1),

(void*)&PhoneBookOptionalFields,

OPTIONAL_FIELDS_RECORD_SIZE,

&pError);

mmi_asc_to_ucs2(pbHomeNumber, (PS8) PhoneBookOptionalFields.homeNumber);

mmi_ucs2cpy(pbCompanyName, (PS8) PhoneBookOptionalFields.companyName);

mmi_asc_to_ucs2(pbEmailAddress, (PS8) PhoneBookOptionalFields.emailAddress);

mmi_asc_to_ucs2(pbOfficeNumber, (PS8) PhoneBookOptionalFields.officeNumber);

mmi_asc_to_ucs2(pbFaxNumber, (PS8) PhoneBookOptionalFields.faxNumber);

}

return 0;

}



static pBOOL jun_mmi_phb_op_view_fill_item(

U8 field_index,

U8 item_index,

S8 **entry_list,

U16 *title_list,

U16 *image_list)

{

/*----------------------------------------------------------------*/

/* Local Variables */

/*----------------------------------------------------------------*/

/*----------------------------------------------------------------*/

/* Code Body */

/*----------------------------------------------------------------*/

switch (field_index)

{

case MMI_PHB_FIELD_NAME:

*entry_list = pbName;

title_list[item_index] = STR_ID_PHB_NAME;

image_list[item_index] = IMG_NAME;

break;

case MMI_PHB_FIELD_NUMBER:

*entry_list = pbNumber;

title_list[item_index] = STR_ID_PHB_MOBILE_NUMBER;

image_list[item_index] = IMG_MOBILE_NUMBER;

break;

#if !defined(__MMI_PHB_NO_OPTIONAL_FIELD__)

case MMI_PHB_FIELD_HOME:

*entry_list = pbHomeNumber;

title_list[item_index] = STR_HOME_NUMBER;

image_list[item_index] = IMG_HOME_NUMBER;

break;

case MMI_PHB_FIELD_COMPANY_NAME:

*entry_list = pbCompanyName;

title_list[item_index] = STR_COMPNAY_NAME;

image_list[item_index] = IMG_COMPANY_NAME;

break;

case MMI_PHB_FIELD_EMAIL:

*entry_list = pbEmailAddress;

title_list[item_index] = STR_EMAIL_ADRESS;

image_list[item_index] = IMG_EMAIL_ADDRESS;

break;

case MMI_PHB_FIELD_OFFICE:

*entry_list = pbOfficeNumber;

title_list[item_index] = STR_OFFICE_NUMBER;

image_list[item_index] = IMG_OFFICE_NUMBER;

break;

case MMI_PHB_FIELD_FAX:

*entry_list = pbFaxNumber;

title_list[item_index] = STR_FAX_NUMBER;

image_list[item_index] = IMG_FAX_NUMBER;

break;

#endif /* !defined(__MMI_PHB_NO_OPTIONAL_FIELD__) */

case MMI_PHB_FIELD_PIC:

if (g_phb_cntx.selected_pic_index == 0)

{

return FALSE;

}

*entry_list = (PS8) g_phb_cntx.image_name_list[g_phb_cntx.selected_pic_index];

title_list[item_index] = STR_ASSOCIATE_PICTURE;

image_list[item_index] = IMG_PICTURE;

gPictureItemIndex = item_index;

return TRUE;

case MMI_PHB_FIELD_RING:

if (g_phb_cntx.selected_ring_index == 0)

{

return FALSE;

}

*entry_list = (PS8) g_phb_cntx.ring_tone_name_list[g_phb_cntx.selected_ring_index];

title_list[item_index] = STR_ASSOCIATE_SOUND;

image_list[item_index] = IMG_RING_TONE;

gRingtoneItemIndex = item_index;

return TRUE;

case MMI_PHB_FIELD_GROUP:

if (g_phb_cntx.selected_grp_index == 0)

{

return FALSE;

}

*entry_list = (PS8) myCallerGrpnames[g_phb_cntx.selected_grp_index];

title_list[item_index] = STR_CALLER_GROUP;

image_list[item_index] = IMG_CALLER_GROUP;

return TRUE;

#if defined(__MMI_PHB_BIRTHDAY_FIELD__)

case MMI_PHB_FIELD_BIRTHDAY:

if (mmi_ucs2cmp((const S8*)pbYear, (const S8*)MMI_PHB_BDAY_YEAR_STR) == 0 &&

mmi_ucs2cmp((const S8*)pbMon, (const S8*)MMI_PHB_BDAY_MON_STR) == 0 &&

mmi_ucs2cmp((const S8*)pbDay, (const S8*)MMI_PHB_BDAY_DAY_STR) == 0)

{

return FALSE;

}

else

{

mmi_ucs2cpy((S8*) pbBday, (S8*) pbYear);

mmi_ucs2cat((S8*) pbBday, (S8*) "/");

mmi_ucs2cat((S8*) pbBday, (S8*) pbMon);

mmi_ucs2cat((S8*) pbBday, (S8*) "/");

mmi_ucs2cat((S8*) pbBday, (S8*) pbDay);

*entry_list = (S8*) pbBday;

title_list[item_index] = STR_ID_PHB_BIRTHDAY;

image_list[item_index] = IMG_ID_PHB_BIRTHDAY;

return TRUE;

}

#endif /* defined(__MMI_PHB_BIRTHDAY_FIELD__) */

default:

return FALSE;

} // end of switch

if( field_index==9)

return FALSE;

if (field_index == MMI_PHB_FIELD_NAME || field_index == MMI_PHB_FIELD_NUMBER ||

(*entry_list && mmi_ucs2strlen(*entry_list) > 0))

{

return TRUE;

}

else

{

return FALSE;

}

}