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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* driver.c */
  5. /* */
  6. /*  Copyright (C) 1997,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: driver.c,v 5.1 1998/02/01 07:10:39 root Exp $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #if defined(MODEMLIB) && (MODEMLIB == LIBMODEM)
  32. #include <termios.h>
  33. #include <dial/modems.h>
  34. #else
  35. #include "sms_modem.h"
  36. #endif
  37. #include "common.h"
  38. #include "logfile.h"
  39. #include "driver.h"
  40. #include "parserc.h"
  41. #include "sms_error.h"
  42. /* -------------------------------------------------------------------- */
  43. #if !defined(MSERVICEDIR)
  44. #error "MSERVICEDIR undefined"
  45. #else
  46. #define SERVICEDIR        MSERVICEDIR
  47. #endif
  48. /* -------------------------------------------------------------------- */
  49. DEVICE_ENTRY *device_list[] = {
  50. #if defined(TAP)
  51. &tap_device,
  52. #endif
  53. #if defined(VODAFONE)
  54. &vodafone_device,
  55. #endif
  56. #if defined(ORANGE)
  57. &orange_device,
  58. #endif
  59. #if defined(PAGEONE)
  60. &pageone_device,
  61. #endif
  62. #if defined(VODACOM)
  63. &vodacom_device,
  64. #endif
  65. #if defined(MTN)
  66. &mtn_device,
  67. #endif
  68. #if defined(ONE2ONE)
  69. &one2one_device,
  70. #endif
  71. #if defined(LIBERTEL)
  72. &libertel_device,
  73. #endif
  74. #if defined(TIM)
  75. &tim_device,
  76. #endif
  77. #if defined(SNPP)
  78. &snpp_device,
  79. #endif
  80. #if defined(CIMD)
  81. &cimd_device,
  82. #endif
  83. #if defined(VODAPAGE_BLOCK)
  84. &vodapage_block_device,
  85. #endif
  86. #if defined(PROXIMUS)
  87. &proximus_device,
  88. #endif
  89. #if defined(KPN)
  90. &kpn_device,
  91. #endif
  92. #if defined(ANSWER)
  93. &answer_device,
  94. #endif
  95. #if defined(GENERIC)
  96. &generic_device,
  97. #endif
  98. NULL
  99. };
  100. /* -------------------------------------------------------------------- */
  101. #if defined(MODEMLIB) && (MODEMLIB == LIBMODEM)
  102. static void LIBMODEM_setup_comm_params(int fd, char *params);
  103. static int LIBMODEM_dial(char *number, char *params, long baud);
  104. static int num2baud (long baud_num);
  105. static int SMS_dial(char *number, char *params, long baud);
  106. static void SMS_hangup(int fd);
  107. #endif
  108. /* -------------------------------------------------------------------- */
  109. /* -------------------------------------------------------------------- */
  110. DEVICE_ENTRY *get_device(char *name)
  111. {
  112. DEVICE_ENTRY **device;
  113. if (name == NULL)
  114. { return NULL;
  115. }
  116. device = device_list;
  117. while (*device != NULL)
  118. {
  119. if ((*device)->name != NULL)
  120. { if (strcmp((*device)->name, name) == 0)
  121. {
  122. lprintf(LOG_VERBOSE, "Device Found: %sn", name);
  123. return *device;
  124. }
  125. }
  126. device++;
  127. }
  128. lprintf(LOG_VERBOSE, "Device NOT Found: %sn", name);
  129. return NULL;
  130. }
  131. /* -------------------------------------------------------------------- */
  132. /* -------------------------------------------------------------------- */
  133. void display_drivers(void)
  134. {
  135. DEVICE_ENTRY **device;
  136. device = device_list;
  137. if (*device == NULL)
  138. { lprintf(LOG_WARNING, "No drivers have been included!n");
  139. }
  140. while (*device != NULL)
  141. {
  142. if ((*device)->name != NULL)
  143. { lprintf(LOG_STANDARD, "%sn", (*device)->name);
  144. }
  145. else
  146. { lprintf(LOG_STANDARD, "<NULL>n");
  147. }
  148. device++;
  149. }
  150. }
  151. /* -------------------------------------------------------------------- */
  152. /* -------------------------------------------------------------------- */
  153. #if defined(MODEMLIB) && (MODEMLIB == LIBMODEM)
  154. static void LIBMODEM_setup_comm_params(int fd, char *params)
  155. {
  156. struct  termios 
  157. trm;
  158. if (params == NULL)
  159. { return;
  160. }
  161. lprintf(LOG_VERBOSE, "Setting communications parameters: %sn", params);
  162. if (strcmp(params, "8N1") == 0)
  163. {
  164. /* Default - No ACTION */
  165. }
  166. else if (strcmp(params, "7E1") == 0)
  167. {
  168. tcgetattr(fd, &trm);
  169. trm.c_cflag &= ~(CSIZE|CSTOPB|PARODD);
  170. trm.c_cflag |= CS7|PARENB;
  171. tcsetattr(fd, TCSAFLUSH, &trm);
  172. }
  173. }        
  174. static int num2baud(long baud) 
  175. {
  176. switch (baud)
  177. {
  178. case 0:
  179. return B0;
  180. case 50:
  181. return B50;
  182. case 75:
  183. return B75;
  184. case 110:
  185. return B110;
  186. case 134:
  187. return B134;
  188. case 150:
  189. return B150;
  190. case 200:
  191. return B200;
  192. case 300:
  193. return B300;
  194. case 600:
  195. return B600;
  196. case 1200:
  197. return B1200;
  198. case 1800:
  199. return B1800;
  200. case 2400:
  201. return B2400;
  202. case 4800:
  203. return B4800;
  204. case 7200:
  205. case 9600:
  206. return B9600;
  207. case 12200:
  208. case 14400:
  209. case 16800:
  210. case 19200:
  211. return B19200;
  212. case 21600:
  213. case 24000:
  214. case 26400:
  215. case 28800:
  216. case 31200:
  217. case 33600:
  218. case 38400:
  219. return B38400;
  220. }
  221. return -1;
  222. }
  223. static int LIBMODEM_dial(char *number, char *params, long baud)
  224. {
  225. int  fd, mbaud;
  226. lprintf(LOG_VERBOSE, "Using Libmodem Packagen");
  227. mbaud = num2baud(baud);
  228. if (mbaud != -1)
  229. { fd = bdial(number, num2baud(baud));
  230. }
  231. else
  232. { lprintf(LOG_WARNING, "Unknown baud %ldn", baud);
  233. return -1;
  234. }
  235. /* Libmodem-1.0.0 does not supports  */
  236. /* cofiguration of modem parameters. */
  237. /* Use own function to change them. */
  238. if (fd >= 0)
  239. { LIBMODEM_setup_comm_params(fd, params);
  240. }
  241. return fd;
  242. }
  243. static int SMS_dial(char *number, char *params, long baud)
  244. { return LIBMODEM_dial(number, params, baud);
  245. }
  246. static void SMS_hangup(int fd)
  247. { hangup(fd);
  248. }
  249. #endif
  250. /* -------------------------------------------------------------------- */
  251. /* -------------------------------------------------------------------- */
  252. int default_dial(DRIVER_DEFAULT_ENV *env)
  253. {
  254. lprintf(LOG_STANDARD, "Dialing SMSC %s...n", env->centre_number);
  255. env->fd = SMS_dial(env->centre_number, env->comms_params, env->baud);
  256. if (env->fd < 0)
  257. {  lprintf(LOG_WARNING, "Failed to connectn"); 
  258. return EDIAL;
  259. }
  260. lprintf(LOG_STANDARD, "Connection Established.n");
  261. return 0;
  262. }
  263. /* -------------------------------------------------------------------- */
  264. /* -------------------------------------------------------------------- */
  265. void default_hangup(DRIVER_DEFAULT_ENV *env)
  266. {
  267. lprintf(LOG_STANDARD, "Hangup...n");
  268. SMS_hangup(env->fd);
  269. env->connection_status = SERVICE_NOT_CONNECTED;
  270. }
  271. /* -------------------------------------------------------------------- */
  272. /* -------------------------------------------------------------------- */
  273. SMS_list *default_main(SMS_list *list, char *message, DRIVER_DEFAULT_ENV *env)
  274. {
  275. SMS_list 
  276. *node;
  277. int result;
  278. if (env->device->name != NULL)
  279. { lprintf(LOG_VERBOSE, "%s driver calledn", env->device->name);
  280. }
  281. else
  282. { lprintf(LOG_VERBOSE, "<NULL> driver calledn");
  283. }
  284. env->connection_status = SERVICE_NOT_CONNECTED;
  285. result = 0;
  286. node = get_first(list);
  287. while (node != NULL)
  288. {
  289. result = (* env->device->deliver)(node, message, env);
  290. set_delivery(node, result);
  291. if (result)
  292. { (* env->device->hangup)(env);
  293. env->connection_status = SERVICE_NOT_CONNECTED;
  294. }
  295. node = get_next(node);
  296. }
  297. if ((result == 0) && (env->connection_status == SERVICE_CONNECTED))
  298. {
  299. (* env->device->disconnect)();
  300. (* env->device->hangup)(env);
  301. env->connection_status = SERVICE_NOT_CONNECTED;
  302. }
  303. return NULL;
  304. }
  305. /* -------------------------------------------------------------------- */
  306. /* -------------------------------------------------------------------- */
  307. int default_multiple_deliver(SMS_list *node, char *message, DRIVER_DEFAULT_ENV *env)
  308. {
  309. char  *msisdn, 
  310. *name;
  311. int  error;
  312. msisdn = get_number(node);
  313. name   = get_name(node);
  314. lprintf(LOG_VERBOSE, "Name     :%sn", name);
  315. lprintf(LOG_VERBOSE, "Number   :%sn", msisdn);
  316. if (env->connection_status == SERVICE_NOT_CONNECTED)
  317. {
  318. env->connection_status = SERVICE_CONNECTED;
  319.   error = (* env->device->dial)(env);
  320. if (error)
  321. { return error;
  322. }
  323. error = (* env->device->login)();
  324. if (error)
  325. { return error;
  326. }
  327. }
  328. error = (* env->device->sendmessage)(msisdn, message);
  329. if (error)
  330. { return error;
  331. }
  332. return 0;
  333. }
  334. /* -------------------------------------------------------------------- */
  335. /* Send as many messages as we are allowed. */
  336. /* Keep track of number of messages sent and compare against */
  337. /* Max allowed, disconnecting when number sent reaches */
  338. /* the max allowed. */
  339. /* -------------------------------------------------------------------- */
  340. int default_multiple_counted_deliver(SMS_list *node, char *message, DRIVER_DEFAULT_ENV *env)
  341. {
  342. char  *msisdn, 
  343. *name;
  344. int  error;
  345. msisdn = get_number(node);
  346. name   = get_name(node);
  347. lprintf(LOG_VERBOSE, "Name     :%sn", name);
  348. lprintf(LOG_VERBOSE, "Number   :%sn", msisdn);
  349. if (env->connection_status == SERVICE_NOT_CONNECTED)
  350. {
  351. env->num_sent          = 0;
  352. env->connection_status = SERVICE_CONNECTED;
  353.   error = (* env->device->dial)(env);
  354. if (error)
  355. { return error;
  356. }
  357. error = (* env->device->login)();
  358. if (error)
  359. { return error;
  360. }
  361. }
  362. error = (* env->device->sendmessage)(msisdn, message);
  363. if (error)
  364. { return error;
  365. }
  366. env->num_sent++;
  367. lprintf(LOG_VERBOSE, "Num sent    = %ldn", env->num_sent);
  368. lprintf(LOG_VERBOSE, "Max deliver = %ldn", env->max_deliver);
  369. if ((env->max_deliver != 0) && 
  370.     (env->num_sent >= env->max_deliver))
  371. {
  372. (* env->device->disconnect)();
  373. (* env->device->hangup)(env);
  374. env->connection_status = SERVICE_NOT_CONNECTED;
  375. }
  376. return 0;
  377. }
  378. /* -------------------------------------------------------------------- */
  379. /* -------------------------------------------------------------------- */
  380. int default_send_disconnect(void)
  381. { return 0;
  382. }
  383. /* -------------------------------------------------------------------- */
  384. /* -------------------------------------------------------------------- */
  385. int default_single_deliver(SMS_list *node, char *message, DRIVER_DEFAULT_ENV *env)
  386. {
  387. char  *msisdn, 
  388. *name;
  389. int  error;
  390. msisdn = get_number(node);
  391. name   = get_name(node);
  392. lprintf(LOG_VERBOSE, "Name     :%sn", name);
  393. lprintf(LOG_VERBOSE, "Number   :%sn", msisdn);
  394. env->connection_status = SERVICE_CONNECTED;
  395. error = (* env->device->dial)(env);
  396. if (error)
  397. { return error;
  398. }
  399. error = (* env->device->login)();
  400. if (error)
  401. { return error;
  402. }
  403. error = (* env->device->sendmessage)(msisdn, message);
  404. if (error)
  405. { return error;
  406. }
  407. (* env->device->disconnect)();
  408. (* env->device->hangup)(env);
  409. env->connection_status = SERVICE_NOT_CONNECTED;
  410. return 0;
  411. }
  412. /* -------------------------------------------------------------------- */
  413. /* -------------------------------------------------------------------- */
  414. int default_validate_numeric_id(char *id)
  415. { return is_numeric(id);
  416. }
  417. /* -------------------------------------------------------------------- */
  418. /* -------------------------------------------------------------------- */
  419. int default_validate_always_true(char *id)
  420. { return TRUE;
  421. }
  422. /* -------------------------------------------------------------------- */
  423. /* -------------------------------------------------------------------- */
  424. void default_init(char *mservice, DEVICE_ENTRY *device)
  425. {
  426. char fname[1024];
  427. sms_strcpy(fname, SERVICEDIR);
  428. sms_strcat(fname, "/services/");
  429. sms_strcat(fname, mservice);
  430. if (read_resource_file(fname, device->resource_list, TRUE) != RESOURCE_FILE_OK)
  431. { lprintf(LOG_ERROR, "Unrecoverable Failure Parsing file %sn", fname); 
  432. exit(1);
  433. }
  434. device->env->device = device;
  435. }
  436. /* -------------------------------------------------------------------- */
  437. /* -------------------------------------------------------------------- */
  438. int default_login(void)
  439. { return 0;
  440. }
  441. /* -------------------------------------------------------------------- */
  442. /* -------------------------------------------------------------------- */
  443. int default_sendmessage(char *msisdn, char *message)
  444. { return 0;
  445. }