diff --git a/src/include/switch_types.h b/src/include/switch_types.h index b23fa2d662..1afa599395 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1186,7 +1186,8 @@ typedef enum { SWITCH_CAUSE_ALLOTTED_TIMEOUT = 602, SWITCH_CAUSE_USER_CHALLENGE = 603, SWITCH_CAUSE_MEDIA_TIMEOUT = 604, - SWITCH_CAUSE_PICKED_OFF = 605 + SWITCH_CAUSE_PICKED_OFF = 605, + SWITCH_CAUSE_USER_NOT_REGISTERED = 606 } switch_call_cause_t; typedef enum { diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 5cf980c050..81752ca228 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1616,8 +1616,8 @@ SWITCH_STANDARD_API(sofia_contact_function) char *p; sofia_profile_t *profile = NULL; const char *exclude_contact = NULL; - char *reply = ""; - + char *reply = "error/facility_not_subscribed"; + if (!cmd) { stream->write_function(stream, "%s", ""); return SWITCH_STATUS_SUCCESS; @@ -1696,8 +1696,14 @@ SWITCH_STANDARD_API(sofia_contact_function) if (!switch_strlen_zero(reply) && end_of(reply) == ',') { end_of(reply) = '\0'; } + + if (switch_strlen_zero(reply)) { + reply = "error/user_not_registered"; + } + stream->write_function(stream, "%s", reply); reply = NULL; + switch_safe_free(mystream.data); } } @@ -1960,7 +1966,7 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session tech_pvt->local_url = switch_core_session_sprintf(nsession, "%s@%s", dest, host); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot locate registered user %s@%s\n", dest, host); - cause = SWITCH_CAUSE_NO_ROUTE_DESTINATION; + cause = SWITCH_CAUSE_USER_NOT_REGISTERED; goto error; } } else if (!(host = strchr(dest, '@'))) { @@ -1972,7 +1978,7 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session host = profile_name; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot locate registered user %s@%s\n", dest, profile_name); - cause = SWITCH_CAUSE_NO_ROUTE_DESTINATION; + cause = SWITCH_CAUSE_USER_NOT_REGISTERED; goto error; } } else { diff --git a/src/switch_channel.c b/src/switch_channel.c index 9123526c95..084657a8d1 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -101,6 +101,7 @@ static struct switch_cause_table CAUSE_CHART[] = { {"USER_CHALLENGE", SWITCH_CAUSE_USER_CHALLENGE}, {"MEDIA_TIMEOUT", SWITCH_CAUSE_MEDIA_TIMEOUT}, {"PICKED_OFF", SWITCH_CAUSE_PICKED_OFF}, + {"USER_NOT_REGISTERED", SWITCH_CAUSE_USER_NOT_REGISTERED}, {NULL, 0} }; diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 70d739e9a7..6cc355f5c4 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -536,10 +536,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess char *loop_data = NULL; uint32_t progress_timelimit_sec = 0; + *bleg = NULL; + + if (!strncasecmp(bridgeto, "error/", 6)) { + *cause = switch_channel_str2cause(bridgeto + 6); + return SWITCH_STATUS_SUCCESS; + } + switch_zmalloc(write_frame.data, SWITCH_RECOMMENDED_BUFFER_SIZE); write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; - *bleg = NULL; odata = strdup(bridgeto); if (!odata) {