Wed Nov 28 2012 04:18:16

Asterisk developer's documentation


sig_analog.c
Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2009, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  *
00021  * \brief Analog signaling module
00022  *
00023  * \author Matthew Fredrickson <creslin@digium.com>
00024  */
00025 
00026 /*** MODULEINFO
00027    <support_level>core</support_level>
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 /*! \note
00050  * Define if you want to check the hook state for an FXO (FXS signalled) interface
00051  * before dialing on it.  Certain FXO interfaces always think they're out of
00052  * service with this method however.
00053  */
00054 /* #define DAHDI_CHECK_HOOKSTATE */
00055 
00056 #define POLARITY_IDLE 0
00057 #define POLARITY_REV    1
00058 #define MIN_MS_SINCE_FLASH       ( (2000) )  /*!< 2000 ms */
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    /* "smdi" is intentionally not supported here, as there is a much better
00101     * way to do this in the dialplan now. */
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    /* Don't have progress detection. */
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    /* Return 0 since I think this is unnecessary to do in most cases it is used.  Mostly only for ast_dsp */
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  * \internal
00558  * \brief Obtain the specified subchannel owner lock if the owner exists.
00559  *
00560  * \param pvt Analog private struct.
00561  * \param sub_idx Subchannel owner to lock.
00562  *
00563  * \note Assumes the analog_lock_private(pvt->chan_pvt) is already obtained.
00564  *
00565  * \note
00566  * Because deadlock avoidance may have been necessary, you need to confirm
00567  * the state of things before continuing.
00568  *
00569  * \return Nothing
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          /* No subchannel owner pointer */
00576          break;
00577       }
00578       if (!ast_channel_trylock(pvt->subs[sub_idx].owner)) {
00579          /* Got subchannel owner lock */
00580          break;
00581       }
00582       /* We must unlock the private to avoid the possibility of a deadlock */
00583       if (pvt->calls->deadlock_avoidance_private) {
00584          pvt->calls->deadlock_avoidance_private(pvt->chan_pvt);
00585       } else {
00586          /* Don't use 100% CPU if required callback not present. */
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  * \internal
00677  * \brief Attempt to transfer 3-way call.
00678  *
00679  * \param p Analog private structure.
00680  * \param inthreeway TRUE if the 3-way call is conferenced.
00681  *
00682  * \note
00683  * On entry these locks are held: real-call, private, 3-way call.
00684  *
00685  * \retval 1 Transfer successful.  3-way call is unlocked and subchannel is unalloced.
00686  *         Swapped real and 3-way subchannel.
00687  * \retval 0 Transfer successful.  3-way call is unlocked and subchannel is unalloced.
00688  * \retval -1 on error.  Caller must unlock 3-way call.
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     * In order to transfer, we need at least one of the channels to
00704     * actually be in a call bridge.  We can't conference two
00705     * applications together.  Why would we want to?
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        * The three-way party we're about to transfer is on hold if he
00717        * is not in a three way conference.
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       /* Three-way is now the REAL */
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       /* Tell the caller not to hangup */
00731       return 1;
00732    } else if (bridge_real) {
00733       /* Try transferring the other way. */
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        * The three-way party we're about to transfer is on hold if he
00743        * is not in a three way conference.
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       /* Orphan the channel after releasing the lock */
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    /* Start with the obvious, general stuff */
00769    for (x = 0; x < 3; x++) {
00770       /* Look for three way calls */
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    /* If do not disturb, definitely not */
00820    if (p->dnd) {
00821       return 0;
00822    }
00823    /* If guard time, definitely not */
00824    if (p->guardtime && (time(NULL) < p->guardtime)) {
00825       return 0;
00826    }
00827 
00828    /* If no owner definitely available */
00829    if (!p->owner) {
00830       offhook = analog_is_off_hook(p);
00831 
00832       /* TDM FXO card, "onhook" means out of service (no battery on the line) */
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       /* TDM FXS card, "offhook" means someone took the hook off so it's unavailable! */
00841       } else if (offhook) {
00842          ast_debug(1, "Channel %d off hook, can't use\n", p->channel);
00843          /* Not available when the other end is off hook */
00844          return 0;
00845       }
00846       return 1;
00847    }
00848 
00849    /* If it's not an FXO, forget about call wait */
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       /* If they don't have call waiting enabled, then for sure they're unavailable at this point */
00856       return 0;
00857    }
00858 
00859    if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
00860       /* If there is already a call waiting call, then we can't take a second one */
00861       return 0;
00862    }
00863 
00864    if ((p->owner->_state != AST_STATE_UP) &&
00865        ((p->owner->_state != AST_STATE_RINGING) || p->outgoing)) {
00866       /* If the current call is not up, then don't allow the call */
00867       return 0;
00868    }
00869    if ((p->subs[ANALOG_SUB_THREEWAY].owner) && (!p->subs[ANALOG_SUB_THREEWAY].inthreeway)) {
00870       /* Can't take a call wait when the three way calling hasn't been merged yet. */
00871       return 0;
00872    }
00873    /* We're cool */
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       /* Return provides old linear_mode setting or error indication */
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]; /* must be same length as p->dialdest */
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          /* Normal ring, on hook */
01047 
01048          /* Don't send audio while on hook, until the call is answered */
01049          analog_set_dialing(p, 1);
01050          analog_set_cadence(p, ast); /* and set p->cidrings */
01051 
01052          /* nick@dccinc.com 4/3/03 mods to allow for deferred dialing */
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          /* Call waiting call */
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          /* Call waiting tone instead */
01088          if (analog_callwait(p)) {
01089             return -1;
01090          }
01091          /* Make ring-back */
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          /* This is where the initial ringing frame is queued for an analog call.
01121           * As such, this is a great time to offer CCNR to the caller if it's available.
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       /* fall through */
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          /* If you have to go through a Tandem Access point you need to use this */
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       /* Real channel, do some fixup */
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                /* We had flipped over to answer a callwait and now it's gone */
01317                ast_debug(1, "We were flipped over to the callwait, moving back and unowning.\n");
01318                /* Move to the call-wait, but un-own us until they flip back. */
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                /* The three way hung up, but we still have a call wait */
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                   /* This was part of a three way call.  Immediately make way for
01329                      another call */
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                   /* This call hasn't been completed yet...  Set owner to NULL */
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             /* Need to hold the lock for real-call, private, and call-waiting call */
01341             analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
01342             if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
01343                /* The call waiting call dissappeared. */
01344                analog_set_new_owner(p, NULL);
01345                break;
01346             }
01347 
01348             /* Move to the call-wait and switch back to them. */
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             /* Unlock the call-waiting call that we swapped to real-call. */
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                /* This was part of a three way call.  Immediately make way for
01365                   another call */
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                /* This call hasn't been completed yet...  Set owner to NULL */
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          /* Ditch the holding callwait call, and immediately make it available */
01378          if (p->subs[ANALOG_SUB_CALLWAIT].inthreeway) {
01379             /* Need to hold the lock for call-waiting call, private, and 3-way call */
01380             analog_lock_sub_owner(p, ANALOG_SUB_THREEWAY);
01381 
01382             /* This is actually part of a three way, placed on hold.  Place the third part
01383                on music on hold now */
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             /* Make it the call wait now */
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                /* Unlock the 3-way call that we swapped to call-waiting call. */
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          /* Need to hold the lock for 3-way call, private, and call-waiting call */
01403          analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
01404          if (p->subs[ANALOG_SUB_CALLWAIT].inthreeway) {
01405             /* The other party of the three way call is currently in a call-wait state.
01406                Start music on hold for them, and take the main guy out of the third call */
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          /* If this was part of a three way call index, let us make
01419             another three way call */
01420          analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
01421          break;
01422       default:
01423          /*
01424           * Should never happen.
01425           * This wasn't any sort of call, so how are we an index?
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       /* Perform low level hangup if no owner left */
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          /* If they're off hook, try playing congestion */
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          /* Make sure we're not made available for at least two seconds assuming
01462             we were actually used for an inbound or outbound call. */
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       /* Fall through */
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       /* Pick up the line */
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          /* Upon receiving a DTMF digit, consider this an answer confirmation instead
01608          of a DTMF digit */
01609          p->subs[idx].f.frametype = AST_FRAME_CONTROL;
01610          p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
01611          /* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
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; /* start with empty output buffer */
01643    for (;;) {
01644       /* Wait for the first digit (up to specified ms). */
01645       c = ast_waitfordigit(chan, ms);
01646       /* if timeout, hangup or error, return as such */
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    /* hardcoded features are *60, *67, *69, *70, *72, *73, *78, *79, *82, *0 */
01731    if (exten[0] == '*' && extlen < 3) {
01732       if (extlen == 1) {
01733          return 1;
01734       }
01735       /* "*0" should be processed before it gets here */
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       /* What happened to the channel? */
01773       goto quit;
01774    }
01775    /* in the bizarre case where the channel has become a zombie before we
01776       even get started here, abort safely
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       /* Fall through */
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       /* set digit mode appropriately */
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       /* Wait for the first digit only if immediate=no */
01823       if (!p->immediate) {
01824          /* Wait for the first digit (up to 5 seconds). */
01825          res = ast_waitfordigit(chan, 5000);
01826       } else {
01827          res = 0;
01828       }
01829       if (res > 0) {
01830          /* save first char */
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             /* Wait for the first digit (up to 5 seconds). */
01853             res = ast_waitfordigit(chan, 5000);
01854             if (res <= 0) {
01855                break;
01856             }
01857             dtmfbuf[0] = res;
01858             /* fall through intentionally */
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             /* if international caca, do it again to get real ANO */
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                /* Wait for the first digit (up to 5 seconds). */
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                /* if E911, take off hook */
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             /* if we received a '*', we are actually receiving Feature Group D
01899                dial syntax, so use that mode; otherwise, fall through to normal
01900                mode
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             /* If we got the first digit, get the rest */
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          /* Look for Feature Group D on all E&M Wink and Feature Group D trunks */
01972          if (exten[0] == '*') {
01973             char *stringp=NULL;
01974             ast_copy_string(exten2, exten, sizeof(exten2));
01975             /* Parse out extension and callerid */
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             /* Parse out extension and callerid */
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             /* Parse out extension and callerid */
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             /* Parse out extension and callerid */
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           * Some switches require a minimum guard time between the last
02055           * FGD wink and something that answers immediately.  This
02056           * ensures it.
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       /* Read the first digit */
02099       timeout = analog_firstdigittimeout;
02100       /* If starting a threeway call, never timeout on the first digit so someone
02101          can use flash-hook as a "hold" feature */
02102       if (p->subs[ANALOG_SUB_THREEWAY].owner) {
02103          timeout = 999999;
02104       }
02105       while (len < AST_MAX_EXTENSION-1) {
02106          /* Read digit unless it's supposed to be immediate, in which case the
02107             only answer is 's' */
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                   /* Record this as the forwarding extension */
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                /* It's a match, but they just typed a digit, and there is an ambiguous match,
02172                   so just set the timeout to analog_matchdigittimeout and wait some more */
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             /* Disable call waiting if enabled */
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             /* Scan all channels and see if there are any
02196              * ringing channels that have call groups
02197              * that equal this channels pickup group
02198              */
02199             if (idx == ANALOG_SUB_REAL) {
02200                /* Switch us from Third call to Call Wait */
02201                if (p->subs[ANALOG_SUB_THREEWAY].owner) {
02202                   /* If you make a threeway call and the *8# a call, it should actually
02203                      look like a callwait */
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             /* Disable Caller*ID if enabled */
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             /* Do not disturb enabled */
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             /* Do not disturb disabled */
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             /* This is a three way call, the main call being a real channel,
02277                and we're parking the first call. */
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             /* Enable Caller*ID if enabled */
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             /* set up the private struct of the bridged one, if any */
02308             if (nbridge) {
02309                pbridge = analog_get_bridged_channel(p, nbridge);
02310             }
02311             if (pbridge && ISTRUNK(pbridge)) {
02312                /* Clear out the dial buffer */
02313                p->dop.dialstr[0] = '\0';
02314                /* flash hookswitch */
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       /* check for SMDI messages */
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       /* If we want caller id, we're in a prering state due to a polarity reversal
02379        * and we're set to use a polarity reversal to trigger the start of caller id,
02380        * grab the caller id and wait for ringing to start... */
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          /* If set to use DTMF CID signalling, listen for DTMF */
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              * We are the only party interested in the Rx stream since
02396              * we have not answered yet.  We don't need or even want DTMF
02397              * emulation.  The DTMF digits can come so fast that emulation
02398              * can drop some of them.
02399              */
02400             ast_set_flag(chan, AST_FLAG_END_DTMF_ONLY);
02401             res = 4000;/* This is a typical OFF time between rings. */
02402             for (;;) {
02403                struct ast_frame *f;
02404                res = ast_waitfor(chan, res);
02405                if (res <= 0) {
02406                   /*
02407                    * We do not need to restore the analog_set_linear_mode()
02408                    * or AST_FLAG_END_DTMF_ONLY flag settings since we
02409                    * are hanging up the channel.
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;/* This is a typical OFF time between rings. */
02426                }
02427                ast_frfree(f);
02428                if (chan->_state == AST_STATE_RING ||
02429                   chan->_state == AST_STATE_RINGING) {
02430                   break; /* Got ring */
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             /* Got cid and ring. */
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             /* If first byte is NULL, we have no cid */
02443             if (!ast_strlen_zero(dtmfcid)) {
02444                number = dtmfcid;
02445             } else {
02446                number = NULL;
02447             }
02448 
02449          /* If set to use V23 Signalling, launch our FSK gubbins and listen for it */
02450          } else if ((p->cid_signalling == CID_SIG_V23) || (p->cid_signalling == CID_SIG_V23_JP)) {
02451             int timeout = 10000;  /* Ten seconds */
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                /* Finished with Caller*ID, now wait for a ring to make sure there really is a call coming */
02496                res = 4000;/* This is a typical OFF time between rings. */
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; /* Got ring */
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;  /* Ten seconds */
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                      /* Let us detect callerid when the telco uses distinctive ring */
02567                      curRingData[receivedRingT] = p->ringt;
02568 
02569                      if (p->ringt < p->ringt_base/2) {
02570                         break;
02571                      }
02572                      /* Increment the ringT counter so we can match it against
02573                         values in chan_dahdi.conf for distinctive ring */
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       /* Mute conference */
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       /* Stop tone if there's a pulse start and the PBX isn't started */
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) { /* if not still dialing in driver */
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                /* if thru with dialing after offhook */
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 { /* if to state wait for offhook to dial rest */
02757                   /* we now wait for off hook */
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                   /* If aops=0 and hops=1, this is necessary */
02779                   p->polarity = POLARITY_REV;
02780                } else {
02781                   /* Start clean, so we can catch the change to REV polarity when party answers */
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       /* Intentionally fall through to analog_set_echocanceller() call */
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          /* Check for some special conditions regarding call waiting */
02802          if (idx == ANALOG_SUB_REAL) {
02803             /* The normal line was hung up */
02804             if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
02805                /* Need to hold the lock for real-call, private, and call-waiting call */
02806                analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
02807                if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
02808                   /*
02809                    * The call waiting call dissappeared.
02810                    * This is now a normal hangup.
02811                    */
02812                   analog_set_echocanceller(p, 0);
02813                   return NULL;
02814                }
02815 
02816                /* There's a call waiting call, so ring the phone, but make it unowned in the mean time */
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                /* Don't start streaming audio yet if the incoming call isn't up yet */
02823                if (p->subs[ANALOG_SUB_REAL].owner->_state != AST_STATE_UP) {
02824                   analog_set_dialing(p, 1);
02825                }
02826                /* Unlock the call-waiting call that we swapped to real-call. */
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                /* Need to hold the lock for real-call, private, and 3-way call */
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                   /* Just hangup */
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                   /* Just hangup */
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                   /* It hasn't been long enough since the last flashook.  This is probably a bounce on
02850                      hanging up.  Hangup both channels now */
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                      /* In any case this isn't a threeway call anymore */
02862                      analog_set_inthreeway(p, ANALOG_SUB_REAL, 0);
02863                      analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 0);
02864 
02865                      /* Only attempt transfer if the phone is ringing; why transfer to busy tone eh? */
02866                      if (!p->transfertobusy && ast->_state == AST_STATE_BUSY) {
02867                         /* Swap subs and dis-own channel */
02868                         analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
02869                         /* Unlock the 3-way call that we swapped to real-call. */
02870                         ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
02871                         analog_set_new_owner(p, NULL);
02872                         /* Ring the phone */
02873                         analog_ring(p);
02874                      } else {
02875                         res = analog_attempt_transfer(p, inthreeway);
02876                         if (res < 0) {
02877                            /* Transfer attempt failed. */
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                            /* Don't actually hang up at this point */
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                   /* Swap subs and dis-own channel */
02891                   analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
02892                   /* Unlock the 3-way call that we swapped to real-call. */
02893                   ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
02894                   analog_set_new_owner(p, NULL);
02895                   /* Ring the phone */
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          /* Fall through */
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       /* for E911, its supposed to wait for offhook then dial
02913          the second half of the dial string */
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             /* Make sure it stops ringing */
02956             analog_set_needringing(p, 0);
02957             analog_off_hook(p);
02958             ast_debug(1, "channel %d answered\n", p->channel);
02959 
02960             /* Cancel any running CallerID spill */
02961             analog_cancel_cidspill(p);
02962 
02963             analog_set_dialing(p, 0);
02964             p->callwaitcas = 0;
02965             if (analog_check_confirmanswer(p)) {
02966                /* Ignore answer if "confirm answer" is enabled */
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                /* nick@dccinc.com 4/3/03 - fxo should be able to do deferred dialing */
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             /* Make sure it stops ringing */
02998             analog_off_hook(p);
02999             /* Okay -- probably call waiting*/
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             /* Start up dialtone */
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          /* Fall through */
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             /* Fall through */
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             /* Fall through */
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       /* Remember last time we got a flash-hook */
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          /* Cancel any running CallerID spill */
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             /* Need to hold the lock for real-call, private, and call-waiting call */
03133             analog_lock_sub_owner(p, ANALOG_SUB_CALLWAIT);
03134             if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
03135                /*
03136                 * The call waiting call dissappeared.
03137                 * Let's just ignore this flash-hook.
03138                 */
03139                ast_log(LOG_NOTICE, "Whoa, the call-waiting call disappeared.\n");
03140                goto winkflashdone;
03141             }
03142 
03143             /* Swap to call-wait */
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             /* Start music on hold if appropriate */
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             /* Unlock the call-waiting call that we swapped to real-call. */
03168             ast_channel_unlock(p->subs[ANALOG_SUB_REAL].owner);
03169          } else if (!p->subs[ANALOG_SUB_THREEWAY].owner) {
03170             if (!p->threewaycalling) {
03171                /* Just send a flash if no 3-way calling */
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                /* XXX This section needs much more error checking!!! XXX */
03193                /* Start a 3-way call if feasible */
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                 * Make new channel
03207                 *
03208                 * We cannot hold the p or ast locks while creating a new
03209                 * channel.
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                /* Swap things around between the three-way and real call */
03234                analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL);
03235                /* Disable echo canceller for better dialing */
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                   /* Start music on hold if appropriate */
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             /* Already have a 3 way call */
03261             enum analog_sub orig_3way_sub;
03262 
03263             /* Need to hold the lock for real-call, private, and 3-way call */
03264             analog_lock_sub_owner(p, ANALOG_SUB_THREEWAY);
03265             if (!p->subs[ANALOG_SUB_THREEWAY].owner) {
03266                /*
03267                 * The 3-way call dissappeared.
03268                 * Let's just ignore this flash-hook.
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                /* Call is already up, drop the last person */
03277                ast_debug(1, "Got flash with three way call up, dropping last call on %d\n", p->channel);
03278                /* If the primary call isn't answered yet, use it */
03279                if ((p->subs[ANALOG_SUB_REAL].owner->_state != AST_STATE_UP) &&
03280                   (p->subs[ANALOG_SUB_THREEWAY].owner->_state == AST_STATE_UP)) {
03281                   /* Swap back -- we're dropping the real 3-way that isn't finished yet*/
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                /* Drop the last call and stop the conference */
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                /* Lets see what we're up to */
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                   /* Put them in the threeway, and flip */
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          /* Fall through */
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          /* FGD MF and EMWINK *Must* wait for wink */
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:  /* only interesting for FXS */
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        * If we get a Polarity Switch event, this could be
03431        * due to line seizure, remote end connect or remote end disconnect.
03432        *
03433        * Check to see if we should change the polarity state and
03434        * mark the channel as UP or if this is an indication
03435        * of remote end disconnect.
03436        */
03437 
03438       if (p->polarityonanswerdelay > 0) {
03439          /* check if event is not too soon after OffHook or Answer */
03440          if (ast_tvdiff_ms(ast_tvnow(), p->polaritydelaytv) > p->polarityonanswerdelay) {
03441             switch (ast->_state) {
03442             case AST_STATE_DIALING:       /*!< Digits (or equivalent) have been dialed */
03443             case AST_STATE_RINGING:       /*!< Remote end is 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:            /*!< Line is up */
03457             case AST_STATE_RING:       /*!< Line is ringing */
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:          /*!< Channel is down and available */
03468             case AST_STATE_RESERVED:         /*!< Channel is down, but reserved */
03469             case AST_STATE_OFFHOOK:          /*!< Channel is off hook */
03470             case AST_STATE_BUSY:          /*!< Line is busy */
03471             case AST_STATE_DIALING_OFFHOOK:     /*!< Digits (or equivalent) have been dialed while offhook */
03472             case AST_STATE_PRERING:          /*!< Channel has detected an incoming call and is waiting for ring */
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             /* event is too soon after OffHook or Answer */
03482             switch (ast->_state) {
03483             case AST_STATE_DIALING:    /*!< Digits (or equivalent) have been dialed */
03484             case AST_STATE_RINGING:    /*!< Remote end is 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:         /*!< Line is up */
03491             case AST_STATE_RING:    /*!< Line is ringing */
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       /* Added more log_debug information below to provide a better indication of what is going on */
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       /* If nobody owns us, absorb the event appropriately, otherwise
03540          we loop indefinitely.  This occurs when, during call waiting, the
03541          other end hangs up our channel so that it no longer exists, but we
03542          have neither FLASH'd nor ONHOOK'd to signify our desire to
03543          change to the other channel. */
03544       res = analog_get_event(p);
03545 
03546       /* Switch to real if there is one and this isn't something really silly... */
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              * Could this even happen?
03554              * Possible deadlock because we do not have the real-call lock.
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          /* Do nothing */
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                /* Answer if necessary */
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    /* If it's not us, return NULL immediately */
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       /* Tell the CDR this DAHDI device hung up */
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    /* Handle an event on a given channel for the monitor thread. */
03647    switch (event) {
03648    case ANALOG_EVENT_WINKFLASH:
03649    case ANALOG_EVENT_RINGOFFHOOK:
03650       if (i->inalarm) {
03651          break;
03652       }
03653       /* Got a ring/answer.  What kind of channel are we? */
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          /* Cancel VMWI spill */
03665          analog_cancel_cidspill(i);
03666 
03667          if (i->immediate) {
03668             analog_set_echocanceller(i, 1);
03669             /* The channel is immediately up.  Start right away */
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             /* Check for callerid, digits, etc */
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          /* Fall through */
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          /* Check for callerid, digits, etc */
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       /* fall thru intentionally */
03761    case ANALOG_EVENT_ONHOOK:
03762       /* Back on hook.  Hang up. */
03763       switch (i->sig) {
03764       case ANALOG_SIG_FXOLS:
03765       case ANALOG_SIG_FXOGS:
03766          i->fxsoffhookstate = 0;
03767          analog_start_polarityswitch(i);
03768          /* Fall through */
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          /* Diddle the battery for the zhone */
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          /* We have already got a PR before the channel was
03815             created, but it wasn't handled. We need polarity
03816             to be REV for remote hangup detection to work.
03817             At least in Spain */
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: /* destroy channel, will actually do so in do_monitor */
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    /* Some defaults for values */
03898    p->cid_start = ANALOG_CID_START_RING;
03899    p->cid_signalling = CID_SIG_BELL;
03900    /* Sub real is assumed to always be alloc'd */
03901    p->subs[ANALOG_SUB_REAL].allocd = 1;
03902 
03903    return p;
03904 }
03905 
03906 /*!
03907  * \brief Delete the analog private structure.
03908  * \since 1.8
03909  *
03910  * \param doomed Analog private structure to delete.
03911  *
03912  * \return Nothing
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    /* No call waiting on non FXS channels */
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 /* called while dahdi_pvt is locked in dahdi_fixup */
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 }