Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 315670) +++ channels/chan_sip.c (working copy) @@ -5370,8 +5370,34 @@ res = -1; } else { int xmitres; + struct ast_party_connected_line connected; + struct ast_set_party_connected_line update_connected; sip_pvt_lock(p); + + /* Supply initial connected line information if available. */ + memset(&update_connected, 0, sizeof(update_connected)); + ast_party_connected_line_init(&connected); + if (!ast_strlen_zero(p->cid_num) + || (p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) { + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + } + if (!ast_strlen_zero(p->cid_name) + || (p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) { + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + } + if (update_connected.id.number || update_connected.id.name) { + connected.id.tag = (char *) p->cid_tag; + connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; + ast_channel_queue_connected_line_update(ast, &connected, &update_connected); + } + xmitres = transmit_invite(p, SIP_INVITE, 1, 2, uri); sip_pvt_unlock(p); if (xmitres == XMIT_ERROR) @@ -12361,15 +12387,18 @@ ast_set_flag(&p->flags[0], SIP_NEEDREINVITE); } } else { + ast_set_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND); if (ast_test_flag(&p->flags[1], SIP_PAGE2_RPID_IMMEDIATE)) { struct sip_request resp; if ((p->owner->_state == AST_STATE_RING) && !ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT)) { + ast_clear_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND); respprep(&resp, p, "180 Ringing", &p->initreq); add_rpid(&resp, p); send_response(p, &resp, XMIT_UNRELIABLE, 0); ast_set_flag(&p->flags[0], SIP_RINGING); } else if (p->owner->_state == AST_STATE_RINGING) { + ast_clear_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND); respprep(&resp, p, "183 Session Progress", &p->initreq); add_rpid(&resp, p); send_response(p, &resp, XMIT_UNRELIABLE, 0); @@ -12377,8 +12406,6 @@ } else { ast_debug(1, "Unable able to send update to '%s' in state '%s'\n", p->owner->name, ast_state2str(p->owner->_state)); } - } else { - ast_set_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND); } } } @@ -19141,20 +19168,20 @@ ast_log(LOG_WARNING, "Unable to cancel SIP destruction. Expect bad things.\n"); if (!req->ignore && p->owner) { if (get_rpid(p, req)) { + /* Queue a connected line update */ ast_party_connected_line_init(&connected); memset(&update_connected, 0, sizeof(update_connected)); - if (p->cid_num) { - update_connected.id.number = 1; - connected.id.number.valid = 1; - connected.id.number.str = (char *) p->cid_num; - connected.id.number.presentation = p->callingpres; - } - if (p->cid_name) { - update_connected.id.name = 1; - connected.id.name.valid = 1; - connected.id.name.str = (char *) p->cid_name; - connected.id.name.presentation = p->callingpres; - } + + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + connected.id.tag = (char *) p->cid_tag; connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; ast_channel_queue_connected_line_update(p->owner, &connected, @@ -19206,18 +19233,17 @@ /* Queue a connected line update */ ast_party_connected_line_init(&connected); memset(&update_connected, 0, sizeof(update_connected)); - if (p->cid_num) { - update_connected.id.number = 1; - connected.id.number.valid = 1; - connected.id.number.str = (char *) p->cid_num; - connected.id.number.presentation = p->callingpres; - } - if (p->cid_name) { - update_connected.id.name = 1; - connected.id.name.valid = 1; - connected.id.name.str = (char *) p->cid_name; - connected.id.name.presentation = p->callingpres; - } + + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + connected.id.tag = (char *) p->cid_tag; connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; ast_channel_queue_connected_line_update(p->owner, &connected, @@ -19259,26 +19285,37 @@ ast_rtp_instance_activate(p->rtp); } - if (!req->ignore && p->owner && (get_rpid(p, req) || !reinvite)) { - /* Queue a connected line update */ - ast_party_connected_line_init(&connected); - memset(&update_connected, 0, sizeof(update_connected)); - if (p->cid_num) { - update_connected.id.number = 1; - connected.id.number.valid = 1; - connected.id.number.str = (char *) p->cid_num; - connected.id.number.presentation = p->callingpres; + if (!req->ignore && p->owner) { + int rpid_changed; + + rpid_changed = get_rpid(p, req); + if (rpid_changed || !reinvite) { + /* Queue a connected line update */ + ast_party_connected_line_init(&connected); + memset(&update_connected, 0, sizeof(update_connected)); + if (rpid_changed + || !ast_strlen_zero(p->cid_num) + || (p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) { + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + } + if (rpid_changed + || !ast_strlen_zero(p->cid_name) + || (p->callingpres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) { + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + } + if (update_connected.id.number || update_connected.id.name) { + connected.id.tag = (char *) p->cid_tag; + connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; + ast_channel_queue_connected_line_update(p->owner, &connected, + &update_connected); + } } - if (p->cid_name) { - update_connected.id.name = 1; - connected.id.name.valid = 1; - connected.id.name.str = (char *) p->cid_name; - connected.id.name.presentation = p->callingpres; - } - connected.id.tag = (char *) p->cid_tag; - connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; - ast_channel_queue_connected_line_update(p->owner, &connected, - &update_connected); } /* Parse contact header for continued conversation */ @@ -21154,20 +21191,20 @@ if (get_rpid(p, req)) { struct ast_party_connected_line connected; struct ast_set_party_connected_line update_connected; + ast_party_connected_line_init(&connected); memset(&update_connected, 0, sizeof(update_connected)); - if (p->cid_num) { - update_connected.id.number = 1; - connected.id.number.valid = 1; - connected.id.number.str = (char *) p->cid_num; - connected.id.number.presentation = p->callingpres; - } - if (p->cid_name) { - update_connected.id.name = 1; - connected.id.name.valid = 1; - connected.id.name.str = (char *) p->cid_name; - connected.id.name.presentation = p->callingpres; - } + + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + connected.id.tag = (char *) p->cid_tag; connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER; ast_channel_queue_connected_line_update(p->owner, &connected, &update_connected); @@ -21499,18 +21536,17 @@ ast_party_connected_line_init(&connected); memset(&update_connected, 0, sizeof(update_connected)); - if (p->cid_num) { - update_connected.id.number = 1; - connected.id.number.valid = 1; - connected.id.number.str = (char *) p->cid_num; - connected.id.number.presentation = p->callingpres; - } - if (p->cid_name) { - update_connected.id.name = 1; - connected.id.name.valid = 1; - connected.id.name.str = (char *) p->cid_name; - connected.id.name.presentation = p->callingpres; - } + + update_connected.id.number = 1; + connected.id.number.valid = 1; + connected.id.number.str = (char *) p->cid_num; + connected.id.number.presentation = p->callingpres; + + update_connected.id.name = 1; + connected.id.name.valid = 1; + connected.id.name.str = (char *) p->cid_name; + connected.id.name.presentation = p->callingpres; + connected.id.tag = (char *) p->cid_tag; connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER; ast_channel_queue_connected_line_update(p->owner, &connected,