mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-04 12:12:48 +00:00
Merge "res_pjsip: New endpoint option "notify_early_inuse_ringing"" into 13
This commit is contained in:
4
CHANGES
4
CHANGES
@@ -21,6 +21,10 @@ res_pjsip
|
|||||||
Some SIP phones like Mitel/Aastra or Snom keep the line busy until
|
Some SIP phones like Mitel/Aastra or Snom keep the line busy until
|
||||||
receive "200 OK".
|
receive "200 OK".
|
||||||
|
|
||||||
|
* A new endpoint option "notify_early_inuse_ringing" was added to control
|
||||||
|
whether to notify dialog-info state 'early' or 'confirmed' on Ringing
|
||||||
|
when already INUSE.
|
||||||
|
|
||||||
res_agi
|
res_agi
|
||||||
------------------
|
------------------
|
||||||
* The EAGI() application will now look for a dialplan variable named
|
* The EAGI() application will now look for a dialplan variable named
|
||||||
|
@@ -768,6 +768,11 @@
|
|||||||
; transfer (default: "yes"). The value "no" is useful
|
; transfer (default: "yes"). The value "no" is useful
|
||||||
; for some SIP phones (Mitel/Aastra, Snom) which expect
|
; for some SIP phones (Mitel/Aastra, Snom) which expect
|
||||||
; a sip/frag "200 OK" after REFER has been accepted.
|
; a sip/frag "200 OK" after REFER has been accepted.
|
||||||
|
;notify_early_inuse_ringing = ; Whether to notifies dialog-info 'early'
|
||||||
|
; on INUSE && RINGING state (default: "no").
|
||||||
|
; The value "yes" is useful for some SIP phones
|
||||||
|
; (Cisco SPA) to be able to indicate and pick up
|
||||||
|
; ringing devices.
|
||||||
|
|
||||||
;==========================AUTH SECTION OPTIONS=========================
|
;==========================AUTH SECTION OPTIONS=========================
|
||||||
;[auth]
|
;[auth]
|
||||||
|
@@ -0,0 +1,30 @@
|
|||||||
|
"""add ps_endpoints.notify_early_inuse_ringing
|
||||||
|
|
||||||
|
Revision ID: d7983954dd96
|
||||||
|
Revises: 86bb1efa278d
|
||||||
|
Create Date: 2017-06-05 15:44:41.152280
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'd7983954dd96'
|
||||||
|
down_revision = '86bb1efa278d'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects.postgresql import ENUM
|
||||||
|
|
||||||
|
YESNO_NAME = 'yesno_values'
|
||||||
|
YESNO_VALUES = ['yes', 'no']
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
############################# Enums ##############################
|
||||||
|
|
||||||
|
# yesno_values have already been created, so use postgres enum object
|
||||||
|
# type to get around "already created" issue - works okay with mysql
|
||||||
|
yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
|
||||||
|
|
||||||
|
op.add_column('ps_endpoints', sa.Column('notify_early_inuse_ringing', yesno_values))
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.drop_column('ps_endpoints', 'notify_early_inuse_ringing')
|
@@ -763,6 +763,8 @@ struct ast_sip_endpoint {
|
|||||||
unsigned int allow_overlap;
|
unsigned int allow_overlap;
|
||||||
/*! Whether to notifies all the progress details on blind transfer */
|
/*! Whether to notifies all the progress details on blind transfer */
|
||||||
unsigned int refer_blind_progress;
|
unsigned int refer_blind_progress;
|
||||||
|
/*! Whether to notifies dialog-info 'early' on INUSE && RINGING state */
|
||||||
|
unsigned int notify_early_inuse_ringing;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! URI parameter for symmetric transport */
|
/*! URI parameter for symmetric transport */
|
||||||
|
@@ -69,7 +69,8 @@ void ast_sip_sanitize_xml(const char *input, char *output, size_t len);
|
|||||||
* \param[out] local_state
|
* \param[out] local_state
|
||||||
*/
|
*/
|
||||||
void ast_sip_presence_exten_state_to_str(int state, char **statestring,
|
void ast_sip_presence_exten_state_to_str(int state, char **statestring,
|
||||||
char **pidfstate, char **pidfnote, enum ast_sip_pidf_state *local_state);
|
char **pidfstate, char **pidfnote, enum ast_sip_pidf_state *local_state,
|
||||||
|
unsigned int notify_early_inuse_ringing);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Create XML attribute
|
* \brief Create XML attribute
|
||||||
|
@@ -965,6 +965,13 @@
|
|||||||
will not send the progress details, but immediately will send "200 OK".
|
will not send the progress details, but immediately will send "200 OK".
|
||||||
</para></description>
|
</para></description>
|
||||||
</configOption>
|
</configOption>
|
||||||
|
<configOption name="notify_early_inuse_ringing" default="no">
|
||||||
|
<synopsis>Whether to notifies dialog-info 'early' on InUse&Ringing state</synopsis>
|
||||||
|
<description><para>
|
||||||
|
Control whether dialog-info subscriptions get 'early' state
|
||||||
|
on Ringing when already INUSE.
|
||||||
|
</para></description>
|
||||||
|
</configOption>
|
||||||
</configObject>
|
</configObject>
|
||||||
<configObject name="auth">
|
<configObject name="auth">
|
||||||
<synopsis>Authentication type</synopsis>
|
<synopsis>Authentication type</synopsis>
|
||||||
|
@@ -1941,6 +1941,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
|
|||||||
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtcp_mux", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rtcp_mux));
|
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtcp_mux", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rtcp_mux));
|
||||||
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_overlap", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_overlap));
|
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_overlap", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_overlap));
|
||||||
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));
|
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));
|
||||||
|
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "notify_early_inuse_ringing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, notify_early_inuse_ringing));
|
||||||
|
|
||||||
if (ast_sip_initialize_sorcery_transport()) {
|
if (ast_sip_initialize_sorcery_transport()) {
|
||||||
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
|
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
|
||||||
|
@@ -82,7 +82,8 @@ void ast_sip_sanitize_xml(const char *input, char *output, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **pidfstate,
|
void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **pidfstate,
|
||||||
char **pidfnote, enum ast_sip_pidf_state *local_state)
|
char **pidfnote, enum ast_sip_pidf_state *local_state,
|
||||||
|
unsigned int notify_early_inuse_ringing)
|
||||||
{
|
{
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case AST_EXTENSION_RINGING:
|
case AST_EXTENSION_RINGING:
|
||||||
@@ -92,7 +93,11 @@ void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **p
|
|||||||
*pidfnote = "Ringing";
|
*pidfnote = "Ringing";
|
||||||
break;
|
break;
|
||||||
case (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING):
|
case (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING):
|
||||||
*statestring = "confirmed";
|
if (notify_early_inuse_ringing) {
|
||||||
|
*statestring = "early";
|
||||||
|
} else {
|
||||||
|
*statestring = "confirmed";
|
||||||
|
}
|
||||||
*local_state = NOTIFY_INUSE;
|
*local_state = NOTIFY_INUSE;
|
||||||
*pidfstate = "busy";
|
*pidfstate = "busy";
|
||||||
*pidfnote = "Ringing";
|
*pidfnote = "Ringing";
|
||||||
|
@@ -107,6 +107,8 @@ static int dialog_info_generate_body_content(void *body, void *data)
|
|||||||
enum ast_sip_pidf_state local_state;
|
enum ast_sip_pidf_state local_state;
|
||||||
unsigned int version;
|
unsigned int version;
|
||||||
char version_str[32], sanitized[PJSIP_MAX_URL_SIZE];
|
char version_str[32], sanitized[PJSIP_MAX_URL_SIZE];
|
||||||
|
struct ast_sip_endpoint *endpoint = NULL;
|
||||||
|
unsigned int notify_early_inuse_ringing = 0;
|
||||||
|
|
||||||
if (!local || !state_data->sub) {
|
if (!local || !state_data->sub) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -120,8 +122,12 @@ static int dialog_info_generate_body_content(void *body, void *data)
|
|||||||
stripped = ast_strip_quoted(local, "<", ">");
|
stripped = ast_strip_quoted(local, "<", ">");
|
||||||
ast_sip_sanitize_xml(stripped, sanitized, sizeof(sanitized));
|
ast_sip_sanitize_xml(stripped, sanitized, sizeof(sanitized));
|
||||||
|
|
||||||
|
if (state_data->sub && (endpoint = ast_sip_subscription_get_endpoint(state_data->sub))) {
|
||||||
|
notify_early_inuse_ringing = endpoint->notify_early_inuse_ringing;
|
||||||
|
ao2_cleanup(endpoint);
|
||||||
|
}
|
||||||
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
||||||
&pidfstate, &pidfnote, &local_state);
|
&pidfstate, &pidfnote, &local_state, notify_early_inuse_ringing);
|
||||||
|
|
||||||
ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "xmlns", "urn:ietf:params:xml:ns:dialog-info");
|
ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "xmlns", "urn:ietf:params:xml:ns:dialog-info");
|
||||||
|
|
||||||
@@ -133,7 +139,7 @@ static int dialog_info_generate_body_content(void *body, void *data)
|
|||||||
|
|
||||||
dialog = ast_sip_presence_xml_create_node(state_data->pool, dialog_info, "dialog");
|
dialog = ast_sip_presence_xml_create_node(state_data->pool, dialog_info, "dialog");
|
||||||
ast_sip_presence_xml_create_attr(state_data->pool, dialog, "id", state_data->exten);
|
ast_sip_presence_xml_create_attr(state_data->pool, dialog, "id", state_data->exten);
|
||||||
if (state_data->exten_state == AST_EXTENSION_RINGING) {
|
if (!ast_strlen_zero(statestring) && !strcmp(statestring, "early")) {
|
||||||
ast_sip_presence_xml_create_attr(state_data->pool, dialog, "direction", "recipient");
|
ast_sip_presence_xml_create_attr(state_data->pool, dialog, "direction", "recipient");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ static int pidf_generate_body_content(void *body, void *data)
|
|||||||
struct ast_sip_exten_state_data *state_data = data;
|
struct ast_sip_exten_state_data *state_data = data;
|
||||||
|
|
||||||
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
||||||
&pidfstate, &pidfnote, &local_state);
|
&pidfstate, &pidfnote, &local_state, 0);
|
||||||
|
|
||||||
if (!pjpidf_pres_add_note(state_data->pool, pres, pj_cstr(¬e, pidfnote))) {
|
if (!pjpidf_pres_add_note(state_data->pool, pres, pj_cstr(¬e, pidfnote))) {
|
||||||
ast_log(LOG_WARNING, "Unable to add note to PIDF presence\n");
|
ast_log(LOG_WARNING, "Unable to add note to PIDF presence\n");
|
||||||
|
@@ -80,7 +80,7 @@ static int pidf_supplement_body(void *body, void *data)
|
|||||||
enum ast_sip_pidf_state local_state;
|
enum ast_sip_pidf_state local_state;
|
||||||
|
|
||||||
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
||||||
&pidfstate, &pidfnote, &local_state);
|
&pidfstate, &pidfnote, &local_state, 0);
|
||||||
|
|
||||||
add_eyebeam(state_data->pool, pres, pidfstate);
|
add_eyebeam(state_data->pool, pres, pidfstate);
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -63,7 +63,7 @@ static int xpidf_generate_body_content(void *body, void *data)
|
|||||||
pj_xml_node *msnsubstatus;
|
pj_xml_node *msnsubstatus;
|
||||||
|
|
||||||
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
|
||||||
&pidfstate, &pidfnote, &local_state);
|
&pidfstate, &pidfnote, &local_state, 0);
|
||||||
|
|
||||||
ast_sip_presence_xml_find_node_attr(state_data->pool, pres, "atom", "id",
|
ast_sip_presence_xml_find_node_attr(state_data->pool, pres, "atom", "id",
|
||||||
&atom, &attr);
|
&atom, &attr);
|
||||||
|
Reference in New Issue
Block a user