Mon Mar 20 08:25:49 2006

Asterisk developer's documentation


Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

callerid.c File Reference

CallerID Generation support. More...

#include <time.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <ctype.h>
#include "asterisk.h"
#include "asterisk/ulaw.h"
#include "asterisk/alaw.h"
#include "asterisk/frame.h"
#include "asterisk/channel.h"
#include "asterisk/callerid.h"
#include "asterisk/logger.h"
#include "asterisk/fskmodem.h"
#include "asterisk/utils.h"

Go to the source code of this file.

Data Structures

struct  callerid_state

Defines

#define AST_CALLERID_UNKNOWN   "<unknown>"
#define CALLERID_MARK   1200.0
#define CALLERID_SPACE   2200.0
#define CAS_FREQ1   2130.0
#define CAS_FREQ2   2750.0
#define SAS_FREQ   440.0

Functions

int __ast_callerid_generate (unsigned char *buf, char *name, char *number, int callwaiting, int codec)
int ast_callerid_callwaiting_generate (unsigned char *buf, char *name, char *number, int codec)
 Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm) See ast_callerid_generate() for other details.
int ast_callerid_generate (unsigned char *buf, char *name, char *number, int codec)
 Generate Caller-ID spill from the "callerid" field of asterisk (in e-mail address like format).
char * ast_callerid_merge (char *buf, int bufsiz, const char *name, const char *num, const char *unknown)
int ast_callerid_parse (char *instr, char **name, char **location)
 Destructively parse inbuf into name and location (or number) Parses callerid stream from inbuf and changes into useable form, outputed in name and location.
int ast_callerid_split (const char *buf, char *name, int namelen, char *num, int numlen)
const char * ast_describe_caller_presentation (int data)
 Convert caller ID pres value to explanatory string.
int ast_gen_cas (unsigned char *outbuf, int sendsas, int len, int codec)
int ast_isphonenumber (char *n)
 Check if a string consists only of digits.
int ast_parse_caller_presentation (const char *data)
 Convert caller ID text code to value used in config file parsing.
void ast_shrink_phone_number (char *n)
 Shrink a phone number in place to just digits (more accurately it just removes ()'s, .'s, and -'s...
int callerid_feed (struct callerid_state *cid, unsigned char *ubuf, int len, int codec)
 Read samples into the state machine.
void callerid_free (struct callerid_state *cid)
 Free a callerID state.
int callerid_generate (unsigned char *buf, char *number, char *name, int flags, int callwaiting, int codec)
 Generates a CallerID FSK stream in ulaw format suitable for transmission.
int callerid_genmsg (char *msg, int size, char *number, char *name, int flags)
void callerid_get (struct callerid_state *cid, char **name, char **number, int *flags)
 Extract info out of callerID state machine. Flags are listed above.
void callerid_get_dtmf (char *cidstring, char *number, int *flags)
void callerid_init (void)
 CallerID Initialization.
callerid_statecallerid_new (int cid_signalling)
 Create a callerID state machine.
void gen_tone (unsigned char *buf, int len, int codec, float ddr1, float ddi1, float *cr1, float *ci1)
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)
int vmwi_generate (unsigned char *buf, int active, int mdmf, int codec)
 Generate message waiting indicator (stutter tone).

Variables

float casdi1
float casdi2
float casdr1
float casdr2
float cid_di [4]
float cid_dr [4]
float clidsb = 8000.0 / 1200.0
struct {
   char *   description
   char *   name
   int   val
pres_types []
float sasdi
float sasdr


Detailed Description

CallerID Generation support.

Definition in file callerid.c.


Define Documentation

#define AST_CALLERID_UNKNOWN   "<unknown>"
 

Definition at line 73 of file callerid.c.

#define CALLERID_MARK   1200.0
 

1200 hz for "1"

Definition at line 68 of file callerid.c.

Referenced by callerid_init().

#define CALLERID_SPACE   2200.0
 

2200 hz for "0"

Definition at line 67 of file callerid.c.

Referenced by callerid_init().

#define CAS_FREQ1   2130.0
 

Definition at line 70 of file callerid.c.

Referenced by callerid_init().

#define CAS_FREQ2   2750.0
 

Definition at line 71 of file callerid.c.

Referenced by callerid_init().

#define SAS_FREQ   440.0
 

Definition at line 69 of file callerid.c.

Referenced by callerid_init().


Function Documentation

int __ast_callerid_generate unsigned char *  buf,
char *  name,
char *  number,
int  callwaiting,
int  codec
[static]
 

Definition at line 684 of file callerid.c.

References ast_strlen_zero(), callerid_generate(), and name.

Referenced by ast_callerid_callwaiting_generate(), and ast_callerid_generate().

00685 {
00686    if (ast_strlen_zero(name))
00687       name = NULL;
00688    if (ast_strlen_zero(number))
00689       number = NULL;
00690    return callerid_generate(buf, number, name, 0, callwaiting, codec);
00691 }

int ast_callerid_callwaiting_generate unsigned char *  buf,
char *  name,
char *  number,
int  codec
 

Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm) See ast_callerid_generate() for other details.

Definition at line 698 of file callerid.c.

References __ast_callerid_generate(), and name.

Referenced by send_cwcidspill().

00699 {
00700    return __ast_callerid_generate(buf, name, number, 1, codec);
00701 }

int ast_callerid_generate unsigned char *  buf,
char *  name,
char *  number,
int  codec
 

Generate Caller-ID spill from the "callerid" field of asterisk (in e-mail address like format).

Parameters:
buf buffer for output samples. See callerid_generate() for details regarding buffer.
name Caller-ID Name
number Caller-ID Number
codec Asterisk codec (either AST_FORMAT_ALAW or AST_FORMAT_ULAW)
Acts like callerid_generate except uses an asterisk format callerid string.

