📄 mfw_sms.c
字号:
+--------------------------------------------------------------------+
PURPOSE : Receive a new short message.
*/
void rAT_PlusCMT(T_ACI_CMGL_SM* sm)
{ T_SMS_TYPE received_sms_type;
T_CONC_ASSEMBLY_RETURN concatenated_status;
T_SM_DATA_EXT conc_data_ext;
int i;
TRACE_FUNCTION ("rAT_PlusCMT()");
TRACE_EVENT_P1("CMT, sm->data.len: %d", sm->data.len);
received_sms_type = SMS_getSMSType( &sm->udh);
if (received_sms_type == CONCATE)
{
concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);
for(i=0;i<conc_data_ext.len;i++)
{
TRACE_EVENT_P2("%02x, %c", conc_data_ext.data[i],conc_data_ext.data[i]);
}
switch (concatenated_status)
{
case CONC_ERR_UNKN:
TRACE_EVENT("Concatenated SMS error");break;
case CONC_ERR_BUF_FULL:
TRACE_EVENT("Concatented SMS buffer Full Error");break;
case CONC_CONTINUED: //not last SMS
TRACE_EVENT("Concatenated Continued!");
break;
case CONC_COMPLETED:
{
TRACE_EVENT("COncatenation Completed!");
memset(&sms_mt, 0, sizeof(sms_mt));
#ifdef NO_ASCIIZ
memcpy(sms_mt.orig_addr.tag,
sm->alpha.data,
sm->alpha.len);
sms_mt.orig_addr.len = sm->alpha.len;
#else
phb_Alpha2Gsm(sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
strcpy(sms_mt.orig_addr.number, sm->adress);
sms_mt.orig_addr.ton =
phb_cvtTon(sm->toa.ton);
sms_mt.orig_addr.npi =
phb_cvtNpi(sm->toa.npi);
if (sm->tosca.ton == TON_International)
sprintf(sms_mt.sc_addr, "+%s", sm->sca);
else
strcpy(sms_mt.sc_addr, sm->sca);
sms_mt.prot_id = (UBYTE)sm->pid;
sms_mt.dcs = (UBYTE)sm->dcs & 0xFC; /* Ignore message class */
sms_mt.rp = sm->fo >> 7 & 1;
/* SBH */
if (sm->dcs & 0x10) /* Bit 5 indicates that we should get message class from bits 0 & 1 */
{
sms_mt.ti = sm->dcs & 3;
}
else /* Otherwise, set to default value */
{
sms_mt.ti = 1;
}
TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);
/* SBH end */
memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
sms_mt.sctp.timezone = sm->scts.timezone;
/* copy length of whole concat SMS*/
sms_mt.msg_len = conc_data_ext.len;
memset(sms_mt.sms_msg, 0, sm->data.len);
/*copy all data from concat SMS*/
memcpy(sms_mt.sms_msg, (char*)conc_data_ext.data, conc_data_ext.len);
sms_mt.udh_len = sm->udh.len;
memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
/*SPR#1408 - DS - Now done at end of function
*sms_signal(E_SMS_MT, &sms_mt);
*/
}
}
}
else
{
memset(&sms_mt, 0, sizeof(sms_mt));
#ifdef NO_ASCIIZ
memcpy(sms_mt.orig_addr.tag,
sm->alpha.data,
sm->alpha.len);
sms_mt.orig_addr.len = sm->alpha.len;
#else
phb_Alpha2Gsm(sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
strcpy(sms_mt.orig_addr.number, sm->adress);
sms_mt.orig_addr.ton =
phb_cvtTon(sm->toa.ton);
sms_mt.orig_addr.npi =
phb_cvtNpi(sm->toa.npi);
if (sm->tosca.ton == TON_International)
sprintf(sms_mt.sc_addr, "+%s", sm->sca);
else
strcpy(sms_mt.sc_addr, sm->sca);
sms_mt.prot_id = (UBYTE)sm->pid;
sms_mt.dcs = (UBYTE)sm->dcs & 0xFC; /* Ignore message class */
sms_mt.rp = sm->fo >> 7 & 1;
/* PATCH JPS 04.10 END */
/* SBH */
if (sm->dcs & 0x10) /* Bit 5 indicates that we should get message class from bits 0 & 1 */
{
sms_mt.ti = sm->dcs & 3;
}
else /* Otherwise, set to default value */
{
sms_mt.ti = 1;
}
TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);
/* SBH end */
memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
sms_mt.sctp.timezone = sm->scts.timezone;
sms_mt.msg_len = sm->data.len;
memcpy(sms_mt.sms_msg, (char *)sm->data.data, sm->data.len);
sms_mt.udh_len = sm->udh.len;
memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
/*SPR#1408 - DS - Now done at end of function
*sms_signal(E_SMS_MT, &sms_mt);
*/
}
/*MC SPR 1364, need to call this function to update CPHS voicemail data*/
/*SPR#1408 - DS - Modified to store voicemail status in SMS structure. Port of 1669 */
if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
&sm->toa, &sm->udh) == MFW_SMS_VOICE)
{
sms_mt.voicemail = TRUE;
TRACE_EVENT("MT SMS is a voicemail message");
}
else
{
sms_mt.voicemail = FALSE;
}
sms_signal(E_SMS_MT, &sms_mt);
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : rAT_PlusCMTI |
+--------------------------------------------------------------------+
PURPOSE : Receive a new short message identifier.
*/
void rAT_PlusCMTI(T_ACI_SMS_STOR mem, UBYTE index, T_ACI_CMGL_SM* sm)
{
/* MZ 2260 Handset displays Message Full on receiving an SMS. */
//T_MFW_MEM_INFO memory;
T_ACI_RETURN ret;
T_SMS_TYPE received_sms_type;
T_CONC_ASSEMBLY_RETURN concatenated_status;
T_SM_DATA_EXT conc_data_ext;
int i, j;
#if (_PUSH_DETECT_ENABLE_ == 1)
UBYTE *push_data, push_msg_flag = 0;
USHORT push_data_len;
T_PUSH_MERGE *mergeBuf_slot;
T_PUSH_SEGBUF *segbuf_slot;
#endif
if (initialising_flag == FALSE)
{
/* Ignore CMTI if initialising */
#if (_PUSH_DETECT_ENABLE_ == 1)
PUSH_DET_TRACE(("Robert:rAT_PlusCMTI() idx=%d, uL=%d, dL=%d", sm->msg_ref, sm->udh.len, sm->data.len));
if(sm->udh.len > 0) /* is not a normal SM */
{
push_msg_flag = udh_adjust(sm->msg_ref, sm);
#ifdef _INNOVATION_EMULATOR_
if(sm->udh.len > 0)
{
if(sm->udh.data[0] == 0 || sm->udh.data[0] == 0x08)
received_sms_type = CONCATE;
}
else
received_sms_type = NORMAL;
#else
received_sms_type = SMS_getSMSType(&sm->udh);
#endif
if(push_msg_flag)
{
if(received_sms_type == CONCATE)
concatenated_status = push_merge_sms(sm, &mergeBuf_slot);
if((received_sms_type == CONCATE && concatenated_status == MERGE_STA_COMPLETE)
|| (received_sms_type != CONCATE))
{
if(received_sms_type != CONCATE)
{
push_data = sm->data.data;
push_data_len = sm->data.len;
}
else
{
push_data = mergeBuf_slot->data;
push_data_len = mergeBuf_slot->len;
}
if((push_data = push_appli_dispatch(push_data, &push_data_len, push_data_len)) != NULL)
{
PUSH_DET_TRACE(("rAT_PlusCMTI():write push msg to FFS:len=%d,DP=%d!", push_data_len, (UINT32)push_data));
MMS_SI_ind(push_data, push_data_len, sm->msg_ref);
}
else
{
if(received_sms_type != CONCATE)
ffs_fwrite("/mmi/pusherr", push_data, sm->data.len);
else
ffs_fwrite("/mmi/pusherr", push_data, mergeBuf_slot->len);
PUSH_DET_TRACE(("rAT_PlusCMTI():receive a port address message, but nott a MMS PUSH!"));
}
/* release merge buffer */
if(received_sms_type == CONCATE)
{
segbuf_slot = push_sbuf_getSlot(mergeBuf_slot->ref_num);
push_sbuf_clear(segbuf_slot, 0, 0xff);
push_mbuf_clear(mergeBuf_slot, 0, 0xff);
}
}
return;
}
}
#endif //_PUSH_DETECT_ENABLE_
TRACE_FUNCTION ("rAT_PlusCMTI()");
TRACE_EVENT_P1("f_update is = % in CMTI", f_update);
received_sms_type = SMS_getSMSType( &sm->udh);
TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
TRACE_EVENT_P2("msg_ref: %d, index: %d", sm->msg_ref, index);
if (received_sms_type == CONCATE)
{
if(initialising_flag == TRUE)
concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
else
concatenated_status =concSMS_Collect(&conc_data_ext, sm, TRUE);
TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);
}
sms_store_new_msg_info(index,sm,TRUE, concatenated_status);
if (f_update EQ MFW_SMS_UPDATE OR
coll_sms_send EQ MFW_SMS_WAIT OR
coll_sms_read EQ MFW_SMS_WAIT OR
coll_sms_delete EQ MFW_SMS_WAIT OR
coll_sms_req EQ MFW_SMS_WAIT)
{
if (sms_id_wait.index <= 0)
{
sms_id_wait.index = index;
sms_id_wait.mem = (mem EQ SMS_STOR_Me)? MFW_MEM_ME: MFW_MEM_SIM;
sms_id_wait.concat_status = concatenated_status;
sms_id_wait.received_sms_type = received_sms_type;
}
else
{
TRACE_EVENT("Indication Overrun");
}
f_update = MFW_SMS_UPDATE;
}
else
{
sms_send_new_msg_ind(sm,index, mem, received_sms_type, concatenated_status);
}
f_update = MFW_SMS_FREE;
/* glowing,2004-06-10, import from TCS2112 */
if(memory.total == memory.used)
{
TRACE_EVENT_P2("memory used is = %d, of %d", memory.used, memory.total);
sms_signal(E_SMS_MEM_FULL, NULL);
}
/* glowing,2004-06-10, end of import */
}
{
TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
}
/*MC SPR 1364, need to call this function to update CPHS voicemail data*/
sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
&sm->toa, &sm->udh);
/*SPR 2260, this is already called in sms_store_new_msg_info, BUT we need it in for initialisation*/
}
/*
+------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : find_slot_in_msg_info |
+------------------------------------------------------------------------+
PURPOSE : Find a slot in msg_info for the index of the SMS supplied
*/
static int find_slot_in_msg_info(UBYTE index, UBYTE update_mem)
{
int ret = -1;
int i;
TRACE_FUNCTION("find_slot_in_msg_info");
if (index >= 1)
{
/* A valid index, so look for it already being in msg_info */
for (i = 0; (i < MAX_MESSAGES) && (ret == -1); i++)
{
if (msg_info[i].index == index)
{
/* Index already in msg_info, so replace */
ret = i;
}
}
if (ret == -1)
{
/* Index was not already in msg_info, so look for unused slot */
for (i = 0; (i < MAX_MESSAGES) && (ret == -1); i++)
{
if (msg_info[i].index == -1)
{
/* First unused slot in msg_info found */
ret = i;
if (update_mem)
memory.used++;
}
}
}
}
TRACE_EVENT_P1("find_slot_in_msg_info returning %d", ret);
return ret;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : sms_store_new_msg_info |
+--------------------------------------------------------------------+
PURPOSE : Store message information
*/
T_MFW sms_store_new_msg_info(UBYTE index, T_ACI_CMGL_SM* sm, UBYTE update_mem, T_CONC_ASSEMBLY_RETURN conc_stat)
{
int j;
T_SMS_TYPE received_sms_type;
T_CONC_ASSEMBLY_RETURN concatenated_status;
T_SM_DATA_EXT conc_data_ext;
int i;
TRACE_EVENT("sms_store_new_msg_info");
sms_type = MFW_SMS_MESSAGE;
if ((j = find_slot_in_msg_info(index, update_mem)) != -1)
{
received_sms_type = SMS_getSMSType(&sm->udh);
TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
/*SPR 2260*/
if (received_sms_type == CONCATE)
{
/* glowing,2004-06-11, import from TCS2112 */
if (conc_stat == CONC_COMPLETED)
{ /*replace index withat of first message*/
index = concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress);
msg_info[j].concat_status = MFW_SMS_CONC_WHOLE;
TRACE_EVENT("Setting to WHOLE");
}
else /*otherwise leave index as it is*/
{ /*check if message already complete*/
for (i=0; i<MAX_MESSAGES; i++)
{ if (msg_info[i].index != -1)
{ if (msg_info[i].first_index == concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress)
&& msg_info[i].concat_status == MFW_SMS_CONC_WHOLE)
return;/*don't bother copying this message into the table*/
}
}
msg_info[j].concat_status = MFW_SMS_CONC_PART;
TRACE_EVENT("Setting to PART");
}
TRACE_EVENT_P1("index = %d",index);
msg_info[j].first_index =concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress);
/*if complete SMS, delete old fragments*/
if (conc_stat == CONC_COMPLETED)
for (i=0; i<MAX_MESSAGES; i++)
{
if (msg_info[i].index != -1)
{
if (msg_info[i].first_index == concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress)
&& msg_info[i].concat_status==MFW_SMS_CONC_PART)
{ TRACE_EVENT_P1("Deleting index number:%d", msg_info[i].index);
delete_sms_from_table(msg_info[i].index);;
}
}
}
}
else
{ msg_info[j].first_index = 0xFF;/*invalid index*/
msg_info[j].concat_status = MFW_SMS_NO_CONC;
TRACE_EVENT("Setting to NO CONC");
}
/* glowing,2004-06-11, end of import */
sm->index = index;
msg_info[j].index = index;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -