00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "asterisk.h"
00031
00032 #include <errno.h>
00033 #include <ctype.h>
00034
00035 #include "asterisk/utils.h"
00036 #include "asterisk/options.h"
00037 #include "asterisk/pbx.h"
00038 #include "asterisk/file.h"
00039 #include "asterisk/callerid.h"
00040 #include "asterisk/say.h"
00041 #include "asterisk/manager.h"
00042 #include "asterisk/astdb.h"
00043 #include "asterisk/features.h"
00044 #include "asterisk/cel.h"
00045 #include "asterisk/causes.h"
00046
00047 #include "sig_analog.h"
00048
00049
00050
00051
00052
00053
00054
00055
00056 #define POLARITY_IDLE 0
00057 #define POLARITY_REV 1
00058 #define MIN_MS_SINCE_FLASH ( (2000) )
00059 static int analog_matchdigittimeout = 3000;
00060 static int analog_gendigittimeout = 8000;
00061 static int analog_firstdigittimeout = 16000;
00062 static char analog_defaultcic[64] = "";
00063 static char analog_defaultozz[64] = "";
00064
00065 static const struct {
00066 enum analog_sigtype sigtype;
00067 const char const *name;
00068 } sigtypes[] = {
00069 { ANALOG_SIG_FXOLS, "fxo_ls" },
00070 { ANALOG_SIG_FXOKS, "fxo_ks" },
00071 { ANALOG_SIG_FXOGS, "fxo_gs" },
00072 { ANALOG_SIG_FXSLS, "fxs_ls" },
00073 { ANALOG_SIG_FXSKS, "fxs_ks" },
00074 { ANALOG_SIG_FXSGS, "fxs_gs" },
00075 { ANALOG_SIG_EMWINK, "em_w" },
00076 { ANALOG_SIG_EM, "em" },
00077 { ANALOG_SIG_EM_E1, "em_e1" },
00078 { ANALOG_SIG_FEATD, "featd" },
00079 { ANALOG_SIG_FEATDMF, "featdmf" },
00080 { ANALOG_SIG_FEATDMF_TA, "featdmf_ta" },
00081 { ANALOG_SIG_FEATB, "featb" },
00082 { ANALOG_SIG_FGC_CAMA, "fgccama" },
00083 { ANALOG_SIG_FGC_CAMAMF, "fgccamamf" },
00084 { ANALOG_SIG_SF, "sf" },
00085 { ANALOG_SIG_SFWINK, "sf_w" },
00086 { ANALOG_SIG_SF_FEATD, "sf_featd" },
00087 { ANALOG_SIG_SF_FEATDMF, "sf_featdmf" },
00088 { ANALOG_SIG_SF_FEATB, "sf_featb" },
00089 { ANALOG_SIG_E911, "e911" },
00090 };
00091
00092 static const struct {
00093 unsigned int cid_type;
00094 const char const *name;
00095 } cidtypes[] = {
00096 { CID_SIG_BELL, "bell" },
00097 { CID_SIG_V23, "v23" },
00098 { CID_SIG_V23_JP, "v23_jp" },
00099 { CID_SIG_DTMF, "dtmf" },
00100
00101
00102 };
00103
00104 #define ISTRUNK(p) ((p->sig == ANALOG_SIG_FXSLS) || (p->sig == ANALOG_SIG_FXSKS) || \
00105 (p->sig == ANALOG_SIG_FXSGS))
00106
00107 enum analog_sigtype analog_str_to_sigtype(const char *name)
00108 {
00109 int i;
00110
00111 for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
00112 if (!strcasecmp(sigtypes[i].name, name)) {
00113 return sigtypes[i].sigtype;
00114 }
00115 }
00116
00117 return 0;
00118 }
00119
00120 const char *analog_sigtype_to_str(enum analog_sigtype sigtype)
00121 {
00122 int i;
00123
00124 for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
00125 if (sigtype == sigtypes[i].sigtype) {
00126 return sigtypes[i].name;
00127 }
00128 }
00129
00130 return "Unknown";
00131 }
00132
00133 unsigned int analog_str_to_cidtype(const char *name)
00134 {
00135 int i;
00136
00137 for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
00138 if (!strcasecmp(cidtypes[i].name, name)) {
00139 return cidtypes[i].cid_type;
00140 }
00141 }
00142
00143 return 0;
00144 }
00145
00146 const char *analog_cidtype_to_str(unsigned int cid_type)
00147 {
00148 int i;
00149
00150 for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
00151 if (cid_type == cidtypes[i].cid_type) {
00152 return cidtypes[i].name;
00153 }
00154 }
00155
00156 return "Unknown";
00157 }
00158
00159 static int analog_start_cid_detect(struct analog_pvt *p, int cid_signalling)
00160 {
00161 if (p->calls->start_cid_detect) {
00162 return p->calls->start_cid_detect(p->chan_pvt, cid_signalling);
00163 }
00164 return -1;
00165 }
00166
00167 static int analog_stop_cid_detect(struct analog_pvt *p)
00168 {
00169 if (p->calls->stop_cid_detect) {
00170 return p->calls->stop_cid_detect(p->chan_pvt);
00171 }
00172 return -1;
00173 }
00174
00175 static int analog_get_callerid(struct analog_pvt *p, char *name, char *number, enum analog_event *ev, size_t timeout)
00176 {
00177 if (p->calls->get_callerid) {
00178 return p->calls->get_callerid(p->chan_pvt, name, number, ev, timeout);
00179 }
00180 return -1;
00181 }
00182
00183 static const char *analog_get_orig_dialstring(struct analog_pvt *p)
00184 {
00185 if (p->calls->get_orig_dialstring) {
00186 return p->calls->get_orig_dialstring(p->chan_pvt);
00187 }
00188 return "";
00189 }
00190
00191 static int analog_get_event(struct analog_pvt *p)
00192 {
00193 if (p->calls->get_event) {
00194 return p->calls->get_event(p->chan_pvt);
00195 }
00196 return -1;
00197 }
00198
00199 static int analog_wait_event(struct analog_pvt *p)
00200 {
00201 if (p->calls->wait_event) {
00202 return p->calls->wait_event(p->chan_pvt);
00203 }
00204 return -1;
00205 }
00206
00207 static int analog_have_progressdetect(struct analog_pvt *p)
00208 {
00209 if (p->calls->have_progressdetect) {
00210 return p->calls->have_progressdetect(p->chan_pvt);
00211 }
00212
00213 return 0;
00214 }
00215
00216 enum analog_cid_start analog_str_to_cidstart(const char *value)
00217 {
00218 if (!strcasecmp(value, "ring")) {
00219 return ANALOG_CID_START_RING;
00220 } else if (!strcasecmp(value, "polarity")) {
00221 return ANALOG_CID_START_POLARITY;
00222 } else if (!strcasecmp(value, "polarity_in")) {
00223 return ANALOG_CID_START_POLARITY_IN;
00224 } else if (!strcasecmp(value, "dtmf")) {
00225 return ANALOG_CID_START_DTMF_NOALERT;
00226 }
00227
00228 return 0;
00229 }
00230
00231 const char *analog_cidstart_to_str(enum analog_cid_start cid_start)
00232 {
00233 switch (cid_start) {
00234 case ANALOG_CID_START_RING:
00235 return "Ring";
00236 case ANALOG_CID_START_POLARITY:
00237 return "Polarity";
00238 case ANALOG_CID_START_POLARITY_IN:
00239 return "Polarity_In";
00240 case ANALOG_CID_START_DTMF_NOALERT:
00241 return "DTMF";
00242 }
00243
00244 return "Unknown";
00245 }
00246
00247 static char *analog_event2str(enum analog_event event)
00248 {
00249 char *res;
00250 switch (event) {
00251 case ANALOG_EVENT_ONHOOK:
00252 res = "ANALOG_EVENT_ONHOOK";
00253 break;
00254 case ANALOG_EVENT_RINGOFFHOOK:
00255 res = "ANALOG_EVENT_RINGOFFHOOK";
00256 break;
00257 case ANALOG_EVENT_WINKFLASH:
00258 res = "ANALOG_EVENT_WINKFLASH";
00259 break;
00260 case ANALOG_EVENT_ALARM:
00261 res = "ANALOG_EVENT_ALARM";
00262 break;
00263 case ANALOG_EVENT_NOALARM:
00264 res = "ANALOG_EVENT_NOALARM";
00265 break;
00266 case ANALOG_EVENT_DIALCOMPLETE:
00267 res = "ANALOG_EVENT_DIALCOMPLETE";
00268 break;
00269 case ANALOG_EVENT_HOOKCOMPLETE:
00270 res = "ANALOG_EVENT_HOOKCOMPLETE";
00271 break;
00272 case ANALOG_EVENT_PULSE_START:
00273 res = "ANALOG_EVENT_PULSE_START";
00274 break;
00275 case ANALOG_EVENT_POLARITY:
00276 res = "ANALOG_EVENT_POLARITY";
00277 break;
00278 case ANALOG_EVENT_RINGBEGIN:
00279 res = "ANALOG_EVENT_RINGBEGIN";
00280 break;
00281 case ANALOG_EVENT_EC_DISABLED:
00282 res = "ANALOG_EVENT_EC_DISABLED";
00283 break;
00284 case ANALOG_EVENT_RINGERON:
00285 res = "ANALOG_EVENT_RINGERON";
00286 break;
00287 case ANALOG_EVENT_RINGEROFF:
00288 res = "ANALOG_EVENT_RINGEROFF";
00289 break;
00290 case ANALOG_EVENT_REMOVED:
00291 res = "ANALOG_EVENT_REMOVED";
00292 break;
00293 case ANALOG_EVENT_NEONMWI_ACTIVE:
00294 res = "ANALOG_EVENT_NEONMWI_ACTIVE";
00295 break;
00296 case ANALOG_EVENT_NEONMWI_INACTIVE:
00297 res = "ANALOG_EVENT_NEONMWI_INACTIVE";
00298 break;
00299 #ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
00300 case ANALOG_EVENT_TX_CED_DETECTED:
00301 res = "ANALOG_EVENT_TX_CED_DETECTED";
00302 break;
00303 case ANALOG_EVENT_RX_CED_DETECTED:
00304 res = "ANALOG_EVENT_RX_CED_DETECTED";
00305 break;
00306 case ANALOG_EVENT_EC_NLP_DISABLED:
00307 res = "ANALOG_EVENT_EC_NLP_DISABLED";
00308 break;
00309 case ANALOG_EVENT_EC_NLP_ENABLED:
00310 res = "ANALOG_EVENT_EC_NLP_ENABLED";
00311 break;
00312 #endif
00313 case ANALOG_EVENT_PULSEDIGIT:
00314 res = "ANALOG_EVENT_PULSEDIGIT";
00315 break;
00316 case ANALOG_EVENT_DTMFDOWN:
00317 res = "ANALOG_EVENT_DTMFDOWN";
00318 break;
00319 case ANALOG_EVENT_DTMFUP:
00320 res = "ANALOG_EVENT_DTMFUP";
00321 break;
00322 default:
00323 res = "UNKNOWN/OTHER";
00324 break;
00325 }
00326
00327 return res;
00328 }
00329
00330 static void analog_swap_subs(struct analog_pvt *p, enum analog_sub a, enum analog_sub b)
00331 {
00332 int tinthreeway;
00333 struct ast_channel *towner;
00334
00335 ast_debug(1, "Swapping %d and %d\n", a, b);
00336
00337 towner = p->subs[a].owner;
00338 p->subs[a].owner = p->subs[b].owner;
00339 p->subs[b].owner = towner;
00340
00341 tinthreeway = p->subs[a].inthreeway;
00342 p->subs[a].inthreeway = p->subs[b].inthreeway;
00343 p->subs[b].inthreeway = tinthreeway;
00344
00345 if (p->calls->swap_subs) {
00346 p->calls->swap_subs(p->chan_pvt, a, p->subs[a].owner, b, p->subs[b].owner);
00347 }
00348 }
00349
00350 static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
00351 {
00352 if (p->calls->allocate_sub) {
00353 int res;
00354 res = p->calls->allocate_sub(p->chan_pvt, x);
00355 if (!res) {
00356 p->subs[x].allocd = 1;
00357 }
00358 return res;
00359 }
00360 return 0;
00361 }
00362
00363 static int analog_unalloc_sub(struct analog_pvt *p, enum analog_sub x)
00364 {
00365 p->subs[x].allocd = 0;
00366 p->subs[x].owner = NULL;
00367 if (p->calls->unallocate_sub) {
00368 return p->calls->unallocate_sub(p->chan_pvt, x);
00369 }
00370 return 0;
00371 }
00372
00373 static int analog_send_callerid(struct analog_pvt *p, int cwcid, struct ast_party_caller *caller)
00374 {
00375 ast_debug(1, "Sending callerid. CID_NAME: '%s' CID_NUM: '%s'\n",
00376 caller->id.name.str,
00377 caller->id.number.str);
00378
00379 if (cwcid) {
00380 p->callwaitcas = 0;
00381 }
00382
00383 if (p->calls->send_callerid) {
00384 return p->calls->send_callerid(p->chan_pvt, cwcid, caller);
00385 }
00386 return 0;
00387 }
00388
00389 #define analog_get_index(ast, p, nullok) _analog_get_index(ast, p, nullok, __PRETTY_FUNCTION__, __LINE__)
00390 static int _analog_get_index(struct ast_channel *ast, struct analog_pvt *p, int nullok, const char *fname, unsigned long line)
00391 {
00392 int res;
00393 if (p->subs[ANALOG_SUB_REAL].owner == ast) {
00394 res = ANALOG_SUB_REAL;
00395 } else if (p->subs[ANALOG_SUB_CALLWAIT].owner == ast) {
00396 res = ANALOG_SUB_CALLWAIT;
00397 } else if (p->subs[ANALOG_SUB_THREEWAY].owner == ast) {
00398 res = ANALOG_SUB_THREEWAY;
00399 } else {
00400 res = -1;
00401 if (!nullok) {
00402 ast_log(LOG_WARNING,
00403 "Unable to get index for '%s' on channel %d (%s(), line %lu)\n",
00404 ast ? ast->name : "", p->channel, fname, line);
00405 }
00406 }
00407 return res;
00408 }
00409
00410 static int analog_dsp_reset_and_flush_digits(struct analog_pvt *p)
00411 {
00412 if (p->calls->dsp_reset_and_flush_digits) {
00413 return p->calls->dsp_reset_and_flush_digits(p->chan_pvt);
00414 }
00415
00416
00417 return 0;
00418 }
00419
00420 static int analog_play_tone(struct analog_pvt *p, enum analog_sub sub, enum analog_tone tone)
00421 {
00422 if (p->calls->play_tone) {
00423 return p->calls->play_tone(p->chan_pvt, sub, tone);
00424 }
00425 return -1;
00426 }
00427
00428 static void analog_set_new_owner(struct analog_pvt *p, struct ast_channel *new_owner)
00429 {
00430 p->owner = new_owner;
00431 if (p->calls->set_new_owner) {
00432 p->calls->set_new_owner(p->chan_pvt, new_owner);
00433 }
00434 }
00435
00436 static struct ast_channel * analog_new_ast_channel(struct analog_pvt *p, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
00437 {
00438 struct ast_channel *c;
00439
00440 if (!p->calls->new_ast_channel) {
00441 return NULL;
00442 }
00443
00444 c = p->calls->new_ast_channel(p->chan_pvt, state, startpbx, sub, requestor);
00445 if (c) {
00446 ast_string_field_set(c, call_forward, p->call_forward);
00447 }
00448 p->subs[sub].owner = c;
00449 if (!p->owner) {
00450 analog_set_new_owner(p, c);
00451 }
00452 return c;
00453 }
00454
00455 static int analog_set_echocanceller(struct analog_pvt *p, int enable)
00456 {
00457 if (p->calls->set_echocanceller) {
00458 return p->calls->set_echocanceller(p->chan_pvt, enable);
00459 }
00460 return -1;
00461 }
00462
00463 static int analog_train_echocanceller(struct analog_pvt *p)
00464 {
00465 if (p->calls->train_echocanceller) {
00466 return p->calls->train_echocanceller(p->chan_pvt);
00467 }
00468 return -1;
00469 }
00470
00471 static int analog_is_off_hook(struct analog_pvt *p)
00472 {
00473 if (p->calls->is_off_hook) {
00474 return p->calls->is_off_hook(p->chan_pvt);
00475 }
00476 return -1;
00477 }
00478
00479 static int analog_ring(struct analog_pvt *p)
00480 {
00481 if (p->calls->ring) {
00482 return p->calls->ring(p->chan_pvt);
00483 }
00484 return -1;
00485 }
00486
00487 static int analog_flash(struct analog_pvt *p)
00488 {
00489 if (p->calls->flash) {
00490 return p->calls->flash(p->chan_pvt);
00491 }
00492 return -1;
00493 }
00494
00495 static int analog_start(struct analog_pvt *p)
00496 {
00497 if (p->calls->start) {
00498 return p->calls->start(p->chan_pvt);
00499 }
00500 return -1;
00501 }
00502
00503 static int analog_dial_digits(struct analog_pvt *p, enum analog_sub sub, struct analog_dialoperation *dop)
00504 {
00505 if (p->calls->dial_digits) {
00506 return p->calls->dial_digits(p->chan_pvt, sub, dop);
00507 }
00508 return -1;
00509 }
00510
00511 static int analog_on_hook(struct analog_pvt *p)
00512 {
00513 if (p->calls->on_hook) {
00514 return p->calls->on_hook(p->chan_pvt);
00515 }
00516 return -1;
00517 }
00518
00519 static void analog_set_outgoing(struct analog_pvt *p, int is_outgoing)
00520 {
00521 p->outgoing = is_outgoing;
00522 if (p->calls->set_outgoing) {
00523 p->calls->set_outgoing(p->chan_pvt, is_outgoing);
00524 }
00525 }
00526
00527 static int analog_check_for_conference(struct analog_pvt *p)
00528 {
00529 if (p->calls->check_for_conference) {
00530 return p->calls->check_for_conference(p->chan_pvt);
00531 }
00532 return -1;
00533 }
00534
00535 static void analog_all_subchannels_hungup(struct analog_pvt *p)
00536 {
00537 if (p->calls->all_subchannels_hungup) {
00538 p->calls->all_subchannels_hungup(p->chan_pvt);
00539 }
00540 }
00541
00542 static void analog_unlock_private(struct analog_pvt *p)
00543 {
00544 if (p->calls->unlock_private) {
00545 p->calls->unlock_private(p->chan_pvt);
00546 }
00547 }
00548
00549 static void analog_lock_private(struct analog_pvt *p)
00550 {
00551 if (p->calls->lock_private) {
00552 p->calls->lock_private(p->chan_pvt);
00553 }
00554 }
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571 static void analog_lock_sub_owner(struct analog_pvt *pvt, enum analog_sub sub_idx)
00572 {
00573 for (;;) {
00574 if (!pvt->subs[sub_idx].owner) {
00575
00576 break;
00577 }
00578 if (!ast_channel_trylock(pvt->subs[sub_idx].owner)) {
00579
00580 break;
00581 }
00582
00583 if (pvt->calls->deadlock_avoidance_private) {
00584 pvt->calls->deadlock_avoidance_private(pvt->chan_pvt);
00585 } else {
00586
00587 usleep(1);
00588 }
00589 }
00590 }
00591
00592 static int analog_off_hook(struct analog_pvt *p)
00593 {
00594 if (p->calls->off_hook) {
00595 return p->calls->off_hook(p->chan_pvt);
00596 }
00597 return -1;
00598 }
00599
00600 static void analog_set_needringing(struct analog_pvt *p, int value)
00601 {
00602 if (p->calls->set_needringing) {
00603 return p->calls->set_needringing(p->chan_pvt, value);
00604 }
00605 }
00606
00607 #if 0
00608 static void analog_set_polarity(struct analog_pvt *p, int value)
00609 {
00610 if (p->calls->set_polarity) {
00611 return p->calls->set_polarity(p->chan_pvt, value);
00612 }
00613 }
00614 #endif
00615
00616 static void analog_start_polarityswitch(struct analog_pvt *p)
00617 {
00618 if (p->calls->start_polarityswitch) {
00619 return p->calls->start_polarityswitch(p->chan_pvt);
00620 }
00621 }
00622 static void analog_answer_polarityswitch(struct analog_pvt *p)
00623 {
00624 if (p->calls->answer_polarityswitch) {
00625 return p->calls->answer_polarityswitch(p->chan_pvt);
00626 }
00627 }
00628
00629 static void analog_hangup_polarityswitch(struct analog_pvt *p)
00630 {
00631 if (p->calls->hangup_polarityswitch) {
00632 return p->calls->hangup_polarityswitch(p->chan_pvt);
00633 }
00634 }
00635
00636 static int analog_dsp_set_digitmode(struct analog_pvt *p, enum analog_dsp_digitmode mode)
00637 {
00638 if (p->calls->dsp_set_digitmode) {
00639 return p->calls->dsp_set_digitmode(p->chan_pvt, mode);
00640 }
00641 return -1;
00642 }
00643
00644 static void analog_cb_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
00645 {
00646 if (p->calls->handle_dtmf) {
00647 p->calls->handle_dtmf(p->chan_pvt, ast, analog_index, dest);
00648 }
00649 }
00650
00651 static int analog_wink(struct analog_pvt *p, enum analog_sub index)
00652 {
00653 if (p->calls->wink) {
00654 return p->calls->wink(p->chan_pvt, index);
00655 }
00656 return -1;
00657 }
00658
00659 static int analog_has_voicemail(struct analog_pvt *p)
00660 {
00661 if (p->calls->has_voicemail) {
00662 return p->calls->has_voicemail(p->chan_pvt);
00663 }
00664 return -1;
00665 }
00666
00667 static int analog_is_dialing(struct analog_pvt *p, enum analog_sub index)
00668 {
00669 if (p->calls->is_dialing) {
00670 return p->calls->is_dialing(p->chan_pvt, index);
00671 }
00672 return -1;
00673 }
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690 static int analog_attempt_transfer(struct analog_pvt *p, int inthreeway)
00691 {
00692 struct ast_channel *owner_real;
00693 struct ast_channel *owner_3way;
00694 struct ast_channel *bridge_real;
00695 struct ast_channel *bridge_3way;
00696
00697 owner_real = p->subs[ANALOG_SUB_REAL].owner;
00698 owner_3way = p->subs[ANALOG_SUB_THREEWAY].owner;
00699 bridge_real = ast_bridged_channel(owner_real);
00700 bridge_3way = ast_bridged_channel(owner_3way);
00701
00702
00703
00704
00705
00706
00707 if (bridge_3way) {
00708 ast_verb(3, "TRANSFERRING %s to %s\n", owner_3way->name, owner_real->name);
00709 ast_cel_report_event(owner_3way,
00710 (owner_real->_state == AST_STATE_RINGING
00711 || owner_3way->_state == AST_STATE_RINGING)
00712 ? AST_CEL_BLINDTRANSFER : AST_CEL_ATTENDEDTRANSFER,
00713 NULL, owner_3way->linkedid, NULL);
00714
00715
00716
00717
00718
00719 if (ast_channel_transfer_masquerade(owner_real, &owner_real->connected, 0,
00720 bridge_3way, &owner_3way->connected, !inthreeway)) {
00721 ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n",
00722 bridge_3way->name, owner_real->name);
00723 return -1;
00724 }
00725
00726
00727 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
00728 ast_channel_unlock(owner_3way);
00729 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
00730
00731 return 1;
00732 } else if (bridge_real) {
00733
00734 ast_verb(3, "TRANSFERRING %s to %s\n", owner_real->name, owner_3way->name);
00735 ast_cel_report_event(owner_3way,
00736 (owner_real->_state == AST_STATE_RINGING
00737 || owner_3way->_state == AST_STATE_RINGING)
00738 ? AST_CEL_BLINDTRANSFER : AST_CEL_ATTENDEDTRANSFER,
00739 NULL, owner_3way->linkedid, NULL);
00740
00741
00742
00743
00744
00745 if (ast_channel_transfer_masquerade(owner_3way, &owner_3way->connected,
00746 !inthreeway, bridge_real, &owner_real->connected, 0)) {
00747 ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n",
00748 bridge_real->name, owner_3way->name);
00749 return -1;
00750 }
00751
00752
00753 ast_channel_unlock(owner_3way);
00754 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
00755 return 0;
00756 } else {
00757 ast_debug(1, "Neither %s nor %s are in a bridge, nothing to transfer\n",
00758 owner_real->name, owner_3way->name);
00759 return -1;
00760 }
00761 }
00762
00763 static int analog_update_conf(struct analog_pvt *p)
00764 {
00765 int x;
00766 int needconf = 0;
00767
00768
00769 for (x = 0; x < 3; x++) {
00770
00771 if ((p->subs[x].allocd) && p->subs[x].inthreeway) {
00772 if (p->calls->conf_add) {
00773 p->calls->conf_add(p->chan_pvt, x);
00774 }
00775 needconf++;
00776 } else {
00777 if (p->calls->conf_del) {
00778 p->calls->conf_del(p->chan_pvt, x);
00779 }
00780 }
00781 }
00782 ast_debug(1, "Updated conferencing on %d, with %d conference users\n", p->channel, needconf);
00783
00784 if (p->calls->complete_conference_update) {
00785 p->calls->complete_conference_update(p->chan_pvt, needconf);
00786 }
00787 return 0;
00788 }
00789
00790 struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const struct ast_channel *requestor)
00791 {
00792 struct ast_channel *ast;
00793
00794 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
00795 *callwait = (p->owner != NULL);
00796
00797 if (p->owner) {
00798 if (analog_alloc_sub(p, ANALOG_SUB_CALLWAIT)) {
00799 ast_log(LOG_ERROR, "Unable to alloc subchannel\n");
00800 return NULL;
00801 }
00802 }
00803
00804 analog_set_outgoing(p, 1);
00805 ast = analog_new_ast_channel(p, AST_STATE_RESERVED, 0,
00806 p->owner ? ANALOG_SUB_CALLWAIT : ANALOG_SUB_REAL, requestor);
00807 if (!ast) {
00808 analog_set_outgoing(p, 0);
00809 }
00810 return ast;
00811 }
00812
00813 int analog_available(struct analog_pvt *p)
00814 {
00815 int offhook;
00816
00817 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
00818
00819
00820 if (p->dnd) {
00821 return 0;
00822 }
00823
00824 if (p->guardtime && (time(NULL) < p->guardtime)) {
00825 return 0;
00826 }
00827
00828
00829 if (!p->owner) {
00830 offhook = analog_is_off_hook(p);
00831
00832
00833 if ((p->sig == ANALOG_SIG_FXSLS) || (p->sig == ANALOG_SIG_FXSKS) || (p->sig == ANALOG_SIG_FXSGS)) {
00834 #ifdef DAHDI_CHECK_HOOKSTATE
00835 if (offhook) {
00836 return 1;
00837 }
00838 return 0;
00839 #endif
00840
00841 } else if (offhook) {
00842 ast_debug(1, "Channel %d off hook, can't use\n", p->channel);
00843
00844 return 0;
00845 }
00846 return 1;
00847 }
00848
00849
00850 if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
00851 return 0;
00852 }
00853
00854 if (!p->callwaiting) {
00855
00856 return 0;
00857 }
00858
00859 if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
00860
00861 return 0;
00862 }
00863
00864 if ((p->owner->_state != AST_STATE_UP) &&
00865 ((p->owner->_state != AST_STATE_RINGING) || p->outgoing)) {
00866
00867 return 0;
00868 }
00869 if ((p->subs[ANALOG_SUB_THREEWAY].owner) && (!p->subs[ANALOG_SUB_THREEWAY].inthreeway)) {
00870
00871 return 0;
00872 }
00873
00874 return 1;
00875 }
00876
00877 static int analog_stop_callwait(struct analog_pvt *p)
00878 {
00879 p->callwaitcas = 0;
00880 if (p->calls->stop_callwait) {
00881 return p->calls->stop_callwait(p->chan_pvt);
00882 }
00883 return 0;
00884 }
00885
00886 static int analog_callwait(struct analog_pvt *p)
00887 {
00888 p->callwaitcas = p->callwaitingcallerid;
00889 if (p->calls->callwait) {
00890 return p->calls->callwait(p->chan_pvt);
00891 }
00892 return 0;
00893 }
00894
00895 static void analog_set_callwaiting(struct analog_pvt *p, int callwaiting_enable)
00896 {
00897 p->callwaiting = callwaiting_enable;
00898 if (p->calls->set_callwaiting) {
00899 p->calls->set_callwaiting(p->chan_pvt, callwaiting_enable);
00900 }
00901 }
00902
00903 static void analog_set_cadence(struct analog_pvt *p, struct ast_channel *chan)
00904 {
00905 if (p->calls->set_cadence) {
00906 return p->calls->set_cadence(p->chan_pvt, &p->cidrings, chan);
00907 }
00908 }
00909
00910 static void analog_set_dialing(struct analog_pvt *p, int is_dialing)
00911 {
00912 p->dialing = is_dialing;
00913 if (p->calls->set_dialing) {
00914 return p->calls->set_dialing(p->chan_pvt, is_dialing);
00915 }
00916 }
00917
00918 static void analog_set_alarm(struct analog_pvt *p, int in_alarm)
00919 {
00920 p->inalarm = in_alarm;
00921 if (p->calls->set_alarm) {
00922 return p->calls->set_alarm(p->chan_pvt, in_alarm);
00923 }
00924 }
00925
00926 static void analog_set_ringtimeout(struct analog_pvt *p, int ringt)
00927 {
00928 p->ringt = ringt;
00929 if (!p->calls->set_ringtimeout) {
00930 return;
00931 }
00932 p->calls->set_ringtimeout(p->chan_pvt, ringt);
00933 }
00934
00935 static void analog_set_waitingfordt(struct analog_pvt *p, struct ast_channel *ast)
00936 {
00937 if (p->calls->set_waitingfordt) {
00938 return p->calls->set_waitingfordt(p->chan_pvt, ast);
00939 }
00940 }
00941
00942 static int analog_check_waitingfordt(struct analog_pvt *p)
00943 {
00944 if (p->calls->check_waitingfordt) {
00945 return p->calls->check_waitingfordt(p->chan_pvt);
00946 }
00947
00948 return 0;
00949 }
00950
00951 static void analog_set_confirmanswer(struct analog_pvt *p, int flag)
00952 {
00953 if (!p->calls->set_confirmanswer) {
00954 return;
00955 }
00956 p->calls->set_confirmanswer(p->chan_pvt, flag);
00957 }
00958
00959 static int analog_check_confirmanswer(struct analog_pvt *p)
00960 {
00961 if (p->calls->check_confirmanswer) {
00962 return p->calls->check_confirmanswer(p->chan_pvt);
00963 }
00964
00965 return 0;
00966 }
00967
00968 static void analog_cancel_cidspill(struct analog_pvt *p)
00969 {
00970 if (!p->calls->cancel_cidspill) {
00971 return;
00972 }
00973
00974 p->calls->cancel_cidspill(p->chan_pvt);
00975 }
00976
00977 static int analog_confmute(struct analog_pvt *p, int mute)
00978 {
00979 if (p->calls->confmute) {
00980 return p->calls->confmute(p->chan_pvt, mute);
00981 }
00982 return 0;
00983 }
00984
00985 static void analog_set_pulsedial(struct analog_pvt *p, int flag)
00986 {
00987 if (!p->calls->set_pulsedial) {
00988 return;
00989 }
00990 p->calls->set_pulsedial(p->chan_pvt, flag);
00991 }
00992
00993 static int analog_set_linear_mode(struct analog_pvt *p, enum analog_sub sub, int linear_mode)
00994 {
00995 if (p->calls->set_linear_mode) {
00996
00997 return p->calls->set_linear_mode(p->chan_pvt, sub, linear_mode);
00998 }
00999 return -1;
01000 }
01001
01002 static void analog_set_inthreeway(struct analog_pvt *p, enum analog_sub sub, int inthreeway)
01003 {
01004 p->subs[sub].inthreeway = inthreeway;
01005 if (p->calls->set_inthreeway) {
01006 p->calls->set_inthreeway(p->chan_pvt, sub, inthreeway);
01007 }
01008 }
01009
01010 int analog_call(struct analog_pvt *p, struct ast_channel *ast, char *rdest, int timeout)
01011 {
01012 int res, idx, mysig;
01013 char *c, *n, *l;
01014 char dest[256];
01015
01016 ast_debug(1, "CALLING CID_NAME: %s CID_NUM:: %s\n",
01017 S_COR(ast->connected.id.name.valid, ast->connected.id.name.str, ""),
01018 S_COR(ast->connected.id.number.valid, ast->connected.id.number.str, ""));
01019
01020 ast_copy_string(dest, rdest, sizeof(dest));
01021 ast_copy_string(p->dialdest, rdest, sizeof(p->dialdest));
01022
01023 if ((ast->_state == AST_STATE_BUSY)) {
01024 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_BUSY);
01025 return 0;
01026 }
01027
01028 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
01029 ast_log(LOG_WARNING, "analog_call called on %s, neither down nor reserved\n", ast->name);
01030 return -1;
01031 }
01032
01033 p->dialednone = 0;
01034 analog_set_outgoing(p, 1);
01035
01036 mysig = p->sig;
01037 if (p->outsigmod > -1) {
01038 mysig = p->outsigmod;
01039 }
01040
01041 switch (mysig) {
01042 case ANALOG_SIG_FXOLS:
01043 case ANALOG_SIG_FXOGS:
01044 case ANALOG_SIG_FXOKS:
01045 if (p->owner == ast) {
01046
01047
01048
01049 analog_set_dialing(p, 1);
01050 analog_set_cadence(p, ast);
01051
01052
01053 c = strchr(dest, '/');
01054 if (c) {
01055 c++;
01056 }
01057 if (c && (strlen(c) < p->stripmsd)) {
01058 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
01059 c = NULL;
01060 }
01061 if (c) {
01062 p->dop.op = ANALOG_DIAL_OP_REPLACE;
01063 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "Tw%s", c);
01064 ast_debug(1, "FXO: setup deferred dialstring: %s\n", c);
01065 } else {
01066 p->dop.dialstr[0] = '\0';
01067 }
01068
01069 if (analog_ring(p)) {
01070 ast_log(LOG_WARNING, "Unable to ring phone: %s\n", strerror(errno));
01071 return -1;
01072 }
01073 analog_set_dialing(p, 1);
01074 } else {
01075
01076 if (ast->connected.id.number.valid && ast->connected.id.number.str) {
01077 ast_copy_string(p->callwait_num, ast->connected.id.number.str, sizeof(p->callwait_num));
01078 } else {
01079 p->callwait_num[0] = '\0';
01080 }
01081 if (ast->connected.id.name.valid && ast->connected.id.name.str) {
01082 ast_copy_string(p->callwait_name, ast->connected.id.name.str, sizeof(p->callwait_name));
01083 } else {
01084 p->callwait_name[0] = '\0';
01085 }
01086
01087
01088 if (analog_callwait(p)) {
01089 return -1;
01090 }
01091
01092 if (analog_play_tone(p, ANALOG_SUB_CALLWAIT, ANALOG_TONE_RINGTONE)) {
01093 ast_log(LOG_WARNING, "Unable to generate call-wait ring-back on channel %s\n", ast->name);
01094 }
01095
01096 }
01097 n = ast->connected.id.name.valid ? ast->connected.id.name.str : NULL;
01098 l = ast->connected.id.number.valid ? ast->connected.id.number.str : NULL;
01099 if (l) {
01100 ast_copy_string(p->lastcid_num, l, sizeof(p->lastcid_num));
01101 } else {
01102 p->lastcid_num[0] = '\0';
01103 }
01104 if (n) {
01105 ast_copy_string(p->lastcid_name, n, sizeof(p->lastcid_name));
01106 } else {
01107 p->lastcid_name[0] = '\0';
01108 }
01109
01110 if (p->use_callerid) {
01111 p->caller.id.name.str = p->lastcid_name;
01112 p->caller.id.number.str = p->lastcid_num;
01113 }
01114
01115 ast_setstate(ast, AST_STATE_RINGING);
01116 idx = analog_get_index(ast, p, 0);
01117 if (idx > -1) {
01118 struct ast_cc_config_params *cc_params;
01119
01120
01121
01122
01123 cc_params = ast_channel_get_cc_config_params(p->subs[idx].owner);
01124 if (cc_params) {
01125 switch (ast_get_cc_monitor_policy(cc_params)) {
01126 case AST_CC_MONITOR_NEVER:
01127 break;
01128 case AST_CC_MONITOR_NATIVE:
01129 case AST_CC_MONITOR_ALWAYS:
01130 case AST_CC_MONITOR_GENERIC:
01131 ast_queue_cc_frame(p->subs[idx].owner, AST_CC_GENERIC_MONITOR_TYPE,
01132 analog_get_orig_dialstring(p), AST_CC_CCNR, NULL);
01133 break;
01134 }
01135 }
01136 ast_queue_control(p->subs[idx].owner, AST_CONTROL_RINGING);
01137 }
01138 break;
01139 case ANALOG_SIG_FXSLS:
01140 case ANALOG_SIG_FXSGS:
01141 case ANALOG_SIG_FXSKS:
01142 if (p->answeronpolarityswitch || p->hanguponpolarityswitch) {
01143 ast_debug(1, "Ignore possible polarity reversal on line seizure\n");
01144 p->polaritydelaytv = ast_tvnow();
01145 }
01146
01147 case ANALOG_SIG_EMWINK:
01148 case ANALOG_SIG_EM:
01149 case ANALOG_SIG_EM_E1:
01150 case ANALOG_SIG_FEATD:
01151 case ANALOG_SIG_FEATDMF:
01152 case ANALOG_SIG_E911:
01153 case ANALOG_SIG_FGC_CAMA:
01154 case ANALOG_SIG_FGC_CAMAMF:
01155 case ANALOG_SIG_FEATB:
01156 case ANALOG_SIG_SFWINK:
01157 case ANALOG_SIG_SF:
01158 case ANALOG_SIG_SF_FEATD:
01159 case ANALOG_SIG_SF_FEATDMF:
01160 case ANALOG_SIG_FEATDMF_TA:
01161 case ANALOG_SIG_SF_FEATB:
01162 c = strchr(dest, '/');
01163 if (c) {
01164 c++;
01165 } else {
01166 c = "";
01167 }
01168 if (strlen(c) < p->stripmsd) {
01169 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
01170 return -1;
01171 }
01172 res = analog_start(p);
01173 if (res < 0) {
01174 if (errno != EINPROGRESS) {
01175 return -1;
01176 }
01177 }
01178 ast_debug(1, "Dialing '%s'\n", c);
01179 p->dop.op = ANALOG_DIAL_OP_REPLACE;
01180
01181 c += p->stripmsd;
01182
01183 switch (mysig) {
01184 case ANALOG_SIG_FEATD:
01185 l = ast->connected.id.number.valid ? ast->connected.id.number.str : NULL;
01186 if (l) {
01187 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T*%s*%s*", l, c);
01188 } else {
01189 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T**%s*", c);
01190 }
01191 break;
01192 case ANALOG_SIG_FEATDMF:
01193 l = ast->connected.id.number.valid ? ast->connected.id.number.str : NULL;
01194 if (l) {
01195 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*00%s#*%s#", l, c);
01196 } else {
01197 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*02#*%s#", c);
01198 }
01199 break;
01200 case ANALOG_SIG_FEATDMF_TA:
01201 {
01202 const char *cic = "", *ozz = "";
01203
01204
01205 #ifndef STANDALONE
01206 ozz = pbx_builtin_getvar_helper(p->owner, "FEATDMF_OZZ");
01207 if (!ozz) {
01208 ozz = analog_defaultozz;
01209 }
01210 cic = pbx_builtin_getvar_helper(p->owner, "FEATDMF_CIC");
01211 if (!cic) {
01212 cic = analog_defaultcic;
01213 }
01214 #endif
01215 if (!ozz || !cic) {
01216 ast_log(LOG_WARNING, "Unable to dial channel of type feature group D MF tandem access without CIC or OZZ set\n");
01217 return -1;
01218 }
01219 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s%s#", ozz, cic);
01220 snprintf(p->finaldial, sizeof(p->finaldial), "M*%s#", c);
01221 p->whichwink = 0;
01222 }
01223 break;
01224 case ANALOG_SIG_E911:
01225 ast_copy_string(p->dop.dialstr, "M*911#", sizeof(p->dop.dialstr));
01226 break;
01227 case ANALOG_SIG_FGC_CAMA:
01228 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%s", c);
01229 break;
01230 case ANALOG_SIG_FGC_CAMAMF:
01231 case ANALOG_SIG_FEATB:
01232 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c);
01233 break;
01234 default:
01235 if (p->pulse) {
01236 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%sw", c);
01237 } else {
01238 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c);
01239 }
01240 break;
01241 }
01242
01243 if (p->echotraining && (strlen(p->dop.dialstr) > 4)) {
01244 memset(p->echorest, 'w', sizeof(p->echorest) - 1);
01245 strcpy(p->echorest + (p->echotraining / 400) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
01246 p->echorest[sizeof(p->echorest) - 1] = '\0';
01247 p->echobreak = 1;
01248 p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
01249 } else {
01250 p->echobreak = 0;
01251 }
01252 analog_set_waitingfordt(p, ast);
01253 if (!res) {
01254 if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
01255 int saveerr = errno;
01256
01257 analog_on_hook(p);
01258 ast_log(LOG_WARNING, "Dialing failed on channel %d: %s\n", p->channel, strerror(saveerr));
01259 return -1;
01260 }
01261 } else {
01262 ast_debug(1, "Deferring dialing...\n");
01263 }
01264 analog_set_dialing(p, 1);
01265 if (ast_strlen_zero(c)) {
01266 p->dialednone = 1;
01267 }
01268 ast_setstate(ast, AST_STATE_DIALING);
01269 break;
01270 default:
01271 ast_debug(1, "not yet implemented\n");
01272 return -1;
01273 }
01274 return 0;
01275 }
01276
01277 int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
01278 {
01279 int res;
01280 int idx, x;
01281
01282 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
01283 if (!ast->tech_pvt) {
01284 ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
01285 return 0;
01286 }
01287
01288 idx = analog_get_index(ast, p, 1);
01289
01290 x = 0;
01291 if (p->origcid_num) {
01292 ast_copy_string(p->cid_num, p->origcid_num, sizeof(p->cid_num));
01293 ast_free(p->origcid_num);
01294 p->origcid_num = NULL;
01295 }
01296 if (p->origcid_name) {
01297 ast_copy_string(p->cid_name, p->origcid_name, sizeof(p->cid_name));
01298 ast_free(p->origcid_name);
01299 p->origcid_name = NULL;
01300 }
01301
01302 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_DTMF);
01303
01304 ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
01305 p->channel, idx, p->subs[ANALOG_SUB_REAL].allocd, p->subs[ANALOG_SUB_CALLWAIT].allocd, p->subs[ANALOG_SUB_THREEWAY].allocd);
01306 if (idx > -1) {
01307
01308 p->subs[idx].owner = NULL;
01309 p->polarity = POLARITY_IDLE;
01310 analog_set_linear_mode(p, idx, 0);
01311 switch (idx) {
01312 case ANALOG_SUB_REAL:
01313 if (p->subs[ANALOG_SUB_CALLWAIT].allocd && p->subs[ANALOG_SUB_THREEWAY].allocd) {
01314 ast_debug(1, "Normal call hung up with both three way call and a call waiting call in place?\n");
01315 if (p->subs[ANALOG_SUB_CALLWAIT].inthreeway) {
01316
01317 ast_debug(1, "We were flipped over to the callwait, moving back and unowning.\n");
01318
01319 analog_swap_subs(p, ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL);
01320 analog_unalloc_sub(p, ANALOG_SUB_CALLWAIT);
01321 analog_set_new_owner(p, NULL);
01322 } else {
01323
01324 ast_debug(1, "We were in the threeway and have a callwait still. Ditching the threeway.\n");
01325 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
01326 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
01327 if (p->subs[ANALOG_SUB_REAL].inthreeway) {
01328
01329
01330 ast_debug(1, "Call was complete, setting owner to former third call\n");
01331 analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
01332 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
01333 } else {
01334
01335 ast_debug(1, "Call was incomplete, setting owner to NULL\n");
01336 analog_set_new_owner(p, NULL);
01337 }
01338 }
01339 } else if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
01340
01341 analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
01342 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
01343
01344 analog_set_new_owner(p, NULL);
01345 break;
01346 }
01347
01348
01349 analog_swap_subs(p, ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL);
01350 analog_unalloc_sub(p, ANALOG_SUB_CALLWAIT);
01351 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
01352 if (p->owner->_state != AST_STATE_UP) {
01353 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_ANSWER);
01354 }
01355 if (ast_bridged_channel(p->subs[ANALOG_SUB_REAL].owner)) {
01356 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_UNHOLD);
01357 }
01358
01359 ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
01360 } else if (p->subs[ANALOG_SUB_THREEWAY].allocd) {
01361 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
01362 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
01363 if (p->subs[ANALOG_SUB_REAL].inthreeway) {
01364
01365
01366 ast_debug(1, "Call was complete, setting owner to former third call\n");
01367 analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
01368 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
01369 } else {
01370
01371 ast_debug(1, "Call was incomplete, setting owner to NULL\n");
01372 analog_set_new_owner(p, NULL);
01373 }
01374 }
01375 break;
01376 case ANALOG_SUB_CALLWAIT:
01377
01378 if (p->subs[ANALOG_SUB_CALLWAIT].inthreeway) {
01379
01380 analog_lock_sub_owner(p, ANALOG_SUB_THREEWAY);
01381
01382
01383
01384 if (p->subs[ANALOG_SUB_THREEWAY].owner && ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner)) {
01385 ast_queue_control_data(p->subs[ANALOG_SUB_THREEWAY].owner, AST_CONTROL_HOLD,
01386 S_OR(p->mohsuggest, NULL),
01387 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
01388 }
01389 analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 0);
01390
01391 analog_swap_subs(p, ANALOG_SUB_CALLWAIT, ANALOG_SUB_THREEWAY);
01392 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
01393 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
01394
01395 ast_channel_unlock(p->subs[ANALOG_SUB_CALLWAIT].owner);
01396 }
01397 } else {
01398 analog_unalloc_sub(p, ANALOG_SUB_CALLWAIT);
01399 }
01400 break;
01401 case ANALOG_SUB_THREEWAY:
01402
01403 analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
01404 if (p->subs[ANALOG_SUB_CALLWAIT].inthreeway) {
01405
01406
01407 analog_set_inthreeway(p, ANALOG_SUB_CALLWAIT, 0);
01408 if (p->subs[ANALOG_SUB_CALLWAIT].owner && ast_bridged_channel(p->subs[ANALOG_SUB_CALLWAIT].owner)) {
01409 ast_queue_control_data(p->subs[ANALOG_SUB_CALLWAIT].owner, AST_CONTROL_HOLD,
01410 S_OR(p->mohsuggest, NULL),
01411 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
01412 }
01413 }
01414 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
01415 ast_channel_unlock(p->subs[ANALOG_SUB_CALLWAIT].owner);
01416 }
01417 analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
01418
01419
01420 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
01421 break;
01422 default:
01423
01424
01425
01426
01427 ast_log(LOG_ERROR, "Index found but not any type of call?\n");
01428 break;
01429 }
01430 }
01431
01432 if (!p->subs[ANALOG_SUB_REAL].owner && !p->subs[ANALOG_SUB_CALLWAIT].owner && !p->subs[ANALOG_SUB_THREEWAY].owner) {
01433 analog_set_new_owner(p, NULL);
01434 analog_set_ringtimeout(p, 0);
01435 analog_set_confirmanswer(p, 0);
01436 analog_set_pulsedial(p, 0);
01437 analog_set_outgoing(p, 0);
01438 p->onhooktime = time(NULL);
01439 p->cidrings = 1;
01440
01441
01442 res = analog_on_hook(p);
01443 if (res < 0) {
01444 ast_log(LOG_WARNING, "Unable to hangup line %s\n", ast->name);
01445 }
01446 switch (p->sig) {
01447 case ANALOG_SIG_FXOGS:
01448 case ANALOG_SIG_FXOLS:
01449 case ANALOG_SIG_FXOKS:
01450
01451 if (analog_is_off_hook(p)) {
01452 analog_hangup_polarityswitch(p);
01453 analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
01454 } else {
01455 analog_play_tone(p, ANALOG_SUB_REAL, -1);
01456 }
01457 break;
01458 case ANALOG_SIG_FXSGS:
01459 case ANALOG_SIG_FXSLS:
01460 case ANALOG_SIG_FXSKS:
01461
01462
01463 if (ast->_state != AST_STATE_RESERVED) {
01464 time(&p->guardtime);
01465 p->guardtime += 2;
01466 }
01467 break;
01468 default:
01469 analog_play_tone(p, ANALOG_SUB_REAL, -1);
01470 break;
01471 }
01472
01473 analog_set_echocanceller(p, 0);
01474
01475 x = 0;
01476 ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
01477 ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
01478 p->callwaitcas = 0;
01479 analog_set_callwaiting(p, p->permcallwaiting);
01480 p->hidecallerid = p->permhidecallerid;
01481 analog_set_dialing(p, 0);
01482 analog_update_conf(p);
01483 analog_all_subchannels_hungup(p);
01484 }
01485
01486 analog_stop_callwait(p);
01487
01488 ast_verb(3, "Hanging up on '%s'\n", ast->name);
01489
01490 return 0;
01491 }
01492
01493 int analog_answer(struct analog_pvt *p, struct ast_channel *ast)
01494 {
01495 int res = 0;
01496 int idx;
01497 int oldstate = ast->_state;
01498
01499 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
01500 ast_setstate(ast, AST_STATE_UP);
01501 idx = analog_get_index(ast, p, 1);
01502 if (idx < 0) {
01503 idx = ANALOG_SUB_REAL;
01504 }
01505 switch (p->sig) {
01506 case ANALOG_SIG_FXSLS:
01507 case ANALOG_SIG_FXSGS:
01508 case ANALOG_SIG_FXSKS:
01509 analog_set_ringtimeout(p, 0);
01510
01511 case ANALOG_SIG_EM:
01512 case ANALOG_SIG_EM_E1:
01513 case ANALOG_SIG_EMWINK:
01514 case ANALOG_SIG_FEATD:
01515 case ANALOG_SIG_FEATDMF:
01516 case ANALOG_SIG_FEATDMF_TA:
01517 case ANALOG_SIG_E911:
01518 case ANALOG_SIG_FGC_CAMA:
01519 case ANALOG_SIG_FGC_CAMAMF:
01520 case ANALOG_SIG_FEATB:
01521 case ANALOG_SIG_SF:
01522 case ANALOG_SIG_SFWINK:
01523 case ANALOG_SIG_SF_FEATD:
01524 case ANALOG_SIG_SF_FEATDMF:
01525 case ANALOG_SIG_SF_FEATB:
01526 case ANALOG_SIG_FXOLS:
01527 case ANALOG_SIG_FXOGS:
01528 case ANALOG_SIG_FXOKS:
01529
01530 ast_debug(1, "Took %s off hook\n", ast->name);
01531 if (p->hanguponpolarityswitch) {
01532 gettimeofday(&p->polaritydelaytv, NULL);
01533 }
01534 res = analog_off_hook(p);
01535 analog_play_tone(p, idx, -1);
01536 analog_set_dialing(p, 0);
01537 if ((idx == ANALOG_SUB_REAL) && p->subs[ANALOG_SUB_THREEWAY].inthreeway) {
01538 if (oldstate == AST_STATE_RINGING) {
01539 ast_debug(1, "Finally swapping real and threeway\n");
01540 analog_play_tone(p, ANALOG_SUB_THREEWAY, -1);
01541 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
01542 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
01543 }
01544 }
01545
01546 switch (p->sig) {
01547 case ANALOG_SIG_FXSLS:
01548 case ANALOG_SIG_FXSKS:
01549 case ANALOG_SIG_FXSGS:
01550 analog_set_echocanceller(p, 1);
01551 analog_train_echocanceller(p);
01552 break;
01553 case ANALOG_SIG_FXOLS:
01554 case ANALOG_SIG_FXOKS:
01555 case ANALOG_SIG_FXOGS:
01556 analog_answer_polarityswitch(p);
01557 break;
01558 default:
01559 break;
01560 }
01561 break;
01562 default:
01563 ast_log(LOG_WARNING, "Don't know how to answer signalling %d (channel %d)\n", p->sig, p->channel);
01564 res = -1;
01565 break;
01566 }
01567 ast_setstate(ast, AST_STATE_UP);
01568 return res;
01569 }
01570
01571 static int analog_handles_digit(struct ast_frame *f)
01572 {
01573 char subclass = toupper(f->subclass.integer);
01574
01575 switch (subclass) {
01576 case '1':
01577 case '2':
01578 case '3':
01579 case '4':
01580 case '5':
01581 case '6':
01582 case '7':
01583 case '9':
01584 case 'A':
01585 case 'B':
01586 case 'C':
01587 case 'D':
01588 case 'E':
01589 case 'F':
01590 return 1;
01591 default:
01592 return 0;
01593 }
01594 }
01595
01596 void analog_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub idx, struct ast_frame **dest)
01597 {
01598 struct ast_frame *f = *dest;
01599
01600 ast_debug(1, "%s DTMF digit: 0x%02X '%c' on %s\n",
01601 f->frametype == AST_FRAME_DTMF_BEGIN ? "Begin" : "End",
01602 f->subclass.integer, f->subclass.integer, ast->name);
01603
01604 if (analog_check_confirmanswer(p)) {
01605 if (f->frametype == AST_FRAME_DTMF_END) {
01606 ast_debug(1, "Confirm answer on %s!\n", ast->name);
01607
01608
01609 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
01610 p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
01611
01612 analog_set_confirmanswer(p, 0);
01613 } else {
01614 p->subs[idx].f.frametype = AST_FRAME_NULL;
01615 p->subs[idx].f.subclass.integer = 0;
01616 }
01617 *dest = &p->subs[idx].f;
01618 } else if (p->callwaitcas) {
01619 if (f->frametype == AST_FRAME_DTMF_END) {
01620 if ((f->subclass.integer == 'A') || (f->subclass.integer == 'D')) {
01621 ast_debug(1, "Got some DTMF, but it's for the CAS\n");
01622 p->caller.id.name.str = p->callwait_name;
01623 p->caller.id.number.str = p->callwait_num;
01624 analog_send_callerid(p, 1, &p->caller);
01625 }
01626 if (analog_handles_digit(f)) {
01627 p->callwaitcas = 0;
01628 }
01629 }
01630 p->subs[idx].f.frametype = AST_FRAME_NULL;
01631 p->subs[idx].f.subclass.integer = 0;
01632 *dest = &p->subs[idx].f;
01633 } else {
01634 analog_cb_handle_dtmf(p, ast, idx, dest);
01635 }
01636 }
01637
01638 static int analog_my_getsigstr(struct ast_channel *chan, char *str, const char *term, int ms)
01639 {
01640 char c;
01641
01642 *str = 0;
01643 for (;;) {
01644
01645 c = ast_waitfordigit(chan, ms);
01646
01647 if (c < 1) {
01648 return c;
01649 }
01650 *str++ = c;
01651 *str = 0;
01652 if (strchr(term, c)) {
01653 return 1;
01654 }
01655 }
01656 }
01657
01658 static int analog_handle_notify_message(struct ast_channel *chan, struct analog_pvt *p, int cid_flags, int neon_mwievent)
01659 {
01660 if (p->calls->handle_notify_message) {
01661 p->calls->handle_notify_message(chan, p->chan_pvt, cid_flags, neon_mwievent);
01662 return 0;
01663 }
01664 return -1;
01665 }
01666
01667 static int analog_increase_ss_count(struct analog_pvt *p)
01668 {
01669 if (p->calls->increase_ss_count) {
01670 p->calls->increase_ss_count();
01671 return 0;
01672 }
01673 return -1;
01674 }
01675
01676 static int analog_decrease_ss_count(struct analog_pvt *p)
01677 {
01678 if (p->calls->decrease_ss_count) {
01679 p->calls->decrease_ss_count();
01680 return 0;
01681 }
01682 return -1;
01683 }
01684
01685 static int analog_distinctive_ring(struct ast_channel *chan, struct analog_pvt *p, int idx, int *ringdata)
01686 {
01687 if (p->calls->distinctive_ring) {
01688 return p->calls->distinctive_ring(chan, p->chan_pvt, idx, ringdata);
01689 }
01690 return -1;
01691
01692 }
01693
01694 static void analog_get_and_handle_alarms(struct analog_pvt *p)
01695 {
01696 if (p->calls->get_and_handle_alarms) {
01697 return p->calls->get_and_handle_alarms(p->chan_pvt);
01698 }
01699 }
01700
01701 static void *analog_get_bridged_channel(struct analog_pvt *p, struct ast_channel *chan)
01702 {
01703 if (p->calls->get_sigpvt_bridged_channel) {
01704 return p->calls->get_sigpvt_bridged_channel(chan);
01705 }
01706 return NULL;
01707 }
01708
01709 static int analog_get_sub_fd(struct analog_pvt *p, enum analog_sub sub)
01710 {
01711 if (p->calls->get_sub_fd) {
01712 return p->calls->get_sub_fd(p->chan_pvt, sub);
01713 }
01714 return -1;
01715 }
01716
01717 #define ANALOG_NEED_MFDETECT(p) (((p)->sig == ANALOG_SIG_FEATDMF) || ((p)->sig == ANALOG_SIG_FEATDMF_TA) || ((p)->sig == ANALOG_SIG_E911) || ((p)->sig == ANALOG_SIG_FGC_CAMA) || ((p)->sig == ANALOG_SIG_FGC_CAMAMF) || ((p)->sig == ANALOG_SIG_FEATB))
01718
01719 static int analog_canmatch_featurecode(const char *exten)
01720 {
01721 int extlen = strlen(exten);
01722 const char *pickup_ext;
01723 if (!extlen) {
01724 return 1;
01725 }
01726 pickup_ext = ast_pickup_ext();
01727 if (extlen < strlen(pickup_ext) && !strncmp(pickup_ext, exten, extlen)) {
01728 return 1;
01729 }
01730
01731 if (exten[0] == '*' && extlen < 3) {
01732 if (extlen == 1) {
01733 return 1;
01734 }
01735
01736 switch (exten[1]) {
01737 case '6':
01738 case '7':
01739 case '8':
01740 return 1;
01741 }
01742 }
01743 return 0;
01744 }
01745
01746 static void *__analog_ss_thread(void *data)
01747 {
01748 struct analog_pvt *p = data;
01749 struct ast_channel *chan = p->ss_astchan;
01750 char exten[AST_MAX_EXTENSION] = "";
01751 char exten2[AST_MAX_EXTENSION] = "";
01752 char dtmfcid[300];
01753 char dtmfbuf[300];
01754 char namebuf[ANALOG_MAX_CID];
01755 char numbuf[ANALOG_MAX_CID];
01756 struct callerid_state *cs = NULL;
01757 char *name = NULL, *number = NULL;
01758 int flags = 0;
01759 struct ast_smdi_md_message *smdi_msg = NULL;
01760 int timeout;
01761 int getforward = 0;
01762 char *s1, *s2;
01763 int len = 0;
01764 int res;
01765 int idx;
01766
01767 analog_increase_ss_count(p);
01768
01769 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
01770
01771 if (!chan) {
01772
01773 goto quit;
01774 }
01775
01776
01777
01778 if (!chan->tech_pvt) {
01779 ast_log(LOG_WARNING, "Channel became a zombie before simple switch could be started (%s)\n", chan->name);
01780 ast_hangup(chan);
01781 goto quit;
01782 }
01783
01784 ast_verb(3, "Starting simple switch on '%s'\n", chan->name);
01785 idx = analog_get_index(chan, p, 0);
01786 if (idx < 0) {
01787 ast_hangup(chan);
01788 goto quit;
01789 }
01790 analog_dsp_reset_and_flush_digits(p);
01791 switch (p->sig) {
01792 case ANALOG_SIG_FEATD:
01793 case ANALOG_SIG_FEATDMF:
01794 case ANALOG_SIG_FEATDMF_TA:
01795 case ANALOG_SIG_E911:
01796 case ANALOG_SIG_FGC_CAMAMF:
01797 case ANALOG_SIG_FEATB:
01798 case ANALOG_SIG_EMWINK:
01799 case ANALOG_SIG_SF_FEATD:
01800 case ANALOG_SIG_SF_FEATDMF:
01801 case ANALOG_SIG_SF_FEATB:
01802 case ANALOG_SIG_SFWINK:
01803 if (analog_wink(p, idx))
01804 goto quit;
01805
01806 case ANALOG_SIG_EM:
01807 case ANALOG_SIG_EM_E1:
01808 case ANALOG_SIG_SF:
01809 case ANALOG_SIG_FGC_CAMA:
01810 res = analog_play_tone(p, idx, -1);
01811
01812 analog_dsp_reset_and_flush_digits(p);
01813
01814
01815 if (ANALOG_NEED_MFDETECT(p)) {
01816 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_MF);
01817 } else {
01818 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_DTMF);
01819 }
01820
01821 memset(dtmfbuf, 0, sizeof(dtmfbuf));
01822
01823 if (!p->immediate) {
01824
01825 res = ast_waitfordigit(chan, 5000);
01826 } else {
01827 res = 0;
01828 }
01829 if (res > 0) {
01830
01831 dtmfbuf[0] = res;
01832 switch (p->sig) {
01833 case ANALOG_SIG_FEATD:
01834 case ANALOG_SIG_SF_FEATD:
01835 res = analog_my_getsigstr(chan, dtmfbuf + 1, "*", 3000);
01836 if (res > 0) {
01837 res = analog_my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), "*", 3000);
01838 }
01839 if (res < 1) {
01840 analog_dsp_reset_and_flush_digits(p);
01841 }
01842 break;
01843 case ANALOG_SIG_FEATDMF_TA:
01844 res = analog_my_getsigstr(chan, dtmfbuf + 1, "#", 3000);
01845 if (res < 1) {
01846 analog_dsp_reset_and_flush_digits(p);
01847 }
01848 if (analog_wink(p, idx)) {
01849 goto quit;
01850 }
01851 dtmfbuf[0] = 0;
01852
01853 res = ast_waitfordigit(chan, 5000);
01854 if (res <= 0) {
01855 break;
01856 }
01857 dtmfbuf[0] = res;
01858
01859 case ANALOG_SIG_FEATDMF:
01860 case ANALOG_SIG_E911:
01861 case ANALOG_SIG_FGC_CAMAMF:
01862 case ANALOG_SIG_SF_FEATDMF:
01863 res = analog_my_getsigstr(chan, dtmfbuf + 1, "#", 3000);
01864
01865 if ((p->sig == ANALOG_SIG_FEATDMF) && (dtmfbuf[1] != '0')
01866 && (strlen(dtmfbuf) != 14)) {
01867 if (analog_wink(p, idx)) {
01868 goto quit;
01869 }
01870 dtmfbuf[0] = 0;
01871
01872 res = ast_waitfordigit(chan, 5000);
01873 if (res <= 0) {
01874 break;
01875 }
01876 dtmfbuf[0] = res;
01877 res = analog_my_getsigstr(chan, dtmfbuf + 1, "#", 3000);
01878 }
01879 if (res > 0) {
01880
01881 if (p->sig == ANALOG_SIG_E911) {
01882 analog_off_hook(p);
01883 }
01884 res = analog_my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), "#", 3000);
01885 }
01886 if (res < 1) {
01887 analog_dsp_reset_and_flush_digits(p);
01888 }
01889 break;
01890 case ANALOG_SIG_FEATB:
01891 case ANALOG_SIG_SF_FEATB:
01892 res = analog_my_getsigstr(chan, dtmfbuf + 1, "#", 3000);
01893 if (res < 1) {
01894 analog_dsp_reset_and_flush_digits(p);
01895 }
01896 break;
01897 case ANALOG_SIG_EMWINK:
01898
01899
01900
01901
01902 if (res == '*') {
01903 res = analog_my_getsigstr(chan, dtmfbuf + 1, "*", 3000);
01904 if (res > 0) {
01905 res = analog_my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), "*", 3000);
01906 }
01907 if (res < 1) {
01908 analog_dsp_reset_and_flush_digits(p);
01909 }
01910 break;
01911 }
01912 default:
01913
01914 len = 1;
01915 dtmfbuf[len] = '\0';
01916 while ((len < AST_MAX_EXTENSION-1) && ast_matchmore_extension(chan, chan->context, dtmfbuf, 1, p->cid_num)) {
01917 if (ast_exists_extension(chan, chan->context, dtmfbuf, 1, p->cid_num)) {
01918 timeout = analog_matchdigittimeout;
01919 } else {
01920 timeout = analog_gendigittimeout;
01921 }
01922 res = ast_waitfordigit(chan, timeout);
01923 if (res < 0) {
01924 ast_debug(1, "waitfordigit returned < 0...\n");
01925 ast_hangup(chan);
01926 goto quit;
01927 } else if (res) {
01928 dtmfbuf[len++] = res;
01929 dtmfbuf[len] = '\0';
01930 } else {
01931 break;
01932 }
01933 }
01934 break;
01935 }
01936 }
01937 if (res == -1) {
01938 ast_log(LOG_WARNING, "getdtmf on channel %d: %s\n", p->channel, strerror(errno));
01939 ast_hangup(chan);
01940 goto quit;
01941 } else if (res < 0) {
01942 ast_debug(1, "Got hung up before digits finished\n");
01943 ast_hangup(chan);
01944 goto quit;
01945 }
01946
01947 if (p->sig == ANALOG_SIG_FGC_CAMA) {
01948 char anibuf[100];
01949
01950 if (ast_safe_sleep(chan,1000) == -1) {
01951 ast_hangup(chan);
01952 goto quit;
01953 }
01954 analog_off_hook(p);
01955 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_MF);
01956 res = analog_my_getsigstr(chan, anibuf, "#", 10000);
01957 if ((res > 0) && (strlen(anibuf) > 2)) {
01958 if (anibuf[strlen(anibuf) - 1] == '#') {
01959 anibuf[strlen(anibuf) - 1] = 0;
01960 }
01961 ast_set_callerid(chan, anibuf + 2, NULL, anibuf + 2);
01962 }
01963 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_DTMF);
01964 }
01965
01966 ast_copy_string(exten, dtmfbuf, sizeof(exten));
01967 if (ast_strlen_zero(exten)) {
01968 ast_copy_string(exten, "s", sizeof(exten));
01969 }
01970 if (p->sig == ANALOG_SIG_FEATD || p->sig == ANALOG_SIG_EMWINK) {
01971
01972 if (exten[0] == '*') {
01973 char *stringp=NULL;
01974 ast_copy_string(exten2, exten, sizeof(exten2));
01975
01976 stringp=exten2 +1;
01977 s1 = strsep(&stringp, "*");
01978 s2 = strsep(&stringp, "*");
01979 if (s2) {
01980 if (!ast_strlen_zero(p->cid_num)) {
01981 ast_set_callerid(chan, p->cid_num, NULL, p->cid_num);
01982 } else {
01983 ast_set_callerid(chan, s1, NULL, s1);
01984 }
01985 ast_copy_string(exten, s2, sizeof(exten));
01986 } else {
01987 ast_copy_string(exten, s1, sizeof(exten));
01988 }
01989 } else if (p->sig == ANALOG_SIG_FEATD) {
01990 ast_log(LOG_WARNING, "Got a non-Feature Group D input on channel %d. Assuming E&M Wink instead\n", p->channel);
01991 }
01992 }
01993 if ((p->sig == ANALOG_SIG_FEATDMF) || (p->sig == ANALOG_SIG_FEATDMF_TA)) {
01994 if (exten[0] == '*') {
01995 char *stringp=NULL;
01996 ast_copy_string(exten2, exten, sizeof(exten2));
01997
01998 stringp=exten2 +1;
01999 s1 = strsep(&stringp, "#");
02000 s2 = strsep(&stringp, "#");
02001 if (s2) {
02002 if (!ast_strlen_zero(p->cid_num)) {
02003 ast_set_callerid(chan, p->cid_num, NULL, p->cid_num);
02004 } else {
02005 if (*(s1 + 2)) {
02006 ast_set_callerid(chan, s1 + 2, NULL, s1 + 2);
02007 }
02008 }
02009 ast_copy_string(exten, s2 + 1, sizeof(exten));
02010 } else {
02011 ast_copy_string(exten, s1 + 2, sizeof(exten));
02012 }
02013 } else {
02014 ast_log(LOG_WARNING, "Got a non-Feature Group D input on channel %d. Assuming E&M Wink instead\n", p->channel);
02015 }
02016 }
02017 if ((p->sig == ANALOG_SIG_E911) || (p->sig == ANALOG_SIG_FGC_CAMAMF)) {
02018 if (exten[0] == '*') {
02019 char *stringp=NULL;
02020 ast_copy_string(exten2, exten, sizeof(exten2));
02021
02022 stringp=exten2 +1;
02023 s1 = strsep(&stringp, "#");
02024 s2 = strsep(&stringp, "#");
02025 if (s2 && (*(s2 + 1) == '0')) {
02026 if (*(s2 + 2)) {
02027 ast_set_callerid(chan, s2 + 2, NULL, s2 + 2);
02028 }
02029 }
02030 if (s1) {
02031 ast_copy_string(exten, s1, sizeof(exten));
02032 } else {
02033 ast_copy_string(exten, "911", sizeof(exten));
02034 }
02035 } else {
02036 ast_log(LOG_WARNING, "Got a non-E911/FGC CAMA input on channel %d. Assuming E&M Wink instead\n", p->channel);
02037 }
02038 }
02039 if (p->sig == ANALOG_SIG_FEATB) {
02040 if (exten[0] == '*') {
02041 char *stringp=NULL;
02042 ast_copy_string(exten2, exten, sizeof(exten2));
02043
02044 stringp=exten2 +1;
02045 s1 = strsep(&stringp, "#");
02046 ast_copy_string(exten, exten2 + 1, sizeof(exten));
02047 } else {
02048 ast_log(LOG_WARNING, "Got a non-Feature Group B input on channel %d. Assuming E&M Wink instead\n", p->channel);
02049 }
02050 }
02051 if ((p->sig == ANALOG_SIG_FEATDMF) || (p->sig == ANALOG_SIG_FEATDMF_TA)) {
02052 analog_wink(p, idx);
02053
02054
02055
02056
02057
02058 if (ast_safe_sleep(chan, 100)) {
02059 ast_hangup(chan);
02060 goto quit;
02061 }
02062 }
02063 analog_set_echocanceller(p, 1);
02064
02065 analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_DTMF);
02066
02067 if (ast_exists_extension(chan, chan->context, exten, 1,
02068 chan->caller.id.number.valid ? chan->caller.id.number.str : NULL)) {
02069 ast_copy_string(chan->exten, exten, sizeof(chan->exten));
02070 analog_dsp_reset_and_flush_digits(p);
02071 res = ast_pbx_run(chan);
02072 if (res) {
02073 ast_log(LOG_WARNING, "PBX exited non-zero\n");
02074 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02075 }
02076 goto quit;
02077 } else {
02078 ast_verb(3, "Unknown extension '%s' in context '%s' requested\n", exten, chan->context);
02079 sleep(2);
02080 res = analog_play_tone(p, idx, ANALOG_TONE_INFO);
02081 if (res < 0) {
02082 ast_log(LOG_WARNING, "Unable to start special tone on %d\n", p->channel);
02083 } else {
02084 sleep(1);
02085 }
02086 res = ast_streamfile(chan, "ss-noservice", chan->language);
02087 if (res >= 0) {
02088 ast_waitstream(chan, "");
02089 }
02090 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02091 ast_hangup(chan);
02092 goto quit;
02093 }
02094 break;
02095 case ANALOG_SIG_FXOLS:
02096 case ANALOG_SIG_FXOGS:
02097 case ANALOG_SIG_FXOKS:
02098
02099 timeout = analog_firstdigittimeout;
02100
02101
02102 if (p->subs[ANALOG_SUB_THREEWAY].owner) {
02103 timeout = 999999;
02104 }
02105 while (len < AST_MAX_EXTENSION-1) {
02106
02107
02108 if (p->immediate) {
02109 res = 's';
02110 } else {
02111 res = ast_waitfordigit(chan, timeout);
02112 }
02113 timeout = 0;
02114 if (res < 0) {
02115 ast_debug(1, "waitfordigit returned < 0...\n");
02116 res = analog_play_tone(p, idx, -1);
02117 ast_hangup(chan);
02118 goto quit;
02119 } else if (res) {
02120 ast_debug(1,"waitfordigit returned '%c' (%d), timeout = %d\n", res, res, timeout);
02121 exten[len++]=res;
02122 exten[len] = '\0';
02123 }
02124 if (!ast_ignore_pattern(chan->context, exten)) {
02125 analog_play_tone(p, idx, -1);
02126 } else {
02127 analog_play_tone(p, idx, ANALOG_TONE_DIALTONE);
02128 }
02129 if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num) && !ast_parking_ext_valid(exten, chan, chan->context)) {
02130 if (!res || !ast_matchmore_extension(chan, chan->context, exten, 1, p->cid_num)) {
02131 if (getforward) {
02132
02133 ast_copy_string(p->call_forward, exten, sizeof(p->call_forward));
02134 ast_verb(3, "Setting call forward to '%s' on channel %d\n", p->call_forward, p->channel);
02135 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02136 if (res) {
02137 break;
02138 }
02139 usleep(500000);
02140 res = analog_play_tone(p, idx, -1);
02141 sleep(1);
02142 memset(exten, 0, sizeof(exten));
02143 res = analog_play_tone(p, idx, ANALOG_TONE_DIALTONE);
02144 len = 0;
02145 getforward = 0;
02146 } else {
02147 res = analog_play_tone(p, idx, -1);
02148 ast_copy_string(chan->exten, exten, sizeof(chan->exten));
02149 if (!ast_strlen_zero(p->cid_num)) {
02150 if (!p->hidecallerid) {
02151 ast_set_callerid(chan, p->cid_num, NULL, p->cid_num);
02152 } else {
02153 ast_set_callerid(chan, NULL, NULL, p->cid_num);
02154 }
02155 }
02156 if (!ast_strlen_zero(p->cid_name)) {
02157 if (!p->hidecallerid) {
02158 ast_set_callerid(chan, NULL, p->cid_name, NULL);
02159 }
02160 }
02161 ast_setstate(chan, AST_STATE_RING);
02162 analog_set_echocanceller(p, 1);
02163 res = ast_pbx_run(chan);
02164 if (res) {
02165 ast_log(LOG_WARNING, "PBX exited non-zero\n");
02166 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02167 }
02168 goto quit;
02169 }
02170 } else {
02171
02172
02173 timeout = analog_matchdigittimeout;
02174 }
02175 } else if (res == 0) {
02176 ast_debug(1, "not enough digits (and no ambiguous match)...\n");
02177 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02178 analog_wait_event(p);
02179 ast_hangup(chan);
02180 goto quit;
02181 } else if (p->callwaiting && !strcmp(exten, "*70")) {
02182 ast_verb(3, "Disabling call waiting on %s\n", chan->name);
02183
02184 analog_set_callwaiting(p, 0);
02185 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02186 if (res) {
02187 ast_log(LOG_WARNING, "Unable to do dial recall on channel %s: %s\n",
02188 chan->name, strerror(errno));
02189 }
02190 len = 0;
02191 memset(exten, 0, sizeof(exten));
02192 timeout = analog_firstdigittimeout;
02193
02194 } else if (!strcmp(exten,ast_pickup_ext())) {
02195
02196
02197
02198
02199 if (idx == ANALOG_SUB_REAL) {
02200
02201 if (p->subs[ANALOG_SUB_THREEWAY].owner) {
02202
02203
02204 analog_alloc_sub(p, ANALOG_SUB_CALLWAIT);
02205 analog_swap_subs(p, ANALOG_SUB_CALLWAIT, ANALOG_SUB_THREEWAY);
02206 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
02207 }
02208 analog_set_echocanceller(p, 1);
02209 if (ast_pickup_call(chan)) {
02210 ast_debug(1, "No call pickup possible...\n");
02211 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02212 analog_wait_event(p);
02213 }
02214 ast_hangup(chan);
02215 goto quit;
02216 } else {
02217 ast_log(LOG_WARNING, "Huh? Got *8# on call not on real\n");
02218 ast_hangup(chan);
02219 goto quit;
02220 }
02221
02222 } else if (!p->hidecallerid && !strcmp(exten, "*67")) {
02223 ast_verb(3, "Disabling Caller*ID on %s\n", chan->name);
02224
02225 p->hidecallerid = 1;
02226 ast_party_number_free(&chan->caller.id.number);
02227 ast_party_number_init(&chan->caller.id.number);
02228 ast_party_name_free(&chan->caller.id.name);
02229 ast_party_name_init(&chan->caller.id.name);
02230 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02231 if (res) {
02232 ast_log(LOG_WARNING, "Unable to do dial recall on channel %s: %s\n",
02233 chan->name, strerror(errno));
02234 }
02235 len = 0;
02236 memset(exten, 0, sizeof(exten));
02237 timeout = analog_firstdigittimeout;
02238 } else if (p->callreturn && !strcmp(exten, "*69")) {
02239 res = 0;
02240 if (!ast_strlen_zero(p->lastcid_num)) {
02241 res = ast_say_digit_str(chan, p->lastcid_num, "", chan->language);
02242 }
02243 if (!res) {
02244 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02245 }
02246 break;
02247 } else if (!strcmp(exten, "*78")) {
02248
02249 analog_dnd(p, 1);
02250 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02251 getforward = 0;
02252 memset(exten, 0, sizeof(exten));
02253 len = 0;
02254 } else if (!strcmp(exten, "*79")) {
02255
02256 analog_dnd(p, 0);
02257 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02258 getforward = 0;
02259 memset(exten, 0, sizeof(exten));
02260 len = 0;
02261 } else if (p->cancallforward && !strcmp(exten, "*72")) {
02262 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02263 getforward = 1;
02264 memset(exten, 0, sizeof(exten));
02265 len = 0;
02266 } else if (p->cancallforward && !strcmp(exten, "*73")) {
02267 ast_verb(3, "Cancelling call forwarding on channel %d\n", p->channel);
02268 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02269 memset(p->call_forward, 0, sizeof(p->call_forward));
02270 getforward = 0;
02271 memset(exten, 0, sizeof(exten));
02272 len = 0;
02273 } else if ((p->transfer || p->canpark) && ast_parking_ext_valid(exten, chan, chan->context) &&
02274 p->subs[ANALOG_SUB_THREEWAY].owner &&
02275 ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner)) {
02276
02277
02278 ast_masq_park_call_exten(
02279 ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner), chan, exten,
02280 chan->context, 0, NULL);
02281 ast_verb(3, "Parking call to '%s'\n", chan->name);
02282 break;
02283 } else if (!ast_strlen_zero(p->lastcid_num) && !strcmp(exten, "*60")) {
02284 ast_verb(3, "Blacklisting number %s\n", p->lastcid_num);
02285 res = ast_db_put("blacklist", p->lastcid_num, "1");
02286 if (!res) {
02287 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02288 memset(exten, 0, sizeof(exten));
02289 len = 0;
02290 }
02291 } else if (p->hidecallerid && !strcmp(exten, "*82")) {
02292 ast_verb(3, "Enabling Caller*ID on %s\n", chan->name);
02293
02294 p->hidecallerid = 0;
02295 ast_set_callerid(chan, p->cid_num, p->cid_name, NULL);
02296 res = analog_play_tone(p, idx, ANALOG_TONE_DIALRECALL);
02297 if (res) {
02298 ast_log(LOG_WARNING, "Unable to do dial recall on channel %s: %s\n",
02299 chan->name, strerror(errno));
02300 }
02301 len = 0;
02302 memset(exten, 0, sizeof(exten));
02303 timeout = analog_firstdigittimeout;
02304 } else if (!strcmp(exten, "*0")) {
02305 struct ast_channel *nbridge = p->subs[ANALOG_SUB_THREEWAY].owner;
02306 struct analog_pvt *pbridge = NULL;
02307
02308 if (nbridge) {
02309 pbridge = analog_get_bridged_channel(p, nbridge);
02310 }
02311 if (pbridge && ISTRUNK(pbridge)) {
02312
02313 p->dop.dialstr[0] = '\0';
02314
02315 if ((analog_flash(pbridge) == -1) && (errno != EINPROGRESS)) {
02316 ast_log(LOG_WARNING,
02317 "Unable to flash-hook bridged trunk from channel %s: %s\n",
02318 nbridge->name, strerror(errno));
02319 }
02320 analog_swap_subs(p, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY);
02321 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
02322 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
02323 if (ast_bridged_channel(p->subs[ANALOG_SUB_REAL].owner)) {
02324 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_UNHOLD);
02325 }
02326 ast_hangup(chan);
02327 goto quit;
02328 } else {
02329 analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02330 analog_wait_event(p);
02331 analog_play_tone(p, idx, -1);
02332 analog_swap_subs(p, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY);
02333 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
02334 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
02335 ast_hangup(chan);
02336 goto quit;
02337 }
02338 } else if (!ast_canmatch_extension(chan, chan->context, exten, 1,
02339 chan->caller.id.number.valid ? chan->caller.id.number.str : NULL)
02340 && !analog_canmatch_featurecode(exten)) {
02341 ast_debug(1, "Can't match %s from '%s' in context %s\n", exten,
02342 chan->caller.id.number.valid && chan->caller.id.number.str
02343 ? chan->caller.id.number.str : "<Unknown Caller>",
02344 chan->context);
02345 break;
02346 }
02347 if (!timeout) {
02348 timeout = analog_gendigittimeout;
02349 }
02350 if (len && !ast_ignore_pattern(chan->context, exten)) {
02351 analog_play_tone(p, idx, -1);
02352 }
02353 }
02354 break;
02355 case ANALOG_SIG_FXSLS:
02356 case ANALOG_SIG_FXSGS:
02357 case ANALOG_SIG_FXSKS:
02358
02359 if (p->use_smdi && p->smdi_iface) {
02360 smdi_msg = ast_smdi_md_message_wait(p->smdi_iface, ANALOG_SMDI_MD_WAIT_TIMEOUT);
02361 if (smdi_msg != NULL) {
02362 ast_copy_string(chan->exten, smdi_msg->fwd_st, sizeof(chan->exten));
02363
02364 if (smdi_msg->type == 'B')
02365 pbx_builtin_setvar_helper(chan, "_SMDI_VM_TYPE", "b");
02366 else if (smdi_msg->type == 'N')
02367 pbx_builtin_setvar_helper(chan, "_SMDI_VM_TYPE", "u");
02368
02369 ast_debug(1, "Received SMDI message on %s\n", chan->name);
02370 } else {
02371 ast_log(LOG_WARNING, "SMDI enabled but no SMDI message present\n");
02372 }
02373 }
02374
02375 if (p->use_callerid && (p->cid_signalling == CID_SIG_SMDI && smdi_msg)) {
02376 number = smdi_msg->calling_st;
02377
02378
02379
02380
02381 } else if (p->use_callerid && (chan->_state == AST_STATE_PRERING
02382 && (p->cid_start == ANALOG_CID_START_POLARITY
02383 || p->cid_start == ANALOG_CID_START_POLARITY_IN
02384 || p->cid_start == ANALOG_CID_START_DTMF_NOALERT))) {
02385
02386 if (p->cid_signalling == CID_SIG_DTMF) {
02387 int k = 0;
02388 int oldlinearity;
02389 cs = NULL;
02390 ast_debug(1, "Receiving DTMF cid on channel %s\n", chan->name);
02391
02392 oldlinearity = analog_set_linear_mode(p, idx, 0);
02393
02394
02395
02396
02397
02398
02399
02400 ast_set_flag(chan, AST_FLAG_END_DTMF_ONLY);
02401 res = 4000;
02402 for (;;) {
02403 struct ast_frame *f;
02404 res = ast_waitfor(chan, res);
02405 if (res <= 0) {
02406
02407
02408
02409
02410
02411 ast_log(LOG_WARNING, "DTMFCID timed out waiting for ring. "
02412 "Exiting simple switch\n");
02413 ast_hangup(chan);
02414 goto quit;
02415 }
02416 f = ast_read(chan);
02417 if (!f) {
02418 break;
02419 }
02420 if (f->frametype == AST_FRAME_DTMF) {
02421 if (k < ARRAY_LEN(dtmfbuf) - 1) {
02422 dtmfbuf[k++] = f->subclass.integer;
02423 }
02424 ast_debug(1, "CID got digit '%c'\n", f->subclass.integer);
02425 res = 4000;
02426 }
02427 ast_frfree(f);
02428 if (chan->_state == AST_STATE_RING ||
02429 chan->_state == AST_STATE_RINGING) {
02430 break;
02431 }
02432 }
02433 ast_clear_flag(chan, AST_FLAG_END_DTMF_ONLY);
02434 dtmfbuf[k] = '\0';
02435
02436 analog_set_linear_mode(p, idx, oldlinearity);
02437
02438
02439 ast_debug(1, "CID got string '%s'\n", dtmfbuf);
02440 callerid_get_dtmf(dtmfbuf, dtmfcid, &flags);
02441 ast_debug(1, "CID is '%s', flags %d\n", dtmfcid, flags);
02442
02443 if (!ast_strlen_zero(dtmfcid)) {
02444 number = dtmfcid;
02445 } else {
02446 number = NULL;
02447 }
02448
02449
02450 } else if ((p->cid_signalling == CID_SIG_V23) || (p->cid_signalling == CID_SIG_V23_JP)) {
02451 int timeout = 10000;
02452 struct timeval start = ast_tvnow();
02453 enum analog_event ev;
02454
02455 namebuf[0] = 0;
02456 numbuf[0] = 0;
02457
02458 if (!analog_start_cid_detect(p, p->cid_signalling)) {
02459 while (1) {
02460 res = analog_get_callerid(p, namebuf, numbuf, &ev, timeout - ast_tvdiff_ms(ast_tvnow(), start));
02461
02462 if (res == 0) {
02463 break;
02464 }
02465
02466 if (res == 1) {
02467 if (ev == ANALOG_EVENT_NOALARM) {
02468 analog_set_alarm(p, 0);
02469 }
02470 if (p->cid_signalling == CID_SIG_V23_JP) {
02471 if (ev == ANALOG_EVENT_RINGBEGIN) {
02472 analog_off_hook(p);
02473 usleep(1);
02474 }
02475 } else {
02476 ev = ANALOG_EVENT_NONE;
02477 break;
02478 }
02479 }
02480
02481 if (ast_tvdiff_ms(ast_tvnow(), start) > timeout)
02482 break;
02483
02484 }
02485 name = namebuf;
02486 number = numbuf;
02487
02488 analog_stop_cid_detect(p);
02489
02490 if (p->cid_signalling == CID_SIG_V23_JP) {
02491 res = analog_on_hook(p);
02492 usleep(1);
02493 }
02494
02495
02496 res = 4000;
02497 for (;;) {
02498 struct ast_frame *f;
02499 res = ast_waitfor(chan, res);
02500 if (res <= 0) {
02501 ast_log(LOG_WARNING, "CID timed out waiting for ring. "
02502 "Exiting simple switch\n");
02503 ast_hangup(chan);
02504 goto quit;
02505 }
02506 if (!(f = ast_read(chan))) {
02507 ast_log(LOG_WARNING, "Hangup received waiting for ring. Exiting simple switch\n");
02508 ast_hangup(chan);
02509 goto quit;
02510 }
02511 ast_frfree(f);
02512 if (chan->_state == AST_STATE_RING ||
02513 chan->_state == AST_STATE_RINGING)
02514 break;
02515 }
02516
02517 if (analog_distinctive_ring(chan, p, idx, NULL)) {
02518 goto quit;
02519 }
02520
02521 if (res < 0) {
02522 ast_log(LOG_WARNING, "CallerID returned with error on channel '%s'\n", chan->name);
02523 }
02524 } else {
02525 ast_log(LOG_WARNING, "Unable to get caller ID space\n");
02526 }
02527 } else {
02528 ast_log(LOG_WARNING, "Channel %s in prering "
02529 "state, but I have nothing to do. "
02530 "Terminating simple switch, should be "
02531 "restarted by the actual ring.\n",
02532 chan->name);
02533 ast_hangup(chan);
02534 goto quit;
02535 }
02536 } else if (p->use_callerid && p->cid_start == ANALOG_CID_START_RING) {
02537 int timeout = 10000;
02538 struct timeval start = ast_tvnow();
02539 enum analog_event ev;
02540 int curRingData[RING_PATTERNS] = { 0 };
02541 int receivedRingT = 0;
02542
02543 namebuf[0] = 0;
02544 numbuf[0] = 0;
02545
02546 if (!analog_start_cid_detect(p, p->cid_signalling)) {
02547 while (1) {
02548 res = analog_get_callerid(p, namebuf, numbuf, &ev, timeout - ast_tvdiff_ms(ast_tvnow(), start));
02549
02550 if (res == 0) {
02551 break;
02552 }
02553
02554 if (res == 1 || res == 2) {
02555 if (ev == ANALOG_EVENT_NOALARM) {
02556 analog_set_alarm(p, 0);
02557 } else if (ev == ANALOG_EVENT_POLARITY && p->hanguponpolarityswitch && p->polarity == POLARITY_REV) {
02558 ast_debug(1, "Hanging up due to polarity reversal on channel %d while detecting callerid\n", p->channel);
02559 p->polarity = POLARITY_IDLE;
02560 ast_hangup(chan);
02561 goto quit;
02562 } else if (ev != ANALOG_EVENT_NONE && ev != ANALOG_EVENT_RINGBEGIN && ev != ANALOG_EVENT_RINGOFFHOOK) {
02563 break;
02564 }
02565 if (res != 2) {
02566
02567 curRingData[receivedRingT] = p->ringt;
02568
02569 if (p->ringt < p->ringt_base/2) {
02570 break;
02571 }
02572
02573
02574 if (++receivedRingT == RING_PATTERNS) {
02575 break;
02576 }
02577 }
02578 }
02579
02580 if (ast_tvdiff_ms(ast_tvnow(), start) > timeout) {
02581 break;
02582 }
02583
02584 }
02585 name = namebuf;
02586 number = numbuf;
02587
02588 analog_stop_cid_detect(p);
02589
02590 if (analog_distinctive_ring(chan, p, idx, curRingData)) {
02591 goto quit;
02592 }
02593
02594 if (res < 0) {
02595 ast_log(LOG_WARNING, "CallerID returned with error on channel '%s'\n", chan->name);
02596 }
02597 } else {
02598 ast_log(LOG_WARNING, "Unable to get caller ID space\n");
02599 }
02600 } else {
02601 cs = NULL;
02602 }
02603
02604 if (number) {
02605 ast_shrink_phone_number(number);
02606 }
02607 ast_set_callerid(chan, number, name, number);
02608
02609 if (cs) {
02610 callerid_free(cs);
02611 }
02612
02613 analog_handle_notify_message(chan, p, flags, -1);
02614
02615 ast_setstate(chan, AST_STATE_RING);
02616 chan->rings = 1;
02617 analog_set_ringtimeout(p, p->ringt_base);
02618 res = ast_pbx_run(chan);
02619 if (res) {
02620 ast_hangup(chan);
02621 ast_log(LOG_WARNING, "PBX exited non-zero\n");
02622 }
02623 goto quit;
02624 default:
02625 ast_log(LOG_WARNING, "Don't know how to handle simple switch with signalling %s on channel %d\n", analog_sigtype_to_str(p->sig), p->channel);
02626 break;
02627 }
02628 res = analog_play_tone(p, idx, ANALOG_TONE_CONGESTION);
02629 if (res < 0) {
02630 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", p->channel);
02631 }
02632 ast_hangup(chan);
02633 quit:
02634 if (smdi_msg) {
02635 ASTOBJ_UNREF(smdi_msg, ast_smdi_md_message_destroy);
02636 }
02637 analog_decrease_ss_count(p);
02638 return NULL;
02639 }
02640
02641 int analog_ss_thread_start(struct analog_pvt *p, struct ast_channel *chan)
02642 {
02643 pthread_t threadid;
02644
02645 return ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, p);
02646 }
02647
02648 static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_channel *ast)
02649 {
02650 int res, x;
02651 int mysig;
02652 enum analog_sub idx;
02653 char *c;
02654 pthread_t threadid;
02655 struct ast_channel *chan;
02656 struct ast_frame *f;
02657
02658 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
02659
02660 idx = analog_get_index(ast, p, 0);
02661 if (idx < 0) {
02662 return &ast_null_frame;
02663 }
02664 if (idx != ANALOG_SUB_REAL) {
02665 ast_log(LOG_ERROR, "We got an event on a non real sub. Fix it!\n");
02666 }
02667
02668 mysig = p->sig;
02669 if (p->outsigmod > -1) {
02670 mysig = p->outsigmod;
02671 }
02672
02673 p->subs[idx].f.frametype = AST_FRAME_NULL;
02674 p->subs[idx].f.subclass.integer = 0;
02675 p->subs[idx].f.datalen = 0;
02676 p->subs[idx].f.samples = 0;
02677 p->subs[idx].f.mallocd = 0;
02678 p->subs[idx].f.offset = 0;
02679 p->subs[idx].f.src = "dahdi_handle_event";
02680 p->subs[idx].f.data.ptr = NULL;
02681 f = &p->subs[idx].f;
02682
02683 res = analog_get_event(p);
02684
02685 ast_debug(1, "Got event %s(%d) on channel %d (index %d)\n", analog_event2str(res), res, p->channel, idx);
02686
02687 if (res & (ANALOG_EVENT_PULSEDIGIT | ANALOG_EVENT_DTMFUP)) {
02688 analog_set_pulsedial(p, (res & ANALOG_EVENT_PULSEDIGIT) ? 1 : 0);
02689 ast_debug(1, "Detected %sdigit '%c'\n", (res & ANALOG_EVENT_PULSEDIGIT) ? "pulse ": "", res & 0xff);
02690 analog_confmute(p, 0);
02691 p->subs[idx].f.frametype = AST_FRAME_DTMF_END;
02692 p->subs[idx].f.subclass.integer = res & 0xff;
02693 analog_handle_dtmf(p, ast, idx, &f);
02694 return f;
02695 }
02696
02697 if (res & ANALOG_EVENT_DTMFDOWN) {
02698 ast_debug(1, "DTMF Down '%c'\n", res & 0xff);
02699
02700 analog_confmute(p, 1);
02701 p->subs[idx].f.frametype = AST_FRAME_DTMF_BEGIN;
02702 p->subs[idx].f.subclass.integer = res & 0xff;
02703 analog_handle_dtmf(p, ast, idx, &f);
02704 return f;
02705 }
02706
02707 switch (res) {
02708 case ANALOG_EVENT_EC_DISABLED:
02709 ast_verb(3, "Channel %d echo canceler disabled due to CED detection\n", p->channel);
02710 analog_set_echocanceller(p, 0);
02711 break;
02712 #ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
02713 case ANALOG_EVENT_TX_CED_DETECTED:
02714 ast_verb(3, "Channel %d detected a CED tone towards the network.\n", p->channel);
02715 break;
02716 case ANALOG_EVENT_RX_CED_DETECTED:
02717 ast_verb(3, "Channel %d detected a CED tone from the network.\n", p->channel);
02718 break;
02719 case ANALOG_EVENT_EC_NLP_DISABLED:
02720 ast_verb(3, "Channel %d echo canceler disabled its NLP.\n", p->channel);
02721 break;
02722 case ANALOG_EVENT_EC_NLP_ENABLED:
02723 ast_verb(3, "Channel %d echo canceler enabled its NLP.\n", p->channel);
02724 break;
02725 #endif
02726 case ANALOG_EVENT_PULSE_START:
02727
02728 if (!ast->pbx)
02729 analog_play_tone(p, ANALOG_SUB_REAL, -1);
02730 break;
02731 case ANALOG_EVENT_DIALCOMPLETE:
02732 if (p->inalarm) {
02733 break;
02734 }
02735 x = analog_is_dialing(p, idx);
02736 if (!x) {
02737 analog_set_echocanceller(p, 1);
02738 if (p->echobreak) {
02739 analog_train_echocanceller(p);
02740 ast_copy_string(p->dop.dialstr, p->echorest, sizeof(p->dop.dialstr));
02741 p->dop.op = ANALOG_DIAL_OP_REPLACE;
02742 if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
02743 int dial_err = errno;
02744 ast_log(LOG_WARNING, "Dialing failed on channel %d: %s\n", p->channel, strerror(dial_err));
02745 }
02746 p->echobreak = 0;
02747 } else {
02748 analog_set_dialing(p, 0);
02749 if ((mysig == ANALOG_SIG_E911) || (mysig == ANALOG_SIG_FGC_CAMA) || (mysig == ANALOG_SIG_FGC_CAMAMF)) {
02750
02751 if (ast->_state == AST_STATE_DIALING_OFFHOOK) {
02752 ast_setstate(ast, AST_STATE_UP);
02753 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
02754 p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
02755 break;
02756 } else {
02757
02758 ast_setstate(ast,AST_STATE_DIALING_OFFHOOK);
02759 }
02760 }
02761 if (ast->_state == AST_STATE_DIALING) {
02762 if (analog_have_progressdetect(p)) {
02763 ast_debug(1, "Done dialing, but waiting for progress detection before doing more...\n");
02764 } else if (analog_check_confirmanswer(p) || (!p->dialednone
02765 && ((mysig == ANALOG_SIG_EM) || (mysig == ANALOG_SIG_EM_E1)
02766 || (mysig == ANALOG_SIG_EMWINK) || (mysig == ANALOG_SIG_FEATD)
02767 || (mysig == ANALOG_SIG_FEATDMF_TA) || (mysig == ANALOG_SIG_FEATDMF)
02768 || (mysig == ANALOG_SIG_E911) || (mysig == ANALOG_SIG_FGC_CAMA)
02769 || (mysig == ANALOG_SIG_FGC_CAMAMF) || (mysig == ANALOG_SIG_FEATB)
02770 || (mysig == ANALOG_SIG_SF) || (mysig == ANALOG_SIG_SFWINK)
02771 || (mysig == ANALOG_SIG_SF_FEATD) || (mysig == ANALOG_SIG_SF_FEATDMF)
02772 || (mysig == ANALOG_SIG_SF_FEATB)))) {
02773 ast_setstate(ast, AST_STATE_RINGING);
02774 } else if (!p->answeronpolarityswitch) {
02775 ast_setstate(ast, AST_STATE_UP);
02776 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
02777 p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
02778
02779 p->polarity = POLARITY_REV;
02780 } else {
02781
02782 p->polarity = POLARITY_IDLE;
02783 }
02784 }
02785 }
02786 }
02787 break;
02788 case ANALOG_EVENT_ALARM:
02789 analog_set_alarm(p, 1);
02790 analog_get_and_handle_alarms(p);
02791
02792 case ANALOG_EVENT_ONHOOK:
02793 switch (p->sig) {
02794 case ANALOG_SIG_FXOLS:
02795 case ANALOG_SIG_FXOGS:
02796 case ANALOG_SIG_FXOKS:
02797 analog_start_polarityswitch(p);
02798 p->fxsoffhookstate = 0;
02799 p->onhooktime = time(NULL);
02800 p->msgstate = -1;
02801
02802 if (idx == ANALOG_SUB_REAL) {
02803
02804 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
02805
02806 analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
02807 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
02808
02809
02810
02811
02812 analog_set_echocanceller(p, 0);
02813 return NULL;
02814 }
02815
02816
02817 analog_swap_subs(p, ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL);
02818 ast_verb(3, "Channel %d still has (callwait) call, ringing phone\n", p->channel);
02819 analog_unalloc_sub(p, ANALOG_SUB_CALLWAIT);
02820 analog_stop_callwait(p);
02821 analog_set_new_owner(p, NULL);
02822
02823 if (p->subs[ANALOG_SUB_REAL].owner->_state != AST_STATE_UP) {
02824 analog_set_dialing(p, 1);
02825 }
02826
02827 ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
02828 analog_ring(p);
02829 } else if (p->subs[ANALOG_SUB_THREEWAY].owner) {
02830 unsigned int mssinceflash;
02831
02832
02833 analog_lock_sub_owner(p, ANALOG_SUB_THREEWAY);
02834 if (!p->subs[ANALOG_SUB_THREEWAY].owner) {
02835 ast_log(LOG_NOTICE, "Whoa, threeway disappeared kinda randomly.\n");
02836
02837 return NULL;
02838 }
02839 if (p->owner != ast) {
02840 ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner);
02841 ast_log(LOG_WARNING, "This isn't good...\n");
02842
02843 return NULL;
02844 }
02845
02846 mssinceflash = ast_tvdiff_ms(ast_tvnow(), p->flashtime);
02847 ast_debug(1, "Last flash was %d ms ago\n", mssinceflash);
02848 if (mssinceflash < MIN_MS_SINCE_FLASH) {
02849
02850
02851 ast_debug(1, "Looks like a bounced flash, hanging up both calls on %d\n", p->channel);
02852 ast_queue_hangup_with_cause(p->subs[ANALOG_SUB_THREEWAY].owner, AST_CAUSE_NO_ANSWER);
02853 ast_softhangup_nolock(p->subs[ANALOG_SUB_THREEWAY].owner, AST_SOFTHANGUP_DEV);
02854 ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner);
02855 } else if ((ast->pbx) || (ast->_state == AST_STATE_UP)) {
02856 if (p->transfer) {
02857 int inthreeway;
02858
02859 inthreeway = p->subs[ANALOG_SUB_THREEWAY].inthreeway;
02860
02861
02862 analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
02863 analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 0);
02864
02865
02866 if (!p->transfertobusy && ast->_state == AST_STATE_BUSY) {
02867
02868 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
02869
02870 ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
02871 analog_set_new_owner(p, NULL);
02872
02873 analog_ring(p);
02874 } else {
02875 res = analog_attempt_transfer(p, inthreeway);
02876 if (res < 0) {
02877
02878 ast_softhangup_nolock(p->subs[ANALOG_SUB_THREEWAY].owner, AST_SOFTHANGUP_DEV);
02879 ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner);
02880 } else if (res) {
02881
02882 break;
02883 }
02884 }
02885 } else {
02886 ast_softhangup_nolock(p->subs[ANALOG_SUB_THREEWAY].owner, AST_SOFTHANGUP_DEV);
02887 ast_channel_unlock(p->subs[ANALOG_SUB_THREEWAY].owner);
02888 }
02889 } else {
02890
02891 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
02892
02893 ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
02894 analog_set_new_owner(p, NULL);
02895
02896 analog_ring(p);
02897 }
02898 }
02899 } else {
02900 ast_log(LOG_WARNING, "Got a hangup and my index is %d?\n", idx);
02901 }
02902
02903 default:
02904 analog_set_echocanceller(p, 0);
02905 return NULL;
02906 }
02907 break;
02908 case ANALOG_EVENT_RINGOFFHOOK:
02909 if (p->inalarm) {
02910 break;
02911 }
02912
02913
02914 if (((mysig == ANALOG_SIG_E911) || (mysig == ANALOG_SIG_FGC_CAMA) || (mysig == ANALOG_SIG_FGC_CAMAMF)) && (ast->_state == AST_STATE_DIALING_OFFHOOK)) {
02915 c = strchr(p->dialdest, '/');
02916 if (c) {
02917 c++;
02918 } else {
02919 c = p->dialdest;
02920 }
02921 if (*c) {
02922 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*0%s#", c);
02923 } else {
02924 ast_copy_string(p->dop.dialstr,"M*2#", sizeof(p->dop.dialstr));
02925 }
02926 if (strlen(p->dop.dialstr) > 4) {
02927 memset(p->echorest, 'w', sizeof(p->echorest) - 1);
02928 strcpy(p->echorest + (p->echotraining / 401) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
02929 p->echorest[sizeof(p->echorest) - 1] = '\0';
02930 p->echobreak = 1;
02931 p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
02932 } else {
02933 p->echobreak = 0;
02934 }
02935 if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
02936 int saveerr = errno;
02937 analog_on_hook(p);
02938 ast_log(LOG_WARNING, "Dialing failed on channel %d: %s\n", p->channel, strerror(saveerr));
02939 return NULL;
02940 }
02941 analog_set_dialing(p, 1);
02942 return &p->subs[idx].f;
02943 }
02944 switch (p->sig) {
02945 case ANALOG_SIG_FXOLS:
02946 case ANALOG_SIG_FXOGS:
02947 case ANALOG_SIG_FXOKS:
02948 p->fxsoffhookstate = 1;
02949 switch (ast->_state) {
02950 case AST_STATE_RINGING:
02951 analog_set_echocanceller(p, 1);
02952 analog_train_echocanceller(p);
02953 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
02954 p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
02955
02956 analog_set_needringing(p, 0);
02957 analog_off_hook(p);
02958 ast_debug(1, "channel %d answered\n", p->channel);
02959
02960
02961 analog_cancel_cidspill(p);
02962
02963 analog_set_dialing(p, 0);
02964 p->callwaitcas = 0;
02965 if (analog_check_confirmanswer(p)) {
02966
02967 p->subs[idx].f.frametype = AST_FRAME_NULL;
02968 p->subs[idx].f.subclass.integer = 0;
02969 } else if (!ast_strlen_zero(p->dop.dialstr)) {
02970
02971 res = analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop);
02972 if (res < 0) {
02973 ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", p->channel, strerror(errno));
02974 p->dop.dialstr[0] = '\0';
02975 return NULL;
02976 } else {
02977 ast_debug(1, "Sent FXO deferred digit string: %s\n", p->dop.dialstr);
02978 p->subs[idx].f.frametype = AST_FRAME_NULL;
02979 p->subs[idx].f.subclass.integer = 0;
02980 analog_set_dialing(p, 1);
02981 }
02982 p->dop.dialstr[0] = '\0';
02983 ast_setstate(ast, AST_STATE_DIALING);
02984 } else {
02985 ast_setstate(ast, AST_STATE_UP);
02986 analog_answer_polarityswitch(p);
02987 }
02988 return &p->subs[idx].f;
02989 case AST_STATE_DOWN:
02990 ast_setstate(ast, AST_STATE_RING);
02991 ast->rings = 1;
02992 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
02993 p->subs[idx].f.subclass.integer = AST_CONTROL_OFFHOOK;
02994 ast_debug(1, "channel %d picked up\n", p->channel);
02995 return &p->subs[idx].f;
02996 case AST_STATE_UP:
02997
02998 analog_off_hook(p);
02999
03000 if (ast_bridged_channel(p->owner)) {
03001 ast_queue_control(p->owner, AST_CONTROL_UNHOLD);
03002 }
03003 break;
03004 case AST_STATE_RESERVED:
03005
03006 if (analog_has_voicemail(p)) {
03007 res = analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_STUTTER);
03008 } else {
03009 res = analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_DIALTONE);
03010 }
03011 break;
03012 default:
03013 ast_log(LOG_WARNING, "FXO phone off hook in weird state %d??\n", ast->_state);
03014 }
03015 break;
03016 case ANALOG_SIG_FXSLS:
03017 case ANALOG_SIG_FXSGS:
03018 case ANALOG_SIG_FXSKS:
03019 if (ast->_state == AST_STATE_RING) {
03020 analog_set_ringtimeout(p, p->ringt_base);
03021 }
03022
03023
03024 case ANALOG_SIG_EM:
03025 case ANALOG_SIG_EM_E1:
03026 case ANALOG_SIG_EMWINK:
03027 case ANALOG_SIG_FEATD:
03028 case ANALOG_SIG_FEATDMF:
03029 case ANALOG_SIG_FEATDMF_TA:
03030 case ANALOG_SIG_E911:
03031 case ANALOG_SIG_FGC_CAMA:
03032 case ANALOG_SIG_FGC_CAMAMF:
03033 case ANALOG_SIG_FEATB:
03034 case ANALOG_SIG_SF:
03035 case ANALOG_SIG_SFWINK:
03036 case ANALOG_SIG_SF_FEATD:
03037 case ANALOG_SIG_SF_FEATDMF:
03038 case ANALOG_SIG_SF_FEATB:
03039 switch (ast->_state) {
03040 case AST_STATE_PRERING:
03041 ast_setstate(ast, AST_STATE_RING);
03042
03043 case AST_STATE_DOWN:
03044 case AST_STATE_RING:
03045 ast_debug(1, "Ring detected\n");
03046 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
03047 p->subs[idx].f.subclass.integer = AST_CONTROL_RING;
03048 break;
03049 case AST_STATE_RINGING:
03050 case AST_STATE_DIALING:
03051 if (p->outgoing) {
03052 ast_debug(1, "Line answered\n");
03053 if (analog_check_confirmanswer(p)) {
03054 p->subs[idx].f.frametype = AST_FRAME_NULL;
03055 p->subs[idx].f.subclass.integer = 0;
03056 } else {
03057 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
03058 p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
03059 ast_setstate(ast, AST_STATE_UP);
03060 }
03061 break;
03062 }
03063
03064 default:
03065 ast_log(LOG_WARNING, "Ring/Off-hook in strange state %d on channel %d\n", ast->_state, p->channel);
03066 break;
03067 }
03068 break;
03069 default:
03070 ast_log(LOG_WARNING, "Don't know how to handle ring/off hook for signalling %d\n", p->sig);
03071 break;
03072 }
03073 break;
03074 case ANALOG_EVENT_RINGBEGIN:
03075 switch (p->sig) {
03076 case ANALOG_SIG_FXSLS:
03077 case ANALOG_SIG_FXSGS:
03078 case ANALOG_SIG_FXSKS:
03079 if (ast->_state == AST_STATE_RING) {
03080 analog_set_ringtimeout(p, p->ringt_base);
03081 }
03082 break;
03083 default:
03084 break;
03085 }
03086 break;
03087 case ANALOG_EVENT_RINGEROFF:
03088 if (p->inalarm) break;
03089 ast->rings++;
03090 if (ast->rings == p->cidrings) {
03091 analog_send_callerid(p, 0, &p->caller);
03092 }
03093
03094 if (ast->rings > p->cidrings) {
03095 analog_cancel_cidspill(p);
03096 p->callwaitcas = 0;
03097 }
03098 p->subs[idx].f.frametype = AST_FRAME_CONTROL;
03099 p->subs[idx].f.subclass.integer = AST_CONTROL_RINGING;
03100 break;
03101 case ANALOG_EVENT_RINGERON:
03102 break;
03103 case ANALOG_EVENT_NOALARM:
03104 analog_set_alarm(p, 0);
03105 ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel);
03106 manager_event(EVENT_FLAG_SYSTEM, "AlarmClear",
03107 "Channel: %d\r\n", p->channel);
03108 break;
03109 case ANALOG_EVENT_WINKFLASH:
03110 if (p->inalarm) {
03111 break;
03112 }
03113
03114 gettimeofday(&p->flashtime, NULL);
03115 switch (mysig) {
03116 case ANALOG_SIG_FXOLS:
03117 case ANALOG_SIG_FXOGS:
03118 case ANALOG_SIG_FXOKS:
03119 ast_debug(1, "Winkflash, index: %d, normal: %d, callwait: %d, thirdcall: %d\n",
03120 idx, analog_get_sub_fd(p, ANALOG_SUB_REAL), analog_get_sub_fd(p, ANALOG_SUB_CALLWAIT), analog_get_sub_fd(p, ANALOG_SUB_THREEWAY));
03121
03122
03123 analog_cancel_cidspill(p);
03124 p->callwaitcas = 0;
03125
03126 if (idx != ANALOG_SUB_REAL) {
03127 ast_log(LOG_WARNING, "Got flash hook with index %d on channel %d?!?\n", idx, p->channel);
03128 goto winkflashdone;
03129 }
03130
03131 if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
03132
03133 analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
03134 if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
03135
03136
03137
03138
03139 ast_log(LOG_NOTICE, "Whoa, the call-waiting call disappeared.\n");
03140 goto winkflashdone;
03141 }
03142
03143
03144 analog_swap_subs(p, ANALOG_SUB_REAL, ANALOG_SUB_CALLWAIT);
03145 analog_play_tone(p, ANALOG_SUB_REAL, -1);
03146 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
03147 ast_debug(1, "Making %s the new owner\n", p->owner->name);
03148 if (p->subs[ANALOG_SUB_REAL].owner->_state == AST_STATE_RINGING) {
03149 ast_setstate(p->subs[ANALOG_SUB_REAL].owner, AST_STATE_UP);
03150 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_ANSWER);
03151 }
03152 analog_stop_callwait(p);
03153
03154
03155 if (!p->subs[ANALOG_SUB_CALLWAIT].inthreeway && ast_bridged_channel(p->subs[ANALOG_SUB_CALLWAIT].owner)) {
03156 ast_queue_control_data(p->subs[ANALOG_SUB_CALLWAIT].owner, AST_CONTROL_HOLD,
03157 S_OR(p->mohsuggest, NULL),
03158 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
03159 }
03160 if (ast_bridged_channel(p->subs[ANALOG_SUB_REAL].owner)) {
03161 ast_queue_control_data(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_HOLD,
03162 S_OR(p->mohsuggest, NULL),
03163 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
03164 }
03165 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_UNHOLD);
03166
03167
03168 ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
03169 } else if (!p->subs[ANALOG_SUB_THREEWAY].owner) {
03170 if (!p->threewaycalling) {
03171
03172 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_FLASH);
03173 goto winkflashdone;
03174 } else if (!analog_check_for_conference(p)) {
03175 char cid_num[256];
03176 char cid_name[256];
03177
03178 cid_num[0] = '\0';
03179 cid_name[0] = '\0';
03180 if (p->dahditrcallerid && p->owner) {
03181 if (p->owner->caller.id.number.valid
03182 && p->owner->caller.id.number.str) {
03183 ast_copy_string(cid_num, p->owner->caller.id.number.str,
03184 sizeof(cid_num));
03185 }
03186 if (p->owner->caller.id.name.valid
03187 && p->owner->caller.id.name.str) {
03188 ast_copy_string(cid_name, p->owner->caller.id.name.str,
03189 sizeof(cid_name));
03190 }
03191 }
03192
03193
03194 if (!((ast->pbx) ||
03195 (ast->_state == AST_STATE_UP) ||
03196 (ast->_state == AST_STATE_RING))) {
03197 ast_debug(1, "Flash when call not up or ringing\n");
03198 goto winkflashdone;
03199 }
03200 if (analog_alloc_sub(p, ANALOG_SUB_THREEWAY)) {
03201 ast_log(LOG_WARNING, "Unable to allocate three-way subchannel\n");
03202 goto winkflashdone;
03203 }
03204
03205
03206
03207
03208
03209
03210
03211 analog_unlock_private(p);
03212 ast_channel_unlock(ast);
03213 chan = analog_new_ast_channel(p, AST_STATE_RESERVED, 0, ANALOG_SUB_THREEWAY, NULL);
03214 ast_channel_lock(ast);
03215 analog_lock_private(p);
03216 if (!chan) {
03217 ast_log(LOG_WARNING,
03218 "Cannot allocate new call structure on channel %d\n",
03219 p->channel);
03220 analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
03221 goto winkflashdone;
03222 }
03223 if (p->dahditrcallerid) {
03224 if (!p->origcid_num) {
03225 p->origcid_num = ast_strdup(p->cid_num);
03226 }
03227 if (!p->origcid_name) {
03228 p->origcid_name = ast_strdup(p->cid_name);
03229 }
03230 ast_copy_string(p->cid_num, cid_num, sizeof(p->cid_num));
03231 ast_copy_string(p->cid_name, cid_name, sizeof(p->cid_name));
03232 }
03233
03234 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
03235
03236 analog_set_echocanceller(p, 0);
03237 res = analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_DIALRECALL);
03238 if (res) {
03239 ast_log(LOG_WARNING, "Unable to start dial recall tone on channel %d\n", p->channel);
03240 }
03241 analog_set_new_owner(p, chan);
03242 p->ss_astchan = chan;
03243 if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, p)) {
03244 ast_log(LOG_WARNING, "Unable to start simple switch on channel %d\n", p->channel);
03245 res = analog_play_tone(p, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
03246 analog_set_echocanceller(p, 1);
03247 ast_hangup(chan);
03248 } else {
03249 ast_verb(3, "Started three way call on channel %d\n", p->channel);
03250
03251
03252 if (ast_bridged_channel(p->subs[ANALOG_SUB_THREEWAY].owner)) {
03253 ast_queue_control_data(p->subs[ANALOG_SUB_THREEWAY].owner, AST_CONTROL_HOLD,
03254 S_OR(p->mohsuggest, NULL),
03255 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
03256 }
03257 }
03258 }
03259 } else {
03260
03261 enum analog_sub orig_3way_sub;
03262
03263
03264 analog_lock_sub_owner(p, ANALOG_SUB_THREEWAY);
03265 if (!p->subs[ANALOG_SUB_THREEWAY].owner) {
03266
03267
03268
03269
03270 ast_log(LOG_NOTICE, "Whoa, the 3-way call disappeared.\n");
03271 goto winkflashdone;
03272 }
03273 orig_3way_sub = ANALOG_SUB_THREEWAY;
03274
03275 if (p->subs[ANALOG_SUB_THREEWAY].inthreeway) {
03276
03277 ast_debug(1, "Got flash with three way call up, dropping last call on %d\n", p->channel);
03278
03279 if ((p->subs[ANALOG_SUB_REAL].owner->_state != AST_STATE_UP) &&
03280 (p->subs[ANALOG_SUB_THREEWAY].owner->_state == AST_STATE_UP)) {
03281
03282 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
03283 orig_3way_sub = ANALOG_SUB_REAL;
03284 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
03285 }
03286
03287 ast_verb(3, "Dropping three-way call on %s\n", p->subs[ANALOG_SUB_THREEWAY].owner->name);
03288 ast_softhangup_nolock(p->subs[ANALOG_SUB_THREEWAY].owner, AST_SOFTHANGUP_DEV);
03289 analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
03290 analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 0);
03291 } else {
03292
03293 if (((ast->pbx) || (ast->_state == AST_STATE_UP)) &&
03294 (p->transfertobusy || (ast->_state != AST_STATE_BUSY))) {
03295 ast_verb(3, "Building conference call with %s and %s\n",
03296 p->subs[ANALOG_SUB_THREEWAY].owner->name,
03297 p->subs[ANALOG_SUB_REAL].owner->name);
03298
03299 analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 1);
03300 analog_set_inthreeway(p, ANALOG_SUB_REAL, 1);
03301 if (ast->_state == AST_STATE_UP) {
03302 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
03303 orig_3way_sub = ANALOG_SUB_REAL;
03304 }
03305 if (ast_bridged_channel(p->subs[orig_3way_sub].owner)) {
03306 ast_queue_control(p->subs[orig_3way_sub].owner, AST_CONTROL_UNHOLD);
03307 }
03308 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
03309 } else {
03310 ast_verb(3, "Dumping incomplete call on %s\n", p->subs[ANALOG_SUB_THREEWAY].owner->name);
03311 analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
03312 orig_3way_sub = ANALOG_SUB_REAL;
03313 ast_softhangup_nolock(p->subs[ANALOG_SUB_THREEWAY].owner, AST_SOFTHANGUP_DEV);
03314 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
03315 if (ast_bridged_channel(p->subs[ANALOG_SUB_REAL].owner)) {
03316 ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_UNHOLD);
03317 }
03318 analog_set_echocanceller(p, 1);
03319 }
03320 }
03321 ast_channel_unlock(p->subs[orig_3way_sub].owner);
03322 }
03323 winkflashdone:
03324 analog_update_conf(p);
03325 break;
03326 case ANALOG_SIG_EM:
03327 case ANALOG_SIG_EM_E1:
03328 case ANALOG_SIG_FEATD:
03329 case ANALOG_SIG_SF:
03330 case ANALOG_SIG_SFWINK:
03331 case ANALOG_SIG_SF_FEATD:
03332 case ANALOG_SIG_FXSLS:
03333 case ANALOG_SIG_FXSGS:
03334 if (p->dialing) {
03335 ast_debug(1, "Ignoring wink on channel %d\n", p->channel);
03336 } else {
03337 ast_debug(1, "Got wink in weird state %d on channel %d\n", ast->_state, p->channel);
03338 }
03339 break;
03340 case ANALOG_SIG_FEATDMF_TA:
03341 switch (p->whichwink) {
03342 case 0:
03343 ast_debug(1, "ANI2 set to '%d' and ANI is '%s'\n", p->owner->caller.ani2,
03344 S_COR(p->owner->caller.ani.number.valid,
03345 p->owner->caller.ani.number.str, ""));
03346 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%d%s#",
03347 p->owner->caller.ani2,
03348 S_COR(p->owner->caller.ani.number.valid,
03349 p->owner->caller.ani.number.str, ""));
03350 break;
03351 case 1:
03352 ast_copy_string(p->dop.dialstr, p->finaldial, sizeof(p->dop.dialstr));
03353 break;
03354 case 2:
03355 ast_log(LOG_WARNING, "Received unexpected wink on channel of type ANALOG_SIG_FEATDMF_TA\n");
03356 return NULL;
03357 }
03358 p->whichwink++;
03359
03360 case ANALOG_SIG_FEATDMF:
03361 case ANALOG_SIG_E911:
03362 case ANALOG_SIG_FGC_CAMAMF:
03363 case ANALOG_SIG_FGC_CAMA:
03364 case ANALOG_SIG_FEATB:
03365 case ANALOG_SIG_SF_FEATDMF:
03366 case ANALOG_SIG_SF_FEATB:
03367 case ANALOG_SIG_EMWINK:
03368
03369 if (!ast_strlen_zero(p->dop.dialstr)) {
03370 res = analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop);
03371 if (res < 0) {
03372 ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", p->channel, strerror(errno));
03373 p->dop.dialstr[0] = '\0';
03374 return NULL;
03375 } else {
03376 ast_debug(1, "Sent deferred digit string on channel %d: %s\n", p->channel, p->dop.dialstr);
03377 }
03378 }
03379 p->dop.dialstr[0] = '\0';
03380 break;
03381 default:
03382 ast_log(LOG_WARNING, "Don't know how to handle ring/off hook for signalling %d\n", p->sig);
03383 }
03384 break;
03385 case ANALOG_EVENT_HOOKCOMPLETE:
03386 if (p->inalarm) break;
03387 if (analog_check_waitingfordt(p)) {
03388 break;
03389 }
03390 switch (mysig) {
03391 case ANALOG_SIG_FXSLS:
03392 case ANALOG_SIG_FXSGS:
03393 case ANALOG_SIG_FXSKS:
03394 case ANALOG_SIG_EM:
03395 case ANALOG_SIG_EM_E1:
03396 case ANALOG_SIG_EMWINK:
03397 case ANALOG_SIG_FEATD:
03398 case ANALOG_SIG_SF:
03399 case ANALOG_SIG_SFWINK:
03400 case ANALOG_SIG_SF_FEATD:
03401 if (!ast_strlen_zero(p->dop.dialstr)) {
03402 res = analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop);
03403 if (res < 0) {
03404 ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", p->channel, strerror(errno));
03405 p->dop.dialstr[0] = '\0';
03406 return NULL;
03407 } else {
03408 ast_debug(1, "Sent deferred digit string on channel %d: %s\n", p->channel, p->dop.dialstr);
03409 }
03410 }
03411 p->dop.dialstr[0] = '\0';
03412 p->dop.op = ANALOG_DIAL_OP_REPLACE;
03413 break;
03414 case ANALOG_SIG_FEATDMF:
03415 case ANALOG_SIG_FEATDMF_TA:
03416 case ANALOG_SIG_E911:
03417 case ANALOG_SIG_FGC_CAMA:
03418 case ANALOG_SIG_FGC_CAMAMF:
03419 case ANALOG_SIG_FEATB:
03420 case ANALOG_SIG_SF_FEATDMF:
03421 case ANALOG_SIG_SF_FEATB:
03422 ast_debug(1, "Got hook complete in MF FGD, waiting for wink now on channel %d\n",p->channel);
03423 break;
03424 default:
03425 break;
03426 }
03427 break;
03428 case ANALOG_EVENT_POLARITY:
03429
03430
03431
03432
03433
03434
03435
03436
03437
03438 if (p->polarityonanswerdelay > 0) {
03439
03440 if (ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) > p->polarityonanswerdelay) {
03441 switch (ast->_state) {
03442 case AST_STATE_DIALING:
03443 case AST_STATE_RINGING:
03444 if (p->answeronpolarityswitch) {
03445 ast_debug(1, "Answering on polarity switch! channel %d\n", p->channel);
03446 ast_setstate(p->owner, AST_STATE_UP);
03447 p->polarity = POLARITY_REV;
03448 if (p->hanguponpolarityswitch) {
03449 p->polaritydelaytv = ast_tvnow();
03450 }
03451 } else {
03452 ast_debug(1, "Ignore Answer on polarity switch, channel %d\n", p->channel);
03453 }
03454 break;
03455
03456 case AST_STATE_UP:
03457 case AST_STATE_RING:
03458 if (p->hanguponpolarityswitch) {
03459 ast_debug(1, "HangingUp on polarity switch! channel %d\n", p->channel);
03460 ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
03461 p->polarity = POLARITY_IDLE;
03462 } else {
03463 ast_debug(1, "Ignore Hangup on polarity switch, channel %d\n", p->channel);
03464 }
03465 break;
03466
03467 case AST_STATE_DOWN:
03468 case AST_STATE_RESERVED:
03469 case AST_STATE_OFFHOOK:
03470 case AST_STATE_BUSY:
03471 case AST_STATE_DIALING_OFFHOOK:
03472 case AST_STATE_PRERING:
03473 default:
03474 if (p->answeronpolarityswitch || p->hanguponpolarityswitch) {
03475 ast_debug(1, "Ignoring Polarity switch on channel %d, state %d\n", p->channel, ast->_state);
03476 }
03477 break;
03478 }
03479
03480 } else {
03481
03482 switch (ast->_state) {
03483 case AST_STATE_DIALING:
03484 case AST_STATE_RINGING:
03485 if (p->answeronpolarityswitch) {
03486 ast_debug(1, "Polarity switch detected but NOT answering (too close to OffHook event) on channel %d, state %d\n", p->channel, ast->_state);
03487 }
03488 break;
03489
03490 case AST_STATE_UP:
03491 case AST_STATE_RING:
03492 if (p->hanguponpolarityswitch) {
03493 ast_debug(1, "Polarity switch detected but NOT hanging up (too close to Answer event) on channel %d, state %d\n", p->channel, ast->_state);
03494 }
03495 break;
03496
03497 default:
03498 if (p->answeronpolarityswitch || p->hanguponpolarityswitch) {
03499 ast_debug(1, "Polarity switch detected (too close to previous event) on channel %d, state %d\n", p->channel, ast->_state);
03500 }
03501 break;
03502 }
03503 }
03504 }
03505
03506
03507 ast_debug(1, "Polarity Reversal event occured - DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 "\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) );
03508 break;
03509 default:
03510 ast_debug(1, "Dunno what to do with event %d on channel %d\n", res, p->channel);
03511 }
03512 return &p->subs[idx].f;
03513 }
03514
03515 struct ast_frame *analog_exception(struct analog_pvt *p, struct ast_channel *ast)
03516 {
03517 int res;
03518 int idx;
03519 struct ast_frame *f;
03520
03521 ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
03522
03523 idx = analog_get_index(ast, p, 1);
03524 if (idx < 0) {
03525 idx = ANALOG_SUB_REAL;
03526 }
03527
03528 p->subs[idx].f.frametype = AST_FRAME_NULL;
03529 p->subs[idx].f.datalen = 0;
03530 p->subs[idx].f.samples = 0;
03531 p->subs[idx].f.mallocd = 0;
03532 p->subs[idx].f.offset = 0;
03533 p->subs[idx].f.subclass.integer = 0;
03534 p->subs[idx].f.delivery = ast_tv(0,0);
03535 p->subs[idx].f.src = "dahdi_exception";
03536 p->subs[idx].f.data.ptr = NULL;
03537
03538 if (!p->owner) {
03539
03540
03541
03542
03543
03544 res = analog_get_event(p);
03545
03546
03547 if ((res != ANALOG_EVENT_RINGEROFF) && (res != ANALOG_EVENT_RINGERON) &&
03548 (res != ANALOG_EVENT_HOOKCOMPLETE)) {
03549 ast_debug(1, "Restoring owner of channel %d on event %d\n", p->channel, res);
03550 analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner);
03551 if (p->owner && ast != p->owner) {
03552
03553
03554
03555
03556 ast_log(LOG_WARNING, "Event %s on %s is not restored owner %s\n",
03557 analog_event2str(res), ast->name, p->owner->name);
03558 }
03559 if (p->owner && ast_bridged_channel(p->owner)) {
03560 ast_queue_control(p->owner, AST_CONTROL_UNHOLD);
03561 }
03562 }
03563 switch (res) {
03564 case ANALOG_EVENT_ONHOOK:
03565 analog_set_echocanceller(p, 0);
03566 if (p->owner) {
03567 ast_verb(3, "Channel %s still has call, ringing phone\n", p->owner->name);
03568 analog_ring(p);
03569 analog_stop_callwait(p);
03570 } else {
03571 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
03572 analog_event2str(res));
03573 }
03574 analog_update_conf(p);
03575 break;
03576 case ANALOG_EVENT_RINGOFFHOOK:
03577 analog_set_echocanceller(p, 1);
03578 analog_off_hook(p);
03579 if (p->owner && (p->owner->_state == AST_STATE_RINGING)) {
03580 ast_queue_control(p->owner, AST_CONTROL_ANSWER);
03581 analog_set_dialing(p, 0);
03582 }
03583 break;
03584 case ANALOG_EVENT_HOOKCOMPLETE:
03585 case ANALOG_EVENT_RINGERON:
03586 case ANALOG_EVENT_RINGEROFF:
03587
03588 break;
03589 case ANALOG_EVENT_WINKFLASH:
03590 gettimeofday(&p->flashtime, NULL);
03591 if (p->owner) {
03592 ast_verb(3, "Channel %d flashed to other channel %s\n", p->channel, p->owner->name);
03593 if (p->owner->_state != AST_STATE_UP) {
03594
03595 ast_queue_control(p->owner, AST_CONTROL_ANSWER);
03596 ast_setstate(p->owner, AST_STATE_UP);
03597 }
03598 analog_stop_callwait(p);
03599 if (ast_bridged_channel(p->owner)) {
03600 ast_queue_control(p->owner, AST_CONTROL_UNHOLD);
03601 }
03602 } else {
03603 ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
03604 analog_event2str(res));
03605 }
03606 analog_update_conf(p);
03607 break;
03608 default:
03609 ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", analog_event2str(res));
03610 break;
03611 }
03612 f = &p->subs[idx].f;
03613 return f;
03614 }
03615 ast_debug(1, "Exception on %d, channel %d\n", ast->fds[0],p->channel);
03616
03617 if (ast != p->owner) {
03618 ast_log(LOG_WARNING, "We're %s, not %s\n", ast->name, p->owner->name);
03619 f = &p->subs[idx].f;
03620 return f;
03621 }
03622
03623 f = __analog_handle_event(p, ast);
03624 if (!f) {
03625 const char *name = ast_strdupa(ast->name);
03626
03627
03628 analog_unlock_private(p);
03629 ast_channel_unlock(ast);
03630 ast_set_hangupsource(ast, name, 0);
03631 ast_channel_lock(ast);
03632 analog_lock_private(p);
03633 }
03634 return f;
03635 }
03636
03637 void *analog_handle_init_event(struct analog_pvt *i, int event)
03638 {
03639 int res;
03640 pthread_t threadid;
03641 struct ast_channel *chan;
03642
03643 ast_debug(1, "channel (%d) - signaling (%d) - event (%s)\n",
03644 i->channel, i->sig, analog_event2str(event));
03645
03646
03647 switch (event) {
03648 case ANALOG_EVENT_WINKFLASH:
03649 case ANALOG_EVENT_RINGOFFHOOK:
03650 if (i->inalarm) {
03651 break;
03652 }
03653
03654 switch (i->sig) {
03655 case ANALOG_SIG_FXOLS:
03656 case ANALOG_SIG_FXOGS:
03657 case ANALOG_SIG_FXOKS:
03658 res = analog_off_hook(i);
03659 i->fxsoffhookstate = 1;
03660 if (res && (errno == EBUSY)) {
03661 break;
03662 }
03663
03664
03665 analog_cancel_cidspill(i);
03666
03667 if (i->immediate) {
03668 analog_set_echocanceller(i, 1);
03669
03670 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_RINGTONE);
03671 chan = analog_new_ast_channel(i, AST_STATE_RING, 1, ANALOG_SUB_REAL, NULL);
03672 if (!chan) {
03673 ast_log(LOG_WARNING, "Unable to start PBX on channel %d\n", i->channel);
03674 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
03675 if (res < 0) {
03676 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
03677 }
03678 }
03679 } else {
03680
03681 chan = analog_new_ast_channel(i, AST_STATE_RESERVED, 0, ANALOG_SUB_REAL, NULL);
03682 i->ss_astchan = chan;
03683 if (chan) {
03684 if (analog_has_voicemail(i)) {
03685 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_STUTTER);
03686 } else {
03687 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_DIALTONE);
03688 }
03689 if (res < 0)
03690 ast_log(LOG_WARNING, "Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->channel);
03691
03692 if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
03693 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
03694 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
03695 if (res < 0) {
03696 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
03697 }
03698 ast_hangup(chan);
03699 }
03700 } else
03701 ast_log(LOG_WARNING, "Unable to create channel\n");
03702 }
03703 break;
03704 case ANALOG_SIG_FXSLS:
03705 case ANALOG_SIG_FXSGS:
03706 case ANALOG_SIG_FXSKS:
03707 analog_set_ringtimeout(i, i->ringt_base);
03708
03709 case ANALOG_SIG_EMWINK:
03710 case ANALOG_SIG_FEATD:
03711 case ANALOG_SIG_FEATDMF:
03712 case ANALOG_SIG_FEATDMF_TA:
03713 case ANALOG_SIG_E911:
03714 case ANALOG_SIG_FGC_CAMA:
03715 case ANALOG_SIG_FGC_CAMAMF:
03716 case ANALOG_SIG_FEATB:
03717 case ANALOG_SIG_EM:
03718 case ANALOG_SIG_EM_E1:
03719 case ANALOG_SIG_SFWINK:
03720 case ANALOG_SIG_SF_FEATD:
03721 case ANALOG_SIG_SF_FEATDMF:
03722 case ANALOG_SIG_SF_FEATB:
03723 case ANALOG_SIG_SF:
03724
03725 if (i->cid_start == ANALOG_CID_START_POLARITY_IN || i->cid_start == ANALOG_CID_START_DTMF_NOALERT) {
03726 chan = analog_new_ast_channel(i, AST_STATE_PRERING, 0, ANALOG_SUB_REAL, NULL);
03727 } else {
03728 chan = analog_new_ast_channel(i, AST_STATE_RING, 0, ANALOG_SUB_REAL, NULL);
03729 }
03730 i->ss_astchan = chan;
03731 if (!chan) {
03732 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
03733 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
03734 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
03735 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
03736 if (res < 0) {
03737 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
03738 }
03739 ast_hangup(chan);
03740 }
03741 break;
03742 default:
03743 ast_log(LOG_WARNING, "Don't know how to handle ring/answer with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
03744 res = analog_play_tone(i, ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION);
03745 if (res < 0) {
03746 ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
03747 }
03748 return NULL;
03749 }
03750 break;
03751 case ANALOG_EVENT_NOALARM:
03752 analog_set_alarm(i, 0);
03753 ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", i->channel);
03754 manager_event(EVENT_FLAG_SYSTEM, "AlarmClear",
03755 "Channel: %d\r\n", i->channel);
03756 break;
03757 case ANALOG_EVENT_ALARM:
03758 analog_set_alarm(i, 1);
03759 analog_get_and_handle_alarms(i);
03760
03761 case ANALOG_EVENT_ONHOOK:
03762
03763 switch (i->sig) {
03764 case ANALOG_SIG_FXOLS:
03765 case ANALOG_SIG_FXOGS:
03766 i->fxsoffhookstate = 0;
03767 analog_start_polarityswitch(i);
03768
03769 case ANALOG_SIG_FEATD:
03770 case ANALOG_SIG_FEATDMF:
03771 case ANALOG_SIG_FEATDMF_TA:
03772 case ANALOG_SIG_E911:
03773 case ANALOG_SIG_FGC_CAMA:
03774 case ANALOG_SIG_FGC_CAMAMF:
03775 case ANALOG_SIG_FEATB:
03776 case ANALOG_SIG_EM:
03777 case ANALOG_SIG_EM_E1:
03778 case ANALOG_SIG_EMWINK:
03779 case ANALOG_SIG_SF_FEATD:
03780 case ANALOG_SIG_SF_FEATDMF:
03781 case ANALOG_SIG_SF_FEATB:
03782 case ANALOG_SIG_SF:
03783 case ANALOG_SIG_SFWINK:
03784 case ANALOG_SIG_FXSLS:
03785 case ANALOG_SIG_FXSGS:
03786 case ANALOG_SIG_FXSKS:
03787 analog_set_echocanceller(i, 0);
03788 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
03789 analog_on_hook(i);
03790 break;
03791 case ANALOG_SIG_FXOKS:
03792 i->fxsoffhookstate = 0;
03793 analog_start_polarityswitch(i);
03794 analog_set_echocanceller(i, 0);
03795
03796 #ifdef ZHONE_HACK
03797 analog_off_hook(i);
03798 usleep(1);
03799 #endif
03800 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
03801 analog_on_hook(i);
03802 break;
03803 default:
03804 ast_log(LOG_WARNING, "Don't know how to handle on hook with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
03805 res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
03806 return NULL;
03807 }
03808 break;
03809 case ANALOG_EVENT_POLARITY:
03810 switch (i->sig) {
03811 case ANALOG_SIG_FXSLS:
03812 case ANALOG_SIG_FXSKS:
03813 case ANALOG_SIG_FXSGS:
03814
03815
03816
03817
03818 if (i->hanguponpolarityswitch) {
03819 i->polarity = POLARITY_REV;
03820 }
03821 if (i->cid_start == ANALOG_CID_START_POLARITY || i->cid_start == ANALOG_CID_START_POLARITY_IN) {
03822 i->polarity = POLARITY_REV;
03823 ast_verb(2, "Starting post polarity "
03824 "CID detection on channel %d\n",
03825 i->channel);
03826 chan = analog_new_ast_channel(i, AST_STATE_PRERING, 0, ANALOG_SUB_REAL, NULL);
03827 i->ss_astchan = chan;
03828 if (!chan) {
03829 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
03830 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
03831 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
03832 ast_hangup(chan);
03833 }
03834 }
03835 break;
03836 default:
03837 ast_log(LOG_WARNING, "handle_init_event detected "
03838 "polarity reversal on non-FXO (ANALOG_SIG_FXS) "
03839 "interface %d\n", i->channel);
03840 break;
03841 }
03842 break;
03843 case ANALOG_EVENT_DTMFCID:
03844 switch (i->sig) {
03845 case ANALOG_SIG_FXSLS:
03846 case ANALOG_SIG_FXSKS:
03847 case ANALOG_SIG_FXSGS:
03848 if (i->cid_start == ANALOG_CID_START_DTMF_NOALERT) {
03849 ast_verb(2, "Starting DTMF CID detection on channel %d\n",
03850 i->channel);
03851 chan = analog_new_ast_channel(i, AST_STATE_PRERING, 0, ANALOG_SUB_REAL, NULL);
03852 i->ss_astchan = chan;
03853 if (!chan) {
03854 ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
03855 } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
03856 ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
03857 ast_hangup(chan);
03858 }
03859 }
03860 break;
03861 default:
03862 ast_log(LOG_WARNING, "handle_init_event detected "
03863 "dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) "
03864 "interface %d\n", i->channel);
03865 break;
03866 }
03867 break;
03868 case ANALOG_EVENT_REMOVED:
03869 ast_log(LOG_NOTICE, "Got ANALOG_EVENT_REMOVED. Destroying channel %d\n",
03870 i->channel);
03871 return i->chan_pvt;
03872 case ANALOG_EVENT_NEONMWI_ACTIVE:
03873 analog_handle_notify_message(NULL, i, -1, ANALOG_EVENT_NEONMWI_ACTIVE);
03874 break;
03875 case ANALOG_EVENT_NEONMWI_INACTIVE:
03876 analog_handle_notify_message(NULL, i, -1, ANALOG_EVENT_NEONMWI_INACTIVE);
03877 break;
03878 }
03879 return NULL;
03880 }
03881
03882
03883 struct analog_pvt *analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data)
03884 {
03885 struct analog_pvt *p;
03886
03887 p = ast_calloc(1, sizeof(*p));
03888 if (!p) {
03889 return p;
03890 }
03891
03892 p->calls = c;
03893 p->outsigmod = ANALOG_SIG_NONE;
03894 p->sig = signallingtype;
03895 p->chan_pvt = private_data;
03896
03897
03898 p->cid_start = ANALOG_CID_START_RING;
03899 p->cid_signalling = CID_SIG_BELL;
03900
03901 p->subs[ANALOG_SUB_REAL].allocd = 1;
03902
03903 return p;
03904 }
03905
03906
03907
03908
03909
03910
03911
03912
03913
03914 void analog_delete(struct analog_pvt *doomed)
03915 {
03916 ast_free(doomed);
03917 }
03918
03919 int analog_config_complete(struct analog_pvt *p)
03920 {
03921
03922 if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
03923 p->permcallwaiting = 0;
03924 }
03925
03926 analog_set_callwaiting(p, p->permcallwaiting);
03927
03928 return 0;
03929 }
03930
03931 void analog_free(struct analog_pvt *p)
03932 {
03933 ast_free(p);
03934 }
03935
03936
03937 int analog_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, void *newp)
03938 {
03939 struct analog_pvt *new_pvt = newp;
03940 int x;
03941 ast_debug(1, "New owner for channel %d is %s\n", new_pvt->channel, newchan->name);
03942 if (new_pvt->owner == oldchan) {
03943 analog_set_new_owner(new_pvt, newchan);
03944 }
03945 for (x = 0; x < 3; x++) {
03946 if (new_pvt->subs[x].owner == oldchan) {
03947 new_pvt->subs[x].owner = newchan;
03948 }
03949 }
03950
03951 analog_update_conf(new_pvt);
03952 return 0;
03953 }
03954
03955 int analog_dnd(struct analog_pvt *p, int flag)
03956 {
03957 if (flag == -1) {
03958 return p->dnd;
03959 }
03960
03961 p->dnd = flag;
03962
03963 ast_verb(3, "%s DND on channel %d\n",
03964 flag ? "Enabled" : "Disabled",
03965 p->channel);
03966 manager_event(EVENT_FLAG_SYSTEM, "DNDState",
03967 "Channel: DAHDI/%d\r\n"
03968 "Status: %s\r\n", p->channel,
03969 flag ? "enabled" : "disabled");
03970
03971 return 0;
03972 }