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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * SMSC Connection
  3.  *
  4.  * Interface for main bearerbox to SMS center connection modules
  5.  *
  6.  * Kalle Marjola 2000 for project Kannel
  7.  */
  8. #include <signal.h>
  9. #include <time.h>
  10. #include "gwlib/gwlib.h"
  11. #include "smscconn.h"
  12. #include "smscconn_p.h"
  13. #include "bb_smscconn_cb.h"
  14. SMSCConn *smscconn_create(CfgGroup *grp, int start_as_stopped)
  15. {
  16.     SMSCConn *conn;
  17.     Octstr *smsc_type;
  18.     int ret;
  19.     
  20.     if (grp == NULL)
  21. return NULL;
  22.     
  23.     conn = gw_malloc(sizeof(SMSCConn));
  24.     conn->why_killed = SMSCCONN_ALIVE;
  25.     conn->status = SMSCCONN_CONNECTING;
  26.     conn->connect_time = -1;
  27.     conn->load = 0;
  28.     conn->is_stopped = start_as_stopped;
  29.     conn->received = counter_create();
  30.     conn->sent = counter_create();
  31.     conn->failed = counter_create();
  32.     conn->flow_mutex = mutex_create();
  33.     conn->name = NULL;
  34.     conn->shutdown = NULL;
  35.     conn->queued = NULL;
  36.     conn->send_msg = NULL;
  37.     conn->stop_conn = NULL;
  38.     conn->start_conn = NULL;
  39. #define GET_OPTIONAL_VAL(x, n) x = cfg_get(grp, octstr_imm(n))
  40.     
  41.     GET_OPTIONAL_VAL(conn->id, "smsc-id");
  42.     GET_OPTIONAL_VAL(conn->allowed_smsc_id, "allowed-smsc-id");
  43.     GET_OPTIONAL_VAL(conn->denied_smsc_id, "denied-smsc-id");
  44.     GET_OPTIONAL_VAL(conn->preferred_smsc_id, "preferred-smsc-id");
  45.     GET_OPTIONAL_VAL(conn->allowed_prefix, "allowed-prefix");
  46.     GET_OPTIONAL_VAL(conn->denied_prefix, "denied-prefix");
  47.     GET_OPTIONAL_VAL(conn->preferred_prefix, "preferred-prefix");
  48.     GET_OPTIONAL_VAL(conn->unified_prefix, "unified-prefix");
  49.     if (conn->allowed_smsc_id && conn->denied_smsc_id)
  50. warning(0, "Both 'allowed-smsc-id' and 'denied-smsc-id' set, deny-list "
  51. "automatically ignored");
  52.     
  53.     smsc_type = cfg_get(grp, octstr_imm("smsc"));
  54.     if (smsc_type == NULL) {
  55. error(0, "Required field 'smsc' missing for smsc group.");
  56. smscconn_destroy(conn);
  57. octstr_destroy(smsc_type);
  58. return NULL;
  59.     }
  60.     if (octstr_compare(smsc_type, octstr_imm("fake")) == 0)
  61. ret = smsc_fake_create(conn, grp);
  62.     else if (octstr_compare(smsc_type, octstr_imm("emi2")) == 0)
  63. ret = smsc_emi2_create(conn, grp);
  64.     else if (octstr_compare(smsc_type, octstr_imm("http")) == 0)
  65. ret = smsc_http_create(conn, grp);
  66.     else if (octstr_compare(smsc_type, octstr_imm("smpp")) == 0)
  67. ret = smsc_smpp_create(conn, grp);
  68.     else if (octstr_compare(smsc_type, octstr_imm("at2")) == 0)
  69. ret = smsc_at2_create(conn,grp);
  70.     else if (octstr_compare(smsc_type, octstr_imm("cgw")) == 0)
  71. ret = smsc_cgw_create(conn,grp);
  72.     else if (octstr_compare(smsc_type, octstr_imm("smasi")) == 0)
  73. ret = smsc_smasi_create(conn, grp);
  74.     else
  75. ret = smsc_wrapper_create(conn, grp);
  76.     octstr_destroy(smsc_type);
  77.     if (ret == -1) {
  78. smscconn_destroy(conn);
  79. return NULL;
  80.     }
  81.     gw_assert(conn->send_msg != NULL);
  82.     bb_smscconn_ready(conn);
  83.     
  84.     return conn;
  85. }
  86. void smscconn_shutdown(SMSCConn *conn, int finish_sending)
  87. {
  88.     gw_assert(conn != NULL);
  89.     mutex_lock(conn->flow_mutex);
  90.     if (conn->status == SMSCCONN_DEAD) {
  91. mutex_unlock(conn->flow_mutex);
  92. return;
  93.     }
  94.     /* Call SMSC specific destroyer */
  95.     if (conn->shutdown)
  96. conn->shutdown(conn, finish_sending);
  97.     else
  98. conn->why_killed = SMSCCONN_KILLED_SHUTDOWN;
  99.     mutex_unlock(conn->flow_mutex);
  100.     return;
  101. }
  102. int smscconn_destroy(SMSCConn *conn)
  103. {
  104.     if (conn == NULL)
  105. return 0;
  106.     if (conn->status != SMSCCONN_DEAD)
  107. return -1;
  108.     mutex_lock(conn->flow_mutex);
  109.     counter_destroy(conn->received);
  110.     counter_destroy(conn->sent);
  111.     counter_destroy(conn->failed);
  112.     octstr_destroy(conn->name);
  113.     octstr_destroy(conn->id);
  114.     octstr_destroy(conn->allowed_smsc_id);
  115.     octstr_destroy(conn->denied_smsc_id);
  116.     octstr_destroy(conn->preferred_smsc_id);
  117.     octstr_destroy(conn->denied_prefix);
  118.     octstr_destroy(conn->allowed_prefix);
  119.     octstr_destroy(conn->preferred_prefix);
  120.     octstr_destroy(conn->unified_prefix);
  121.     
  122.     mutex_unlock(conn->flow_mutex);
  123.     mutex_destroy(conn->flow_mutex);
  124.     
  125.     gw_free(conn);
  126.     return 0;
  127. }
  128. int smscconn_stop(SMSCConn *conn)
  129. {
  130.     gw_assert(conn != NULL);
  131.     mutex_lock(conn->flow_mutex);
  132.     if (conn->status == SMSCCONN_DEAD || conn->is_stopped != 0
  133. || conn->why_killed != SMSCCONN_ALIVE)
  134.     {
  135. mutex_unlock(conn->flow_mutex);
  136. return -1;
  137.     }
  138.     conn->is_stopped = 1;
  139.     if (conn->stop_conn)
  140. conn->stop_conn(conn);
  141.     
  142.     mutex_unlock(conn->flow_mutex);
  143.     return 0;
  144. }
  145. void smscconn_start(SMSCConn *conn)
  146. {
  147.     gw_assert(conn != NULL);
  148.     mutex_lock(conn->flow_mutex);
  149.     if (conn->status == SMSCCONN_DEAD || conn->is_stopped == 0) {
  150. mutex_unlock(conn->flow_mutex);
  151. return;
  152.     }
  153.     conn->is_stopped = 0;
  154.     if (conn->start_conn)
  155. conn->start_conn(conn);
  156.     mutex_unlock(conn->flow_mutex);
  157. }
  158. Octstr *smscconn_name(SMSCConn *conn)
  159. {
  160.     return conn->name;
  161. }
  162. Octstr *smscconn_id(SMSCConn *conn)
  163. {
  164.     return conn->id;
  165. }
  166. int smscconn_usable(SMSCConn *conn, Msg *msg)
  167. {
  168.     List *list;
  169.     gw_assert(conn != NULL);
  170.     if (conn->status == SMSCCONN_DEAD || conn->why_killed != SMSCCONN_ALIVE)
  171. return -1;
  172.     /* if allowed-smsc-id set, then only allow this SMSC if message
  173.      * smsc-id matches any of its allowed SMSCes
  174.      */
  175.     if (conn->allowed_smsc_id) {
  176. if (msg->sms.smsc_id == NULL)
  177.     return -1;
  178.         list = octstr_split(conn->allowed_smsc_id, octstr_imm(";"));
  179.         if (list_search(list, msg->sms.smsc_id, octstr_item_match) == NULL) {
  180.     list_destroy(list, octstr_destroy_item);
  181.     return -1;
  182. }
  183. list_destroy(list, octstr_destroy_item);
  184.     }
  185.     /* ..if no allowed-smsc-id set but denied-smsc-id and message smsc-id
  186.      * is set, deny message if smsc-ids match */
  187.     else if (conn->denied_smsc_id && msg->sms.smsc_id != NULL) {
  188.         list = octstr_split(conn->denied_smsc_id, octstr_imm(";"));
  189.         if (list_search(list, msg->sms.smsc_id, octstr_item_match) != NULL) {
  190.     list_destroy(list, octstr_destroy_item);
  191.     return -1;
  192. }
  193. list_destroy(list, octstr_destroy_item);
  194.     }
  195.     /* Have allowed */
  196.     if (conn->allowed_prefix && ! conn->denied_prefix && 
  197.        (does_prefix_match(conn->allowed_prefix, msg->sms.receiver) != 1))
  198. return -1;
  199.     /* Have denied */
  200.     if (conn->denied_prefix && ! conn->allowed_prefix &&
  201.        (does_prefix_match(conn->denied_prefix, msg->sms.receiver) == 1))
  202. return -1;
  203.     /* Have allowed and denied */
  204.     if (conn->denied_prefix && conn->allowed_prefix &&
  205.        (does_prefix_match(conn->allowed_prefix, msg->sms.receiver) != 1) &&
  206.        (does_prefix_match(conn->denied_prefix, msg->sms.receiver) == 1) )
  207. return -1;
  208.     /* then see if it is preferred one */
  209.     if (conn->preferred_smsc_id && msg->sms.smsc_id != NULL) {
  210.         list = octstr_split(conn->preferred_smsc_id, octstr_imm(";"));
  211.         if (list_search(list, msg->sms.smsc_id, octstr_item_match) != NULL) {
  212.     list_destroy(list, octstr_destroy_item);
  213.     return 1;
  214. }
  215. list_destroy(list, octstr_destroy_item);
  216.     }
  217.     if (conn->preferred_prefix)
  218. if (does_prefix_match(conn->preferred_prefix, msg->sms.receiver) == 1)
  219.     return 1;
  220.     return 0;
  221. }
  222. int smscconn_send(SMSCConn *conn, Msg *msg)
  223. {
  224.     int ret;
  225.     char *uf;
  226.     
  227.     gw_assert(conn != NULL);
  228.     mutex_lock(conn->flow_mutex);
  229.     if (conn->status == SMSCCONN_DEAD || conn->why_killed != SMSCCONN_ALIVE) {
  230.         mutex_unlock(conn->flow_mutex);
  231.         return -1;
  232.     }
  233.     /* normalize the destination number for this smsc */
  234.     uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
  235.     normalize_number(uf, &(msg->sms.receiver));
  236.     ret = conn->send_msg(conn, msg);
  237. mutex_unlock(conn->flow_mutex);
  238.     return ret;
  239. }
  240. int smscconn_status(SMSCConn *conn)
  241. {
  242.     gw_assert(conn != NULL);
  243.     return conn->status;
  244. }
  245. int smscconn_info(SMSCConn *conn, StatusInfo *infotable)
  246. {
  247.     if (conn == NULL || infotable == NULL)
  248. return -1;
  249.     mutex_lock(conn->flow_mutex);
  250.     
  251.     infotable->status = conn->status;
  252.     infotable->killed = conn->why_killed;
  253.     infotable->is_stopped = conn->is_stopped;
  254.     infotable->online = time(NULL) - conn->connect_time;
  255.     
  256.     infotable->sent = counter_value(conn->sent);
  257.     infotable->received = counter_value(conn->received);
  258.     infotable->failed = counter_value(conn->failed);
  259.     if (conn->queued)
  260. infotable->queued = conn->queued(conn);
  261.     else
  262. infotable->queued = -1;
  263.     infotable->load = conn->load;
  264.     
  265.     mutex_unlock(conn->flow_mutex);
  266.     return 0;
  267. }