Changeset 1507
- Timestamp:
- Oct 18, 2007 5:54:02 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c
r1500 r1507 532 532 } 533 533 534 /* Check and update Service-Route header */ 535 void update_service_route(pjsua_acc *acc, pjsip_rx_data *rdata) 536 { 537 pjsip_generic_string_hdr *hsr = NULL; 538 pjsip_route_hdr *hr, *h; 539 const pj_str_t HNAME = { "Service-Route", 13 }; 540 const pj_str_t HROUTE = { "Route", 5 }; 541 pjsip_uri *uri[PJSUA_ACC_MAX_PROXIES]; 542 unsigned i, uri_cnt = 0; 543 544 /* Find and parse Service-Route headers */ 545 for (;;) { 546 char saved; 547 int parsed_len; 548 549 /* Find Service-Route header */ 550 hsr = (pjsip_generic_string_hdr*) 551 pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &HNAME, hsr); 552 if (!hsr) 553 break; 554 555 /* Parse as Route header since the syntax is similar. This may 556 * return more than one headers. 557 */ 558 saved = hsr->hvalue.ptr[hsr->hvalue.slen]; 559 hsr->hvalue.ptr[hsr->hvalue.slen] = '\0'; 560 hr = (pjsip_route_hdr*) 561 pjsip_parse_hdr(rdata->tp_info.pool, &HROUTE, hsr->hvalue.ptr, 562 hsr->hvalue.slen, &parsed_len); 563 hsr->hvalue.ptr[hsr->hvalue.slen] = saved; 564 565 if (hr == NULL) { 566 /* Error */ 567 PJ_LOG(1,(THIS_FILE, "Error parsing Service-Route header")); 568 return; 569 } 570 571 /* Save each URI in the result */ 572 h = hr; 573 do { 574 if (!PJSIP_URI_SCHEME_IS_SIP(h->name_addr.uri) && 575 !PJSIP_URI_SCHEME_IS_SIPS(h->name_addr.uri)) 576 { 577 PJ_LOG(1,(THIS_FILE,"Error: non SIP URI in Service-Route: %.*s", 578 (int)hsr->hvalue.slen, hsr->hvalue.ptr)); 579 return; 580 } 581 582 uri[uri_cnt++] = h->name_addr.uri; 583 h = h->next; 584 } while (h != hr && uri_cnt != PJ_ARRAY_SIZE(uri)); 585 586 if (h != hr) { 587 PJ_LOG(1,(THIS_FILE, "Error: too many Service-Route headers")); 588 return; 589 } 590 591 /* Prepare to find next Service-Route header */ 592 hsr = hsr->next; 593 if ((void*)hsr == (void*)&rdata->msg_info.msg->hdr) 594 break; 595 } 596 597 if (uri_cnt == 0) 598 return; 599 600 /* 601 * Update account's route set 602 */ 603 604 /* First remove all routes which are not the outbound proxies */ 605 for (i=0, hr=acc->route_set.prev; 606 i<pjsua_var.ua_cfg.outbound_proxy_cnt; 607 ++i) 608 { 609 pjsip_route_hdr *prev = hr->prev; 610 pj_list_erase(hr); 611 hr = prev; 612 } 613 614 /* Then append the Service-Route URIs */ 615 for (i=0; i<uri_cnt; ++i) { 616 hr = pjsip_route_hdr_create(pjsua_var.pool); 617 hr->name_addr.uri = pjsip_uri_clone(pjsua_var.pool, uri[i]); 618 pj_list_push_back(&acc->route_set, hr); 619 } 620 621 /* Done */ 622 623 PJ_LOG(4,(THIS_FILE, "Service-Route updated for acc %d with %d URI(s)", 624 acc->index, uri_cnt)); 625 } 626 534 627 /* 535 628 * This callback is called by pjsip_regc when outgoing register … … 576 669 return; 577 670 } 671 672 /* Check and update Service-Route header */ 673 update_service_route(acc, param->rdata); 578 674 579 675 PJ_LOG(3, (THIS_FILE,
Note: See TracChangeset
for help on using the changeset viewer.