Definition at line 693 of file callerid.c.

References __ast_callerid_generate(), and name.

Referenced by zt_call().

00694 {
00695    return __ast_callerid_generate(buf, name, number, 0, codec);
00696 }

char* ast_callerid_merge char *  buf,
int  bufsiz,
const char *  name,
const char *  num,
const char *  unknown
 

Definition at line 703 of file callerid.c.

References name.

Referenced by _sip_show_peer(), iax2_show_peer(), leave_voicemail(), prep_email_sub_vars(), and sip_show_user().

00704 {
00705    if (!unknown)
00706       unknown = "<unknown>";
00707    if (name && num)
00708       snprintf(buf, bufsiz, "\"%s\" <%s>", name, num);
00709    else if (name) 
00710       ast_copy_string(buf, name, bufsiz);
00711    else if (num)
00712       ast_copy_string(buf, num, bufsiz);
00713    else
00714       ast_copy_string(buf, unknown, bufsiz);
00715    return buf;
00716 }

int ast_callerid_parse char *  instr,
char **  name,
char **  location
 

Destructively parse inbuf into name and location (or number) Parses callerid stream from inbuf and changes into useable form, outputed in name and location.

Returns:
returns -1 on failure, otherwise 0

Definition at line 637 of file callerid.c.

References ast_isphonenumber(), ast_shrink_phone_number(), ast_strlen_zero(), and name.

Referenced by action_originate(), adsi_message(), advanced_options(), ast_callerid_split(), ast_osp_lookup(), ast_osp_validate(), ast_privacy_check(), ast_privacy_set(), handle_setcallerid(), misdn_new(), play_message_callerid(), rpt_call(), rpt_exec(), setrdnis_exec(), and write_metadata().

00638 {
00639    char *ns, *ne;
00640    char *ls, *le;
00641    char tmp[256];
00642    /* Try for "name" <location> format or 
00643       name <location> format */
00644    if ((ls = strchr(instr, '<')) && (le = strchr(ls, '>'))) {
00645       /* Found the location */
00646       *le = '\0';
00647       *ls = '\0';
00648       *location = ls + 1;
00649       if ((ns = strchr(instr, '\"')) && (ne = strchr(ns + 1, '\"'))) {
00650          /* Get name out of quotes */
00651          *ns = '\0';
00652          *ne = '\0';
00653          *name = ns + 1;
00654          return 0;
00655       } else {
00656          /* Just trim off any trailing spaces */
00657          *name = instr;
00658          while(!ast_strlen_zero(instr) && (instr[strlen(instr) - 1] < 33))
00659             instr[strlen(instr) - 1] = '\0';
00660          /* And leading spaces */
00661          *name = ast_skip_blanks(*name);
00662          return 0;
00663       }
00664    } else {
00665       ast_copy_string(tmp, instr, sizeof(tmp));
00666       ast_shrink_phone_number(tmp);
00667       if (ast_isphonenumber(tmp)) {
00668          /* Assume it's just a location */
00669          *name = NULL;
00670          *location = instr;
00671       } else {
00672          /* Assume it's just a name.  Make sure it's not quoted though */
00673          *name = instr;
00674          while(*(*name) && ((*(*name) < 33) || (*(*name) == '\"'))) (*name)++;
00675          ne = *name + strlen(*name) - 1;
00676          while((ne > *name) && ((*ne < 33) || (*ne == '\"'))) { *ne = '\0'; ne--; }
00677          *location = NULL;
00678       }
00679       return 0;
00680    }
00681    return -1;
00682 }

int ast_callerid_split const char *  buf,
char *  name,
int  namelen,
char *  num,
int  numlen
 

Definition at line 718 of file callerid.c.

References ast_callerid_parse(), ast_shrink_phone_number(), ast_strdupa, and name.

Referenced by apply_outgoing(), build_device(), build_gateway(), build_peer(), build_user(), callerid_write(), disa_exec(), load_module(), monitor_handle_notowned(), setcallerid_exec(), setup_zap(), and vpb_new().

00719 {
00720    char *tmp;
00721    char *l = NULL, *n = NULL;
00722    tmp = ast_strdupa(buf);
00723    if (!tmp) {
00724       name[0] = '\0';
00725       num[0] = '\0';
00726       return -1;
00727    }
00728    ast_callerid_parse(tmp, &n, &l);
00729    if (n)
00730       ast_copy_string(name, n, namelen);
00731    else
00732       name[0] = '\0';
00733    if (l) {
00734       ast_shrink_phone_number(l);
00735       ast_copy_string(num, l, numlen);
00736    } else
00737       num[0] = '\0';
00738    return 0;
00739 }

const char* ast_describe_caller_presentation int  data  ) 
 

Convert caller ID pres value to explanatory string.

Parameters:
data value (see callerid.h AST_PRES_ )
Returns:
string for human presentation

Definition at line 778 of file callerid.c.

References pres_types.

Referenced by _sip_show_peer(), ast_set_callerid(), and sip_show_user().

00779 {
00780    int i;
00781 
00782    for (i = 0; i < ((sizeof(pres_types) / sizeof(pres_types[0]))); i++) {
00783       if (pres_types[i].val == data)
00784          return pres_types[i].description;
00785    }
00786 
00787    return "unknown";
00788 }

int ast_gen_cas unsigned char *  outbuf,
int  sas,
int  len,
int  codec
 

Parameters:
outbuf Allocated buffer for data. Must be at least 2400 bytes unless no SAS is desired
sas Non-zero if CAS should be preceeded by SAS
len How many samples to generate.
codec Which codec (AST_FORMAT_ALAW or AST_FORMAT_ULAW)
Returns:
Returns -1 on error (if len is less than 2400), 0 on success.

