⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfw_sms.c

📁 GSM手机设计软件代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				sms_mt.index = conc_index;

				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;
				}
				/* 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*/
				if (conc_data_ext.len > MAX_MSG_LEN)
				  sms_mt.msg_len = MAX_MSG_LEN;
				else
				  sms_mt.msg_len = conc_data_ext.len;
				/*copy all data from concat SMS*/
				memcpy(sms_mt.sms_msg, (char*)conc_data_ext.data, sms_mt.msg_len);
				/* Free memory allocated by the ACI */
				MFREE(conc_data_ext.data);
				sms_mt.udh_len = sm->udh.len;
				memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);

          			  sms_type = MFW_NO_MESSAGE;

          			  coll_sms_read = MFW_SMS_FREE;
         			  sms_signal(E_SMS_MT, &sms_mt);
         			  
					}
				}
	  		}
			else
			{
#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

				if (sm->toa.ton == TON_International)
					sprintf(sms_mt.orig_addr.number, "+%s", sm->adress);
				else
					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;
				}
				/* SBH end */

				TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);

				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;
				/* SBH decoded_dcs = cmhSMS_getAlphabetPp (sm->dcs); */

				sms_mt.msg_len = sm->data.len;
				TRACE_EVENT_P2("msg_len %d, data.len %d", sms_mt.msg_len, sm->data.len);


				memcpy(sms_mt.sms_msg, (char *)sm->data.data, sms_mt.msg_len);
				sms_mt.udh_len = sm->udh.len;
				memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
				sms_type = MFW_NO_MESSAGE;
				TRACE_EVENT("read=free1");
				coll_sms_read = MFW_SMS_FREE;
				sms_signal(E_SMS_MT, &sms_mt);
			}
        }
        else
        {
          TRACE_EVENT("f_update = MFW_SMS_UPDATE");
		if ((received_sms_type == CONCATE && concatenated_status==CONC_COMPLETED)
			|| received_sms_type != CONCATE)
		{
		sms_store_new_msg_info(sms_id.index, sm, TRUE);
              sms_update_ready();

        }
          break;

        case 0x01:
        	{
        	received_sms_type = SMS_getSMSType( &sm->udh);
		  	TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
  			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);
	  		}

          	TRACE_EVENT_P1("UDH Length is = %d", sm->udh.len);

	  		if (received_sms_type == CONCATE)
	  		{
			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("Concatenation Continued");
					break;
				case CONC_COMPLETED:
				{
					  TRACE_EVENT("Concatenation Completed");
					  memset(&sms_mo, 0, sizeof(sms_mo));

					  TRACE_EVENT_P2("msg_len: %d conc len: %d", sms_mo.msg_len, conc_data_ext.len);

#ifdef NO_ASCIIZ
			          memcpy(sms_mo.dest_addr.tag,
			                 sm->alpha.data,
			                 sm->alpha.len);
			          sms_mo.dest_addr.len = sm->alpha.len;
#else
			          phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mo.dest_addr.tag);
#endif
			          strcpy(sms_mo.dest_addr.number, sm->adress);
			          sms_mo.dest_addr.ton = phb_cvtTon(sm->toa.ton);
			          sms_mo.dest_addr.npi = phb_cvtNpi(sm->toa.npi);
			          if (sm->tosca.ton == TON_International)
			            sprintf(sms_mo.sc_addr, "+%s", sm->sca);
			          else
				        strcpy((char *)sms_mo.sc_addr, sm->sca);

			          sms_mo.prot_id = (UBYTE)sm->pid;
			          sms_mo.dcs     = sm->dcs;
			          sms_mo.msg_ref = sm->msg_ref;
			          sms_mo.vp_mode = 0x03 & sm->fo << 2;
			          sms_mo.vp_rel  = (UBYTE)sm->vp_rel;


			          memcpy((char *)sms_mo.vp_abs.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
			          memcpy((char *)sms_mo.vp_abs.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
			          memcpy((char *)sms_mo.vp_abs.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
			          memcpy((char *)sms_mo.vp_abs.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
			          memcpy((char *)sms_mo.vp_abs.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
			          memcpy((char *)sms_mo.vp_abs.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
			          sms_mo.vp_abs.timezone = sm->scts.timezone;

					/* copy length of whole concat SMS*/
					  if (conc_data_ext.len > MAX_MSG_LEN)
					  	sms_mo.msg_len = MAX_MSG_LEN;
					  else
					    sms_mo.msg_len = conc_data_ext.len;

					  memcpy(sms_mo.sms_msg, (char*)conc_data_ext.data, sms_mo.msg_len);
					/* Free memory allocated by the ACI */
					  MFREE(conc_data_ext.data);

			          sms_type = MFW_NO_MESSAGE;
			          sms_signal(E_SMS_MO, &sms_mo);
					}
				}
	  		}
			else
			{
#ifdef NO_ASCIIZ
          memcpy(sms_mo.dest_addr.tag,
                 sm->alpha.data,
                 sm->alpha.len);
          sms_mo.dest_addr.len = sm->alpha.len;
#else
          phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mo.dest_addr.tag);
#endif
          strcpy(sms_mo.dest_addr.number, sm->adress);
          sms_mo.dest_addr.ton = phb_cvtTon(sm->toa.ton);
          sms_mo.dest_addr.npi = phb_cvtNpi(sm->toa.npi);
          if (sm->tosca.ton == TON_International)
            sprintf(sms_mo.sc_addr, "+%s", sm->sca);
          else
          	strcpy((char *)sms_mo.sc_addr, sm->sca);

          sms_mo.prot_id = (UBYTE)sm->pid;
          sms_mo.dcs     = sm->dcs;
          sms_mo.msg_ref = sm->msg_ref;
          sms_mo.vp_mode = 0x03 & sm->fo << 2;
          sms_mo.vp_rel  = (UBYTE)sm->vp_rel;

          memcpy((char *)sms_mo.vp_abs.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
          memcpy((char *)sms_mo.vp_abs.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
          memcpy((char *)sms_mo.vp_abs.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
          memcpy((char *)sms_mo.vp_abs.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
          memcpy((char *)sms_mo.vp_abs.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
          memcpy((char *)sms_mo.vp_abs.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
          sms_mo.vp_abs.timezone = sm->scts.timezone;

		  TRACE_EVENT("Normal MO Message");
          sms_mo.msg_len = sm->data.len;
          memcpy(sms_mo.sms_msg, (char *)sm->data.data, sm->data.len);

          sms_type = MFW_NO_MESSAGE;
          sms_signal(E_SMS_MO, &sms_mo);
				}
        	}
          break;

        default:
          sms_signal(E_SMS_ERR, NULL);
      	}
    	}
  	}
      break;

      case MFW_CB_MESSAGE:
        sms_cb.sn     = cbm->sn;
        sms_cb.msg_id = cbm->mid;
        sms_cb.dcs    = cbm->dcs;
        sms_cb.page   = cbm->page;
        sms_cb.pages  = cbm->pages;
        sms_cb.msg_len = cbm->data.len;
        memcpy((char *)sms_cb.cb_msg, (char *)cbm->data.data, cbm->data.len);

        /* send cell broadcast message event */
        sms_type = MFW_NO_MESSAGE;
        sms_signal(E_SMS_CB, &sms_cb);
        break;

      case MFW_NO_MESSAGE:
        TRACE_EVENT("read=free no msg");
        coll_sms_read = MFW_SMS_FREE;
        if(coll_sms_read EQ MFW_SMS_WAIT)
          coll_sms_read = MFW_SMS_FREE;
        break;
  }

  sms_check_mt_update();
{
	TRACE_EVENT_P4("CMGR 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("CMGR Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
}

}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : MFW_SMS                  |
| STATE   : code                  ROUTINE : rAT_PlusCMGD             |
+--------------------------------------------------------------------+

  PURPOSE :
*/
GLOBAL void rAT_PlusCMGD ()
{
  TRACE_FUNCTION ("rAT_PlusCMGD");
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : sms_store         |
+--------------------------------------------------------------------+

   PURPOSE :  Save a short message.

  GW 09/10/01 - Modified code to always save the maximum message length
*/
#ifdef NO_ASCIIZ
T_MFW sms_store(T_MFW_SMS_MO_TYPE type,
				CHAR *addr,
                UBYTE *msg,
                USHORT msg_len,
				CHAR *sca)
#else
T_MFW sms_store(T_MFW_SMS_MO_TYPE type,
				CHAR *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    data;
#else
  T_SM_DATA_EXT		conc_data_ext;
#endif
  SHORT            rp;

  TRACE_FUNCTION ("sms_store()");


  /* check whether memory is full */
  if (memory.used == memory.total)
  {
    sms_signal(E_SMS_MEM_FULL, 0);
    return MFW_SMS_FAIL;
  }

  if (type == MFW_SMS_REPLY     OR
      type == MFW_SMS_REPLY_SENT  )
    rp = 0;   /* reply path = 0 */
  else
    rp = -1;  /* reply path = default */

#ifdef NO_CONCAT
  if (msg_len < MAX_SM_LEN)
  {
	  data.len = msg_len;
  }
  else
  {
	  data.len = MAX_SM_LEN;
  }
  memcpy((char *)data.data, (char *)msg, MAX_SM_LEN);
#else
	conc_data_ext.len = msg_len;
  conc_data_ext.data = msg;
#endif

  if (type == MFW_SMS_REPLY_SENT  OR
      type == MFW_SMS_SUBMIT_SENT   )
    sentStatus =  SMS_STAT_StoSent;
  else
    sentStatus =  SMS_STAT_StoUnsent;

#ifdef NO_CONCAT
  if (sAT_PlusCMGW_Old(CMD_SRC_LCL, 0, addr, NULL, /* => addr analysed by ACI */
                       sentStatus, 0xFF,   /* unknown message reference */
                       &data, sca,
                       NULL, rp) NEQ AT_EXCT)
#else
  if (sAT_PlusCMGW(CMD_SRC_LCL, 0, addr, NULL, /* => addr analysed by ACI */
                       sentStatus, 0xFF,   /* unknown message reference */
                       &conc_data_ext, sca,
                       NULL, rp) NEQ AT_EXCT)
#endif
  {
    TRACE_EVENT("sAT_PlusCMGW error");
    return MFW_SMS_FAIL;
  }

  wr_addr = addr;
  sms_type = MFW_WR_NEW_MESSAGE;
  return MFW_SMS_OK;
}




/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : sms_mt_store      |
+--------------------------------------------------------------------+

   PURPOSE :  Save a MT message.

*/

T_MFW sms_mt_store(T_MFW_SMS_MT *mt_msg, T_MFW_SMS_STAT stat)
{
#ifdef NO_CONCAT
  T_ACI_SM_DATA    data;
#else
  T_SM_DATA_EXT		conc_data_ext;
#endif
  T_ACI_TOA        toa;

  TRACE_FUNCTION ("sms_mt_store()");

  /* check whether memory is full */
  if (memory.used == memory.total)
  {
    sms_signal(E_SMS_MEM_FULL, 0);
    return MFW_SMS_FAIL;
  }

#ifdef NO_CONCAT
  data.len = mt_msg->msg_len;
  memcpy((char *)data.data, (char *)mt_msg->sms_msg, data.len);
#else
  conc_data_ext.len = mt_msg->msg_len;
  conc_data_ext.data = (UBYTE *)mt_msg->sms_msg;
#endif

  toa.ton = phb_ncvtTon(mt_msg->orig_addr.ton);
  toa.npi = phb_ncvtNpi(mt_msg->orig_addr.npi);

#ifdef NO_CONCAT
  if (sAT_PlusCMGW_Old(CMD_SRC_LCL, 0, mt_msg->orig_addr.number,
                   &toa, sms_codeStatus(stat), 0,  /* no message reference */
                   &data,
                   mt_msg->sc_addr, NULL, -1) NEQ AT_EXCT)
#else
  if (sAT_PlusCMGW(CMD_SRC_LCL, 0, mt_msg->orig_addr.number,
                   &toa, sms_codeStatus(stat), 0,  /* no message reference */
                   &conc_data_ext,
                   mt_msg->sc_addr, NULL, -1) NEQ AT_EXCT)
#endif
  {
    TRACE_EVENT("sAT_PlusCMGW error");
    return MFW_SMS_FAIL;
  }

  sms_type = MFW_WR_NEW_MESSAGE;
  return MFW_SMS_OK;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE: MFW_SMS     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -