Changeset 139 for pjproject/trunk/pjsip/src/pjsip/sip_dialog.c
- Timestamp:
- Feb 7, 2006 12:34:11 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_dialog.c
r132 r139 38 38 #define THIS_FILE "sip_dialog.c" 39 39 40 long pjsip_dlg_lock_tls_id; 40 41 41 42 PJ_DEF(pj_bool_t) pjsip_method_creates_dialog(const pjsip_method *m) … … 73 74 pj_sprintf(dlg->obj_name, "dlg%p", dlg); 74 75 dlg->ua = ua; 76 dlg->endpt = endpt; 75 77 76 78 status = pj_mutex_create_recursive(pool, "dlg%p", &dlg->mutex); … … 93 95 if (dlg->mutex) 94 96 pj_mutex_destroy(dlg->mutex); 95 pjsip_endpt_release_pool( pjsip_ua_get_endpt(dlg->ua), dlg->pool);97 pjsip_endpt_release_pool(dlg->endpt, dlg->pool); 96 98 } 97 99 … … 145 147 /* Randomize local CSeq. */ 146 148 dlg->local.first_cseq = pj_rand() % 0x7FFFFFFFL; 147 dlg->local.cseq = dlg->local. cseq;149 dlg->local.cseq = dlg->local.first_cseq; 148 150 149 151 /* Init local contact. */ … … 184 186 185 187 /* Init client authentication session. */ 186 status = pjsip_auth_clt_init(&dlg->auth_sess, pjsip_ua_get_endpt(ua),188 status = pjsip_auth_clt_init(&dlg->auth_sess, dlg->endpt, 187 189 dlg->pool, 0); 188 190 if (status != PJ_SUCCESS) … … 343 345 344 346 /* Init client authentication session. */ 345 status = pjsip_auth_clt_init(&dlg->auth_sess, pjsip_ua_get_endpt(ua),347 status = pjsip_auth_clt_init(&dlg->auth_sess, dlg->endpt, 346 348 dlg->pool, 0); 347 349 if (status != PJ_SUCCESS) … … 507 509 } 508 510 511 /* Log */ 512 PJ_LOG(5,(dlg->obj_name, "Dialog destroyed")); 513 509 514 /* Destroy this dialog. */ 510 515 pj_mutex_destroy(dlg->mutex); 511 pjsip_endpt_release_pool( pjsip_ua_get_endpt(dlg->ua), dlg->pool);516 pjsip_endpt_release_pool(dlg->endpt, dlg->pool); 512 517 513 518 return PJ_SUCCESS; … … 630 635 dlg->mod_data[mod->id] = mod_data; 631 636 637 /* Increment count. */ 638 ++dlg->usage_cnt; 639 632 640 pj_mutex_unlock(dlg->mutex); 633 641 … … 664 672 * dialog. 665 673 */ 666 status = pjsip_endpt_create_request_from_hdr( pjsip_ua_get_endpt(dlg->ua),674 status = pjsip_endpt_create_request_from_hdr(dlg->endpt, 667 675 method, 668 676 dlg->target, … … 810 818 } 811 819 812 *p_tsx = tsx; 820 if (p_tsx) 821 *p_tsx = tsx; 813 822 814 823 } else { 815 status = pjsip_endpt_send_request_stateless( 816 pjsip_ua_get_endpt(dlg->ua), tdata,NULL, NULL);824 status = pjsip_endpt_send_request_stateless(dlg->endpt, tdata, 825 NULL, NULL); 817 826 if (status != PJ_SUCCESS) 818 827 goto on_error; 819 828 820 *p_tsx = NULL; 829 if (p_tsx) 830 *p_tsx = NULL; 821 831 } 822 832 … … 833 843 pjsip_tx_data_dec_ref( tdata ); 834 844 835 *p_tsx = NULL; 845 if (p_tsx) 846 *p_tsx = NULL; 836 847 return status; 837 848 } … … 853 864 854 865 /* Create generic response. */ 855 status = pjsip_endpt_create_response( pjsip_ua_get_endpt(dlg->ua),866 status = pjsip_endpt_create_response(dlg->endpt, 856 867 rdata, st_code, st_text, &tdata); 857 868 if (status != PJ_SUCCESS) … … 915 926 if (st_class==2 || st_code==405) { 916 927 const pjsip_hdr *c_hdr; 917 c_hdr = pjsip_endpt_get_capability( pjsip_ua_get_endpt(dlg->ua),928 c_hdr = pjsip_endpt_get_capability(dlg->endpt, 918 929 PJSIP_H_ALLOW, NULL); 919 930 if (c_hdr) { … … 926 937 if (st_class==2) { 927 938 const pjsip_hdr *c_hdr; 928 c_hdr = pjsip_endpt_get_capability( pjsip_ua_get_endpt(dlg->ua),939 c_hdr = pjsip_endpt_get_capability(dlg->endpt, 929 940 PJSIP_H_SUPPORTED, NULL); 930 941 if (c_hdr) { … … 1057 1068 */ 1058 1069 pj_mutex_unlock(dlg->mutex); 1059 pjsip_endpt_respond_stateless( pjsip_ua_get_endpt(dlg->ua),1070 pjsip_endpt_respond_stateless(dlg->endpt, 1060 1071 rdata, 500, NULL, NULL, NULL); 1061 1072 return; … … 1095 1106 "Dialog will response with 500 (Internal Server Error)", 1096 1107 pjsip_rx_data_get_info(rdata))); 1097 status = pjsip_endpt_create_response( pjsip_ua_get_endpt(dlg->ua),1108 status = pjsip_endpt_create_response(dlg->endpt, 1098 1109 rdata, 1099 1110 PJSIP_SC_INTERNAL_SERVER_ERROR, … … 1126 1137 pj_mutex_lock(dlg->mutex); 1127 1138 1139 /* Check that rdata already has dialog in mod_data. */ 1140 pj_assert(pjsip_rdata_get_dlg(rdata) == dlg); 1141 1128 1142 /* Update the remote tag, if none is specified yet. */ 1129 1143 if (dlg->remote.info->tag.slen == 0 && rdata->msg_info.to->tag.slen != 0) { … … 1134 1148 } 1135 1149 1136 /* Check that rdata already has dialog in mod_data. */ 1137 pj_assert(pjsip_rdata_get_dlg(rdata) == dlg); 1150 /* Update remote target when receiving certain response messages. */ 1151 if (pjsip_method_creates_dialog(&rdata->msg_info.cseq->method) && 1152 rdata->msg_info.msg->line.status.code/100 == 2) 1153 { 1154 pjsip_contact_hdr *contact; 1155 1156 contact = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, 1157 NULL); 1158 if (contact) { 1159 dlg->remote.contact = pjsip_hdr_clone(dlg->pool, contact); 1160 dlg->target = dlg->remote.contact->uri; 1161 } 1162 } 1138 1163 1139 1164 /* Pass to dialog usages. */ … … 1186 1211 dlg->sess_count == 0) 1187 1212 { 1213 /* Unregister this dialog from the transaction. */ 1214 tsx->mod_data[dlg->ua->id] = NULL; 1215 1188 1216 /* Time to destroy dialog. */ 1189 1217 unregister_and_destroy_dialog(dlg);
Note: See TracChangeset
for help on using the changeset viewer.