sms.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:3k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * sms.c - features specific to SMS but not particular to any SMSC protocol.
  3.  *
  4.  * This file current contains very little, but sms features that are
  5.  * currently implemented separately in each protocol should be extracted
  6.  * and placed here.
  7.  */
  8. #include "sms.h"
  9. /* 
  10.  * Encode DCS using sms fields
  11.  * mode = 0= encode using 00xxx, 1= encode using Fx mode
  12.  *
  13.  */
  14. int fields_to_dcs(Msg *msg, int mode) {
  15.     int dcs=0;
  16.     /* Coding defaults to 7BIT or to 8BIT if udh is set */
  17.     if (msg->sms.coding == DC_UNDEF) {
  18. if (octstr_len(msg->sms.udhdata))
  19.   msg->sms.coding = DC_8BIT;
  20. else
  21.   msg->sms.coding = DC_7BIT;
  22.     }
  23.     /* MWI */
  24.     if (msg->sms.mwi != MWI_UNDEF) {
  25. dcs = msg->sms.mwi - 1;  /* sets bits 1 and 0 */
  26. if (dcs & 0x04)
  27.     dcs = (dcs & 0x03) | 0xC0; /* MWI Inactive */
  28. else {
  29.     dcs = (dcs & 0x03) | 0x08; /* MWI Active, sets bit 3 */
  30.     if (! octstr_len(msg->sms.msgdata))
  31. dcs |= 0xC0; /* Discard */
  32.     else
  33. if (msg->sms.coding == DC_7BIT)
  34.     dcs |= 0xD0; /* 7bit */
  35. else
  36.     dcs |= 0xE0; /* UCS2 */
  37.      /* XXX Shouldn't happen to have mwi and dc=DC_8BIT! */
  38. }
  39.     }
  40.     /* Non-MWI */
  41.     else {
  42. /* mode 0 */
  43. if (mode == 0 || msg->sms.coding == DC_UCS2 || msg->sms.compress) { 
  44.     /* bits 7,6 are 0 */
  45.     if (msg->sms.compress)
  46. dcs |= 0x20; /* sets bit 5 */
  47.     if (msg->sms.mclass)
  48. dcs |= 0x10 | (msg->sms.mclass - 1); /* sets bit 4,1,0 */
  49.     if (msg->sms.coding)
  50. dcs |= ((msg->sms.coding - 1) << 2); /* sets bit 3,2 */
  51. /* mode 1 */
  52. else {
  53.     dcs |= 0xF0; /* sets bits 7-3 */
  54.     dcs |= (msg->sms.coding - 1) << 2; /* only DC_7BIT or DC_8BIT, sets bit 2*/
  55.     if (msg->sms.mclass == 0)
  56. dcs |= 1; /* sets bit 1,0 */
  57.     else
  58. dcs |= (msg->sms.mclass - 1); /* sets bit 1,0 */
  59. }
  60.     }
  61.     return dcs;
  62. }
  63. /*
  64.  * Decode DCS to sms fields
  65.  */
  66. int dcs_to_fields(Msg **msg, int dcs) {
  67.     /* Non-MWI Mode 1 */
  68.     if ((dcs & 0xF0) == 0xF0) { 
  69. dcs &= 0x07;
  70. (*msg)->sms.coding = (dcs & 0x04) ? DC_8BIT : DC_7BIT; /* grab bit 2 */
  71. (*msg)->sms.mclass = 1 + (dcs & 0x03); /* grab bits 1,0 */
  72.     }
  73.     
  74.     /* Non-MWI Mode 0 */
  75.     else if ((dcs & 0xC0) == 0x00) { 
  76. (*msg)->sms.compress = ((dcs & 0x20) == 0x20) ? 1 : 0; /* grab bit 5 */
  77. (*msg)->sms.mclass = ((dcs & 0x10) == 0x10) ? 1 + (dcs & 0x03) : 0; 
  78.     /* grab bit 0,1 if bit 4 is on */
  79. (*msg)->sms.coding = 1 + ((dcs & 0x0C) >> 2); /* grab bit 3,2 */
  80.     }
  81.     /* MWI */
  82.     else if ((dcs & 0xC0) == 0xC0) { 
  83. (*msg)->sms.coding = ((dcs & 0x30) == 0x30) ? DC_UCS2 : DC_7BIT;
  84. if (dcs & 0x08)
  85.     dcs |= 0x04; /* if bit 3 is active, have mwi += 4 */
  86. dcs &= 0x07;
  87.   (*msg)->sms.mwi = 1 + dcs ; /* grab bits 1,0 */
  88.     } 
  89.     
  90.     else {
  91. return 0;
  92.     }
  93.     return 1;
  94. }
  95. /*
  96.  * Compute length of an Octstr after it will be converted to GSM 03.38 
  97.  * 7 bit alphabet - escaped characters would be counted as two septets
  98.  */
  99. int sms_msgdata_len(Msg* msg) {
  100. int ret = 0;
  101. Octstr* msgdata = NULL;
  102. /* got a bad input */
  103. if (!msg || !msg->sms.msgdata) 
  104. return -1;
  105. if (msg->sms.coding == DC_7BIT) {
  106. msgdata = octstr_duplicate(msg->sms.msgdata);
  107. charset_latin1_to_gsm(msgdata);
  108. ret = octstr_len(msgdata);
  109. octstr_destroy(msgdata);
  110. } else 
  111. ret = octstr_len(msg->sms.msgdata);
  112. return ret;
  113. }