/helpers.c

http://datacard.googlecode.com/ · C · 196 lines · 157 code · 29 blank · 10 comment · 26 complexity · feb5e10b8030925897710c2a4a5c46a2 MD5 · raw file

  1. /*
  2. Copyright (C) 2009 - 2010
  3. Artem Makhutov <artem@makhutov.org>
  4. http://www.makhutov.org
  5. Dmitry Vagin <dmitry2004@yandex.ru>
  6. bg <bg_one@mail.ru>
  7. */
  8. #ifdef HAVE_CONFIG_H
  9. #include <config.h>
  10. #endif /* HAVE_CONFIG_H */
  11. #include <signal.h> /* SIGURG */
  12. #include <asterisk.h>
  13. #include <asterisk/callerid.h> /* AST_PRES_* */
  14. #include "helpers.h"
  15. #include "chan_datacard.h" /* devices */
  16. #include "at_command.h"
  17. #include "pdu.h" /* pdu_digit2code() */
  18. static int is_valid_ussd_string(const char* number)
  19. {
  20. for(; *number; number++)
  21. if(pdu_digit2code(*number) == 0)
  22. return 0;
  23. return 1;
  24. }
  25. #/* */
  26. EXPORT_DEF int is_valid_phone_number(const char* number)
  27. {
  28. if(number[0] == '+')
  29. number++;
  30. return is_valid_ussd_string(number);
  31. }
  32. #/* */
  33. EXPORT_DEF int get_at_clir_value (struct pvt* pvt, int clir)
  34. {
  35. int res = 0;
  36. switch (clir)
  37. {
  38. case AST_PRES_ALLOWED_NETWORK_NUMBER:
  39. case AST_PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
  40. case AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
  41. case AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
  42. case AST_PRES_NUMBER_NOT_AVAILABLE:
  43. ast_debug (2, "[%s] callingpres: %s\n", PVT_ID(pvt), ast_describe_caller_presentation (clir));
  44. res = 2;
  45. break;
  46. case AST_PRES_PROHIB_NETWORK_NUMBER:
  47. case AST_PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
  48. case AST_PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
  49. case AST_PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
  50. ast_debug (2, "[%s] callingpres: %s\n", PVT_ID(pvt), ast_describe_caller_presentation (clir));
  51. res = 1;
  52. break;
  53. default:
  54. ast_log (LOG_WARNING, "[%s] Unsupported callingpres: %d\n", PVT_ID(pvt), clir);
  55. if ((clir & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED)
  56. {
  57. res = 0;
  58. }
  59. else
  60. {
  61. res = 2;
  62. }
  63. break;
  64. }
  65. return res;
  66. }
  67. typedef int (*at_cmd_f)(struct cpvt*, const char*, const char*, unsigned, int, void **);
  68. #/* */
  69. static const char* send2(const char* dev_name, int * status, int online, const char* emsg, const char* okmsg, at_cmd_f func, const char* arg1, const char* arg2, unsigned arg3, int arg4, void ** arg5)
  70. {
  71. struct pvt* pvt;
  72. const char* msg;
  73. if(status)
  74. *status = 0;
  75. pvt = find_device_ext(dev_name, &msg);
  76. if(pvt)
  77. {
  78. if(pvt->connected && (!online || (pvt->initialized && pvt->gsm_registered)))
  79. {
  80. if((*func) (&pvt->sys_chan, arg1, arg2, arg3, arg4, arg5))
  81. {
  82. msg = emsg;
  83. ast_log (LOG_ERROR, "[%s] %s\n", PVT_ID(pvt), emsg);
  84. }
  85. else
  86. {
  87. msg = okmsg;
  88. if(status)
  89. *status = 1;
  90. }
  91. }
  92. else
  93. msg = "Device not connected / initialized / registered";
  94. ast_mutex_unlock (&pvt->lock);
  95. }
  96. return msg;
  97. }
  98. #/* */
  99. EXPORT_DEF const char* send_ussd(const char* dev_name, const char* ussd, int * status, void ** id)
  100. {
  101. if(is_valid_ussd_string(ussd))
  102. return send2(dev_name, status, 1, "Error adding USSD command to queue", "USSD queued for send", (at_cmd_f)at_enque_ussd, ussd, 0, 0, 0, id);
  103. if(status)
  104. *status = 0;
  105. return "Invalid USSD";
  106. }
  107. #/* */
  108. EXPORT_DEF const char * send_sms(const char * dev_name, const char * number, const char * message, const char * validity, const char * report, int * status, void ** id)
  109. {
  110. if(is_valid_phone_number(number))
  111. {
  112. int val = 0;
  113. int srr = 0;
  114. if(validity)
  115. {
  116. val = strtol (validity, NULL, 10);
  117. if(val <= 0)
  118. val = 0;
  119. }
  120. if(report)
  121. srr = ast_true (report);
  122. return send2(dev_name, status, 1, "Error adding SMS commands to queue", "SMS queued for send", at_enque_sms, number, message, val, srr, id);
  123. }
  124. if(status)
  125. *status = 0;
  126. return "Invalid destination number";
  127. }
  128. #/* */
  129. EXPORT_DEF const char* send_reset(const char* dev_name, int * status)
  130. {
  131. return send2(dev_name, status, 0, "Error adding reset command to queue", "Reset command queued for execute", (at_cmd_f)at_enque_reset, 0, 0, 0, 0, NULL);
  132. }
  133. #/* */
  134. EXPORT_DEF const char* send_ccwa_set(const char* dev_name, call_waiting_t enable, int * status)
  135. {
  136. return send2(dev_name, status, 1, "Error adding CCWA commands to queue", "Call-Waiting commands queued for execute", (at_cmd_f)at_enque_set_ccwa, 0, 0, enable, 0, NULL);
  137. }
  138. #/* */
  139. EXPORT_DEF const char* send_at_command(const char* dev_name, const char* command)
  140. {
  141. return send2(dev_name, NULL, 0, "Error adding command", "Command queued for execute", (at_cmd_f)at_enque_user_cmd, command, NULL, 0, 0, NULL);
  142. }
  143. EXPORT_DEF const char* schedule_restart_event(dev_state_t event, restate_time_t when, const char* dev_name, int * status)
  144. {
  145. const char * msg;
  146. struct pvt * pvt = find_device(dev_name);
  147. if (pvt)
  148. {
  149. pvt->desired_state = event;
  150. pvt->restart_time = when;
  151. pvt_try_restate(pvt);
  152. ast_mutex_unlock (&pvt->lock);
  153. msg = dev_state2str_msg(event);
  154. if(status)
  155. *status = 1;
  156. }
  157. else
  158. {
  159. msg = "Device not found";
  160. if(status)
  161. *status = 0;
  162. }
  163. return msg;
  164. }