Changeset 2193 for pjproject/trunk


Ignore:
Timestamp:
Aug 5, 2008 7:28:17 PM (16 years ago)
Author:
bennylp
Message:

Implement ticket #551: Generic URI scheme handler (thanks Juri Glaß for the patch)

Location:
pjproject/trunk/pjsip
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip/sip_parser.h

    r2039 r2193  
    359359    pj_cis_t pjsip_DISPLAY_SPEC;        /**< Used when searching for display 
    360360                                             name.                      */ 
     361    pj_cis_t pjsip_OTHER_URI_CONTENT;   /**< Generic URI content.       */ 
    361362 
    362363} pjsip_parser_const_t; 
  • pjproject/trunk/pjsip/include/pjsip/sip_uri.h

    r2103 r2193  
    415415                                      const pjsip_name_addr *rhs); 
    416416 
    417  
    418  
    419  
    420417/** 
    421418 * @} 
    422419 */ 
    423420 
     421/** 
     422 * @defgroup PJSIP_OTHER_URI Other URI schemes 
     423 * @ingroup PJSIP_URI 
     424 * @brief Container for non SIP/tel URI scheme (e.g. "http:", "mailto:") 
     425 * @{ 
     426 */ 
     427 
     428/** 
     429 * Generic URI container for non SIP/tel URI scheme. 
     430 */ 
     431typedef struct pjsip_other_uri  
     432{ 
     433    pjsip_uri_vptr *vptr;       /**< Pointer to virtual function table. */ 
     434    pj_str_t scheme;            /**< The URI scheme (e.g. "mailto")     */ 
     435    pj_str_t content;           /**< The whole URI content              */ 
     436} pjsip_other_uri; 
     437 
     438 
     439/** 
     440 * Create a generic URI object. 
     441 * 
     442 * @param pool      The pool to allocate memory from. 
     443 * 
     444 * @return          The URI instance. 
     445 */ 
     446PJ_DECL(pjsip_other_uri*) pjsip_other_uri_create(pj_pool_t *pool); 
     447 
     448 
     449/** 
     450 * @} 
     451 */ 
     452 
    424453PJ_END_DECL 
    425454 
  • pjproject/trunk/pjsip/src/pjsip/sip_parser.c

    r2039 r2193  
    4848#define HNV_UNRESERVED      "[]/?:+$" 
    4949#define HDR_CHAR            HNV_UNRESERVED UNRESERVED ESCAPED 
     50 
     51/* A generic URI can consist of (For a complete BNF see RFC 2396): 
     52     #?;:@&=+-_.!~*'()%$,/ 
     53 */ 
     54#define GENERIC_URI_CHARS   "#?;:@&=+-_.!~*'()%$,/" "%" 
    5055 
    5156#define PJSIP_VERSION           "SIP/2.0" 
     
    153158                    int_parse_name_addr( pj_scanner *scanner,  
    154159                                         pj_pool_t *pool ); 
     160static void*        int_parse_other_uri(pj_scanner *scanner,  
     161                                        pj_pool_t *pool, 
     162                                        pj_bool_t parse_params); 
    155163static void         parse_hdr_end( pj_scanner *scanner ); 
    156164 
     
    377385    pj_cis_invert(&pconst.pjsip_DISPLAY_SPEC); 
    378386 
     387    status = pj_cis_dup(&pconst.pjsip_OTHER_URI_CONTENT, &pconst.pjsip_ALNUM_SPEC); 
     388    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 
     389    pj_cis_add_str( &pconst.pjsip_OTHER_URI_CONTENT, GENERIC_URI_CHARS); 
     390 
    379391    /* 
    380392     * Register URI parsers. 
     
    691703            return uri_handler[i].parse; 
    692704    } 
    693     return NULL; 
     705    return &int_parse_other_uri; 
    694706} 
    695707 
     
    14641476 
    14651477 
     1478/* Parse other URI */ 
     1479static void* int_parse_other_uri(pj_scanner *scanner,  
     1480                                 pj_pool_t *pool, 
     1481                                 pj_bool_t parse_params) 
     1482{ 
     1483    pjsip_other_uri *uri = 0; 
     1484    const pjsip_parser_const_t *pc = pjsip_parser_const(); 
     1485    int skip_ws = scanner->skip_ws; 
     1486 
     1487    PJ_UNUSED_ARG(parse_params); 
     1488 
     1489    scanner->skip_ws = 0; 
     1490     
     1491    uri = pjsip_other_uri_create(pool);  
     1492     
     1493    pj_scan_get(scanner, &pc->pjsip_TOKEN_SPEC, &uri->scheme); 
     1494    if (pj_scan_get_char(scanner) != ':') { 
     1495        PJ_THROW(PJSIP_SYN_ERR_EXCEPTION); 
     1496    } 
     1497     
     1498    pj_scan_get(scanner, &pc->pjsip_OTHER_URI_CONTENT, &uri->content); 
     1499    scanner->skip_ws = skip_ws; 
     1500     
     1501    return uri; 
     1502} 
     1503 
     1504 
    14661505/* Parse SIP request line. */ 
    14671506static void int_parse_req_line( pj_scanner *scanner, pj_pool_t *pool, 
  • pjproject/trunk/pjsip/src/pjsip/sip_uri.c

    r2039 r2193  
    618618} 
    619619 
     620/////////////////////////////////////////////////////////////////////////////// 
     621 
     622static const pj_str_t *other_uri_get_scheme( const pjsip_other_uri*); 
     623static void *other_uri_get_uri( pjsip_other_uri*); 
     624static pj_ssize_t other_uri_print( pjsip_uri_context_e context, 
     625                                   const pjsip_other_uri *url,  
     626                                   char *buf, pj_size_t size); 
     627static int other_uri_cmp( pjsip_uri_context_e context, 
     628                          const pjsip_other_uri *url1,  
     629                          const pjsip_other_uri *url2); 
     630static pjsip_other_uri* other_uri_clone( pj_pool_t *pool,  
     631                                         const pjsip_other_uri *rhs); 
     632 
     633static pjsip_uri_vptr other_uri_vptr =  
     634{ 
     635    (P_GET_SCHEME)  &other_uri_get_scheme, 
     636    (P_GET_URI)     &other_uri_get_uri, 
     637    (P_PRINT_URI)   &other_uri_print, 
     638    (P_CMP_URI)     &other_uri_cmp, 
     639    (P_CLONE)       &other_uri_clone 
     640}; 
     641 
     642 
     643PJ_DEF(pjsip_other_uri*) pjsip_other_uri_create(pj_pool_t *pool)  
     644{ 
     645    pjsip_other_uri *uri = PJ_POOL_ZALLOC_T(pool, pjsip_other_uri); 
     646    uri->vptr = &other_uri_vptr; 
     647    return uri; 
     648} 
     649 
     650static const pj_str_t *other_uri_get_scheme( const pjsip_other_uri *uri ) 
     651{ 
     652        return &uri->scheme; 
     653} 
     654 
     655static void *other_uri_get_uri( pjsip_other_uri *uri ) 
     656{ 
     657    return uri; 
     658} 
     659 
     660static pj_ssize_t other_uri_print(pjsip_uri_context_e context, 
     661                                  const pjsip_other_uri *uri,  
     662                                  char *buf, pj_size_t size) 
     663{ 
     664    char *startbuf = buf; 
     665    char *endbuf = buf + size; 
     666     
     667    PJ_UNUSED_ARG(context); 
     668     
     669    if (uri->scheme.slen + uri->content.slen + 1 > (int)size) 
     670        return -1; 
     671 
     672    /* Print scheme. */ 
     673    copy_advance(buf, uri->scheme); 
     674    *buf++ = ':'; 
     675     
     676    /* Print content. */ 
     677    copy_advance(buf, uri->content); 
     678     
     679    return (buf - startbuf); 
     680} 
     681 
     682static int other_uri_cmp(pjsip_uri_context_e context, 
     683                         const pjsip_other_uri *uri1, 
     684                         const pjsip_other_uri *uri2) 
     685{ 
     686    PJ_UNUSED_ARG(context); 
     687     
     688    /* Scheme must match. */ 
     689    if (pj_stricmp(&uri1->scheme, &uri2->scheme) != 0) { 
     690        return PJSIP_ECMPSCHEME; 
     691    } 
     692     
     693    /* Content must match. */ 
     694    if(pj_stricmp(&uri1->content, &uri2->content) != 0) { 
     695        return -1; 
     696    } 
     697     
     698    /* Equal. */ 
     699    return 0; 
     700} 
     701 
     702/* Clone *: URI */ 
     703static pjsip_other_uri* other_uri_clone(pj_pool_t *pool,  
     704                                        const pjsip_other_uri *rhs)  
     705{ 
     706    pjsip_other_uri *uri = pjsip_other_uri_create(pool); 
     707    pj_strdup(pool, &uri->scheme, &rhs->scheme); 
     708    pj_strdup(pool, &uri->content, &rhs->content); 
     709 
     710    return uri; 
     711} 
     712 
Note: See TracChangeset for help on using the changeset viewer.