Definition at line 233 of file callerid.c.

References casdi1, casdi2, casdr1, casdr2, gen_tone(), gen_tones(), sasdi, and sasdr.

Referenced by __adsi_transmit_messages(), and zt_callwait().

00234 {
00235    int pos = 0;
00236    int saslen=2400;
00237    float cr1 = 1.0;
00238    float ci1 = 0.0;
00239    float cr2 = 1.0;
00240    float ci2 = 0.0;
00241    if (sendsas) {
00242       if (len < saslen)
00243          return -1;
00244       gen_tone(outbuf, saslen, codec, sasdr, sasdi, &cr1, &ci1);
00245       len -= saslen;
00246       pos += saslen;
00247       cr2 = cr1;
00248       ci2 = ci1;
00249    }
00250    gen_tones(outbuf + pos, len, codec, casdr1, casdi1, casdr2, casdi2, &cr1, &ci1, &cr2, &ci2);
00251    return 0;
00252 }

int ast_isphonenumber char *  n  ) 
 

Check if a string consists only of digits.

Returns:
1 if string is valid AST phone number

0 if not

Definition at line 623 of file callerid.c.

References ast_strlen_zero().

Referenced by ast_callerid_parse(), ast_osp_lookup(), and ast_osp_validate().

00624 {
00625    int x;
00626    if (ast_strlen_zero(n))
00627       return 0;
00628    for (x=0;n[x];x++)
00629       if (!strchr("0123456789*#+", n[x]))
00630          return 0;
00631    return 1;
00632 }

int ast_parse_caller_presentation const char *  data  ) 
 

Convert caller ID text code to value used in config file parsing.

Parameters:
data text string
Returns:
value AST_PRES_ from callerid.h

Definition at line 762 of file callerid.c.

References name, and pres_types.

Referenced by build_peer(), build_user(), and setcallerid_pres_exec().

00763 {
00764    int i;
00765 
00766    for (i = 0; i < ((sizeof(pres_types) / sizeof(pres_types[0]))); i++) {
00767       if (!strcasecmp(pres_types[i].name, data))
00768          return pres_types[i].val;
00769    }
00770 
00771    return -1;
00772 }

void ast_shrink_phone_number char *  n  ) 
 

