From c1d1440e599f85f41d55e91bedda3e3f2076efc6 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Wed, 19 Sep 2007 20:01:34 +0000 Subject: [PATCH] Clean up code in res_adsi. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@83182 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_adsi.c | 324 +++++++++++++++++++++---------------------------- 1 file changed, 141 insertions(+), 183 deletions(-) diff --git a/res/res_adsi.c b/res/res_adsi.c index 21f1d89faf..ee6966ca7b 100644 --- a/res/res_adsi.c +++ b/res/res_adsi.c @@ -76,22 +76,19 @@ static int alignment = 0; static int adsi_generate(unsigned char *buf, int msgtype, unsigned char *msg, int msglen, int msgnum, int last, int codec) { - int sum; - int x; - int bytes=0; + int sum, x, bytes = 0; /* Initial carrier (imaginary) */ - float cr = 1.0; - float ci = 0.0; - float scont = 0.0; + float cr = 1.0, ci = 0.0, scont = 0.0; if (msglen > 255) msglen = 255; /* If first message, Send 150ms of MARK's */ if (msgnum == 1) { - for (x=0;x<150;x++) /* was 150 */ + for (x = 0; x < 150; x++) /* was 150 */ PUT_CLID_MARKMS; } + /* Put message type */ PUT_CLID(msgtype); sum = msgtype; @@ -105,7 +102,7 @@ static int adsi_generate(unsigned char *buf, int msgtype, unsigned char *msg, in sum += msgnum; /* Put actual message */ - for (x=0;xframetype == AST_FRAME_VOICE) { - /* Read a voice frame */ - if (inf->subclass != AST_FORMAT_ULAW) { - ast_log(LOG_WARNING, "Channel not in ulaw?\n"); - return -1; - } - /* Send no more than they sent us */ - if (amt > inf->datalen) - amt = inf->datalen; - else if (remainder) - *remainder = inf->datalen - amt; - outf.frametype = AST_FRAME_VOICE; - outf.subclass = AST_FORMAT_ULAW; - outf.data = buf; - outf.datalen = amt; - outf.samples = amt; - if (ast_write(chan, &outf)) { - ast_log(LOG_WARNING, "Failed to carefully write frame\n"); - return -1; - } - /* Update pointers and lengths */ - buf += amt; - len -= amt; + + /* Drop any frames that are not voice */ + if (inf->frametype != AST_FRAME_VOICE) { + ast_frfree(inf); + continue; } + + if (inf->subclass != AST_FORMAT_ULAW) { + ast_log(LOG_WARNING, "Channel not in ulaw?\n"); + ast_frfree(inf); + return -1; + } + /* Send no more than they sent us */ + if (amt > inf->datalen) + amt = inf->datalen; + else if (remainder) + *remainder = inf->datalen - amt; + outf.frametype = AST_FRAME_VOICE; + outf.subclass = AST_FORMAT_ULAW; + outf.data = buf; + outf.datalen = amt; + outf.samples = amt; + if (ast_write(chan, &outf)) { + ast_log(LOG_WARNING, "Failed to carefully write frame\n"); + return -1; + } + /* Update pointers and lengths */ + buf += amt; + len -= amt; ast_frfree(inf); } return 0; @@ -199,18 +200,9 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms { /* msglen must be no more than 256 bits, each */ unsigned char buf[24000 * 5]; - int pos = 0, res; - int x; - int start=0; - int retries = 0; - + int pos = 0, res, x, start = 0, retries = 0, waittime, rem = 0, def; char ack[3]; - - /* Wait up to 500 ms for initial ACK */ - int waittime; struct ast_frame *f; - int rem = 0; - int def; if (chan->adsicpe == AST_ADSI_UNAVAILABLE) { /* Don't bother if we know they don't support ADSI */ @@ -224,9 +216,9 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms ast_gen_cas(buf, 0, 680, AST_FORMAT_ULAW); /* Send CAS */ - if (adsi_careful_send(chan, buf, 680, NULL)) { + if (adsi_careful_send(chan, buf, 680, NULL)) ast_log(LOG_WARNING, "Unable to send CAS\n"); - } + /* Wait For DTMF result */ waittime = 500; for(;;) { @@ -239,8 +231,7 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms return -1; } waittime = res; - f = ast_read(chan); - if (!f) { + if (!(f = ast_read(chan))) { ast_debug(1, "Hangup in ADSI\n"); return -1; } @@ -251,9 +242,9 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms chan->adsicpe = AST_ADSI_AVAILABLE; break; } else { - if (f->subclass == 'D') { + if (f->subclass == 'D') ast_debug(1, "Off-hook capable CPE only, not ADSI\n"); - } else + else ast_log(LOG_WARNING, "Unknown ADSI response '%c'\n", f->subclass); if (!chan->adsicpe) chan->adsicpe = AST_ADSI_UNAVAILABLE; @@ -274,9 +265,8 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms #if 1 def= ast_channel_defer_dtmf(chan); #endif - while((x < 6) && msg[x]) { - res = adsi_generate(buf + pos, msgtype[x], msg[x], msglen[x], x+1 - start, (x == 5) || !msg[x+1], AST_FORMAT_ULAW); - if (res < 0) { + while ((x < 6) && msg[x]) { + if ((res = adsi_generate(buf + pos, msgtype[x], msg[x], msglen[x], x+1 - start, (x == 5) || !msg[x+1], AST_FORMAT_ULAW)) < 0) { ast_log(LOG_WARNING, "Failed to generate ADSI message %d on channel %s\n", x + 1, chan->name); return -1; } @@ -296,10 +286,8 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms ast_debug(1, "Sent total spill of %d bytes\n", pos); memset(ack, 0, sizeof(ack)); - /* Get real result */ - res = ast_readstring(chan, ack, 2, 1000, 1000, ""); - /* Check for hangup */ - if (res < 0) + /* Get real result and check for hangup */ + if ((res = ast_readstring(chan, ack, 2, 1000, 1000, "")) < 0) return -1; if (ack[0] == 'D') { ast_debug(1, "Acked up to message %d\n", atoi(ack + 1)); start += atoi(ack + 1); @@ -325,10 +313,10 @@ static int __adsi_transmit_messages(struct ast_channel *chan, unsigned char **ms static int _ast_adsi_begin_download(struct ast_channel *chan, char *service, unsigned char *fdn, unsigned char *sec, int version) { - int bytes; + int bytes = 0; unsigned char buf[256]; char ack[2]; - bytes = 0; + /* Setup the resident soft key stuff, a piece at a time */ /* Upload what scripts we can for voicemail ahead of time */ bytes += ast_adsi_download_connect(buf + bytes, service, fdn, sec, version); @@ -344,9 +332,9 @@ static int _ast_adsi_begin_download(struct ast_channel *chan, char *service, uns static int _ast_adsi_end_download(struct ast_channel *chan) { - int bytes; + int bytes = 0; unsigned char buf[256]; - bytes = 0; + /* Setup the resident soft key stuff, a piece at a time */ /* Upload what scripts we can for voicemail ahead of time */ bytes += ast_adsi_download_disconnect(buf + bytes); @@ -358,20 +346,9 @@ static int _ast_adsi_end_download(struct ast_channel *chan) static int _ast_adsi_transmit_message_full(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait) { unsigned char *msgs[5] = { NULL, NULL, NULL, NULL, NULL }; - int msglens[5]; - int msgtypes[5]; - int newdatamode; - int res; - int x; - int writeformat, readformat; - int waitforswitch = 0; + int msglens[5], msgtypes[5], newdatamode = (chan->adsicpe & ADSI_FLAG_DATAMODE), res, x, writeformat = chan->writeformat, readformat = chan->readformat, waitforswitch = 0; - writeformat = chan->writeformat; - readformat = chan->readformat; - - newdatamode = chan->adsicpe & ADSI_FLAG_DATAMODE; - - for (x=0;x 33)) return -1; + buf[bytes++] = ADSI_LOAD_SOFTKEY; /* Reserve for length */ bytes++; @@ -489,8 +467,7 @@ static int _ast_adsi_load_soft_key(unsigned char *buf, int key, const char *llab static int _ast_adsi_connect_session(unsigned char *buf, unsigned char *fdn, int ver) { - int bytes=0; - int x; + int bytes = 0, x; /* Message type */ buf[bytes++] = ADSI_CONNECT_SESSION; @@ -499,7 +476,7 @@ static int _ast_adsi_connect_session(unsigned char *buf, unsigned char *fdn, int bytes++; if (fdn) { - for (x=0;x<4;x++) + for (x = 0; x < 4; x++) buf[bytes++] = fdn[x]; if (ver > -1) buf[bytes++] = ver & 0xff; @@ -512,8 +489,7 @@ static int _ast_adsi_connect_session(unsigned char *buf, unsigned char *fdn, int static int _ast_adsi_download_connect(unsigned char *buf, char *service, unsigned char *fdn, unsigned char *sec, int ver) { - int bytes=0; - int x; + int bytes = 0, x; /* Message type */ buf[bytes++] = ADSI_DOWNLOAD_CONNECT; @@ -527,11 +503,12 @@ static int _ast_adsi_download_connect(unsigned char *buf, char *service, unsign /* Delimiter */ buf[bytes++] = 0xff; - for (x=0;x<4;x++) { + for (x = 0; x < 4; x++) buf[bytes++] = fdn[x]; - } - for (x=0;x<4;x++) + + for (x = 0; x < 4; x++) buf[bytes++] = sec[x]; + buf[bytes++] = ver & 0xff; buf[1] = bytes - 2; @@ -542,7 +519,7 @@ static int _ast_adsi_download_connect(unsigned char *buf, char *service, unsign static int _ast_adsi_disconnect_session(unsigned char *buf) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_DISC_SESSION; @@ -577,16 +554,14 @@ static int _ast_adsi_query_cpeinfo(unsigned char *buf) static int _ast_adsi_read_encoded_dtmf(struct ast_channel *chan, unsigned char *buf, int maxlen) { - int bytes = 0; - int res; + int bytes = 0, res, gotstar = 0, pos = 0; unsigned char current = 0; - int gotstar = 0; - int pos = 0; + memset(buf, 0, sizeof(buf)); + while(bytes <= maxlen) { /* Wait up to a second for a digit */ - res = ast_waitfordigit(chan, 1000); - if (!res) + if (!(res = ast_waitfordigit(chan, 1000))) break; if (res == '*') { gotstar = 1; @@ -607,14 +582,15 @@ static int _ast_adsi_read_encoded_dtmf(struct ast_channel *chan, unsigned char * } gotstar = 0; } + return bytes; } static int _ast_adsi_get_cpeid(struct ast_channel *chan, unsigned char *cpeid, int voice) { - unsigned char buf[256]; - int bytes = 0; - int res; + unsigned char buf[256] = ""; + int bytes = 0, res; + bytes += ast_adsi_data_mode(buf); ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); @@ -623,7 +599,6 @@ static int _ast_adsi_get_cpeid(struct ast_channel *chan, unsigned char *cpeid, i ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); /* Get response */ - memset(buf, 0, sizeof(buf)); res = ast_adsi_read_encoded_dtmf(chan, cpeid, 4); if (res != 4) { ast_log(LOG_WARNING, "Got %d bytes back of encoded DTMF, expecting 4\n", res); @@ -644,9 +619,9 @@ static int _ast_adsi_get_cpeid(struct ast_channel *chan, unsigned char *cpeid, i static int _ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *height, int *buttons, int voice) { - unsigned char buf[256]; - int bytes = 0; - int res; + unsigned char buf[256] = ""; + int bytes = 0, res; + bytes += ast_adsi_data_mode(buf); ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); @@ -655,9 +630,7 @@ static int _ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *heig ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); /* Get width */ - memset(buf, 0, sizeof(buf)); - res = ast_readstring(chan, (char *)buf, 2, 1000, 500, ""); - if (res < 0) + if ((res = ast_readstring(chan, (char *)buf, 2, 1000, 500, "")) < 0) return res; if (strlen((char *)buf) != 2) { ast_log(LOG_WARNING, "Got %d bytes of width, expecting 2\n", res); @@ -670,8 +643,7 @@ static int _ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *heig /* Get height */ memset(buf, 0, sizeof(buf)); if (res) { - res = ast_readstring(chan, (char *)buf, 2, 1000, 500, ""); - if (res < 0) + if ((res = ast_readstring(chan, (char *)buf, 2, 1000, 500, "")) < 0) return res; if (strlen((char *)buf) != 2) { ast_log(LOG_WARNING, "Got %d bytes of height, expecting 2\n", res); @@ -685,8 +657,7 @@ static int _ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *heig /* Get buttons */ memset(buf, 0, sizeof(buf)); if (res) { - res = ast_readstring(chan, (char *)buf, 1, 1000, 500, ""); - if (res < 0) + if ((res = ast_readstring(chan, (char *)buf, 1, 1000, 500, "")) < 0) return res; if (strlen((char *)buf) != 1) { ast_log(LOG_WARNING, "Got %d bytes of buttons, expecting 1\n", res); @@ -709,7 +680,7 @@ static int _ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *heig static int _ast_adsi_data_mode(unsigned char *buf) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_SWITCH_TO_DATA; @@ -724,7 +695,7 @@ static int _ast_adsi_data_mode(unsigned char *buf) static int _ast_adsi_clear_soft_keys(unsigned char *buf) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_CLEAR_SOFTKEY; @@ -739,7 +710,7 @@ static int _ast_adsi_clear_soft_keys(unsigned char *buf) static int _ast_adsi_clear_screen(unsigned char *buf) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_CLEAR_SCREEN; @@ -754,7 +725,7 @@ static int _ast_adsi_clear_screen(unsigned char *buf) static int _ast_adsi_voice_mode(unsigned char *buf, int when) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_SWITCH_TO_VOICE; @@ -780,7 +751,7 @@ static int _ast_adsi_available(struct ast_channel *chan) static int _ast_adsi_download_disconnect(unsigned char *buf) { - int bytes=0; + int bytes = 0; /* Message type */ buf[bytes++] = ADSI_DOWNLOAD_DISC; @@ -796,7 +767,7 @@ static int _ast_adsi_download_disconnect(unsigned char *buf) static int _ast_adsi_display(unsigned char *buf, int page, int line, int just, int wrap, char *col1, char *col2) { - int bytes=0; + int bytes = 0; /* Sanity check line number */ @@ -841,7 +812,7 @@ static int _ast_adsi_display(unsigned char *buf, int page, int line, int just, i static int _ast_adsi_input_control(unsigned char *buf, int page, int line, int display, int format, int just) { - int bytes=0; + int bytes = 0; if (page) { if (line > 4) return -1; @@ -883,14 +854,14 @@ static int _ast_adsi_input_format(unsigned char *buf, int num, int dir, int wrap static int _ast_adsi_set_keys(unsigned char *buf, unsigned char *keys) { - int bytes=0; - int x; + int bytes = 0, x; + /* Message type */ buf[bytes++] = ADSI_INIT_SOFTKEY_LINE; /* Space for size */ bytes++; /* Key definitions */ - for (x=0;x<6;x++) + for (x = 0; x < 6; x++) buf[bytes++] = (keys[x] & 0x3f) ? keys[x] : (keys[x] | 0x1); buf[1] = bytes - 2; return bytes; @@ -898,7 +869,7 @@ static int _ast_adsi_set_keys(unsigned char *buf, unsigned char *keys) static int _ast_adsi_set_line(unsigned char *buf, int page, int line) { - int bytes=0; + int bytes = 0; /* Sanity check line number */ @@ -929,12 +900,8 @@ static int speeds = 0; static int _ast_adsi_channel_restore(struct ast_channel *chan) { - unsigned char dsp[256]; - int bytes; - int x; - unsigned char keyd[6]; - - memset(dsp, 0, sizeof(dsp)); + unsigned char dsp[256] = "", keyd[6] = ""; + int bytes, x; /* Start with initial display setup */ bytes = 0; @@ -943,10 +910,8 @@ static int _ast_adsi_channel_restore(struct ast_channel *chan) /* Prepare key setup messages */ if (speeds) { - memset(keyd, 0, sizeof(keyd)); - for (x=0;xnext) { - if (!strcasecmp(v->name, "alignment")) - alignment = str2align(v->value); - else if (!strcasecmp(v->name, "greeting")) { - if (x < ADSI_MAX_INTRO) { - aligns[x] = alignment; - ast_copy_string(intro[x], v->value, sizeof(intro[x])); - x++; - } - } else if (!strcasecmp(v->name, "maxretries")) { - if (atoi(v->value) > 0) - maxretries = atoi(v->value); - } - } - if (x) - total = x; - x = 0; - for (v = ast_variable_browse(conf, "speeddial"); v; v = v->next) { - char *stringp = v->value; - name = strsep(&stringp, ","); - sname = strsep(&stringp, ","); - if (!sname) - sname = name; - if (x < ADSI_MAX_SPEED_DIAL) { - ast_copy_string(speeddial[x][0], v->name, sizeof(speeddial[x][0])); - ast_copy_string(speeddial[x][1], name, 18); - ast_copy_string(speeddial[x][2], sname, 7); + + if (!(conf = ast_config_load("adsi.conf", config_flags))) + return; + + for (v = ast_variable_browse(conf, "intro"); v; v = v->next) { + if (!strcasecmp(v->name, "alignment")) + alignment = str2align(v->value); + else if (!strcasecmp(v->name, "greeting")) { + if (x < ADSI_MAX_INTRO) { + aligns[x] = alignment; + ast_copy_string(intro[x], v->value, sizeof(intro[x])); x++; } + } else if (!strcasecmp(v->name, "maxretries")) { + if (atoi(v->value) > 0) + maxretries = atoi(v->value); } - if (x) - speeds = x; - ast_config_destroy(conf); } + if (x) + total = x; + + x = 0; + for (v = ast_variable_browse(conf, "speeddial"); v; v = v->next) { + char *stringp = v->value; + name = strsep(&stringp, ","); + sname = strsep(&stringp, ","); + if (!sname) + sname = name; + if (x < ADSI_MAX_SPEED_DIAL) { + ast_copy_string(speeddial[x][0], v->name, sizeof(speeddial[x][0])); + ast_copy_string(speeddial[x][1], name, 18); + ast_copy_string(speeddial[x][2], sname, 7); + x++; + } + } + if (x) + speeds = x; + ast_config_destroy(conf); + + return; } static int reload(void)