Merge "chan_sip: 3PCC patch for AMI "SIPnotify"" into 13

certified/13.21
Jenkins2 7 years ago committed by Gerrit Code Review
commit 31b501c1a7

@ -546,6 +546,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<para>At least one variable pair must be specified. <para>At least one variable pair must be specified.
<replaceable>name</replaceable>=<replaceable>value</replaceable></para> <replaceable>name</replaceable>=<replaceable>value</replaceable></para>
</parameter> </parameter>
<parameter name="Call-ID" required="false">
<para>When specified, SIP notity will be sent as a part of an existing dialog.</para>
</parameter>
</syntax> </syntax>
<description> <description>
<para>Sends a SIP Notify event.</para> <para>Sends a SIP Notify event.</para>
@ -15526,11 +15529,13 @@ static int manager_sipnotify(struct mansession *s, const struct message *m)
{ {
const char *channame = astman_get_header(m, "Channel"); const char *channame = astman_get_header(m, "Channel");
struct ast_variable *vars = astman_get_variables_order(m, ORDER_NATURAL); struct ast_variable *vars = astman_get_variables_order(m, ORDER_NATURAL);
const char *callid = astman_get_header(m, "Call-ID");
struct sip_pvt *p; struct sip_pvt *p;
struct ast_variable *header, *var; struct ast_variable *header, *var;
if (ast_strlen_zero(channame)) { if (ast_strlen_zero(channame)) {
astman_send_error(s, m, "SIPNotify requires a channel name"); astman_send_error(s, m, "SIPNotify requires a channel name");
ast_variables_destroy(vars);
return 0; return 0;
} }
@ -15538,23 +15543,46 @@ static int manager_sipnotify(struct mansession *s, const struct message *m)
channame += 4; channame += 4;
} }
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY, NULL, NULL))) { /* check if Call-ID header is set */
astman_send_error(s, m, "Unable to build sip pvt data for notify (memory/socket error)"); if (!ast_strlen_zero(callid)) {
return 0; struct sip_pvt tmp_dialog = {
} .callid = callid,
};
if (create_addr(p, channame, NULL, 0)) { p = ao2_find(dialogs, &tmp_dialog, OBJ_SEARCH_OBJECT);
/* Maybe they're not registered, etc. */ if (!p) {
dialog_unlink_all(p); astman_send_error(s, m, "Call-ID not found");
dialog_unref(p, "unref dialog inside for loop" ); ast_variables_destroy(vars);
/* sip_destroy(p); */ return 0;
astman_send_error(s, m, "Could not create address"); }
return 0;
}
/* Notify is outgoing call */ if (!(p->notify)) {
ast_set_flag(&p->flags[0], SIP_OUTGOING); sip_notify_alloc(p);
sip_notify_alloc(p); } else {
ast_variables_destroy(p->notify->headers);
}
} else {
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY, NULL, NULL))) {
astman_send_error(s, m, "Unable to build sip pvt data for notify (memory/socket error)");
ast_variables_destroy(vars);
return 0;
}
if (create_addr(p, channame, NULL, 0)) {
/* Maybe they're not registered, etc. */
dialog_unlink_all(p);
dialog_unref(p, "unref dialog inside for loop" );
/* sip_destroy(p); */
astman_send_error(s, m, "Could not create address");
ast_variables_destroy(vars);
return 0;
}
/* Notify is outgoing call */
ast_set_flag(&p->flags[0], SIP_OUTGOING);
sip_notify_alloc(p);
}
p->notify->headers = header = ast_variable_new("Subscription-State", "terminated", ""); p->notify->headers = header = ast_variable_new("Subscription-State", "terminated", "");
@ -15571,14 +15599,19 @@ static int manager_sipnotify(struct mansession *s, const struct message *m)
} }
} }
/* Now that we have the peer's address, set our ip and change callid */ if (ast_strlen_zero(callid)) {
ast_sip_ouraddrfor(&p->sa, &p->ourip, p); /* Now that we have the peer's address, set our ip and change callid */
build_via(p); ast_sip_ouraddrfor(&p->sa, &p->ourip, p);
build_via(p);
change_callid_pvt(p, NULL); change_callid_pvt(p, NULL);
sip_scheddestroy(p, SIP_TRANS_TIMEOUT); sip_scheddestroy(p, SIP_TRANS_TIMEOUT);
transmit_invite(p, SIP_NOTIFY, 0, 2, NULL); transmit_invite(p, SIP_NOTIFY, 0, 2, NULL);
} else {
sip_scheddestroy(p, SIP_TRANS_TIMEOUT);
transmit_invite(p, SIP_NOTIFY, 0, 1, NULL);
}
dialog_unref(p, "bump down the count of p since we're done with it."); dialog_unref(p, "bump down the count of p since we're done with it.");
astman_send_ack(s, m, "Notify Sent"); astman_send_ack(s, m, "Notify Sent");

Loading…
Cancel
Save