Shrink a phone number in place to just digits (more accurately it just removes ()'s, .'s, and -'s...

Parameters:
n The number to be stripped/shrunk
Returns:
Returns nothing important

Definition at line 589 of file callerid.c.

Referenced by action_originate(), ast_callerid_parse(), ast_callerid_split(), ast_osp_lookup(), ast_osp_validate(), ast_privacy_check(), ast_privacy_set(), check_access(), check_user_full(), dial_exec_full(), handle_setcallerid(), pbx_load_module(), rpt_exec(), setrdnis_exec(), ss_thread(), and write_metadata().

00590 {
00591    int x,y=0;
00592    int bracketed=0;
00593    for (x=0;n[x];x++) {
00594       switch(n[x]) {
00595       case '[':
00596          bracketed++;
00597          n[y++] = n[x];
00598          break;
00599       case ']':
00600          bracketed--;
00601          n[y++] = n[x];
00602          break;
00603       case '-':
00604          if (bracketed)
00605             n[y++] = n[x];
00606          break;
00607       case '.':
00608          if (!n[x+1])
00609             n[y++] = n[x];
00610          break;
00611       default:
00612          if (!strchr("( )", n[x]))
00613             n[y++] = n[x];
00614       }
00615    }
00616    n[y] = '\0';
00617 }

int callerid_feed struct callerid_state cid,
unsigned char *  ubuf,
int  samples,
int  codec
 

Read samples into the state machine.

Parameters:
cid Which state machine to act upon
ubuf containing your samples
samples number of samples contained within the buffer.
codec which codec (AST_FORMAT_ALAW or AST_FORMAT_ULAW)
Send received audio to the Caller*ID demodulator.
Returns:
Returns -1 on error, 0 for "needs more samples", and 1 if the CallerID spill reception is complete.

Definition at line 254 of file callerid.c.

References ast_log(), ast_strlen_zero(), AST_XLAW, callerid_state::cksum, callerid_state::flags, free, fsk_serie(), callerid_state::fskd, callerid_state::len, LOG_ERROR, LOG_NOTICE, LOG_WARNING, malloc, callerid_state::name, callerid_state::number, callerid_state::oldlen, callerid_state::oldstuff, callerid_state::pos, callerid_state::rawdata, callerid_state::sawflag, and callerid_state::type.

Referenced by get_callerid_ast(), and ss_thread().

00255 {
00256    int mylen = len;
00257    int olen;
00258    int b = 'X';
00259    int res;
00260    int x;
00261    short *buf = malloc(2 * len + cid->oldlen);
00262    short *obuf = buf;
00263    if (!buf) {
00264       ast_log(LOG_WARNING, "Out of memory\n");
00265       return -1;
00266    }
00267    memset(buf, 0, 2 * len + cid->oldlen);
00268    memcpy(buf, cid->oldstuff, cid->oldlen);
00269    mylen += cid->oldlen/2;
00270    for (x=0;x<len;x++) 
00271       buf[x+cid->oldlen/2] = AST_XLAW(ubuf[x]);
00272    while(mylen >= 160) {
00273       olen = mylen;
00274       res = fsk_serie(&cid->fskd, buf, &mylen, &b);
00275       if (mylen < 0) {
00276          ast_log(LOG_ERROR, "fsk_serie made mylen < 0 (%d)\n", mylen);
00277          return -1;
00278       }
00279       buf += (olen - mylen);
00280       if (res < 0) {
00281          ast_log(LOG_NOTICE, "fsk_serie failed\n");
00282          return -1;
00283       }
00284       if (res == 1) {
00285          /* Ignore invalid bytes */
00286          if (b > 0xff)
00287             continue;
00288          switch(cid->sawflag) {
00289          case 0: /* Look for flag */
00290             if (b == 'U')
00291                cid->sawflag = 2;
00292             break;
00293          case 2: /* Get lead-in */
00294             if ((b == 0x04) || (b == 0x80)) {
00295                cid->type = b;
00296                cid->sawflag = 3;
00297                cid->cksum = b;
00298             }
00299             break;
00300          case 3:  /* Get length */
00301             /* Not a lead in.  We're ready  */
00302             cid->sawflag = 4;
00303             cid->len = b;
00304             cid->pos = 0;
00305             cid->cksum += b;
00306             break;
00307          case 4: /* Retrieve message */
00308             if (cid->pos >= 128) {
00309                ast_log(LOG_WARNING, "Caller ID too long???\n");
00310                return -1;
00311             }
00312             cid->rawdata[cid->pos++] = b;
00313             cid->len--;
00314             cid->cksum += b;
00315             if (!cid->len) {
00316                cid->rawdata[cid->pos] = '\0';
00317                cid->sawflag = 5;
00318             }
00319             break;
00320          case 5: /* Check checksum */
00321             if (b != (256 - (cid->cksum & 0xff))) {
00322                ast_log(LOG_NOTICE, "Caller*ID failed checksum\n");
00323                /* Try again */
00324                cid->sawflag = 0;
00325                break;
00326             }
00327       
00328             cid->number[0] = '\0';
00329             cid->name[0] = '\0';
00330             /* If we get this far we're fine.  */
00331             if (cid->type == 0x80) {
00332                /* MDMF */
00333                /* Go through each element and process */
00334                for (x=0;x< cid->pos;) {
00335                   switch(cid->rawdata[x++]) {
00336                   case 1:
00337                      /* Date */
00338                      break;
00339                   case 2: /* Number */
00340                   case 3: /* Number (for Zebble) */
00341                   case 4: /* Number */
00342                      res = cid->rawdata[x];
00343                      if (res > 32) {
00344                         ast_log(LOG_NOTICE, "Truncating long caller ID number from %d bytes to 32\n", cid->rawdata[x]);
00345                         res = 32; 
00346                      }
00347                      if (ast_strlen_zero(cid->number)) {
00348                         memcpy(cid->number, cid->rawdata + x + 1, res);
00349                         /* Null terminate */
00350                         cid->number[res] = '\0';
00351                      }
00352                      break;
00353                   case 6: /* Stentor Call Qualifier (ie. Long Distance call) */
00354                      break;
00355                   case 7: /* Name */
00356                   case 8: /* Name */
00357                      res = cid->rawdata[x];
00358                      if (res > 32) {
00359                         ast_log(LOG_NOTICE, "Truncating long caller ID name from %d bytes to 32\n", cid->rawdata[x]);
00360                         res = 32; 
00361                      }
00362                      memcpy(cid->name, cid->rawdata + x + 1, res);
00363                      cid->name[res] = '\0';
00364                      break;
00365                   case 17: /* UK: Call type, 1=Voice Call, 2=Ringback when free, 129=Message waiting  */
00366                   case 19: /* UK: Network message system status (Number of messages waiting) */
00367                   case 22: /* Something French */
00368                      break;
00369                   default:
00370                      ast_log(LOG_NOTICE, "Unknown IE %d\n", cid->rawdata[x-1]);
00371                   }
00372                   x += cid->rawdata[x];
00373                   x++;
00374                }
00375             } else {
00376                /* SDMF */
00377                ast_copy_string(cid->number, cid->rawdata + 8, sizeof(cid->number));
00378             }
00379             /* Update flags */
00380             cid->flags = 0;
00381             if (!strcmp(cid->number, "P")) {
00382                strcpy(cid->number, "");
00383                cid->flags |= CID_PRIVATE_NUMBER;
00384             } else if (!strcmp(cid->number, "O") || ast_strlen_zero(cid->number)) {
00385                strcpy(cid->number, "");
00386                cid->flags |= CID_UNKNOWN_NUMBER;
00387             }
00388             if (!strcmp(cid->name, "P")) {
00389                strcpy(cid->name, "");
00390                cid->flags |= CID_PRIVATE_NAME;
00391             } else if (!strcmp(cid->name, "O") || ast_strlen_zero(cid->name)) {
00392                strcpy(cid->name, "");
00393                cid->flags |= CID_UNKNOWN_NAME;
00394             }
00395             return 1;
00396             break;
00397          default:
00398             ast_log(LOG_ERROR, "Dunno what to do with a digit in sawflag %d\n", cid->sawflag);
00399          }
00400       }
00401    }
00402    if (mylen) {
00403       memcpy(cid->oldstuff, buf, mylen * 2);
00404       cid->oldlen = mylen * 2;
00405    } else
00406       cid->oldlen = 0;
00407    free(obuf);
00408    return 0;
00409 }

void callerid_free struct callerid_state cid  ) 
 

Free a callerID state.

Parameters:
cid This is the callerid_state state machine to free This function frees callerid_state cid.

Definition at line 411 of file callerid.c.

References free.

Referenced by ss_thread().

00412 {
00413    free(cid);
00414 }

int callerid_generate unsigned char *  buf,
char *  number,
char *  name,
int  flags,
int  callwaiting,
int  codec
 

