#include "asterisk.h"
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <errno.h>
#include "asterisk/ulaw.h"
#include "asterisk/alaw.h"
#include "asterisk/callerid.h"
#include "asterisk/logger.h"
#include "asterisk/fskmodem.h"
#include "asterisk/channel.h"
#include "asterisk/adsi.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/file.h"
Go to the source code of this file.
Defines | |
#define | ADSI_FLAG_DATAMODE (1 << 8) |
#define | ADSI_MAX_INTRO 20 |
#define | ADSI_MAX_SPEED_DIAL 6 |
#define | ADSI_SPEED_DIAL 10 |
#define | DEFAULT_ADSI_MAX_RETRIES 3 |
Functions | |
static int | __adsi_transmit_messages (struct ast_channel *chan, unsigned char **msg, int *msglen, int *msgtype) |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | adsi_careful_send (struct ast_channel *chan, unsigned char *buf, int len, int *remainder) |
static int | adsi_generate (unsigned char *buf, int msgtype, unsigned char *msg, int msglen, int msgnum, int last, int codec) |
static void | adsi_load (void) |
int | ast_adsi_available (struct ast_channel *chan) |
int | ast_adsi_begin_download (struct ast_channel *chan, char *service, unsigned char *fdn, unsigned char *sec, int version) |
int | ast_adsi_channel_restore (struct ast_channel *chan) |
int | ast_adsi_clear_screen (unsigned char *buf) |
int | ast_adsi_clear_soft_keys (unsigned char *buf) |
int | ast_adsi_connect_session (unsigned char *buf, unsigned char *fdn, int ver) |
int | ast_adsi_data_mode (unsigned char *buf) |
int | ast_adsi_disconnect_session (unsigned char *buf) |
int | ast_adsi_display (unsigned char *buf, int page, int line, int just, int wrap, char *col1, char *col2) |
int | ast_adsi_download_connect (unsigned char *buf, char *service, unsigned char *fdn, unsigned char *sec, int ver) |
int | ast_adsi_download_disconnect (unsigned char *buf) |
int | ast_adsi_end_download (struct ast_channel *chan) |
int | ast_adsi_get_cpeid (struct ast_channel *chan, unsigned char *cpeid, int voice) |
int | ast_adsi_get_cpeinfo (struct ast_channel *chan, int *width, int *height, int *buttons, int voice) |
int | ast_adsi_input_control (unsigned char *buf, int page, int line, int display, int format, int just) |
int | ast_adsi_input_format (unsigned char *buf, int num, int dir, int wrap, char *format1, char *format2) |
int | ast_adsi_load_session (struct ast_channel *chan, unsigned char *app, int ver, int data) |
int | ast_adsi_load_soft_key (unsigned char *buf, int key, const char *llabel, const char *slabel, const char *ret, int data) |
int | ast_adsi_print (struct ast_channel *chan, char **lines, int *aligns, int voice) |
int | ast_adsi_query_cpeid (unsigned char *buf) |
int | ast_adsi_query_cpeinfo (unsigned char *buf) |
int | ast_adsi_read_encoded_dtmf (struct ast_channel *chan, unsigned char *buf, int maxlen) |
int | ast_adsi_set_keys (unsigned char *buf, unsigned char *keys) |
int | ast_adsi_set_line (unsigned char *buf, int page, int line) |
int | ast_adsi_transmit_message (struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype) |
int | ast_adsi_transmit_message_full (struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait) |
int | ast_adsi_unload_session (struct ast_channel *chan) |
int | ast_adsi_voice_mode (unsigned char *buf, int when) |
static int | ccopy (unsigned char *dst, const unsigned char *src, int max) |
static void | init_state (void) |
static int | load_module (void) |
static int | reload (void) |
static int | str2align (char *s) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_BUILDSUM, .description = "ADSI Resource" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, .reload = reload, } |
static int | alignment = 0 |
static int | aligns [ADSI_MAX_INTRO] |
static const struct ast_module_info * | ast_module_info = &__mod_info |
static char | intro [ADSI_MAX_INTRO][20] |
static int | maxretries = DEFAULT_ADSI_MAX_RETRIES |
static char | speeddial [ADSI_MAX_SPEED_DIAL][3][20] |
static int | speeds = 0 |
static int | total = 0 |
Create a core layer so that app_voicemail does not require res_adsi to load
Definition in file res_adsi.c.
#define ADSI_FLAG_DATAMODE (1 << 8) |
Definition at line 61 of file res_adsi.c.
Referenced by __adsi_transmit_messages(), and ast_adsi_transmit_message_full().
#define ADSI_MAX_INTRO 20 |
#define ADSI_MAX_SPEED_DIAL 6 |
#define ADSI_SPEED_DIAL 10 |
#define DEFAULT_ADSI_MAX_RETRIES 3 |
Definition at line 56 of file res_adsi.c.
static int __adsi_transmit_messages | ( | struct ast_channel * | chan, | |
unsigned char ** | msg, | |||
int * | msglen, | |||
int * | msgtype | |||
) | [static] |
Definition at line 198 of file res_adsi.c.
References adsi_careful_send(), ADSI_FLAG_DATAMODE, adsi_generate(), ast_channel::adsicpe, AST_ADSI_AVAILABLE, AST_ADSI_UNAVAILABLE, ast_channel_defer_dtmf(), ast_channel_undefer_dtmf(), AST_FORMAT_ULAW, AST_FRAME_DTMF, ast_frfree, ast_gen_cas(), ast_log(), ast_read(), ast_readstring(), ast_waitfor(), errno, f, LOG_DEBUG, LOG_WARNING, and ast_channel::name.
Referenced by ast_adsi_transmit_message_full().
00199 { 00200 /* msglen must be no more than 256 bits, each */ 00201 unsigned char buf[24000 * 5]; 00202 int pos = 0, res; 00203 int x; 00204 int start=0; 00205 int retries = 0; 00206 00207 char ack[3]; 00208 00209 /* Wait up to 500 ms for initial ACK */ 00210 int waittime; 00211 struct ast_frame *f; 00212 int rem = 0; 00213 int def; 00214 00215 if (chan->adsicpe == AST_ADSI_UNAVAILABLE) { 00216 /* Don't bother if we know they don't support ADSI */ 00217 errno = ENOSYS; 00218 return -1; 00219 } 00220 00221 while(retries < maxretries) { 00222 if (!(chan->adsicpe & ADSI_FLAG_DATAMODE)) { 00223 /* Generate CAS (no SAS) */ 00224 ast_gen_cas(buf, 0, 680, AST_FORMAT_ULAW); 00225 00226 /* Send CAS */ 00227 if (adsi_careful_send(chan, buf, 680, NULL)) { 00228 ast_log(LOG_WARNING, "Unable to send CAS\n"); 00229 } 00230 /* Wait For DTMF result */ 00231 waittime = 500; 00232 for(;;) { 00233 if (((res = ast_waitfor(chan, waittime)) < 1)) { 00234 /* Didn't get back DTMF A in time */ 00235 ast_log(LOG_DEBUG, "No ADSI CPE detected (%d)\n", res); 00236 if (!chan->adsicpe) 00237 chan->adsicpe = AST_ADSI_UNAVAILABLE; 00238 errno = ENOSYS; 00239 return -1; 00240 } 00241 waittime = res; 00242 f = ast_read(chan); 00243 if (!f) { 00244 ast_log(LOG_DEBUG, "Hangup in ADSI\n"); 00245 return -1; 00246 } 00247 if (f->frametype == AST_FRAME_DTMF) { 00248 if (f->subclass == 'A') { 00249 /* Okay, this is an ADSI CPE. Note this for future reference, too */ 00250 if (!chan->adsicpe) 00251 chan->adsicpe = AST_ADSI_AVAILABLE; 00252 break; 00253 } else { 00254 if (f->subclass == 'D') { 00255 ast_log(LOG_DEBUG, "Off-hook capable CPE only, not ADSI\n"); 00256 } else 00257 ast_log(LOG_WARNING, "Unknown ADSI response '%c'\n", f->subclass); 00258 if (!chan->adsicpe) 00259 chan->adsicpe = AST_ADSI_UNAVAILABLE; 00260 errno = ENOSYS; 00261 ast_frfree(f); 00262 return -1; 00263 } 00264 } 00265 ast_frfree(f); 00266 } 00267 00268 ast_log(LOG_DEBUG, "ADSI Compatible CPE Detected\n"); 00269 } else 00270 ast_log(LOG_DEBUG, "Already in data mode\n"); 00271 00272 x = 0; 00273 pos = 0; 00274 #if 1 00275 def= ast_channel_defer_dtmf(chan); 00276 #endif 00277 while((x < 6) && msg[x]) { 00278 res = adsi_generate(buf + pos, msgtype[x], msg[x], msglen[x], x+1 - start, (x == 5) || !msg[x+1], AST_FORMAT_ULAW); 00279 if (res < 0) { 00280 ast_log(LOG_WARNING, "Failed to generate ADSI message %d on channel %s\n", x + 1, chan->name); 00281 return -1; 00282 } 00283 ast_log(LOG_DEBUG, "Message %d, of %d input bytes, %d output bytes\n", 00284 x + 1, msglen[x], res); 00285 pos += res; 00286 x++; 00287 } 00288 00289 00290 rem = 0; 00291 res = adsi_careful_send(chan, buf, pos, &rem); 00292 if (!def) 00293 ast_channel_undefer_dtmf(chan); 00294 if (res) 00295 return -1; 00296 00297 ast_log(LOG_DEBUG, "Sent total spill of %d bytes\n", pos); 00298 00299 memset(ack, 0, sizeof(ack)); 00300 /* Get real result */ 00301 res = ast_readstring(chan, ack, 2, 1000, 1000, ""); 00302 /* Check for hangup */ 00303 if (res < 0) 00304 return -1; 00305 if (ack[0] == 'D') { 00306 ast_log(LOG_DEBUG, "Acked up to message %d\n", atoi(ack + 1)); 00307 start += atoi(ack + 1); 00308 if (start >= x) 00309 break; 00310 else { 00311 retries++; 00312 ast_log(LOG_DEBUG, "Retransmitting (%d), from %d\n", retries, start + 1); 00313 } 00314 } else { 00315 retries++; 00316 ast_log(LOG_WARNING, "Unexpected response to ack: %s (retry %d)\n", ack, retries); 00317 } 00318 } 00319 if (retries >= maxretries) { 00320 ast_log(LOG_WARNING, "Maximum ADSI Retries (%d) exceeded\n", maxretries); 00321 errno = ETIMEDOUT; 00322 return -1; 00323 } 00324 return 0; 00325 00326 }
static void __reg_module | ( | void | ) | [static] |
Definition at line 1132 of file res_adsi.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 1132 of file res_adsi.c.
static int adsi_careful_send | ( | struct ast_channel * | chan, | |
unsigned char * | buf, | |||
int | len, | |||
int * | remainder | |||
) | [static] |
Definition at line 125 of file res_adsi.c.
References AST_FORMAT_ULAW, AST_FRAME_VOICE, ast_frfree, ast_log(), ast_read(), ast_waitfor(), ast_write(), ast_frame::datalen, ast_frame::frametype, LOG_WARNING, and ast_frame::subclass.
Referenced by __adsi_transmit_messages().
00126 { 00127 /* Sends carefully on a full duplex channel by using reading for 00128 timing */ 00129 struct ast_frame *inf, outf; 00130 int amt; 00131 00132 /* Zero out our outgoing frame */ 00133 memset(&outf, 0, sizeof(outf)); 00134 00135 if (remainder && *remainder) { 00136 amt = len; 00137 00138 /* Send remainder if provided */ 00139 if (amt > *remainder) 00140 amt = *remainder; 00141 else 00142 *remainder = *remainder - amt; 00143 outf.frametype = AST_FRAME_VOICE; 00144 outf.subclass = AST_FORMAT_ULAW; 00145 outf.data = buf; 00146 outf.datalen = amt; 00147 outf.samples = amt; 00148 if (ast_write(chan, &outf)) { 00149 ast_log(LOG_WARNING, "Failed to carefully write frame\n"); 00150 return -1; 00151 } 00152 /* Update pointers and lengths */ 00153 buf += amt; 00154 len -= amt; 00155 } 00156 00157 while(len) { 00158 amt = len; 00159 /* If we don't get anything at all back in a second, forget 00160 about it */ 00161 if (ast_waitfor(chan, 1000) < 1) 00162 return -1; 00163 inf = ast_read(chan); 00164 /* Detect hangup */ 00165 if (!inf) 00166 return -1; 00167 if (inf->frametype == AST_FRAME_VOICE) { 00168 /* Read a voice frame */ 00169 if (inf->subclass != AST_FORMAT_ULAW) { 00170 ast_log(LOG_WARNING, "Channel not in ulaw?\n"); 00171 ast_frfree(inf); 00172 return -1; 00173 } 00174 /* Send no more than they sent us */ 00175 if (amt > inf->datalen) 00176 amt = inf->datalen; 00177 else if (remainder) 00178 *remainder = inf->datalen - amt; 00179 outf.frametype = AST_FRAME_VOICE; 00180 outf.subclass = AST_FORMAT_ULAW; 00181 outf.data = buf; 00182 outf.datalen = amt; 00183 outf.samples = amt; 00184 if (ast_write(chan, &outf)) { 00185 ast_log(LOG_WARNING, "Failed to carefully write frame\n"); 00186 ast_frfree(inf); 00187 return -1; 00188 } 00189 /* Update pointers and lengths */ 00190 buf += amt; 00191 len -= amt; 00192 } 00193 ast_frfree(inf); 00194 } 00195 return 0; 00196 }
static int adsi_generate | ( | unsigned char * | buf, | |
int | msgtype, | |||
unsigned char * | msg, | |||
int | msglen, | |||
int | msgnum, | |||
int | last, | |||
int | codec | |||
) | [static] |
Definition at line 75 of file res_adsi.c.
References PUT_CLID, and PUT_CLID_MARKMS.
Referenced by __adsi_transmit_messages().
00076 { 00077 int sum; 00078 int x; 00079 int bytes=0; 00080 /* Initial carrier (imaginary) */ 00081 float cr = 1.0; 00082 float ci = 0.0; 00083 float scont = 0.0; 00084 00085 if (msglen > 255) 00086 msglen = 255; 00087 00088 /* If first message, Send 150ms of MARK's */ 00089 if (msgnum == 1) { 00090 for (x=0;x<150;x++) /* was 150 */ 00091 PUT_CLID_MARKMS; 00092 } 00093 /* Put message type */ 00094 PUT_CLID(msgtype); 00095 sum = msgtype; 00096 00097 /* Put message length (plus one for the message number) */ 00098 PUT_CLID(msglen + 1); 00099 sum += msglen + 1; 00100 00101 /* Put message number */ 00102 PUT_CLID(msgnum); 00103 sum += msgnum; 00104 00105 /* Put actual message */ 00106 for (x=0;x<msglen;x++) { 00107 PUT_CLID(msg[x]); 00108 sum += msg[x]; 00109 } 00110 00111 /* Put 2's compliment of sum */ 00112 PUT_CLID(256-(sum & 0xff)); 00113 00114 #if 0 00115 if (last) { 00116 /* Put trailing marks */ 00117 for (x=0;x<50;x++) 00118 PUT_CLID_MARKMS; 00119 } 00120 #endif 00121 return bytes; 00122 00123 }
static void adsi_load | ( | void | ) | [static] |
Definition at line 1064 of file res_adsi.c.
References ADSI_MAX_INTRO, ADSI_MAX_SPEED_DIAL, ast_config_destroy(), ast_config_load(), ast_copy_string(), ast_variable_browse(), init_state(), ast_variable::name, name, ast_variable::next, str2align(), and ast_variable::value.
Referenced by load_module(), and reload().
01065 { 01066 int x; 01067 struct ast_config *conf; 01068 struct ast_variable *v; 01069 char *name, *sname; 01070 init_state(); 01071 conf = ast_config_load("adsi.conf"); 01072 if (conf) { 01073 x=0; 01074 for (v = ast_variable_browse(conf, "intro"); v; v = v->next) { 01075 if (!strcasecmp(v->name, "alignment")) 01076 alignment = str2align(v->value); 01077 else if (!strcasecmp(v->name, "greeting")) { 01078 if (x < ADSI_MAX_INTRO) { 01079 aligns[x] = alignment; 01080 ast_copy_string(intro[x], v->value, sizeof(intro[x])); 01081 x++; 01082 } 01083 } else if (!strcasecmp(v->name, "maxretries")) { 01084 if (atoi(v->value) > 0) 01085 maxretries = atoi(v->value); 01086 } 01087 } 01088 if (x) 01089 total = x; 01090 x = 0; 01091 for (v = ast_variable_browse(conf, "speeddial"); v; v = v->next) { 01092 char *stringp = v->value; 01093 name = strsep(&stringp, ","); 01094 sname = strsep(&stringp, ","); 01095 if (!sname) 01096 sname = name; 01097 if (x < ADSI_MAX_SPEED_DIAL) { 01098 ast_copy_string(speeddial[x][0], v->name, sizeof(speeddial[x][0])); 01099 ast_copy_string(speeddial[x][1], name, 18); 01100 ast_copy_string(speeddial[x][2], sname, 7); 01101 x++; 01102 } 01103 } 01104 if (x) 01105 speeds = x; 01106 ast_config_destroy(conf); 01107 } 01108 }
int ast_adsi_available | ( | struct ast_channel * | chan | ) |
chan | Channel to check |
Definition at line 771 of file res_adsi.c.
References ast_channel::adsicpe, AST_ADSI_AVAILABLE, and AST_ADSI_UNKNOWN.
Referenced by adsi_begin(), adsi_delete(), adsi_exec(), adsi_folders(), adsi_goodbye(), adsi_login(), adsi_message(), adsi_password(), adsi_status(), adsi_status2(), park_call_full(), vm_newuser(), vm_options(), and vm_tempgreeting().
00772 { 00773 int cpe = chan->adsicpe & 0xff; 00774 if ((cpe == AST_ADSI_AVAILABLE) || 00775 (cpe == AST_ADSI_UNKNOWN)) 00776 return 1; 00777 return 0; 00778 }
int ast_adsi_begin_download | ( | struct ast_channel * | chan, | |
char * | service, | |||
unsigned char * | fdn, | |||
unsigned char * | sec, | |||
int | version | |||
) |
Definition at line 328 of file res_adsi.c.
References ADSI_MSG_DOWNLOAD, ast_adsi_download_connect(), ast_adsi_transmit_message_full(), ast_log(), ast_readstring(), and LOG_DEBUG.
Referenced by adsi_load_vmail(), and adsi_prog().
00329 { 00330 int bytes; 00331 unsigned char buf[256]; 00332 char ack[2]; 00333 bytes = 0; 00334 /* Setup the resident soft key stuff, a piece at a time */ 00335 /* Upload what scripts we can for voicemail ahead of time */ 00336 bytes += ast_adsi_download_connect(buf + bytes, service, fdn, sec, version); 00337 if (ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DOWNLOAD, 0)) 00338 return -1; 00339 if (ast_readstring(chan, ack, 1, 10000, 10000, "")) 00340 return -1; 00341 if (ack[0] == 'B') 00342 return 0; 00343 ast_log(LOG_DEBUG, "Download was denied by CPE\n"); 00344 return -1; 00345 }
int ast_adsi_channel_restore | ( | struct ast_channel * | chan | ) |
chan | Channel to restore |
Definition at line 929 of file res_adsi.c.
References ADSI_INFO_PAGE, ADSI_MSG_DISPLAY, ADSI_SPEED_DIAL, ast_adsi_set_keys(), ast_adsi_set_line(), and ast_adsi_transmit_message_full().
00930 { 00931 unsigned char dsp[256]; 00932 int bytes; 00933 int x; 00934 unsigned char keyd[6]; 00935 00936 memset(dsp, 0, sizeof(dsp)); 00937 00938 /* Start with initial display setup */ 00939 bytes = 0; 00940 bytes += ast_adsi_set_line(dsp + bytes, ADSI_INFO_PAGE, 1); 00941 00942 /* Prepare key setup messages */ 00943 00944 if (speeds) { 00945 memset(keyd, 0, sizeof(keyd)); 00946 for (x=0;x<speeds;x++) { 00947 keyd[x] = ADSI_SPEED_DIAL + x; 00948 } 00949 bytes += ast_adsi_set_keys(dsp + bytes, keyd); 00950 } 00951 ast_adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0); 00952 return 0; 00953 00954 }
int ast_adsi_clear_screen | ( | unsigned char * | buf | ) |
Definition at line 739 of file res_adsi.c.
References ADSI_CLEAR_SCREEN.
00740 { 00741 int bytes=0; 00742 00743 /* Message type */ 00744 buf[bytes++] = ADSI_CLEAR_SCREEN; 00745 00746 /* Reserve space for length */ 00747 bytes++; 00748 00749 buf[1] = bytes - 2; 00750 return bytes; 00751 00752 }
int ast_adsi_clear_soft_keys | ( | unsigned char * | buf | ) |
Definition at line 724 of file res_adsi.c.
References ADSI_CLEAR_SOFTKEY.
00725 { 00726 int bytes=0; 00727 00728 /* Message type */ 00729 buf[bytes++] = ADSI_CLEAR_SOFTKEY; 00730 00731 /* Reserve space for length */ 00732 bytes++; 00733 00734 buf[1] = bytes - 2; 00735 return bytes; 00736 00737 }
int ast_adsi_connect_session | ( | unsigned char * | buf, | |
unsigned char * | fdn, | |||
int | ver | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
fdn | Optional 4 byte Feature Download Number (for loading soft keys) | |
ver | Optional version number (0-255, or -1 to omit) |
Definition at line 489 of file res_adsi.c.
References ADSI_CONNECT_SESSION.
Referenced by ast_adsi_load_session().
00490 { 00491 int bytes=0; 00492 int x; 00493 00494 /* Message type */ 00495 buf[bytes++] = ADSI_CONNECT_SESSION; 00496 00497 /* Reserve space for length */ 00498 bytes++; 00499 00500 if (fdn) { 00501 for (x=0;x<4;x++) 00502 buf[bytes++] = fdn[x]; 00503 if (ver > -1) 00504 buf[bytes++] = ver & 0xff; 00505 } 00506 00507 buf[1] = bytes - 2; 00508 return bytes; 00509 00510 }
int ast_adsi_data_mode | ( | unsigned char * | buf | ) |
buf | Character buffer to create parameter in (must have at least 256 free) |
Definition at line 709 of file res_adsi.c.
References ADSI_SWITCH_TO_DATA.
Referenced by adsi_load_vmail(), ast_adsi_get_cpeid(), ast_adsi_get_cpeinfo(), and ast_adsi_load_session().
00710 { 00711 int bytes=0; 00712 00713 /* Message type */ 00714 buf[bytes++] = ADSI_SWITCH_TO_DATA; 00715 00716 /* Reserve space for length */ 00717 bytes++; 00718 00719 buf[1] = bytes - 2; 00720 return bytes; 00721 00722 }
int ast_adsi_disconnect_session | ( | unsigned char * | buf | ) |
buf | Character buffer to create parameter in (must have at least 256 free) |
Definition at line 542 of file res_adsi.c.
References ADSI_DISC_SESSION.
Referenced by ast_adsi_unload_session().
00543 { 00544 int bytes=0; 00545 00546 /* Message type */ 00547 buf[bytes++] = ADSI_DISC_SESSION; 00548 00549 /* Reserve space for length */ 00550 bytes++; 00551 00552 buf[1] = bytes - 2; 00553 return bytes; 00554 00555 }
int ast_adsi_display | ( | unsigned char * | buf, | |
int | page, | |||
int | line, | |||
int | just, | |||
int | wrap, | |||
char * | col1, | |||
char * | col2 | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
page | Page to load (ADSI_COMM_PAGE or ADSI_INFO_PAGE) | |
line | Line number to load (1-4 for Comm page, 1-33 for info page) | |
just | Line justification (ADSI_JUST_LEFT, ADSI_JUST_RIGHT, ADSI_JUST_CENT, ADSI_JUST_IND) | |
wrap | Wrap (1 = yes, 0 = no) | |
col1 | Text to place in first column | |
col2 | Text to place in second column |
Definition at line 795 of file res_adsi.c.
References ADSI_LOAD_VIRTUAL_DISP, and ccopy().
Referenced by adsi_folders(), adsi_goodbye(), adsi_load_vmail(), adsi_login(), adsi_logo(), adsi_status(), adsi_status2(), ast_adsi_print(), vm_newuser(), vm_options(), and vm_tempgreeting().
00797 { 00798 int bytes=0; 00799 00800 /* Sanity check line number */ 00801 00802 if (page) { 00803 if (line > 4) return -1; 00804 } else { 00805 if (line > 33) return -1; 00806 } 00807 00808 if (line < 1) 00809 return -1; 00810 /* Parameter type */ 00811 buf[bytes++] = ADSI_LOAD_VIRTUAL_DISP; 00812 00813 /* Reserve space for size */ 00814 bytes++; 00815 00816 /* Page and wrap indicator */ 00817 buf[bytes++] = ((page & 0x1) << 7) | ((wrap & 0x1) << 6) | (line & 0x3f); 00818 00819 /* Justification */ 00820 buf[bytes++] = (just & 0x3) << 5; 00821 00822 /* Omit highlight mode definition */ 00823 buf[bytes++] = 0xff; 00824 00825 /* Primary column */ 00826 bytes+= ccopy(buf + bytes, (unsigned char *)col1, 20); 00827 00828 /* Delimiter */ 00829 buf[bytes++] = 0xff; 00830 00831 /* Secondary column */ 00832 bytes += ccopy(buf + bytes, (unsigned char *)col2, 20); 00833 00834 /* Update length */ 00835 buf[1] = bytes - 2; 00836 00837 return bytes; 00838 00839 }
int ast_adsi_download_connect | ( | unsigned char * | buf, | |
char * | service, | |||
unsigned char * | fdn, | |||
unsigned char * | sec, | |||
int | ver | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
service | a 1-18 byte name of the feature | |
fdn | 4 byte Feature Download Number (for loading soft keys) | |
sec | 4 byte vendor security code | |
ver | version number (0-255, or -1 to omit) |
Definition at line 512 of file res_adsi.c.
References ADSI_DOWNLOAD_CONNECT, and ccopy().
Referenced by ast_adsi_begin_download().
00513 { 00514 int bytes=0; 00515 int x; 00516 00517 /* Message type */ 00518 buf[bytes++] = ADSI_DOWNLOAD_CONNECT; 00519 00520 /* Reserve space for length */ 00521 bytes++; 00522 00523 /* Primary column */ 00524 bytes+= ccopy(buf + bytes, (unsigned char *)service, 18); 00525 00526 /* Delimiter */ 00527 buf[bytes++] = 0xff; 00528 00529 for (x=0;x<4;x++) { 00530 buf[bytes++] = fdn[x]; 00531 } 00532 for (x=0;x<4;x++) 00533 buf[bytes++] = sec[x]; 00534 buf[bytes++] = ver & 0xff; 00535 00536 buf[1] = bytes - 2; 00537 00538 return bytes; 00539 00540 }
int ast_adsi_download_disconnect | ( | unsigned char * | buf | ) |
buf | Character buffer to create parameter in (must have at least 256 free) |
Definition at line 780 of file res_adsi.c.
References ADSI_DOWNLOAD_DISC.
Referenced by adsi_load_vmail(), and ast_adsi_end_download().
00781 { 00782 int bytes=0; 00783 00784 /* Message type */ 00785 buf[bytes++] = ADSI_DOWNLOAD_DISC; 00786 00787 /* Reserve space for length */ 00788 bytes++; 00789 00790 buf[1] = bytes - 2; 00791 return bytes; 00792 00793 }
int ast_adsi_end_download | ( | struct ast_channel * | chan | ) |
Definition at line 347 of file res_adsi.c.
References ADSI_MSG_DOWNLOAD, ast_adsi_download_disconnect(), and ast_adsi_transmit_message_full().
Referenced by adsi_load_vmail().
00348 { 00349 int bytes; 00350 unsigned char buf[256]; 00351 bytes = 0; 00352 /* Setup the resident soft key stuff, a piece at a time */ 00353 /* Upload what scripts we can for voicemail ahead of time */ 00354 bytes += ast_adsi_download_disconnect(buf + bytes); 00355 if (ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DOWNLOAD, 0)) 00356 return -1; 00357 return 0; 00358 }
int ast_adsi_get_cpeid | ( | struct ast_channel * | chan, | |
unsigned char * | cpeid, | |||
int | voice | |||
) |
Returns 1 on success, storing 4 bytes of CPE ID at buf or -1 on hangup, or 0 if there was no hangup but it failed to find the device ID. Returns to voice mode if "voice" is non-zero.
Definition at line 612 of file res_adsi.c.
References ADSI_MSG_DISPLAY, ast_adsi_data_mode(), ast_adsi_query_cpeid(), ast_adsi_read_encoded_dtmf(), ast_adsi_transmit_message_full(), ast_adsi_voice_mode(), ast_log(), ast_waitfordigit(), and LOG_WARNING.
Referenced by cpeid_exec().
00613 { 00614 unsigned char buf[256]; 00615 int bytes = 0; 00616 int res; 00617 bytes += ast_adsi_data_mode(buf); 00618 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00619 00620 bytes = 0; 00621 bytes += ast_adsi_query_cpeid(buf); 00622 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00623 00624 /* Get response */ 00625 memset(buf, 0, sizeof(buf)); 00626 res = ast_adsi_read_encoded_dtmf(chan, cpeid, 4); 00627 if (res != 4) { 00628 ast_log(LOG_WARNING, "Got %d bytes back of encoded DTMF, expecting 4\n", res); 00629 res = 0; 00630 } else { 00631 res = 1; 00632 } 00633 00634 if (voice) { 00635 bytes = 0; 00636 bytes += ast_adsi_voice_mode(buf, 0); 00637 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00638 /* Ignore the resulting DTMF B announcing it's in voice mode */ 00639 ast_waitfordigit(chan, 1000); 00640 } 00641 return res; 00642 }
int ast_adsi_get_cpeinfo | ( | struct ast_channel * | chan, | |
int * | width, | |||
int * | height, | |||
int * | buttons, | |||
int | voice | |||
) |
Definition at line 644 of file res_adsi.c.
References ADSI_MSG_DISPLAY, ast_adsi_data_mode(), ast_adsi_query_cpeinfo(), ast_adsi_transmit_message_full(), ast_adsi_voice_mode(), ast_log(), ast_readstring(), ast_waitfordigit(), and LOG_WARNING.
Referenced by cpeid_exec().
00645 { 00646 unsigned char buf[256]; 00647 int bytes = 0; 00648 int res; 00649 bytes += ast_adsi_data_mode(buf); 00650 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00651 00652 bytes = 0; 00653 bytes += ast_adsi_query_cpeinfo(buf); 00654 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00655 00656 /* Get width */ 00657 memset(buf, 0, sizeof(buf)); 00658 res = ast_readstring(chan, (char *)buf, 2, 1000, 500, ""); 00659 if (res < 0) 00660 return res; 00661 if (strlen((char *)buf) != 2) { 00662 ast_log(LOG_WARNING, "Got %d bytes of width, expecting 2\n", res); 00663 res = 0; 00664 } else { 00665 res = 1; 00666 } 00667 if (width) 00668 *width = atoi((char *)buf); 00669 /* Get height */ 00670 memset(buf, 0, sizeof(buf)); 00671 if (res) { 00672 res = ast_readstring(chan, (char *)buf, 2, 1000, 500, ""); 00673 if (res < 0) 00674 return res; 00675 if (strlen((char *)buf) != 2) { 00676 ast_log(LOG_WARNING, "Got %d bytes of height, expecting 2\n", res); 00677 res = 0; 00678 } else { 00679 res = 1; 00680 } 00681 if (height) 00682 *height= atoi((char *)buf); 00683 } 00684 /* Get buttons */ 00685 memset(buf, 0, sizeof(buf)); 00686 if (res) { 00687 res = ast_readstring(chan, (char *)buf, 1, 1000, 500, ""); 00688 if (res < 0) 00689 return res; 00690 if (strlen((char *)buf) != 1) { 00691 ast_log(LOG_WARNING, "Got %d bytes of buttons, expecting 1\n", res); 00692 res = 0; 00693 } else { 00694 res = 1; 00695 } 00696 if (buttons) 00697 *buttons = atoi((char *)buf); 00698 } 00699 if (voice) { 00700 bytes = 0; 00701 bytes += ast_adsi_voice_mode(buf, 0); 00702 ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00703 /* Ignore the resulting DTMF B announcing it's in voice mode */ 00704 ast_waitfordigit(chan, 1000); 00705 } 00706 return res; 00707 }
int ast_adsi_input_control | ( | unsigned char * | buf, | |
int | page, | |||
int | line, | |||
int | display, | |||
int | format, | |||
int | just | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
page | Which page to input on (ADSI_COMM_PAGE or ADSI_INFO_PAGE) | |
line | Line number to input on | |
display | Set to zero to obscure input, or 1 to leave visible | |
format | Format number to use (0-7) | |
just | Justification (left, right center, indent) |
Definition at line 841 of file res_adsi.c.
References ADSI_INPUT_CONTROL.
Referenced by adsi_login(), and adsi_password().
00842 { 00843 int bytes=0; 00844 00845 if (page) { 00846 if (line > 4) return -1; 00847 } else { 00848 if (line > 33) return -1; 00849 } 00850 00851 if (line < 1) 00852 return -1; 00853 00854 buf[bytes++] = ADSI_INPUT_CONTROL; 00855 bytes++; 00856 buf[bytes++] = ((page & 1) << 7) | (line & 0x3f); 00857 buf[bytes++] = ((display & 1) << 7) | ((just & 0x3) << 4) | (format & 0x7); 00858 00859 buf[1] = bytes - 2; 00860 return bytes; 00861 00862 }
int ast_adsi_input_format | ( | unsigned char * | buf, | |
int | num, | |||
int | dir, | |||
int | wrap, | |||
char * | format1, | |||
char * | format2 | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
num | Which format we are setting | |
dir | Which direction (ADSI_DIR_FROM_LEFT or ADSI_DIR_FROM_RIGHT) | |
wrap | Set to 1 to permit line wrap, or 0 if not | |
format1 | Format for column 1 | |
format2 | Format for column 2 |
Definition at line 864 of file res_adsi.c.
References ADSI_INPUT_FORMAT, and ccopy().
Referenced by adsi_login(), and adsi_password().
00865 { 00866 int bytes = 0; 00867 00868 if (!strlen((char *)format1)) 00869 return -1; 00870 00871 buf[bytes++] = ADSI_INPUT_FORMAT; 00872 bytes++; 00873 buf[bytes++] = ((dir & 1) << 7) | ((wrap & 1) << 6) | (num & 0x7); 00874 bytes += ccopy(buf + bytes, (unsigned char *)format1, 20); 00875 buf[bytes++] = 0xff; 00876 if (format2 && strlen((char *)format2)) { 00877 bytes += ccopy(buf + bytes, (unsigned char *)format2, 20); 00878 } 00879 buf[1] = bytes - 2; 00880 return bytes; 00881 }
int ast_adsi_load_session | ( | struct ast_channel * | chan, | |
unsigned char * | app, | |||
int | ver, | |||
int | data | |||
) |
chan | Channel to test for loaded app | |
app | Four character app name (must be unique to your application) | |
ver | optional version number | |
data | Non-zero if you want to be put in data mode |
Definition at line 976 of file res_adsi.c.
References ADSI_MSG_DISPLAY, ast_adsi_connect_session(), ast_adsi_data_mode(), ast_adsi_transmit_message_full(), ast_log(), ast_readstring(), LOG_DEBUG, and LOG_WARNING.
Referenced by adsi_announce_park(), adsi_begin(), adsi_load_vmail(), adsi_prog(), and cpeid_exec().
00977 { 00978 unsigned char dsp[256]; 00979 int bytes; 00980 int res; 00981 char resp[2]; 00982 00983 memset(dsp, 0, sizeof(dsp)); 00984 00985 /* Connect to session */ 00986 bytes = 0; 00987 bytes += ast_adsi_connect_session(dsp + bytes, app, ver); 00988 00989 if (data) 00990 bytes += ast_adsi_data_mode(dsp + bytes); 00991 00992 /* Prepare key setup messages */ 00993 if (ast_adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0)) 00994 return -1; 00995 if (app) { 00996 res = ast_readstring(chan, resp, 1, 1200, 1200, ""); 00997 if (res < 0) 00998 return -1; 00999 if (res) { 01000 ast_log(LOG_DEBUG, "No response from CPE about version. Assuming not there.\n"); 01001 return 0; 01002 } 01003 if (!strcmp(resp, "B")) { 01004 ast_log(LOG_DEBUG, "CPE has script '%s' version %d already loaded\n", app, ver); 01005 return 1; 01006 } else if (!strcmp(resp, "A")) { 01007 ast_log(LOG_DEBUG, "CPE hasn't script '%s' version %d already loaded\n", app, ver); 01008 } else { 01009 ast_log(LOG_WARNING, "Unexpected CPE response to script query: %s\n", resp); 01010 } 01011 } else 01012 return 1; 01013 return 0; 01014 01015 }
int ast_adsi_load_soft_key | ( | unsigned char * | buf, | |
int | key, | |||
const char * | llabel, | |||
const char * | slabel, | |||
const char * | ret, | |||
int | data | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
key | Key code from 2 to 33, for which key we are loading | |
llabel | Long label for key (1-18 bytes) | |
slabel | Short label for key (1-7 bytes) | |
ret | Optional return sequence (NULL for none) | |
data | whether to put CPE in data mode before sending digits |
Definition at line 450 of file res_adsi.c.
References ADSI_LOAD_SOFTKEY, ADSI_SWITCH_TO_DATA2, and ccopy().
Referenced by adsi_load_vmail(), and adsi_login().
00451 { 00452 int bytes=0; 00453 00454 /* Abort if invalid key specified */ 00455 if ((key < 2) || (key > 33)) 00456 return -1; 00457 buf[bytes++] = ADSI_LOAD_SOFTKEY; 00458 /* Reserve for length */ 00459 bytes++; 00460 /* Which key */ 00461 buf[bytes++] = key; 00462 00463 /* Carefully copy long label */ 00464 bytes += ccopy(buf + bytes, (const unsigned char *)llabel, 18); 00465 00466 /* Place delimiter */ 00467 buf[bytes++] = 0xff; 00468 00469 /* Short label */ 00470 bytes += ccopy(buf + bytes, (const unsigned char *)slabel, 7); 00471 00472 00473 /* If specified, copy return string */ 00474 if (ret) { 00475 /* Place delimiter */ 00476 buf[bytes++] = 0xff; 00477 if (data) 00478 buf[bytes++] = ADSI_SWITCH_TO_DATA2; 00479 /* Carefully copy return string */ 00480 bytes += ccopy(buf + bytes, (const unsigned char *)ret, 20); 00481 00482 } 00483 /* Replace parameter length */ 00484 buf[1] = bytes - 2; 00485 return bytes; 00486 00487 }
int ast_adsi_print | ( | struct ast_channel * | chan, | |
char ** | lines, | |||
int * | align, | |||
int | voice | |||
) |
chan | Channel to display on | |
lines | NULL-terminated list of things to print (no more than 4 recommended) | |
align | list of alignments to use (ADSI_JUST_LEFT, ADSI_JUST_RIGHT, ADSI_JUST_CEN, etc..) | |
voice | whether to jump into voice mode when finished |
Definition at line 956 of file res_adsi.c.
References ADSI_INFO_PAGE, ADSI_MSG_DISPLAY, ast_adsi_display(), ast_adsi_set_line(), ast_adsi_transmit_message_full(), ast_adsi_voice_mode(), and ast_waitfordigit().
Referenced by adsi_announce_park(), and cpeid_setstatus().
00957 { 00958 unsigned char buf[4096]; 00959 int bytes=0; 00960 int res; 00961 int x; 00962 for(x=0;lines[x];x++) 00963 bytes += ast_adsi_display(buf + bytes, ADSI_INFO_PAGE, x+1, aligns[x], 0, lines[x], ""); 00964 bytes += ast_adsi_set_line(buf + bytes, ADSI_INFO_PAGE, 1); 00965 if (voice) { 00966 bytes += ast_adsi_voice_mode(buf + bytes, 0); 00967 } 00968 res = ast_adsi_transmit_message_full(chan, buf, bytes, ADSI_MSG_DISPLAY, 0); 00969 if (voice) { 00970 /* Ignore the resulting DTMF B announcing it's in voice mode */ 00971 ast_waitfordigit(chan, 1000); 00972 } 00973 return res; 00974 }
int ast_adsi_query_cpeid | ( | unsigned char * | buf | ) |
Returns number of bytes added to message
Definition at line 557 of file res_adsi.c.
References ADSI_QUERY_CPEID.
Referenced by ast_adsi_get_cpeid().
00558 { 00559 int bytes = 0; 00560 buf[bytes++] = ADSI_QUERY_CPEID; 00561 /* Reserve space for length */ 00562 bytes++; 00563 buf[1] = bytes - 2; 00564 return bytes; 00565 }
int ast_adsi_query_cpeinfo | ( | unsigned char * | buf | ) |
Definition at line 567 of file res_adsi.c.
References ADSI_QUERY_CONFIG.
Referenced by ast_adsi_get_cpeinfo().
00568 { 00569 int bytes = 0; 00570 buf[bytes++] = ADSI_QUERY_CONFIG; 00571 /* Reserve space for length */ 00572 bytes++; 00573 buf[1] = bytes - 2; 00574 return bytes; 00575 }
int ast_adsi_read_encoded_dtmf | ( | struct ast_channel * | chan, | |
unsigned char * | buf, | |||
int | maxlen | |||
) |
Returns number of bytes received
Definition at line 577 of file res_adsi.c.
References ast_waitfordigit().
Referenced by ast_adsi_get_cpeid().
00578 { 00579 int bytes = 0; 00580 int res; 00581 unsigned char current = 0; 00582 int gotstar = 0; 00583 int pos = 0; 00584 memset(buf, 0, sizeof(buf)); 00585 while(bytes <= maxlen) { 00586 /* Wait up to a second for a digit */ 00587 res = ast_waitfordigit(chan, 1000); 00588 if (!res) 00589 break; 00590 if (res == '*') { 00591 gotstar = 1; 00592 continue; 00593 } 00594 /* Ignore anything other than a digit */ 00595 if ((res < '0') || (res > '9')) 00596 continue; 00597 res -= '0'; 00598 if (gotstar) 00599 res += 9; 00600 if (pos) { 00601 pos = 0; 00602 buf[bytes++] = (res << 4) | current; 00603 } else { 00604 pos = 1; 00605 current = res; 00606 } 00607 gotstar = 0; 00608 } 00609 return bytes; 00610 }
int ast_adsi_set_keys | ( | unsigned char * | buf, | |
unsigned char * | keys | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
keys | Array of 8 unsigned chars with the key numbers, may be OR'd with ADSI_KEY_HILITE But remember, the last two keys aren't real keys, they're for scrolling |
Definition at line 883 of file res_adsi.c.
References ADSI_INIT_SOFTKEY_LINE.
Referenced by adsi_folders(), adsi_login(), adsi_password(), adsi_status(), adsi_status2(), and ast_adsi_channel_restore().
00884 { 00885 int bytes=0; 00886 int x; 00887 /* Message type */ 00888 buf[bytes++] = ADSI_INIT_SOFTKEY_LINE; 00889 /* Space for size */ 00890 bytes++; 00891 /* Key definitions */ 00892 for (x=0;x<6;x++) 00893 buf[bytes++] = (keys[x] & 0x3f) ? keys[x] : (keys[x] | 0x1); 00894 buf[1] = bytes - 2; 00895 return bytes; 00896 }
int ast_adsi_set_line | ( | unsigned char * | buf, | |
int | page, | |||
int | line | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
page | Which page (ADSI_COMM_PAGE or ADSI_INFO_PAGE) | |
line | Line number (1-33 for info page, 1-4 for comm page) |
Definition at line 898 of file res_adsi.c.
References ADSI_LINE_CONTROL.
Referenced by adsi_folders(), adsi_goodbye(), adsi_load_vmail(), adsi_login(), adsi_password(), adsi_status(), adsi_status2(), ast_adsi_channel_restore(), ast_adsi_print(), vm_newuser(), vm_options(), and vm_tempgreeting().
00899 { 00900 int bytes=0; 00901 00902 /* Sanity check line number */ 00903 00904 if (page) { 00905 if (line > 4) return -1; 00906 } else { 00907 if (line > 33) return -1; 00908 } 00909 00910 if (line < 1) 00911 return -1; 00912 /* Parameter type */ 00913 buf[bytes++] = ADSI_LINE_CONTROL; 00914 00915 /* Reserve space for size */ 00916 bytes++; 00917 00918 /* Page and line */ 00919 buf[bytes++] = ((page & 0x1) << 7) | (line & 0x3f); 00920 00921 buf[1] = bytes - 2; 00922 return bytes; 00923 00924 };
int ast_adsi_transmit_message | ( | struct ast_channel * | chan, | |
unsigned char * | msg, | |||
int | msglen, | |||
int | msgtype | |||
) |
Definition at line 434 of file res_adsi.c.
References ast_adsi_transmit_message_full().
Referenced by adsi_folders(), adsi_goodbye(), adsi_load_vmail(), adsi_login(), adsi_password(), adsi_prog(), adsi_status(), adsi_status2(), vm_newuser(), vm_options(), and vm_tempgreeting().
00435 { 00436 return ast_adsi_transmit_message_full(chan, msg, msglen, msgtype, 1); 00437 }
int ast_adsi_transmit_message_full | ( | struct ast_channel * | chan, | |
unsigned char * | msg, | |||
int | msglen, | |||
int | msgtype, | |||
int | dowait | |||
) |
Definition at line 360 of file res_adsi.c.
References __adsi_transmit_messages(), ADSI_FLAG_DATAMODE, ADSI_SWITCH_TO_DATA, ADSI_SWITCH_TO_VOICE, ast_channel::adsicpe, AST_FORMAT_ULAW, ast_log(), ast_safe_sleep(), ast_set_read_format(), ast_set_write_format(), ast_stopstream(), ast_waitfordigit(), LOG_DEBUG, LOG_WARNING, ast_channel::readformat, and ast_channel::writeformat.
Referenced by ast_adsi_begin_download(), ast_adsi_channel_restore(), ast_adsi_end_download(), ast_adsi_get_cpeid(), ast_adsi_get_cpeinfo(), ast_adsi_load_session(), ast_adsi_print(), ast_adsi_transmit_message(), and ast_adsi_unload_session().
00361 { 00362 unsigned char *msgs[5] = { NULL, NULL, NULL, NULL, NULL }; 00363 int msglens[5]; 00364 int msgtypes[5]; 00365 int newdatamode; 00366 int res; 00367 int x; 00368 int writeformat, readformat; 00369 int waitforswitch = 0; 00370 00371 writeformat = chan->writeformat; 00372 readformat = chan->readformat; 00373 00374 newdatamode = chan->adsicpe & ADSI_FLAG_DATAMODE; 00375 00376 for (x=0;x<msglen;x+=(msg[x+1]+2)) { 00377 if (msg[x] == ADSI_SWITCH_TO_DATA) { 00378 ast_log(LOG_DEBUG, "Switch to data is sent!\n"); 00379 waitforswitch++; 00380 newdatamode = ADSI_FLAG_DATAMODE; 00381 } 00382 00383 if (msg[x] == ADSI_SWITCH_TO_VOICE) { 00384 ast_log(LOG_DEBUG, "Switch to voice is sent!\n"); 00385 waitforswitch++; 00386 newdatamode = 0; 00387 } 00388 } 00389 msgs[0] = msg; 00390 00391 msglens[0] = msglen; 00392 msgtypes[0] = msgtype; 00393 00394 if (msglen > 253) { 00395 ast_log(LOG_WARNING, "Can't send ADSI message of %d bytes, too large\n", msglen); 00396 return -1; 00397 } 00398 00399 ast_stopstream(chan); 00400 00401 if (ast_set_write_format(chan, AST_FORMAT_ULAW)) { 00402 ast_log(LOG_WARNING, "Unable to set write format to ULAW\n"); 00403 return -1; 00404 } 00405 00406 if (ast_set_read_format(chan, AST_FORMAT_ULAW)) { 00407 ast_log(LOG_WARNING, "Unable to set read format to ULAW\n"); 00408 if (writeformat) { 00409 if (ast_set_write_format(chan, writeformat)) 00410 ast_log(LOG_WARNING, "Unable to restore write format to %d\n", writeformat); 00411 } 00412 return -1; 00413 } 00414 res = __adsi_transmit_messages(chan, msgs, msglens, msgtypes); 00415 00416 if (dowait) { 00417 ast_log(LOG_DEBUG, "Wait for switch is '%d'\n", waitforswitch); 00418 while(waitforswitch-- && ((res = ast_waitfordigit(chan, 1000)) > 0)) { res = 0; ast_log(LOG_DEBUG, "Waiting for 'B'...\n"); } 00419 } 00420 00421 if (!res) 00422 chan->adsicpe = (chan->adsicpe & ~ADSI_FLAG_DATAMODE) | newdatamode; 00423 00424 if (writeformat) 00425 ast_set_write_format(chan, writeformat); 00426 if (readformat) 00427 ast_set_read_format(chan, readformat); 00428 00429 if (!res) 00430 res = ast_safe_sleep(chan, 100 ); 00431 return res; 00432 }
int ast_adsi_unload_session | ( | struct ast_channel * | chan | ) |
Definition at line 1017 of file res_adsi.c.
References ADSI_MSG_DISPLAY, ast_adsi_disconnect_session(), ast_adsi_transmit_message_full(), and ast_adsi_voice_mode().
Referenced by cpeid_exec(), park_call_full(), and vm_execmain().
01018 { 01019 unsigned char dsp[256]; 01020 int bytes; 01021 01022 memset(dsp, 0, sizeof(dsp)); 01023 01024 /* Connect to session */ 01025 bytes = 0; 01026 bytes += ast_adsi_disconnect_session(dsp + bytes); 01027 bytes += ast_adsi_voice_mode(dsp + bytes, 0); 01028 01029 /* Prepare key setup messages */ 01030 if (ast_adsi_transmit_message_full(chan, dsp, bytes, ADSI_MSG_DISPLAY, 0)) 01031 return -1; 01032 return 0; 01033 }
int ast_adsi_voice_mode | ( | unsigned char * | buf, | |
int | when | |||
) |
buf | Character buffer to create parameter in (must have at least 256 free) | |
when | (a time in seconds) to make the switch |
Definition at line 754 of file res_adsi.c.
References ADSI_SWITCH_TO_VOICE.
Referenced by adsi_folders(), adsi_goodbye(), adsi_load_vmail(), adsi_login(), adsi_password(), adsi_status(), adsi_status2(), ast_adsi_get_cpeid(), ast_adsi_get_cpeinfo(), ast_adsi_print(), ast_adsi_unload_session(), vm_newuser(), vm_options(), and vm_tempgreeting().
00755 { 00756 int bytes=0; 00757 00758 /* Message type */ 00759 buf[bytes++] = ADSI_SWITCH_TO_VOICE; 00760 00761 /* Reserve space for length */ 00762 bytes++; 00763 00764 buf[bytes++] = when & 0x7f; 00765 00766 buf[1] = bytes - 2; 00767 return bytes; 00768 00769 }
static int ccopy | ( | unsigned char * | dst, | |
const unsigned char * | src, | |||
int | max | |||
) | [inline, static] |
Definition at line 439 of file res_adsi.c.
Referenced by ast_adsi_display(), ast_adsi_download_connect(), ast_adsi_input_format(), and ast_adsi_load_soft_key().
00440 { 00441 int x=0; 00442 /* Carefully copy the requested data */ 00443 while ((x < max) && src[x] && (src[x] != 0xff)) { 00444 dst[x] = src[x]; 00445 x++; 00446 } 00447 return x; 00448 }
static void init_state | ( | void | ) | [static] |
Definition at line 1047 of file res_adsi.c.
References ADSI_JUST_CENT, ADSI_MAX_INTRO, and ast_copy_string().
Referenced by adsi_load().
01048 { 01049 int x; 01050 01051 for (x=0;x<ADSI_MAX_INTRO;x++) 01052 aligns[x] = ADSI_JUST_CENT; 01053 ast_copy_string(intro[0], "Welcome to the", sizeof(intro[0])); 01054 ast_copy_string(intro[1], "Asterisk", sizeof(intro[1])); 01055 ast_copy_string(intro[2], "Open Source PBX", sizeof(intro[2])); 01056 total = 3; 01057 speeds = 0; 01058 for (x=3;x<ADSI_MAX_INTRO;x++) 01059 intro[x][0] = '\0'; 01060 memset(speeddial, 0, sizeof(speeddial)); 01061 alignment = ADSI_JUST_CENT; 01062 }
static int load_module | ( | void | ) | [static] |
Definition at line 1116 of file res_adsi.c.
References adsi_load().
01117 { 01118 adsi_load(); 01119 return 0; 01120 }
static int reload | ( | void | ) | [static] |
Definition at line 1110 of file res_adsi.c.
References adsi_load().
01111 { 01112 adsi_load(); 01113 return 0; 01114 }
static int str2align | ( | char * | s | ) | [static] |
Definition at line 1035 of file res_adsi.c.
References ADSI_JUST_CENT, ADSI_JUST_IND, ADSI_JUST_LEFT, and ADSI_JUST_RIGHT.
Referenced by adsi_load().
01036 { 01037 if (!strncasecmp(s, "l", 1)) 01038 return ADSI_JUST_LEFT; 01039 else if (!strncasecmp(s, "r", 1)) 01040 return ADSI_JUST_RIGHT; 01041 else if (!strncasecmp(s, "i", 1)) 01042 return ADSI_JUST_IND; 01043 else 01044 return ADSI_JUST_CENT; 01045 }
static int unload_module | ( | void | ) | [static] |
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_BUILDSUM, .description = "ADSI Resource" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, .reload = reload, } [static] |
Definition at line 1132 of file res_adsi.c.
int alignment = 0 [static] |
Definition at line 73 of file res_adsi.c.
int aligns[ADSI_MAX_INTRO] [static] |
Definition at line 69 of file res_adsi.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 1132 of file res_adsi.c.
char intro[ADSI_MAX_INTRO][20] [static] |
Definition at line 68 of file res_adsi.c.
int maxretries = DEFAULT_ADSI_MAX_RETRIES [static] |
Definition at line 63 of file res_adsi.c.
Referenced by ast_ivr_menu_run_internal(), and privacy_exec().
char speeddial[ADSI_MAX_SPEED_DIAL][3][20] [static] |
Definition at line 71 of file res_adsi.c.
int speeds = 0 [static] |
Definition at line 927 of file res_adsi.c.
int total = 0 [static] |
Definition at line 926 of file res_adsi.c.
Referenced by ast_cdr_serialize_variables(), manager_sip_show_peers(), meetme_cmd(), pbx_builtin_serialize_variables(), and send_sound().