Ignore:
Timestamp:
Oct 18, 2007 5:54:02 AM (17 years ago)
Author:
bennylp
Message:

Ticket #400: initial support for Service-Route header, still untested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r1500 r1507  
    532532} 
    533533 
     534/* Check and update Service-Route header */ 
     535void 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 
    534627/* 
    535628 * This callback is called by pjsip_regc when outgoing register 
     
    576669                return; 
    577670            } 
     671 
     672            /* Check and update Service-Route header */ 
     673            update_service_route(acc, param->rdata); 
    578674 
    579675            PJ_LOG(3, (THIS_FILE,  
Note: See TracChangeset for help on using the changeset viewer.