Generates a CallerID FSK stream in ulaw format suitable for transmission.

Parameters:
buf Buffer to use. If "buf" is supplied, it will use that buffer instead of allocating its own. "buf" must be at least 32000 bytes in size of you want to be sure you don't have an overrun.
number Use NULL for no number or "P" for "private"
name name to be used
flags passed flags
callwaiting callwaiting flag
codec -- either AST_FORMAT_ULAW or AST_FORMAT_ALAW This function creates a stream of callerid (a callerid spill) data in ulaw format.
Returns:
It returns the size (in bytes) of the data (if it returns a size of 0, there is probably an error)

Definition at line 547 of file callerid.c.

References callerid_genmsg(), name, PUT_BYTE, and PUT_CLID.

Referenced by __ast_callerid_generate().

00548 {
00549    int bytes=0;
00550    int x, sum;
00551    int len;
00552    /* Initial carriers (real/imaginary) */
00553    float cr = 1.0;
00554    float ci = 0.0;
00555    float scont = 0.0;
00556    char msg[256];
00557    len = callerid_genmsg(msg, sizeof(msg), number, name, flags);
00558    if (!callwaiting) {
00559       /* Wait a half a second */
00560       for (x=0;x<4000;x++)
00561          PUT_BYTE(0x7f);
00562       /* Transmit 30 0x55's (looks like a square wave) for channel seizure */
00563       for (x=0;x<30;x++)
00564          PUT_CLID(0x55);
00565    }
00566    /* Send 150ms of callerid marks */
00567    for (x=0;x<150;x++)
00568       PUT_CLID_MARKMS;
00569    /* Send 0x80 indicating MDMF format */
00570    PUT_CLID(0x80);
00571    /* Put length of whole message */
00572    PUT_CLID(len);
00573    sum = 0x80 + strlen(msg);
00574    /* Put each character of message and update checksum */
00575    for (x=0;x<len; x++) {
00576       PUT_CLID(msg[x]);
00577       sum += msg[x];
00578    }
00579    /* Send 2's compliment of sum */
00580    PUT_CLID(256 - (sum & 255));
00581 
00582    /* Send 50 more ms of marks */
00583    for (x=0;x<50;x++)
00584       PUT_CLID_MARKMS;
00585    
00586    return bytes;
00587 }

int callerid_genmsg char *  msg,
int  size,
char *  number,
char *  name,
int  flags
[static]
 

Definition at line 416 of file callerid.c.

References ast_strlen_zero(), and name.

Referenced by callerid_generate().

00417 {
00418    time_t t;
00419    struct tm tm;
00420    char *ptr;
00421    int res;
00422    int i,x;
00423    /* Get the time */
00424    time(&t);
00425    localtime_r(&t,&tm);
00426    
00427    ptr = msg;
00428    
00429    /* Format time and message header */
00430    res = snprintf(ptr, size, "\001\010%02d%02d%02d%02d", tm.tm_mon + 1,
00431             tm.tm_mday, tm.tm_hour, tm.tm_min);
00432    size -= res;
00433    ptr += res;
00434    if (ast_strlen_zero(number) || (flags & CID_UNKNOWN_NUMBER)) {
00435       /* Indicate number not known */
00436       res = snprintf(ptr, size, "\004\001O");
00437       size -= res;
00438       ptr += res;
00439    } else if (flags & CID_PRIVATE_NUMBER) {
00440       /* Indicate number is private */
00441       res = snprintf(ptr, size, "\004\001P");
00442       size -= res;
00443       ptr += res;
00444    } else {
00445       /* Send up to 16 digits of number MAX */
00446       i = strlen(number);
00447       if (i > 16) i = 16;
00448       res = snprintf(ptr, size, "\002%c", i);
00449       size -= res;
00450       ptr += res;
00451       for (x=0;x<i;x++)
00452          ptr[x] = number[x];
00453       ptr[i] = '\0';
00454       ptr += i;
00455       size -= i;
00456    }
00457 
00458    if (ast_strlen_zero(name) || (flags & CID_UNKNOWN_NAME)) {
00459       /* Indicate name not known */
00460       res = snprintf(ptr, size, "\010\001O");
00461       size -= res;
00462       ptr += res;
00463    } else if (flags & CID_PRIVATE_NAME) {
00464       /* Indicate name is private */
00465       res = snprintf(ptr, size, "\010\001P");
00466       size -= res;
00467       ptr += res;
00468    } else {
00469       /* Send up to 16 digits of name MAX */
00470       i = strlen(name);
00471       if (i > 16) i = 16;
00472       res = snprintf(ptr, size, "\007%c", i);
00473       size -= res;
00474       ptr += res;
00475       for (x=0;x<i;x++)
00476          ptr[x] = name[x];
00477       ptr[i] = '\0';
00478       ptr += i;
00479       size -= i;
00480    }
00481    return (ptr - msg);
00482    
00483 }

void callerid_get struct callerid_state cid,
char **  number,
char **  name,
int *  flags
 

Extract info out of callerID state machine. Flags are listed above.

Parameters:
cid Callerid state machine to act upon
number Pass the address of a pointer-to-char (will contain the phone number)
name Pass the address of a pointer-to-char (will contain the name)
flags Pass the address of an int variable(will contain the various callerid flags)
This function extracts a callerid string out of a callerid_state state machine. If no number is found, *number will be set to NULL. Likewise for the name. Flags can contain any of the following:

Returns:
Returns nothing.

Definition at line 159 of file callerid.c.

References CID_UNKNOWN_NAME, CID_UNKNOWN_NUMBER, callerid_state::flags, name, callerid_state::name, and callerid_state::number.

Referenced by get_callerid_ast(), and ss_thread().

00160 {
00161    *flags = cid->flags;
00162    if (cid->flags & (CID_UNKNOWN_NAME | CID_PRIVATE_NUMBER))
00163       *name = NULL;
00164    else
00165       *name = cid->name;
00166    if (cid->flags & (CID_UNKNOWN_NUMBER | CID_PRIVATE_NUMBER))
00167       *number = NULL;
00168    else
00169       *number = cid->number;
00170 }

void callerid_get_dtmf char *  cidstring,
char *  number,
int *  flags
 

Parameters:
cidstring The actual transmitted string.
number The cid number is returned here.
flags The cid flags are returned here. This function parses DTMF callerid.

Definition at line 172 of file callerid.c.

References ast_log(), LOG_DEBUG, and LOG_WARNING.

Referenced by ss_thread().

00173 {
00174    int i;
00175    int code;
00176 
00177    /* "Clear" the number-buffer. */
00178    number[0] = 0;
00179 
00180    if (strlen(cidstring) < 2) {
00181       ast_log(LOG_DEBUG, "No cid detected\n");
00182       *flags = CID_UNKNOWN_NUMBER;
00183       return;
00184    }
00185    
00186    /* Detect protocol and special types */
00187    if (cidstring[0] == 'B') {
00188       /* Handle special codes */
00189       code = atoi(&cidstring[1]);
00190       if (code == 0)
00191          *flags = CID_UNKNOWN_NUMBER;
00192       else if (code == 10) 
00193          *flags = CID_PRIVATE_NUMBER;
00194       else
00195          ast_log(LOG_DEBUG, "Unknown DTMF code %d\n", code);
00196    } else if (cidstring[0] == 'D' && cidstring[2] == '#') {
00197       /* .DK special code */
00198       if (cidstring[1] == '1')
00199          *flags = CID_PRIVATE_NUMBER;
00200       if (cidstring[1] == '2' || cidstring[1] == '3')
00201          *flags = CID_UNKNOWN_NUMBER;
00202    } else if (cidstring[0] == 'D' || cidstring[0] == 'A') {
00203       /* "Standard" callerid */
00204       for (i = 1; i < strlen(cidstring); i++ ) {
00205          if (cidstring[i] == 'C' || cidstring[i] == '#')
00206             break;
00207          if (isdigit(cidstring[i]))
00208             number[i-1] = cidstring[i];
00209          else
00210             ast_log(LOG_DEBUG, "Unknown CID digit '%c'\n",
00211                cidstring[i]);
00212       }
00213       number[i-1] = 0;
00214    } else if (isdigit(cidstring[0])) {
00215       /* It begins with a digit, so we parse it as a number and hope
00216        * for the best */
00217       ast_log(LOG_WARNING, "Couldn't detect start-character. CID "
00218          "parsing might be unreliable\n");
00219       for (i = 0; i < strlen(cidstring); i++) {
00220          if (isdigit(cidstring[i]))
00221                                 number[i] = cidstring[i];
00222          else
00223             break;
00224       }
00225       number[i] = 0;
00226    } else {
00227       ast_log(LOG_DEBUG, "Unknown CID protocol, start digit '%c'\n", 
00228          cidstring[0]);
00229       *flags = CID_UNKNOWN_NUMBER;
00230    }
00231 }

void callerid_init void   ) 
 

CallerID Initialization.

Initializes the callerid system. Mostly stuff for inverse FFT

Definition at line 113 of file callerid.c.

References CALLERID_MARK, CALLERID_SPACE, CAS_FREQ1, CAS_FREQ2, casdi1, casdi2, casdr1, casdr2, cid_di, cid_dr, SAS_FREQ, sasdi, and sasdr.

Referenced by main().

00114 {
00115    cid_dr[0] = cos(CALLERID_SPACE * 2.0 * M_PI / 8000.0);
00116    cid_di[0] = sin(CALLERID_SPACE * 2.0 * M_PI / 8000.0);
00117    cid_dr[1] = cos(CALLERID_MARK * 2.0 * M_PI / 8000.0);
00118    cid_di[1] = sin(CALLERID_MARK * 2.0 * M_PI / 8000.0);
00119    sasdr = cos(SAS_FREQ * 2.0 * M_PI / 8000.0);
00120    sasdi = sin(SAS_FREQ * 2.0 * M_PI / 8000.0);
00121    casdr1 = cos(CAS_FREQ1 * 2.0 * M_PI / 8000.0);
00122    casdi1 = sin(CAS_FREQ1 * 2.0 * M_PI / 8000.0);
00123    casdr2 = cos(CAS_FREQ2 * 2.0 * M_PI / 8000.0);
00124    casdi2 = sin(CAS_FREQ2 * 2.0 * M_PI / 8000.0);
00125 }

struct callerid_state* callerid_new int  cid_signalling  ) 
 

Create a callerID state machine.

Parameters:
cid_signalling Type of signalling in use
This function returns a malloc'd instance of the callerid_state data structure.
Returns:
Returns a pointer to a malloc'd callerid_state structure, or NULL on error.

Definition at line 127 of file callerid.c.

References ast_log(), fsk_data::bw, CID_UNKNOWN_NAME, fsk_data::cont, fsk_data::f_mark_idx, fsk_data::f_space_idx, callerid_state::flags, callerid_state::fskd, fsk_data::hdlc, LOG_WARNING, malloc, callerid_state::name, fsk_data::nbit, fsk_data::nstop, callerid_state::number, fsk_data::paridad, fsk_data::pcola, callerid_state::pos, fsk_data::spb, fsk_data::state, and fsk_data::x0.

Referenced by get_callerid_ast(), and ss_thread().

