generic.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:11k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* generic.c */
  5. /* */
  6. /*  Copyright (C) 1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include "common.h"
  32. #include "logfile.h"
  33. #include "driver.h"
  34. #include "expect.h"
  35. #include "sms_error.h"
  36. #include "sms_resource.h"
  37. #include "gs_token.h"
  38. #include "gs_translate.h"
  39. #include "sms_tcpip.h"
  40. /* -------------------------------------------------------------------- */
  41. #if !defined(MSERVICEDIR)
  42. #error "MSERVICEDIR undefined"
  43. #else
  44. #define SERVICEDIR        MSERVICEDIR
  45. #endif
  46. /* -------------------------------------------------------------------- */
  47. /* The 'env' structure contains Service level data to be used for */
  48. /* sending a message. */
  49. /* -------------------------------------------------------------------- */
  50. static struct generic_env
  51. {
  52. DRIVER_DEFAULT_ENV def;
  53. /* Place any extended driver */ 
  54. /* variables here  */
  55. TOKEN_HEAP 
  56. *heap;
  57. char *script_file,
  58. *dialer;
  59. char  *server_name;
  60. long server_port;
  61. } driver_env;
  62. /* -------------------------------------------------------------------- */
  63. static  RESOURCE resource_list[] = 
  64. {
  65. { RESOURCE_STRING,  "SMS_comms_params",  0, 1, NULL, 0,  "8N1",      0,    &(driver_env.def.comms_params)   },
  66. { RESOURCE_STRING,  "SMS_centre_number",  0, 1, NULL, 0,  NULL,       0,    &(driver_env.def.centre_number)   },
  67. { RESOURCE_NUMERIC, "SMS_baud",  0, 1, NULL, 0,  NULL,       1200, &(driver_env.def.baud)   },
  68. { RESOURCE_NUMERIC, "SMS_deliver_timeout",  0, 0, NULL, 0,  NULL,       30,   &(driver_env.def.deliver_timeout)   },
  69. { RESOURCE_NUMERIC, "SMS_timeout",  0, 0, NULL, 0,  NULL,       10,   &(driver_env.def.timeout)   },
  70. { RESOURCE_NUMERIC, "SMS_write_timeout",  0, 0, NULL, 0,  NULL,       10,   &(driver_env.def.write_timeout)   },
  71. { RESOURCE_NUMERIC, "SMS_max_deliver",  0, 0, NULL, 0,  NULL,       0,    &(driver_env.def.max_deliver)   },
  72. { RESOURCE_STRING,  "SMS_dialer",  0, 1, NULL, 0,  "tcpip",     0,   &(driver_env.dialer)     },
  73. { RESOURCE_STRING,  "SMS_script_file",  0, 1, NULL, 0,  NULL,        0,   &(driver_env.script_file)     },
  74. { RESOURCE_STRING,  "SMS_server_name",  0, 1, NULL, 0,  "localhost", 0,   &(driver_env.server_name) },
  75. { RESOURCE_NUMERIC, "SMS_server_port",  0, 1, NULL, 0,  NULL,       444, &(driver_env.server_port) },
  76. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,        0,   NULL   }
  77. };
  78. /* -------------------------------------------------------------------- */
  79. #define DELIVERTIMEOUT  (driver_env.def.deliver_timeout)
  80. #define TIMEOUT  (driver_env.def.timeout)
  81. #define WRITETIMEOUT  (driver_env.def.write_timeout)
  82. /* -------------------------------------------------------------------- */
  83. #define FD (driver_env.def.fd)
  84. #define SCRIPT_FILE (driver_env.script_file)
  85. /* -------------------------------------------------------------------- */
  86. /* The following defines are used to signify errors */
  87. /* occuring during the dialogue between the driver and the */
  88. /* service centre. This number will be returned as the delivery */
  89. /* value for the message that was aborted */
  90. /* */
  91. /* The defines MUST be placed in 'sms_error.h' */
  92. #define EGENERIC_NONUMBER  250
  93. #define EGENERIC_NOMESSAGE 251
  94. #define EGENERIC_NODELIVERY 252
  95. /* -------------------------------------------------------------------- */
  96. static void GENERIC_hangup(void);
  97. static int GENERIC_login(void);
  98. static int GENERIC_send_disconnect(void);
  99. static int GENERIC_sendmessage(char *msisdn, char *message);
  100. static int GENERIC_dial(DRIVER_DEFAULT_ENV *env);
  101. static void GENERIC_wrapper_hangup(DRIVER_DEFAULT_ENV *env);
  102. static using_modem_dialer(void);
  103. static using_tcpip_dialer(void);
  104. /* -------------------------------------------------------------------- */
  105. /* -------------------------------------------------------------------- */
  106. static int using_modem_dialer(void)
  107. { return (strcmp(driver_env.dialer, "modem") == 0);
  108. }
  109. /* -------------------------------------------------------------------- */
  110. /* -------------------------------------------------------------------- */
  111. static int using_tcpip_dialer(void)
  112. { return (strcmp(driver_env.dialer, "tcpip") == 0);
  113. }
  114. /* -------------------------------------------------------------------- */
  115. /* -------------------------------------------------------------------- */
  116. static int GENERIC_dial(DRIVER_DEFAULT_ENV *env)
  117. {
  118. if (using_modem_dialer())
  119. { return default_dial(env);
  120. }
  121. else
  122. if (using_tcpip_dialer())
  123. {
  124. /* Reminder - there should be a default TCP/IP dialer */
  125. /*            functions. */
  126. lprintf(LOG_STANDARD, "Connecting to GERNERIC Server %s:%ld...n", 
  127. ((struct generic_env *)env)->server_name, 
  128. ((struct generic_env *)env)->server_port);
  129. env->fd = TCPIP_connect(((struct generic_env *)env)->server_name,
  130.                        ((struct generic_env *)env)->server_port);
  131. if (env->fd < 0)
  132. {  lprintf(LOG_WARNING, "Failed to Connect.n"); 
  133. return EDIAL;
  134. }
  135. }
  136. else
  137. { lprintf(LOG_ERROR, "dial() failed,  using unsupported dialer '%s'n", driver_env.dialer);
  138. return -1;
  139. }
  140. lprintf(LOG_STANDARD, "Connection Established.n");
  141. return 0;
  142. }
  143. /* -------------------------------------------------------------------- */
  144. /* -------------------------------------------------------------------- */
  145. void GENERIC_init(char *mservice, DEVICE_ENTRY *device)
  146. {
  147. default_init(mservice, device);
  148. driver_env.heap = gs_parse_file(SCRIPT_FILE);
  149. if (driver_env.heap == NULL)
  150. {
  151. lprintf(LOG_ERROR, "Unrecoverable Failure Parsing file '%s'n", SCRIPT_FILE);
  152. exit(1);
  153. }
  154. }
  155. /* -------------------------------------------------------------------- */
  156. /* -------------------------------------------------------------------- */
  157. static int process_list(TOKEN_HEAP *current_heap)
  158. {
  159. int  i;
  160. char  var[1024],
  161. *str,
  162. buf[1024];
  163. TOKEN_HEAP
  164. *tmp_heap,
  165. *heap;
  166. i = 0;
  167. while(TRUE)
  168. {
  169. sprintf(var, "[%d]", i);
  170. heap = get_varlist(current_heap, var);
  171. if (heap == NULL)
  172. { return 0;
  173. }
  174. str = get_strvalue(heap, "message");
  175. if (str != NULL)
  176. {
  177. if (sms_strlen(str) != 0)
  178. { lprintf(LOG_STANDARD, str);
  179. }
  180. }
  181. str = get_strvalue(heap, "send");
  182. if (str != NULL)
  183. {
  184. if (sms_strlen(str) != 0)
  185. { twrite(FD, str, sms_strlen(str), WRITETIMEOUT);
  186. }
  187. }
  188. str = get_strvalue(heap, "expect");
  189. if (str == NULL)
  190. { return -1;
  191. }
  192. if (expstr(FD, buf, str, 1024, TIMEOUT) == 0)
  193. {
  194. tmp_heap = get_varlist(heap, "success");
  195. if (tmp_heap == NULL)
  196. {
  197. str = get_strvalue(heap, "success");
  198. if (str == NULL)
  199. { return -1;
  200. }
  201. lprintf(LOG_STANDARD, str);
  202. }
  203. else
  204. { if (process_list(tmp_heap))
  205. { return -1;
  206. }
  207. }
  208. }
  209. else
  210. { tmp_heap = get_varlist(heap, "failure");
  211. if (tmp_heap == NULL)
  212. {
  213. str = get_strvalue(heap, "failure");
  214. if (str == NULL)
  215. { return -1;
  216. }
  217. lprintf(LOG_STANDARD, str);
  218. return -1;
  219. }
  220. else
  221. { if (process_list(tmp_heap))
  222.                                 {       return -1;
  223.                                 }
  224. }
  225. }
  226. i++;
  227. }
  228. }
  229. /* -------------------------------------------------------------------- */
  230. /* -------------------------------------------------------------------- */
  231. static int process_script_list(TOKEN_HEAP *current_heap, char *listname)
  232. {
  233. TOKEN_HEAP
  234. *heap;
  235. heap = get_varlist(current_heap, listname);
  236. if (heap == NULL)
  237. { return 0;
  238. }
  239. return process_list(heap);
  240. }
  241. /* -------------------------------------------------------------------- */
  242. /* -------------------------------------------------------------------- */
  243. static int GENERIC_login(void)
  244. { return process_script_list(driver_env.heap, "login");
  245. }
  246. /* -------------------------------------------------------------------- */
  247. /* -------------------------------------------------------------------- */
  248. static int GENERIC_sendmessage(char *msisdn, char *message)
  249. { return process_script_list(driver_env.heap, "send");
  250. }
  251. /* -------------------------------------------------------------------- */
  252. /* -------------------------------------------------------------------- */
  253. static int GENERIC_send_disconnect(void)
  254. { return process_script_list(driver_env.heap, "disconnect");
  255. }
  256. /* -------------------------------------------------------------------- */
  257. /* -------------------------------------------------------------------- */
  258. static void GENERIC_hangup(void)
  259. {
  260. if (using_modem_dialer())
  261. { default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env));
  262. }
  263. else
  264. if (using_tcpip_dialer())
  265. { TCPIP_disconnect(FD);
  266. }
  267. else
  268. { lprintf(LOG_ERROR, "hangup() failed,  using unsupported dialer '%s'n", driver_env.dialer);
  269. }
  270. }
  271. /* -------------------------------------------------------------------- */
  272. /* -------------------------------------------------------------------- */
  273. static void GENERIC_wrapper_hangup(DRIVER_DEFAULT_ENV *env)
  274. { GENERIC_hangup();
  275. }
  276. /* -------------------------------------------------------------------- */
  277. /* The following structure is used by core driver code.  */
  278. /* The diagram below shows the call sequence of the functions. */
  279. /* -------------------------------------------------------------------- */
  280. DEVICE_ENTRY generic_device = {
  281. "GENERIC",
  282. resource_list,
  283. (DRIVER_DEFAULT_ENV *)(&driver_env),
  284. GENERIC_init, /* Init */ 
  285. default_main, /* Main */
  286. default_validate_numeric_id, /* Validation */
  287. GENERIC_dial, /* Dial */
  288. GENERIC_wrapper_hangup, /* Hangup */
  289. GENERIC_send_disconnect, /* Disconnect */
  290. default_single_deliver, /* Deliver  */
  291. GENERIC_sendmessage, /* Send */
  292. GENERIC_login /* Login */
  293. };