callerid.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. /*
  2. * Asterisk -- A telephony toolkit for Linux.
  3. *
  4. * CallerID Generation support
  5. *
  6. * Copyright (C) 2001-2004, Digium, Inc.
  7. *
  8. * Mark Spencer <markster@digium.com>
  9. *
  10. * This program is free software, distributed under the terms of
  11. * the GNU General Public License.
  12. *
  13. * Includes code and algorithms from the Zapata library.
  14. *
  15. */
  16. #include <time.h>
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <unistd.h>
  21. #include <math.h>
  22. #include <ctype.h>
  23. #include <asterisk/ulaw.h>
  24. #include <asterisk/alaw.h>
  25. #include <asterisk/frame.h>
  26. #include <asterisk/callerid.h>
  27. #include <asterisk/logger.h>
  28. #include <asterisk/fskmodem.h>
  29. #include <asterisk/utils.h>
  30. struct callerid_state {
  31. fsk_data fskd;
  32. char rawdata[256];
  33. short oldstuff[160];
  34. int oldlen;
  35. int pos;
  36. int type;
  37. int cksum;
  38. char name[64];
  39. char number[64];
  40. int flags;
  41. int sawflag;
  42. int len;
  43. };
  44. float cid_dr[4], cid_di[4];
  45. float clidsb = 8000.0 / 1200.0;
  46. float sasdr, sasdi;
  47. float casdr1, casdi1, casdr2, casdi2;
  48. #define CALLERID_SPACE 2200.0 /* 2200 hz for "0" */
  49. #define CALLERID_MARK 1200.0 /* 1200 hz for "1" */
  50. #define SAS_FREQ 440.0
  51. #define CAS_FREQ1 2130.0
  52. #define CAS_FREQ2 2750.0
  53. static inline void gen_tones(unsigned char *buf, int len, int codec, float ddr1, float ddi1, float ddr2, float ddi2, float *cr1, float *ci1, float *cr2, float *ci2)
  54. {
  55. int x;
  56. float t;
  57. for (x=0;x<len;x++) {
  58. t = *cr1 * ddr1 - *ci1 * ddi1;
  59. *ci1 = *cr1 * ddi1 + *ci1 * ddr1;
  60. *cr1 = t;
  61. t = 2.0 - (*cr1 * *cr1 + *ci1 * *ci1);
  62. *cr1 *= t;
  63. *ci1 *= t;
  64. t = *cr2 * ddr2 - *ci2 * ddi2;
  65. *ci2 = *cr2 * ddi2 + *ci2 * ddr2;
  66. *cr2 = t;
  67. t = 2.0 - (*cr2 * *cr2 + *ci2 * *ci2);
  68. *cr2 *= t;
  69. *ci2 *= t;
  70. buf[x] = AST_LIN2X((*cr1 + *cr2) * 2048.0);
  71. }
  72. }
  73. static inline void gen_tone(unsigned char *buf, int len, int codec, float ddr1, float ddi1, float *cr1, float *ci1)
  74. {
  75. int x;
  76. float t;
  77. for (x=0;x<len;x++) {
  78. t = *cr1 * ddr1 - *ci1 * ddi1;
  79. *ci1 = *cr1 * ddi1 + *ci1 * ddr1;
  80. *cr1 = t;
  81. t = 2.0 - (*cr1 * *cr1 + *ci1 * *ci1);
  82. *cr1 *= t;
  83. *ci1 *= t;
  84. buf[x] = AST_LIN2X(*cr1 * 8192.0);
  85. }
  86. }
  87. void callerid_init(void)
  88. {
  89. /* Initialize stuff for inverse FFT */
  90. cid_dr[0] = cos(CALLERID_SPACE * 2.0 * M_PI / 8000.0);
  91. cid_di[0] = sin(CALLERID_SPACE * 2.0 * M_PI / 8000.0);
  92. cid_dr[1] = cos(CALLERID_MARK * 2.0 * M_PI / 8000.0);
  93. cid_di[1] = sin(CALLERID_MARK * 2.0 * M_PI / 8000.0);
  94. sasdr = cos(SAS_FREQ * 2.0 * M_PI / 8000.0);
  95. sasdi = sin(SAS_FREQ * 2.0 * M_PI / 8000.0);
  96. casdr1 = cos(CAS_FREQ1 * 2.0 * M_PI / 8000.0);
  97. casdi1 = sin(CAS_FREQ1 * 2.0 * M_PI / 8000.0);
  98. casdr2 = cos(CAS_FREQ2 * 2.0 * M_PI / 8000.0);
  99. casdi2 = sin(CAS_FREQ2 * 2.0 * M_PI / 8000.0);
  100. }
  101. struct callerid_state *callerid_new(int cid_signalling)
  102. {
  103. struct callerid_state *cid;
  104. cid = malloc(sizeof(struct callerid_state));
  105. if (cid) {
  106. memset(cid, 0, sizeof(struct callerid_state));
  107. cid->fskd.spb = 7; /* 1200 baud */
  108. cid->fskd.hdlc = 0; /* Async */
  109. cid->fskd.nbit = 8; /* 8 bits */
  110. cid->fskd.nstop = 1; /* 1 stop bit */
  111. cid->fskd.paridad = 0; /* No parity */
  112. cid->fskd.bw=1; /* Filter 800 Hz */
  113. if (cid_signalling == 2) { /* v23 signalling */
  114. cid->fskd.f_mark_idx = 4; /* 1300 Hz */
  115. cid->fskd.f_space_idx = 5; /* 2100 Hz */
  116. } else { /* Bell 202 signalling as default */
  117. cid->fskd.f_mark_idx = 2; /* 1200 Hz */
  118. cid->fskd.f_space_idx = 3; /* 2200 Hz */
  119. }
  120. cid->fskd.pcola = 0; /* No clue */
  121. cid->fskd.cont = 0; /* Digital PLL reset */
  122. cid->fskd.x0 = 0.0;
  123. cid->fskd.state = 0;
  124. memset(cid->name, 0, sizeof(cid->name));
  125. memset(cid->number, 0, sizeof(cid->number));
  126. cid->flags = CID_UNKNOWN_NAME | CID_UNKNOWN_NUMBER;
  127. cid->pos = 0;
  128. } else
  129. ast_log(LOG_WARNING, "Out of memory\n");
  130. return cid;
  131. }
  132. void callerid_get(struct callerid_state *cid, char **name, char **number, int *flags)
  133. {
  134. *flags = cid->flags;
  135. if (cid->flags & (CID_UNKNOWN_NAME | CID_PRIVATE_NUMBER))
  136. *name = NULL;
  137. else
  138. *name = cid->name;
  139. if (cid->flags & (CID_UNKNOWN_NUMBER | CID_PRIVATE_NUMBER))
  140. *number = NULL;
  141. else
  142. *number = cid->number;
  143. }
  144. void callerid_get_dtmf(char *cidstring, char *number, int *flags)
  145. {
  146. int i;
  147. int code;
  148. /* "Clear" the number-buffer. */
  149. number[0] = 0;
  150. if (strlen(cidstring) < 2) {
  151. ast_log(LOG_DEBUG, "No cid detected\n");
  152. *flags = CID_UNKNOWN_NUMBER;
  153. return;
  154. }
  155. /* Detect protocol and special types */
  156. if (cidstring[0] == 'B') {
  157. /* Handle special codes */
  158. code = atoi(&cidstring[1]);
  159. if (code == 0)
  160. *flags = CID_UNKNOWN_NUMBER;
  161. else if (code == 10)
  162. *flags = CID_PRIVATE_NUMBER;
  163. else
  164. ast_log(LOG_DEBUG, "Unknown DTMF code %d\n", code);
  165. } else if (cidstring[0] == 'D' && cidstring[2] == '#') {
  166. /* .DK special code */
  167. if (cidstring[1] == '1')
  168. *flags = CID_PRIVATE_NUMBER;
  169. if (cidstring[1] == '2' || cidstring[1] == '3')
  170. *flags = CID_UNKNOWN_NUMBER;
  171. } else if (cidstring[0] == 'D' || cidstring[0] == 'A') {
  172. /* "Standard" callerid */
  173. for (i = 1; i < strlen(cidstring); i++ ) {
  174. if (cidstring[i] == 'C' || cidstring[i] == '#')
  175. break;
  176. if (isdigit(cidstring[i]))
  177. number[i-1] = cidstring[i];
  178. else
  179. ast_log(LOG_DEBUG, "Unknown CID digit '%c'\n",
  180. cidstring[i]);
  181. }
  182. number[i-1] = 0;
  183. } else if (isdigit(cidstring[0])) {
  184. /* It begins with a digit, so we parse it as a number and hope
  185. * for the best */
  186. ast_log(LOG_WARNING, "Couldn't detect start-character. CID "
  187. "parsing might be unreliable\n");
  188. for (i = 0; i < strlen(cidstring); i++) {
  189. if (isdigit(cidstring[i]))
  190. number[i] = cidstring[i];
  191. else
  192. break;
  193. }
  194. number[i] = 0;
  195. } else {
  196. ast_log(LOG_DEBUG, "Unknown CID protocol, start digit '%c'\n",
  197. cidstring[0]);
  198. *flags = CID_UNKNOWN_NUMBER;
  199. }
  200. }
  201. int ast_gen_cas(unsigned char *outbuf, int sendsas, int len, int codec)
  202. {
  203. int pos = 0;
  204. int saslen=2400;
  205. float cr1 = 1.0;
  206. float ci1 = 0.0;
  207. float cr2 = 1.0;
  208. float ci2 = 0.0;
  209. if (sendsas) {
  210. if (len < saslen)
  211. return -1;
  212. gen_tone(outbuf, saslen, codec, sasdr, sasdi, &cr1, &ci1);
  213. len -= saslen;
  214. pos += saslen;
  215. cr2 = cr1;
  216. ci2 = ci1;
  217. }
  218. gen_tones(outbuf + pos, len, codec, casdr1, casdi1, casdr2, casdi2, &cr1, &ci1, &cr2, &ci2);
  219. return 0;
  220. }
  221. int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int len, int codec)
  222. {
  223. int mylen = len;
  224. int olen;
  225. int b = 'X';
  226. int res;
  227. int x;
  228. short *buf = malloc(2 * len + cid->oldlen);
  229. short *obuf = buf;
  230. if (!buf) {
  231. ast_log(LOG_WARNING, "Out of memory\n");
  232. return -1;
  233. }
  234. memset(buf, 0, 2 * len + cid->oldlen);
  235. memcpy(buf, cid->oldstuff, cid->oldlen);
  236. mylen += cid->oldlen/2;
  237. for (x=0;x<len;x++)
  238. buf[x+cid->oldlen/2] = AST_XLAW(ubuf[x]);
  239. while(mylen >= 160) {
  240. olen = mylen;
  241. res = fsk_serie(&cid->fskd, buf, &mylen, &b);
  242. if (mylen < 0) {
  243. ast_log(LOG_ERROR, "fsk_serie made mylen < 0 (%d)\n", mylen);
  244. return -1;
  245. }
  246. buf += (olen - mylen);
  247. if (res < 0) {
  248. ast_log(LOG_NOTICE, "fsk_serie failed\n");
  249. return -1;
  250. }
  251. if (res == 1) {
  252. /* Ignore invalid bytes */
  253. if (b > 0xff)
  254. continue;
  255. switch(cid->sawflag) {
  256. case 0: /* Look for flag */
  257. if (b == 'U')
  258. cid->sawflag = 2;
  259. break;
  260. case 2: /* Get lead-in */
  261. if ((b == 0x04) || (b == 0x80)) {
  262. cid->type = b;
  263. cid->sawflag = 3;
  264. cid->cksum = b;
  265. }
  266. break;
  267. case 3: /* Get length */
  268. /* Not a lead in. We're ready */
  269. cid->sawflag = 4;
  270. cid->len = b;
  271. cid->pos = 0;
  272. cid->cksum += b;
  273. break;
  274. case 4: /* Retrieve message */
  275. if (cid->pos >= 128) {
  276. ast_log(LOG_WARNING, "Caller ID too long???\n");
  277. return -1;
  278. }
  279. cid->rawdata[cid->pos++] = b;
  280. cid->len--;
  281. cid->cksum += b;
  282. if (!cid->len) {
  283. cid->rawdata[cid->pos] = '\0';
  284. cid->sawflag = 5;
  285. }
  286. break;
  287. case 5: /* Check checksum */
  288. if (b != (256 - (cid->cksum & 0xff))) {
  289. ast_log(LOG_NOTICE, "Caller*ID failed checksum\n");
  290. /* Try again */
  291. cid->sawflag = 0;
  292. break;
  293. }
  294. cid->number[0] = '\0';
  295. cid->name[0] = '\0';
  296. /* If we get this far we're fine. */
  297. if (cid->type == 0x80) {
  298. /* MDMF */
  299. /* Go through each element and process */
  300. for (x=0;x< cid->pos;) {
  301. switch(cid->rawdata[x++]) {
  302. case 1:
  303. /* Date */
  304. break;
  305. case 2: /* Number */
  306. case 3: /* Number (for Zebble) */
  307. case 4: /* Number */
  308. res = cid->rawdata[x];
  309. if (res > 32) {
  310. ast_log(LOG_NOTICE, "Truncating long caller ID number from %d bytes to 32\n", cid->rawdata[x]);
  311. res = 32;
  312. }
  313. if (ast_strlen_zero(cid->number)) {
  314. memcpy(cid->number, cid->rawdata + x + 1, res);
  315. /* Null terminate */
  316. cid->number[res] = '\0';
  317. }
  318. break;
  319. case 6: /* Stentor Call Qualifier (ie. Long Distance call) */
  320. break;
  321. case 7: /* Name */
  322. case 8: /* Name */
  323. res = cid->rawdata[x];
  324. if (res > 32) {
  325. ast_log(LOG_NOTICE, "Truncating long caller ID name from %d bytes to 32\n", cid->rawdata[x]);
  326. res = 32;
  327. }
  328. memcpy(cid->name, cid->rawdata + x + 1, res);
  329. cid->name[res] = '\0';
  330. break;
  331. case 17: /* UK: Call type, 1=Voice Call, 2=Ringback when free, 129=Message waiting */
  332. case 19: /* UK: Network message system status (Number of messages waiting) */
  333. case 22: /* Something French */
  334. break;
  335. default:
  336. ast_log(LOG_NOTICE, "Unknown IE %d\n", cid->rawdata[x-1]);
  337. }
  338. x += cid->rawdata[x];
  339. x++;
  340. }
  341. } else {
  342. /* SDMF */
  343. strncpy(cid->number, cid->rawdata + 8, sizeof(cid->number)-1);
  344. }
  345. /* Update flags */
  346. cid->flags = 0;
  347. if (!strcmp(cid->number, "P")) {
  348. strcpy(cid->number, "");
  349. cid->flags |= CID_PRIVATE_NUMBER;
  350. } else if (!strcmp(cid->number, "O") || ast_strlen_zero(cid->number)) {
  351. strcpy(cid->number, "");
  352. cid->flags |= CID_UNKNOWN_NUMBER;
  353. }
  354. if (!strcmp(cid->name, "P")) {
  355. strcpy(cid->name, "");
  356. cid->flags |= CID_PRIVATE_NAME;
  357. } else if (!strcmp(cid->name, "O") || ast_strlen_zero(cid->name)) {
  358. strcpy(cid->name, "");
  359. cid->flags |= CID_UNKNOWN_NAME;
  360. }
  361. return 1;
  362. break;
  363. default:
  364. ast_log(LOG_ERROR, "Dunno what to do with a digit in sawflag %d\n", cid->sawflag);
  365. }
  366. }
  367. }
  368. if (mylen) {
  369. memcpy(cid->oldstuff, buf, mylen * 2);
  370. cid->oldlen = mylen * 2;
  371. } else
  372. cid->oldlen = 0;
  373. free(obuf);
  374. return 0;
  375. }
  376. void callerid_free(struct callerid_state *cid)
  377. {
  378. free(cid);
  379. }
  380. static int callerid_genmsg(char *msg, int size, char *number, char *name, int flags)
  381. {
  382. time_t t;
  383. struct tm tm;
  384. char *ptr;
  385. int res;
  386. int i,x;
  387. /* Get the time */
  388. time(&t);
  389. localtime_r(&t,&tm);
  390. ptr = msg;
  391. /* Format time and message header */
  392. res = snprintf(ptr, size, "\001\010%02d%02d%02d%02d", tm.tm_mon + 1,
  393. tm.tm_mday, tm.tm_hour, tm.tm_min);
  394. size -= res;
  395. ptr += res;
  396. if (!number || ast_strlen_zero(number) || (flags & CID_UNKNOWN_NUMBER)) {
  397. /* Indicate number not known */
  398. res = snprintf(ptr, size, "\004\001O");
  399. size -= res;
  400. ptr += res;
  401. } else if (flags & CID_PRIVATE_NUMBER) {
  402. /* Indicate number is private */
  403. res = snprintf(ptr, size, "\004\001P");
  404. size -= res;
  405. ptr += res;
  406. } else {
  407. /* Send up to 16 digits of number MAX */
  408. i = strlen(number);
  409. if (i > 16) i = 16;
  410. res = snprintf(ptr, size, "\002%c", i);
  411. size -= res;
  412. ptr += res;
  413. for (x=0;x<i;x++)
  414. ptr[x] = number[x];
  415. ptr[i] = '\0';
  416. ptr += i;
  417. size -= i;
  418. }
  419. if (!name || ast_strlen_zero(name) || (flags & CID_UNKNOWN_NAME)) {
  420. /* Indicate name not known */
  421. res = snprintf(ptr, size, "\010\001O");
  422. size -= res;
  423. ptr += res;
  424. } else if (flags & CID_PRIVATE_NAME) {
  425. /* Indicate name is private */
  426. res = snprintf(ptr, size, "\010\001P");
  427. size -= res;
  428. ptr += res;
  429. } else {
  430. /* Send up to 16 digits of name MAX */
  431. i = strlen(name);
  432. if (i > 16) i = 16;
  433. res = snprintf(ptr, size, "\007%c", i);
  434. size -= res;
  435. ptr += res;
  436. for (x=0;x<i;x++)
  437. ptr[x] = name[x];
  438. ptr[i] = '\0';
  439. ptr += i;
  440. size -= i;
  441. }
  442. return (ptr - msg);
  443. }
  444. int vmwi_generate(unsigned char *buf, int active, int mdmf, int codec)
  445. {
  446. unsigned char msg[256];
  447. int len=0;
  448. int sum;
  449. int x;
  450. int bytes = 0;
  451. float cr = 1.0;
  452. float ci = 0.0;
  453. float scont = 0.0;
  454. if (mdmf) {
  455. /* MDMF Message waiting */
  456. msg[len++] = 0x82;
  457. /* Length is 3 */
  458. msg[len++] = 3;
  459. /* IE is "Message Waiting Parameter" */
  460. msg[len++] = 0xb;
  461. /* Length of IE is one */
  462. msg[len++] = 1;
  463. /* Active or not */
  464. if (active)
  465. msg[len++] = 0xff;
  466. else
  467. msg[len++] = 0x00;
  468. } else {
  469. /* SDMF Message waiting */
  470. msg[len++] = 0x6;
  471. /* Length is 3 */
  472. msg[len++] = 3;
  473. if (active) {
  474. msg[len++] = 0x42;
  475. msg[len++] = 0x42;
  476. msg[len++] = 0x42;
  477. } else {
  478. msg[len++] = 0x6f;
  479. msg[len++] = 0x6f;
  480. msg[len++] = 0x6f;
  481. }
  482. }
  483. sum = 0;
  484. for (x=0;x<len;x++)
  485. sum += msg[x];
  486. sum = (256 - (sum & 255));
  487. msg[len++] = sum;
  488. /* Wait a half a second */
  489. for (x=0;x<4000;x++)
  490. PUT_BYTE(0x7f);
  491. /* Transmit 30 0x55's (looks like a square wave) for channel seizure */
  492. for (x=0;x<30;x++)
  493. PUT_CLID(0x55);
  494. /* Send 170ms of callerid marks */
  495. for (x=0;x<170;x++)
  496. PUT_CLID_MARKMS;
  497. for (x=0;x<len;x++) {
  498. PUT_CLID(msg[x]);
  499. }
  500. /* Send 50 more ms of marks */
  501. for (x=0;x<50;x++)
  502. PUT_CLID_MARKMS;
  503. return bytes;
  504. }
  505. int callerid_generate(unsigned char *buf, char *number, char *name, int flags, int callwaiting, int codec)
  506. {
  507. int bytes=0;
  508. int x, sum;
  509. int len;
  510. /* Initial carriers (real/imaginary) */
  511. float cr = 1.0;
  512. float ci = 0.0;
  513. float scont = 0.0;
  514. unsigned char msg[256];
  515. len = callerid_genmsg(msg, sizeof(msg), number, name, flags);
  516. if (!callwaiting) {
  517. /* Wait a half a second */
  518. for (x=0;x<4000;x++)
  519. PUT_BYTE(0x7f);
  520. /* Transmit 30 0x55's (looks like a square wave) for channel seizure */
  521. for (x=0;x<30;x++)
  522. PUT_CLID(0x55);
  523. }
  524. /* Send 150ms of callerid marks */
  525. for (x=0;x<150;x++)
  526. PUT_CLID_MARKMS;
  527. /* Send 0x80 indicating MDMF format */
  528. PUT_CLID(0x80);
  529. /* Put length of whole message */
  530. PUT_CLID(len);
  531. sum = 0x80 + strlen(msg);
  532. /* Put each character of message and update checksum */
  533. for (x=0;x<len; x++) {
  534. PUT_CLID(msg[x]);
  535. sum += msg[x];
  536. }
  537. /* Send 2's compliment of sum */
  538. PUT_CLID(256 - (sum & 255));
  539. /* Send 50 more ms of marks */
  540. for (x=0;x<50;x++)
  541. PUT_CLID_MARKMS;
  542. return bytes;
  543. }
  544. void ast_shrink_phone_number(char *n)
  545. {
  546. int x,y=0;
  547. for (x=0;n[x];x++)
  548. if (!strchr("( )-.", n[x]))
  549. n[y++] = n[x];
  550. n[y] = '\0';
  551. }
  552. int ast_isphonenumber(char *n)
  553. {
  554. int x;
  555. if (!n || ast_strlen_zero(n))
  556. return 0;
  557. for (x=0;n[x];x++)
  558. if (!strchr("0123456789*#+", n[x]))
  559. return 0;
  560. return 1;
  561. }
  562. int ast_callerid_parse(char *instr, char **name, char **location)
  563. {
  564. char *ns, *ne;
  565. char *ls, *le;
  566. char tmp[256];
  567. /* Try for "name" <location> format or
  568. name <location> format */
  569. if ((ls = strchr(instr, '<')) && (le = strchr(ls, '>'))) {
  570. /* Found the location */
  571. *le = '\0';
  572. *ls = '\0';
  573. *location = ls + 1;
  574. if ((ns = strchr(instr, '\"')) && (ne = strchr(ns + 1, '\"'))) {
  575. /* Get name out of quotes */
  576. *ns = '\0';
  577. *ne = '\0';
  578. *name = ns + 1;
  579. return 0;
  580. } else {
  581. /* Just trim off any trailing spaces */
  582. *name = instr;
  583. while(!ast_strlen_zero(instr) && (instr[strlen(instr) - 1] < 33))
  584. instr[strlen(instr) - 1] = '\0';
  585. /* And leading spaces */
  586. while(**name && (**name < 33))
  587. (*name)++;
  588. return 0;
  589. }
  590. } else {
  591. strncpy(tmp, instr, sizeof(tmp)-1);
  592. ast_shrink_phone_number(tmp);
  593. if (ast_isphonenumber(tmp)) {
  594. /* Assume it's just a location */
  595. *name = NULL;
  596. *location = instr;
  597. } else {
  598. /* Assume it's just a name. Make sure it's not quoted though */
  599. *name = instr;
  600. while(*(*name) && ((*(*name) < 33) || (*(*name) == '\"'))) (*name)++;
  601. ne = *name + strlen(*name) - 1;
  602. while((ne > *name) && ((*ne < 33) || (*ne == '\"'))) { *ne = '\0'; ne--; }
  603. *location = NULL;
  604. }
  605. return 0;
  606. }
  607. return -1;
  608. }
  609. static int __ast_callerid_generate(unsigned char *buf, char *callerid, int callwaiting, int codec)
  610. {
  611. char tmp[256];
  612. char *n, *l;
  613. if (!callerid)
  614. return callerid_generate(buf, NULL, NULL, 0, callwaiting, codec);
  615. strncpy(tmp, callerid, sizeof(tmp)-1);
  616. if (ast_callerid_parse(tmp, &n, &l)) {
  617. ast_log(LOG_WARNING, "Unable to parse '%s' into CallerID name & number\n", callerid);
  618. return callerid_generate(buf, NULL, NULL, 0, callwaiting, codec);
  619. }
  620. if (l)
  621. ast_shrink_phone_number(l);
  622. if (!ast_isphonenumber(l))
  623. return callerid_generate(buf, NULL, n, 0, callwaiting, codec);
  624. return callerid_generate(buf, l, n, 0, callwaiting, codec);
  625. }
  626. int ast_callerid_generate(unsigned char *buf, char *callerid, int codec)
  627. {
  628. return __ast_callerid_generate(buf, callerid, 0, codec);
  629. }
  630. int ast_callerid_callwaiting_generate(unsigned char *buf, char *callerid, int codec)
  631. {
  632. return __ast_callerid_generate(buf, callerid, 1, codec);
  633. }