00128 {
00129    struct callerid_state *cid;
00130    cid = malloc(sizeof(struct callerid_state));
00131    if (cid) {
00132       memset(cid, 0, sizeof(struct callerid_state));
00133       cid->fskd.spb = 7;      /* 1200 baud */
00134       cid->fskd.hdlc = 0;     /* Async */
00135       cid->fskd.nbit = 8;     /* 8 bits */
00136       cid->fskd.nstop = 1; /* 1 stop bit */
00137       cid->fskd.paridad = 0;  /* No parity */
00138       cid->fskd.bw=1;         /* Filter 800 Hz */
00139       if (cid_signalling == 2) { /* v23 signalling */
00140          cid->fskd.f_mark_idx =  4; /* 1300 Hz */
00141          cid->fskd.f_space_idx = 5; /* 2100 Hz */
00142       } else { /* Bell 202 signalling as default */ 
00143          cid->fskd.f_mark_idx =  2; /* 1200 Hz */
00144          cid->fskd.f_space_idx = 3; /* 2200 Hz */
00145       }
00146       cid->fskd.pcola = 0;    /* No clue */
00147       cid->fskd.cont = 0;        /* Digital PLL reset */
00148       cid->fskd.x0 = 0.0;
00149       cid->fskd.state = 0;
00150       memset(cid->name, 0, sizeof(cid->name));
00151       memset(cid->number, 0, sizeof(cid->number));
00152       cid->flags = CID_UNKNOWN_NAME | CID_UNKNOWN_NUMBER;
00153       cid->pos = 0;
00154    } else
00155       ast_log(LOG_WARNING, "Out of memory\n");
00156    return cid;
00157 }

void gen_tone unsigned char *  buf,
int  len,
int  codec,
float  ddr1,
float  ddi1,
float *  cr1,
float *  ci1
[inline, static]
 

Definition at line 97 of file callerid.c.

References AST_LIN2X.

Referenced by ast_gen_cas().

00098 {
00099    int x;
00100    float t;
00101    for (x=0;x<len;x++) {
00102       t = *cr1 * ddr1 - *ci1 * ddi1;
00103       *ci1 = *cr1 * ddi1 + *ci1 * ddr1;
00104       *cr1 = t;
00105       t = 2.0 - (*cr1 * *cr1 + *ci1 * *ci1);
00106       *cr1 *= t;
00107       *ci1 *= t;  
00108       buf[x] = AST_LIN2X(*cr1 * 8192.0);
00109    }
00110 }

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
[inline, static]
 

Definition at line 75 of file callerid.c.

References AST_LIN2X.

Referenced by ast_gen_cas().

00076 {
00077    int x;
00078    float t;
00079    for (x=0;x<len;x++) {
00080       t = *cr1 * ddr1 - *ci1 * ddi1;
00081       *ci1 = *cr1 * ddi1 + *ci1 * ddr1;
00082       *cr1 = t;
00083       t = 2.0 - (*cr1 * *cr1 + *ci1 * *ci1);
00084       *cr1 *= t;
00085       *ci1 *= t;  
00086 
00087       t = *cr2 * ddr2 - *ci2 * ddi2;
00088       *ci2 = *cr2 * ddi2 + *ci2 * ddr2;
00089       *cr2 = t;
00090       t = 2.0 - (*cr2 * *cr2 + *ci2 * *ci2);
00091       *cr2 *= t;
00092       *ci2 *= t;  
00093       buf[x] = AST_LIN2X((*cr1 + *cr2) * 2048.0);
00094    }
00095 }

int vmwi_generate unsigned char *  buf,
int  active,
int  mdmf,
int  codec
 

Generate message waiting indicator (stutter tone).

Definition at line 485 of file callerid.c.

References PUT_BYTE, and PUT_CLID.

Referenced by do_monitor().

00486 {
00487    unsigned char msg[256];
00488    int len=0;
00489    int sum;
00490    int x;
00491    int bytes = 0;
00492    float cr = 1.0;
00493    float ci = 0.0;
00494    float scont = 0.0;
00495    if (mdmf) {
00496       /* MDMF Message waiting */
00497       msg[len++] = 0x82;
00498       /* Length is 3 */
00499       msg[len++] = 3;
00500       /* IE is "Message Waiting Parameter" */
00501       msg[len++] = 0xb;
00502       /* Length of IE is one */
00503       msg[len++] = 1;
00504       /* Active or not */
00505       if (active)
00506          msg[len++] = 0xff;
00507       else
00508          msg[len++] = 0x00;
00509    } else {
00510       /* SDMF Message waiting */
00511       msg[len++] = 0x6;
00512       /* Length is 3 */
00513       msg[len++] = 3;
00514       if (active) {
00515          msg[len++] = 0x42;
00516          msg[len++] = 0x42;
00517          msg[len++] = 0x42;
00518       } else {
00519          msg[len++] = 0x6f;
00520          msg[len++] = 0x6f;
00521          msg[len++] = 0x6f;
00522       }
00523    }
00524    sum = 0;
00525    for (x=0;x<len;x++)
00526       sum += msg[x];
00527    sum = (256 - (sum & 255));
00528    msg[len++] = sum;
00529    /* Wait a half a second */
00530    for (x=0;x<4000;x++)
00531       PUT_BYTE(0x7f);
00532    /* Transmit 30 0x55's (looks like a square wave) for channel seizure */
00533    for (x=0;x<30;x++)
00534       PUT_CLID(0x55);
00535    /* Send 170ms of callerid marks */
00536    for (x=0;x<170;x++)
00537       PUT_CLID_MARKMS;
00538    for (x=0;x<len;x++) {
00539       PUT_CLID(msg[x]);
00540    }
00541    /* Send 50 more ms of marks */
00542    for (x=0;x<50;x++)
00543       PUT_CLID_MARKMS;
00544    return bytes;
00545 }


