📄 mfw_sms.c
字号:
*/
if (!fg)
{
TRACE_EVENT("sms_change_read_status No index match-ERROR");
return 0;
}
/*CONQUEST 5991- MC- Changed third parameter in function call*/
ret = sAT_PlusCMGR(CMD_SRC_LCL, (UBYTE)index, /*READ_STATUS_CHANGE*/SMS_READ_StatusChange);
if (ret NEQ AT_CMPL AND ret NEQ AT_EXCT)
{
TRACE_EVENT("sms_change_read_status ERROR");
fg = 0;
return 0;
}
/*CONQUEST 5991- MC- Added line to set current message to "read" status*/
if ( msg_info[i].stat == MFW_SMS_STOR_UNSENT)
msg_info[i].stat = MFW_SMS_STOR_SENT;
else
msg_info[i].stat = MFW_SMS_READ;//MC
status_change_index = index;
return 1;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : sms_submit |
+--------------------------------------------------------------------+
PURPOSE : Send a mobile originated short massage.
GW 09/10/01 - Modified code to always copy entire (possible) message length
*/
#ifdef NO_ASCIIZ
T_MFW sms_submit(T_MFW_SMS_MO_TYPE type,
CHAR *dest_addr,
UBYTE *msg,
USHORT msg_len,
CHAR *sca)
#else
T_MFW sms_submit(T_MFW_SMS_MO_TYPE type,
CHAR *dest_addr,
UBYTE *msg,
USHORT msg_len,
CHAR *sca)
// sbh - added length to the above definition, since '@' characters stored as NULL & will stop
// strlen from working properly.
#endif
{
#ifdef NO_CONCAT
T_ACI_SM_DATA dat;
#else
T_SM_DATA_EXT conc_data_ext;
#endif
SHORT rp;
TRACE_FUNCTION ("sms_submit()");
if (type == MFW_SMS_REPLY)
rp = 0; /* reply path = 0 */
else
rp = -1; /* reply path = default */
#ifdef NO_CONCAT /* SBH */
if (msg_len > MAX_SM_LEN)
{
dat.len = MAX_SM_LEN;
}
else
{
dat.len = msg_len;
}
memcpy((char *)dat.data, (char *)msg, MAX_SM_LEN);
if (sAT_PlusCMGS_Old(CMD_SRC_LCL, dest_addr, NULL, &dat, sca, NULL, rp) NEQ AT_EXCT)
return MFW_SMS_FAIL;
#else
conc_data_ext.len = msg_len;
conc_data_ext.data = msg;
if (sAT_PlusCMGS(CMD_SRC_LCL, dest_addr, NULL, &conc_data_ext, sca, NULL, rp) NEQ AT_EXCT)
return MFW_SMS_FAIL;
#endif
flag = 0;
return MFW_SMS_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : sms_stored_submit |
+--------------------------------------------------------------------+
PURPOSE : Send a stored mobile originated short massage.
*/
T_MFW sms_stored_submit(CHAR *dest_addr, UBYTE index)
{
TRACE_FUNCTION ("sms_stored_submit()");
if (sAT_PlusCMSS(CMD_SRC_LCL, index, dest_addr, NULL) NEQ AT_EXCT)
{
return MFW_SMS_FAIL;
}
storage_index = index;
return MFW_SMS_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : rAT_PlusCMSS |
+--------------------------------------------------------------------+
PURPOSE : Response of Send a stored mobile originated
short massage.
*/
void rAT_PlusCMSS (UBYTE mr, UBYTE numSeg)
{
TRACE_FUNCTION ("rAT_PlusCMSS()");
sms_update_msg_info(MFW_SMS_STOR_SENT);
sms_signal(E_SMS_MO_AVAIL, &mr);
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SMS |
| STATE : code ROUTINE : rAT_PlusCMT |
+--------------------------------------------------------------------+
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 = /*sm->data.len*/conc_data_ext.len;
memset(sms_mt.sms_msg, /*(char *)sm->data.data*/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);
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);
sms_signal(E_SMS_MT, &sms_mt);
}
/*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);
}
/*
+--------------------------------------------------------------------+
| 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)
{
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;
/* Ignore CMTI if initialising */
if (initialising_flag == FALSE)
{
#ifdef CONC_TEST
USHORT ref_num;
UBYTE max_num, seq_num;
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);
}
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);
/* 8-bit reference number */
if (sm->udh.data[0] EQ SMS_IEI_CONC_8BIT)
{
ref_num = sm->udh.data[2];
max_num = sm->udh.data[3];
seq_num = sm->udh.data[4];
}
/* 16-bit reference number */
if (sm->udh.data[0] EQ SMS_IEI_CONC_16BIT)
{
/* MSB */
ref_num = (sm->udh.data[2] & 0x00FF) << 8u; /* 23.040 9.1.2.1 */
/* LSB */
ref_num += sm->udh.data[3];
max_num = sm->udh.data[4];
seq_num = sm->udh.data[5];
}
TRACE_EVENT_P3("ref_num: 0x%04x, max_num: %u, seq_num: %u", ref_num, max_num, seq_num);
#endif
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);
#ifdef CONC_TEST
if (seq_num==1)
{
for (i=0; i<MAX_MESSAGES; i++)
{
if (concList[i].ref==0xFFFF)
{
concList[i].ref = ref_num;
concList[i].first_index = index;
break;
}
}
}
#endif
}
if ((received_sms_type == CONCATE && concatenated_status==CONC_COMPLETED)
|| received_sms_type !=CONCATE)
sms_store_new_msg_info(index,sm,TRUE);
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(index, mem, received_sms_type, concatenated_status);
}
f_update = MFW_SMS_FREE;
}
{
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);
}
/*
+------------------------------------------------------------------------+
| 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -