diff --git a/CHANGES b/CHANGES index 3b00468056fcaa5488de9fc0809ae45b3549fe55..49ad4d1e46fdbb73f053e891b6edfa5f0f69a703 100644 --- a/CHANGES +++ b/CHANGES @@ -347,6 +347,7 @@ libpri channel driver (chan_dahdi) DAHDI changes * Added the ability to support call waiting calls. (The SETUP has no B channel assigned.) * Added Malicious Call ID (MCID) event to the AMI call event class. + * Added Message Waiting Indication (MWI) support for ISDN PTMP endpoints (phones). Asterisk Manager Interface -------------------------- diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 17de19dcb1e16fbe29b97e365ba219aad1e940c9..af1b871f5349734c8448d4c8e249b656dcb784e6 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -11895,6 +11895,11 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, pris[span].pri.aoce_delayhangup = conf->pri.pri.aoce_delayhangup; #endif /* defined(HAVE_PRI_AOC_EVENTS) */ ast_copy_string(pris[span].pri.msn_list, conf->pri.pri.msn_list, sizeof(pris[span].pri.msn_list)); +#if defined(HAVE_PRI_MWI) + ast_copy_string(pris[span].pri.mwi_mailboxes, + conf->pri.pri.mwi_mailboxes, + sizeof(pris[span].pri.mwi_mailboxes)); +#endif /* defined(HAVE_PRI_MWI) */ ast_copy_string(pris[span].pri.idledial, conf->pri.pri.idledial, sizeof(pris[span].pri.idledial)); ast_copy_string(pris[span].pri.idleext, conf->pri.pri.idleext, sizeof(pris[span].pri.idleext)); ast_copy_string(pris[span].pri.internationalprefix, conf->pri.pri.internationalprefix, sizeof(pris[span].pri.internationalprefix)); @@ -16586,6 +16591,7 @@ static int __unload_module(void) for (j = 0; j < SIG_PRI_NUM_DCHANS; j++) { dahdi_close_pri_fd(&(pris[i]), j); } + sig_pri_stop_pri(&pris[i].pri); } #if defined(HAVE_PRI_CCSS) ast_cc_agent_unregister(&dahdi_pri_cc_agent_callbacks); @@ -17450,6 +17456,11 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct } else if (!strcasecmp(v->name, "allow_call_waiting_calls")) { confp->pri.pri.allow_call_waiting_calls = ast_true(v->value); #endif /* defined(HAVE_PRI_CALL_WAITING) */ +#if defined(HAVE_PRI_MWI) + } else if (!strcasecmp(v->name, "mwi_mailboxes")) { + ast_copy_string(confp->pri.pri.mwi_mailboxes, v->value, + sizeof(confp->pri.pri.mwi_mailboxes)); +#endif /* defined(HAVE_PRI_MWI) */ #endif /* HAVE_PRI */ #ifdef HAVE_SS7 } else if (!strcasecmp(v->name, "ss7type")) { diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 8955c670b79a72cf6c650e82e8250c0c35a938a4..8e7c73c22c13187d6115bb190de13ba744908eef 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -6423,6 +6423,130 @@ int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char return 1; } +#if defined(HAVE_PRI_MWI) +/*! + * \internal + * \brief Send a MWI indication to the given span. + * \since 1.8 + * + * \param pri Asterisk D channel control structure. + * \param mbox_number Mailbox number + * \param mbox_context Mailbox context + * \param num_messages Number of messages waiting. + * + * \return Nothing + */ +static void sig_pri_send_mwi_indication(struct sig_pri_pri *pri, const char *mbox_number, const char *mbox_context, int num_messages) +{ + struct pri_party_id mailbox; + + ast_debug(1, "Send MWI indication for %s@%s num_messages:%d\n", mbox_number, + mbox_context, num_messages); + + memset(&mailbox, 0, sizeof(mailbox)); + mailbox.number.valid = 1; + mailbox.number.presentation = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED; + mailbox.number.plan = (PRI_TON_UNKNOWN << 4) | PRI_NPI_UNKNOWN; + ast_copy_string(mailbox.number.str, mbox_number, sizeof(mailbox.number.str)); + + ast_mutex_lock(&pri->lock); + pri_mwi_indicate(pri->pri, &mailbox, 1 /* speech */, num_messages, NULL, NULL, -1, 0); + ast_mutex_unlock(&pri->lock); +} +#endif /* defined(HAVE_PRI_MWI) */ + +#if defined(HAVE_PRI_MWI) +/*! + * \internal + * \brief MWI subscription event callback. + * \since 1.8 + * + * \param event the event being passed to the subscriber + * \param userdata the data provider in the call to ast_event_subscribe() + * + * \return Nothing + */ +static void sig_pri_mwi_event_cb(const struct ast_event *event, void *userdata) +{ + struct sig_pri_pri *pri = userdata; + const char *mbox_context; + const char *mbox_number; + int num_messages; + + mbox_number = ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX); + if (ast_strlen_zero(mbox_number)) { + return; + } + mbox_context = ast_event_get_ie_str(event, AST_EVENT_IE_CONTEXT); + if (ast_strlen_zero(mbox_context)) { + return; + } + num_messages = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS); + sig_pri_send_mwi_indication(pri, mbox_number, mbox_context, num_messages); +} +#endif /* defined(HAVE_PRI_MWI) */ + +#if defined(HAVE_PRI_MWI) +/*! + * \internal + * \brief Send update MWI indications from the event cache. + * \since 1.8 + * + * \param pri Asterisk D channel control structure. + * + * \return Nothing + */ +static void sig_pri_mwi_cache_update(struct sig_pri_pri *pri) +{ + int idx; + int num_messages; + struct ast_event *event; + + for (idx = 0; idx < ARRAY_LEN(pri->mbox); ++idx) { + if (!pri->mbox[idx].sub) { + /* There are no more mailboxes on this span. */ + break; + } + + event = ast_event_get_cached(AST_EVENT_MWI, + AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, pri->mbox[idx].number, + AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, pri->mbox[idx].context, + AST_EVENT_IE_END); + if (!event) { + /* No cached event for this mailbox. */ + continue; + } + num_messages = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS); + sig_pri_send_mwi_indication(pri, pri->mbox[idx].number, pri->mbox[idx].context, + num_messages); + ast_event_destroy(event); + } +} +#endif /* defined(HAVE_PRI_MWI) */ + +/*! + * \brief Stop PRI span. + * \since 1.8 + * + * \param pri Asterisk D channel control structure. + * + * \return Nothing + */ +void sig_pri_stop_pri(struct sig_pri_pri *pri) +{ +#if defined(HAVE_PRI_MWI) + int idx; +#endif /* defined(HAVE_PRI_MWI) */ + +#if defined(HAVE_PRI_MWI) + for (idx = 0; idx < ARRAY_LEN(pri->mbox); ++idx) { + if (pri->mbox[idx].sub) { + pri->mbox[idx].sub = ast_event_unsubscribe(pri->mbox[idx].sub); + } + } +#endif /* defined(HAVE_PRI_MWI) */ +} + /*! * \internal * \brief qsort comparison function. @@ -6477,11 +6601,72 @@ int sig_pri_start_pri(struct sig_pri_pri *pri) { int x; int i; +#if defined(HAVE_PRI_MWI) + char *saveptr; + char *mbox_number; + char *mbox_context; + struct ast_str *mwi_description = ast_str_alloca(64); +#endif /* defined(HAVE_PRI_MWI) */ + +#if defined(HAVE_PRI_MWI) + /* Prepare the mbox[] for use. */ + for (i = 0; i < ARRAY_LEN(pri->mbox); ++i) { + if (pri->mbox[i].sub) { + pri->mbox[i].sub = ast_event_unsubscribe(pri->mbox[i].sub); + } + } +#endif /* defined(HAVE_PRI_MWI) */ ast_mutex_init(&pri->lock); - sig_pri_sort_pri_chans(pri); +#if defined(HAVE_PRI_MWI) + /* + * Split the mwi_mailboxes configuration string into the mbox[]: + * mailbox_number[@context]{,mailbox_number[@context]} + */ + i = 0; + saveptr = pri->mwi_mailboxes; + while (i < ARRAY_LEN(pri->mbox)) { + mbox_number = strsep(&saveptr, ","); + if (!mbox_number) { + break; + } + /* Split the mailbox_number and context */ + mbox_context = strchr(mbox_number, '@'); + if (mbox_context) { + *mbox_context++ = '\0'; + mbox_context = ast_strip(mbox_context); + } + mbox_number = ast_strip(mbox_number); + if (ast_strlen_zero(mbox_number)) { + /* There is no mailbox number. Skip it. */ + continue; + } + if (ast_strlen_zero(mbox_context)) { + /* There was no context so use the default. */ + mbox_context = "default"; + } + + /* Fill the mbox[] element. */ + ast_str_set(&mwi_description, -1, "%s span %d[%d] MWI mailbox %s@%s", + sig_pri_cc_type_name, pri->span, i, mbox_number, mbox_context); + pri->mbox[i].sub = ast_event_subscribe(AST_EVENT_MWI, sig_pri_mwi_event_cb, + ast_str_buffer(mwi_description), pri, + AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox_number, + AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, mbox_context, + AST_EVENT_IE_END); + if (!pri->mbox[i].sub) { + ast_log(LOG_ERROR, "%s span %d could not subscribe to MWI events for %s@%s.", + sig_pri_cc_type_name, pri->span, mbox_number, mbox_context); + continue; + } + pri->mbox[i].number = mbox_number; + pri->mbox[i].context = mbox_context; + ++i; + } +#endif /* defined(HAVE_PRI_MWI) */ + for (i = 0; i < SIG_PRI_NUM_DCHANS; i++) { if (pri->fds[i] == -1) { break; @@ -6574,6 +6759,19 @@ int sig_pri_start_pri(struct sig_pri_pri *pri) ast_log(LOG_ERROR, "Unable to spawn D-channel: %s\n", strerror(errno)); return -1; } + +#if defined(HAVE_PRI_MWI) + /* + * Send the initial MWI indications from the event cache for this span. + * + * If we were loaded after app_voicemail the event would already be in + * the cache. If we were loaded before app_voicemail the event would not + * be in the cache yet and app_voicemail will send the event when it + * gets loaded. + */ + sig_pri_mwi_cache_update(pri); +#endif /* defined(HAVE_PRI_MWI) */ + return 0; } diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 450a36eec91f39b503fe84b0f2a63dd68ac47e10..e7f424f5fd50f17c7f3f9ce06eceef4a93a275ab 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -27,6 +27,7 @@ #include "asterisk/channel.h" #include "asterisk/frame.h" +#include "asterisk/event.h" #include "asterisk/ccss.h" #include <libpri.h> #include <dahdi/user.h> @@ -251,6 +252,35 @@ struct sig_pri_chan { #endif }; +#if defined(HAVE_PRI_MWI) +/*! Maximum number of mailboxes per span. */ +#define SIG_PRI_MAX_MWI_MAILBOXES 8 +/*! Typical maximum length of mwi mailbox number */ +#define SIG_PRI_MAX_MWI_MBOX_NUMBER_LEN 10 /* digits in number */ +/*! Typical maximum length of mwi mailbox context */ +#define SIG_PRI_MAX_MWI_CONTEXT_LEN 10 +/*! + * \brief Maximum mwi_mailbox string length. + * \details + * max_length = #mailboxes * (mbox_number + '@' + context + ',') + * The last ',' is a null terminator instead. + */ +#define SIG_PRI_MAX_MWI_MAILBOX_STR (SIG_PRI_MAX_MWI_MAILBOXES \ + * (SIG_PRI_MAX_MWI_MBOX_NUMBER_LEN + 1 + SIG_PRI_MAX_MWI_CONTEXT_LEN + 1)) + +struct sig_pri_mbox { + /*! + * \brief MWI mailbox event subscription. + * \note NULL if mailbox not configured. + */ + struct ast_event_sub *sub; + /*! \brief Mailbox number */ + const char *number; + /*! \brief Mailbox context. */ + const char *context; +}; +#endif /* defined(HAVE_PRI_MWI) */ + struct sig_pri_pri { /* Should be set by user */ struct ast_cc_config_params *cc_params; /*!< CC config parameters for each new call. */ @@ -294,6 +324,17 @@ struct sig_pri_pri { char privateprefix[20]; /*!< for private dialplans */ char unknownprefix[20]; /*!< for unknown dialplans */ long resetinterval; /*!< Interval (in seconds) for resetting unused channels */ +#if defined(HAVE_PRI_MWI) + /*! \brief Active MWI mailboxes */ + struct sig_pri_mbox mbox[SIG_PRI_MAX_MWI_MAILBOXES]; + /*! + * \brief Comma separated list of mailboxes to indicate MWI. + * \note Empty if disabled. + * \note Format: mailbox_number[@context]{,mailbox_number[@context]} + * \note String is split apart when span is started. + */ + char mwi_mailboxes[SIG_PRI_MAX_MWI_MAILBOX_STR]; +#endif /* defined(HAVE_PRI_MWI) */ char msn_list[AST_MAX_EXTENSION]; /*!< Comma separated list of MSNs to handle. Empty if disabled. */ char idleext[AST_MAX_EXTENSION]; /*!< Where to idle extra calls */ char idlecontext[AST_MAX_CONTEXT]; /*!< What context to use for idle */ @@ -412,6 +453,7 @@ void sig_pri_init_pri(struct sig_pri_pri *pri); * functions should handle it normally (generate inband DTMF) */ int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char digit); +void sig_pri_stop_pri(struct sig_pri_pri *pri); int sig_pri_start_pri(struct sig_pri_pri *pri); void sig_pri_chan_alarm_notify(struct sig_pri_chan *p, int noalarm); diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index 157deca28d29421c7c41b6bc06b49368dd6bac52..0187555b44a49663241e943532bb5724900c15b5 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -526,6 +526,12 @@ callwaiting=yes ; A call waiting call is a SETUP message with no B channel selected. ;allow_call_waiting_calls=no ; +; Configure the ISDN span to indicate MWI for the list of mailboxes. +; You can give a comma separated list of up to 8 mailboxes per span. +; An empty list disables MWI. +; The default is an empty list. +;mwi_mailboxes=mailbox_number[@context]{,mailbox_number[@context]} +; ; Whether or not restrict outgoing caller ID (will be sent as ANI only, not ; available for the user) ; Mostly use with FXS ports diff --git a/configure b/configure index 124d6c840ef6ad73d3924f0ab5df5c1b71e3d2d5..f9ae50ba55ff7cb439db27a62574ac3c59342297 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 267261 . +# From configure.ac Revision: 267350 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63 for asterisk 1.6. # @@ -874,6 +874,10 @@ PBX_PRI_MCID PRI_MCID_DIR PRI_MCID_INCLUDE PRI_MCID_LIB +PBX_PRI_MWI +PRI_MWI_DIR +PRI_MWI_INCLUDE +PRI_MWI_LIB PBX_PRI PRI_DIR PRI_INCLUDE @@ -10097,6 +10101,25 @@ fi +PRI_MWI_DESCRIP="ISDN PRI Message Waiting Indication" +PRI_MWI_OPTION=pri + +for i in ${ac_mandatory_list}; do + if test "xPRI" = "x$i"; then + ac_mandatory_list="${ac_mandatory_list} PRI_MWI" + break + fi +done + +PBX_PRI_MWI=0 + + + + + + + + PRI_MCID_DESCRIP="ISDN PRI Malicious Call ID" PRI_MCID_OPTION=pri @@ -35531,6 +35554,273 @@ fi +if test "x${PBX_PRI_MWI}" != "x1" -a "${USE_PRI_MWI}" != "no"; then + pbxlibdir="" + # if --with-PRI_MWI=DIR has been specified, use it. + if test "x${PRI_MWI_DIR}" != "x"; then + if test -d ${PRI_MWI_DIR}/lib; then + pbxlibdir="-L${PRI_MWI_DIR}/lib" + else + pbxlibdir="-L${PRI_MWI_DIR}" + fi + fi + pbxfuncname="pri_mwi_indicate" + if test "x${pbxfuncname}" = "x" ; then # empty lib, assume only headers + AST_PRI_MWI_FOUND=yes + else + ast_ext_lib_check_save_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} " + as_ac_Lib=`$as_echo "ac_cv_lib_pri_${pbxfuncname}" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for ${pbxfuncname} in -lpri" >&5 +$as_echo_n "checking for ${pbxfuncname} in -lpri... " >&6; } +if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpri ${pbxlibdir} $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ${pbxfuncname} (); +int +main () +{ +return ${pbxfuncname} (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_Lib=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Lib=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +ac_res=`eval 'as_val=${'$as_ac_Lib'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Lib'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + AST_PRI_MWI_FOUND=yes +else + AST_PRI_MWI_FOUND=no +fi + + CFLAGS="${ast_ext_lib_check_save_CFLAGS}" + fi + + # now check for the header. + if test "${AST_PRI_MWI_FOUND}" = "yes"; then + PRI_MWI_LIB="${pbxlibdir} -lpri " + # if --with-PRI_MWI=DIR has been specified, use it. + if test "x${PRI_MWI_DIR}" != "x"; then + PRI_MWI_INCLUDE="-I${PRI_MWI_DIR}/include" + fi + PRI_MWI_INCLUDE="${PRI_MWI_INCLUDE} " + if test "xlibpri.h" = "x" ; then # no header, assume found + PRI_MWI_HEADER_FOUND="1" + else # check for the header + ast_ext_lib_check_saved_CPPFLAGS="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} ${PRI_MWI_INCLUDE}" + if test "${ac_cv_header_libpri_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for libpri.h" >&5 +$as_echo_n "checking for libpri.h... " >&6; } +if test "${ac_cv_header_libpri_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_libpri_h" >&5 +$as_echo "$ac_cv_header_libpri_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking libpri.h usability" >&5 +$as_echo_n "checking libpri.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <libpri.h> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking libpri.h presence" >&5 +$as_echo_n "checking libpri.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <libpri.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: libpri.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: libpri.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: libpri.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: libpri.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: libpri.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: libpri.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: libpri.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: libpri.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: libpri.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------- ## +## Report this to www.asterisk.org ## +## ------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for libpri.h" >&5 +$as_echo_n "checking for libpri.h... " >&6; } +if test "${ac_cv_header_libpri_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_libpri_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_libpri_h" >&5 +$as_echo "$ac_cv_header_libpri_h" >&6; } + +fi +if test "x$ac_cv_header_libpri_h" = x""yes; then + PRI_MWI_HEADER_FOUND=1 +else + PRI_MWI_HEADER_FOUND=0 +fi + + + CPPFLAGS="${ast_ext_lib_check_saved_CPPFLAGS}" + fi + if test "x${PRI_MWI_HEADER_FOUND}" = "x0" ; then + PRI_MWI_LIB="" + PRI_MWI_INCLUDE="" + else + if test "x${pbxfuncname}" = "x" ; then # only checking headers -> no library + PRI_MWI_LIB="" + fi + PBX_PRI_MWI=1 + cat >>confdefs.h <<_ACEOF +#define HAVE_PRI_MWI 1 +_ACEOF + + fi + fi +fi + + + if test "x${PBX_PRI_MCID}" != "x1" -a "${USE_PRI_MCID}" != "no"; then pbxlibdir="" # if --with-PRI_MCID=DIR has been specified, use it. diff --git a/configure.ac b/configure.ac index f5ac507e0f9bda71b4e14ed2a722988cf83c4e71..a7dd8dce8bd23a45fbe184115c738675a5dc3f14 100644 --- a/configure.ac +++ b/configure.ac @@ -341,6 +341,7 @@ AST_EXT_LIB_SETUP([PGSQL], [PostgreSQL], [postgres]) AST_EXT_LIB_SETUP([POPT], [popt], [popt]) AST_EXT_LIB_SETUP([PORTAUDIO], [PortAudio], [portaudio]) AST_EXT_LIB_SETUP([PRI], [ISDN PRI], [pri]) +AST_EXT_LIB_SETUP_DEPENDENT([PRI_MWI], [ISDN PRI Message Waiting Indication], [PRI], [pri]) AST_EXT_LIB_SETUP_DEPENDENT([PRI_MCID], [ISDN PRI Malicious Call ID], [PRI], [pri]) AST_EXT_LIB_SETUP_DEPENDENT([PRI_CALL_WAITING], [ISDN PRI call waiting supplementary service], [PRI], [pri]) AST_EXT_LIB_SETUP_DEPENDENT([PRI_AOC_EVENTS], [ISDN PRI advice of charge supplementary service events], [PRI], [pri]) @@ -1594,6 +1595,7 @@ AST_EXT_LIB_CHECK([POPT], [popt], [poptStrerror], [popt.h]) AST_EXT_LIB_CHECK([PORTAUDIO], [portaudio], [Pa_GetDeviceCount], [portaudio.h]) AST_EXT_LIB_CHECK([PRI], [pri], [pri_connected_line_update], [libpri.h]) +AST_EXT_LIB_CHECK([PRI_MWI], [pri], [pri_mwi_indicate], [libpri.h]) AST_EXT_LIB_CHECK([PRI_MCID], [pri], [pri_mcid_enable], [libpri.h]) AST_EXT_LIB_CHECK([PRI_CALL_WAITING], [pri], [pri_connect_ack_enable], [libpri.h]) AST_EXT_LIB_CHECK([PRI_AOC_EVENTS], [pri], [pri_aoc_events_enable], [libpri.h]) diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index a97017a60a1916f964e0d1dbebdb5a3160a087f9..97b6c4b121e2826f39b98924f7cfc9cd7f9c0380 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -560,6 +560,9 @@ /* Define to 1 if you have the ISDN PRI Malicious Call ID library. */ #undef HAVE_PRI_MCID +/* Define to 1 if you have the ISDN PRI Message Waiting Indication library. */ +#undef HAVE_PRI_MWI + /* Define to 1 if you have the ISDN progress with cause library. */ #undef HAVE_PRI_PROG_W_CAUSE