Variable Documentation

float casdi1
 

Definition at line 65 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

float casdi2
 

Definition at line 65 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

float casdr1
 

Definition at line 65 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

float casdr2
 

Definition at line 65 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

float cid_di[4]
 

Definition at line 62 of file callerid.c.

Referenced by callerid_getcarrier(), and callerid_init().

float cid_dr[4]
 

Definition at line 62 of file callerid.c.

Referenced by callerid_getcarrier(), and callerid_init().

float clidsb = 8000.0 / 1200.0
 

Definition at line 63 of file callerid.c.

char* description
 

Definition at line 744 of file callerid.c.

Referenced by handle_show_application(), handle_show_function(), load_pbx(), and modlist_modentry().

char* name
 

Definition at line 743 of file callerid.c.

Referenced by __ast_callerid_generate(), __build_step(), __get_header(), __iax2_show_peers(), _sip_show_peers(), action_getvar(), action_hangup(), action_originate(), action_redirect(), action_setvar(), action_status(), action_timeout(), add_agent(), adsi_load(), adsi_message(), advanced_options(), append_mapping(), append_sub(), ast_callerid_callwaiting_generate(), ast_callerid_generate(), ast_callerid_merge(), ast_callerid_parse(), ast_callerid_split(), ast_category_new(), ast_category_rename(), ast_cdr_getvar(), ast_cdr_getvar_internal(), ast_cdr_register(), ast_cdr_setvar(), ast_cdr_unregister(), ast_channel_free(), ast_context_create(), ast_context_find(), ast_custom_function_find(), ast_dnsmgr_get(), ast_dnsmgr_lookup(), ast_dsp_set_call_progress_zone(), ast_format_register(), ast_format_unregister(), ast_get_channel_by_name_locked(), ast_get_channel_by_name_prefix_locked(), ast_get_channel_tech(), ast_get_hint(), ast_getformatbyname(), ast_getformatname_multiple(), ast_module_reload(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_parse_caller_presentation(), ast_rtp_lookup_mime_multiple(), ast_var_assign(), ast_var_name(), ast_variable_new(), ast_walk_channel_by_name_prefix_locked(), bestdata_handle_escape(), build_alias(), build_mapping(), build_peer(), build_step(), build_user(), callerid_generate(), callerid_genmsg(), callerid_get(), callerid_write(), cb_events(), chan_misdn_trace_call(), change_monitor_action(), channel_find_locked(), channel_spy(), chanspy_exec(), complete_agent_logoff_cmd(), delete_sub(), dlclose(), do_directory(), dump_ies(), dump_prov_ies(), fetch_odbc_obj(), fill_defaults(), find_alias(), find_feature(), find_peer(), find_subchannel_and_lock(), find_user(), free_port_cfg(), get_callerid_ast(), get_chan_by_ast_name(), get_cid_name(), get_header(), get_mohbyname(), get_sdp(), get_sdp_by_line(), get_sdp_iterate(), get_zap_channel_locked(), getdisplaybyname(), geteventbyname(), getflagbyname(), getjustifybyname(), getkeybyname(), getstatebyname(), getsubbyname(), handle_context(), handle_macro(), handle_message(), handle_showchan(), iax_provflags2str(), iax_str2flags(), load_config(), load_module(), load_pbx(), local_get_channel_begin_name(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_is_group_method(), mixmonitor_thread(), my_find_image(), my_unload_module(), new_odbc_obj(), odbc_load_module(), odbc_read(), odbc_unload_module(), odbc_write(), P(), pbx_builtin_getvar_helper(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_setglobalvar(), pbx_builtin_setvar(), pbx_builtin_setvar_helper(), phone_request(), play_mailbox_owner(), play_message_callerid(), process_my_load_module(), process_opcode(), process_returncode(), register_odbc_obj(), register_verify(), registry_authrequest(), remap_feature(), retrieve_astcfgint(), rpt_call(), rpt_exec(), rpt_master(), setcallerid_exec(), setenv(), settransfercapability_exec(), sip_prune_realtime(), softhangup_exec(), ss_thread(), start_monitor_action(), stop_monitor_action(), strat2int(), tds_load_module(), tds_unload_module(), telem_lookup(), temp_peer(), tone2str(), tzload(), tzparse(), unload_module(), unsetenv(), update_call_counter(), update_registry(), and vpb_request().

struct { ... } pres_types[] [static]
 

Referenced by ast_describe_caller_presentation(), and ast_parse_caller_presentation().

float sasdi
 

Definition at line 64 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

float sasdr
 

Definition at line 64 of file callerid.c.

Referenced by ast_gen_cas(), and callerid_init().

int val
 

Definition at line 742 of file callerid.c.

Referenced by __load_resource(), adsi_message(), ast_cdr_copy_vars(), ast_cdr_serialize_variables(), ast_instring(), astman_get_variables(), attempt_reconnect(), authenticate(), build_callid(), builtin_function_set(), count_exec(), disable_dtmf_detect(), dump_datetime(), enable_dtmf_detect(), function_ilink(), function_remote(), get_lib_name(), handle_set_debug(), handle_set_verbose(), ilog2(), ind_load_module(), init_manager(), load_config(), main(), make_tone_burst(), manager_dbput(), ogg_vorbis_read(), pbx_builtin_serialize_variables(), queue_set_param(), rpt_exec(), rpt_master(), thread_safe_rand(), and yyparse().


Generated on Mon Mar 20 08:25:49 2006 for Asterisk - the Open Source PBX by  doxygen 1.3.9.1