aboutsummaryrefslogtreecommitdiffstats
path: root/callerid.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-05-07 00:43:32 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-05-07 00:43:32 +0000
commit90c3a1ec2ec9f47f0c1ab24a23fe783ccdb5dcb5 (patch)
tree19785e87a52fa74ecc72b19cf04b901d677f228b /callerid.c
parente509ea55c0c06ddd5bc57d6ed8e47fae3aa6ce66 (diff)
Version 0.1.8 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@314 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'callerid.c')
-rwxr-xr-xcallerid.c88
1 files changed, 70 insertions, 18 deletions
diff --git a/callerid.c b/callerid.c
index 034b4e8a2..f78714fbf 100755
--- a/callerid.c
+++ b/callerid.c
@@ -24,6 +24,8 @@
#include <asterisk/callerid.h>
#include <asterisk/logger.h>
#include <asterisk/fskmodem.h>
+#include "sas.h"
+#include "cas.h"
struct callerid_state {
@@ -96,6 +98,33 @@ void callerid_get(struct callerid_state *cid, char **name, char **number, int *f
*number = cid->number;
}
+int ast_callerid_gen_cas(unsigned char *outbuf, int len)
+{
+ int pos = 0;
+ int cnt;
+ int saslen=2400;
+ if (len < saslen)
+ return -1;
+ while(saslen) {
+ cnt = saslen;
+ if (cnt > sizeof(sas))
+ cnt = sizeof(sas);
+ memcpy(outbuf + pos, sas, cnt);
+ pos += cnt;
+ len -= cnt;
+ saslen -= cnt;
+ }
+ while(len) {
+ cnt = len;
+ if (cnt > sizeof(cas))
+ cnt = sizeof(cas);
+ memcpy(outbuf + pos, cas, cnt);
+ pos += cnt;
+ len -= cnt;
+ }
+ return 0;
+}
+
int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int len)
{
int mylen = len;
@@ -363,7 +392,7 @@ static inline float callerid_getcarrier(float *cr, float *ci, int bit)
PUT_CLID_BAUD(1); /* Stop bit */ \
} while(0);
-int callerid_generate(unsigned char *buf, char *number, char *name, int flags)
+int callerid_generate(unsigned char *buf, char *number, char *name, int flags, int callwaiting)
{
int bytes=0;
int x, sum;
@@ -373,11 +402,14 @@ int callerid_generate(unsigned char *buf, char *number, char *name, int flags)
float scont = 0.0;
char msg[256];
callerid_genmsg(msg, sizeof(msg), number, name, flags);
- for (x=0;x<4000;x++)
- PUT_BYTE(0x7f);
- /* Transmit 30 0x55's (looks like a square wave */
- for (x=0;x<30;x++)
- PUT_CLID(0x55);
+ if (!callwaiting) {
+ /* Wait a half a second */
+ for (x=0;x<4000;x++)
+ PUT_BYTE(0x7f);
+ /* Transmit 30 0x55's (looks like a square wave) for channel seizure */
+ for (x=0;x<30;x++)
+ PUT_CLID(0x55);
+ }
/* Send 150ms of callerid marks */
for (x=0;x<150;x++)
PUT_CLID_MARKMS;
@@ -412,6 +444,8 @@ void ast_shrink_phone_number(char *n)
int ast_isphonenumber(char *n)
{
int x;
+ if (!n)
+ return 0;
for (x=0;n[x];x++)
if (!strchr("0123456789", n[x]))
return 0;
@@ -422,6 +456,7 @@ int ast_callerid_parse(char *instr, char **name, char **location)
{
char *ns, *ne;
char *ls, *le;
+ char tmp[256];
/* Try for "name" <location> format or
name <location> format */
if ((ls = strchr(instr, '<')) && (le = strchr(ls, '>'))) {
@@ -446,29 +481,46 @@ int ast_callerid_parse(char *instr, char **name, char **location)
return 0;
}
} else {
- /* Assume it's just a location */
- *name = NULL;
- *location = instr;
+ strncpy(tmp, instr, sizeof(tmp));
+ ast_shrink_phone_number(tmp);
+ if (!ast_isphonenumber(tmp)) {
+ /* Assume it's just a location */
+ *name = NULL;
+ *location = instr;
+ } else {
+ /* Assume it's just a name */
+ *name = instr;
+ *location = NULL;
+ }
return 0;
}
return -1;
}
-int ast_callerid_generate(unsigned char *buf, char *callerid)
+static int __ast_callerid_generate(unsigned char *buf, char *callerid, int callwaiting)
{
char tmp[256];
char *n, *l;
if (!callerid)
- return callerid_generate(buf, NULL, NULL, 0);
+ return callerid_generate(buf, NULL, NULL, 0, callwaiting);
strncpy(tmp, callerid, sizeof(tmp));
if (ast_callerid_parse(tmp, &n, &l)) {
ast_log(LOG_WARNING, "Unable to parse '%s' into CallerID name & number\n", callerid);
- return callerid_generate(buf, NULL, NULL, 0);
+ return callerid_generate(buf, NULL, NULL, 0, callwaiting);
}
- ast_shrink_phone_number(l);
- if (!n && (!ast_isphonenumber(l)))
- return callerid_generate(buf, NULL, NULL, 0);
- if (!ast_isphonenumber(l))
- return callerid_generate(buf, NULL, n, 0);
- return callerid_generate(buf, l, n, 0);
+ if (l)
+ ast_shrink_phone_number(l);
+ if (!ast_isphonenumber(l))
+ return callerid_generate(buf, NULL, n, 0, callwaiting);
+ return callerid_generate(buf, l, n, 0, callwaiting);
+}
+
+int ast_callerid_generate(unsigned char *buf, char *callerid)
+{
+ return __ast_callerid_generate(buf, callerid, 0);
+}
+
+int ast_callerid_callwaiting_generate(unsigned char *buf, char *callerid)
+{
+ return __ast_callerid_generate(buf, callerid, 1);
}