⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sip_parser.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    parse_hdr_end(scanner);}/* Parse generic string header. */static void parse_generic_string_hdr( pjsip_generic_string_hdr *hdr,				      pj_scanner *scanner ){    if (pj_cis_match(&pjsip_NOT_NEWLINE, *scanner->curptr))	pj_scan_get( scanner, &pjsip_NOT_NEWLINE, &hdr->hvalue);    else	hdr->hvalue.slen = 0;    parse_hdr_end(scanner);}/* Parse generic integer header. */static void parse_generic_int_hdr( pjsip_generic_int_hdr *hdr,				   pj_scanner *scanner ){    pj_str_t tmp;    pj_scan_get( scanner, &pjsip_DIGIT_SPEC, &tmp);    hdr->ivalue = pj_strtoul(&tmp);    parse_hdr_end(scanner);}/* Parse Accept header. */static pjsip_hdr* parse_hdr_accept(pjsip_parse_ctx *ctx){    pjsip_accept_hdr *accept = pjsip_accept_hdr_create(ctx->pool);    parse_generic_array_hdr(accept, ctx->scanner);    return (pjsip_hdr*)accept;}/* Parse Allow header. */static pjsip_hdr* parse_hdr_allow(pjsip_parse_ctx *ctx){    pjsip_allow_hdr *allow = pjsip_allow_hdr_create(ctx->pool);    parse_generic_array_hdr(allow, ctx->scanner);    return (pjsip_hdr*)allow;}/* Parse Call-ID header. */static pjsip_hdr* parse_hdr_call_id(pjsip_parse_ctx *ctx){    pjsip_cid_hdr *hdr = pjsip_cid_hdr_create(ctx->pool);    pj_scan_get( ctx->scanner, &pjsip_NOT_NEWLINE, &hdr->id);    parse_hdr_end(ctx->scanner);    if (ctx->rdata)        ctx->rdata->msg_info.cid = hdr;    return (pjsip_hdr*)hdr;}/* Parse and interpret Contact param. */static void int_parse_contact_param( pjsip_contact_hdr *hdr, 				     pj_scanner *scanner,				     pj_pool_t *pool){    while ( *scanner->curptr == ';' ) {	pj_str_t pname, pvalue;	int_parse_param( scanner, pool, &pname, &pvalue, 0);	if (!parser_stricmp(pname, pjsip_Q_STR) && pvalue.slen) {	    char *dot_pos = pj_memchr(pvalue.ptr, '.', pvalue.slen);	    if (!dot_pos) {		hdr->q1000 = pj_strtoul(&pvalue);	    } else {		pvalue.slen = (pvalue.ptr+pvalue.slen) - (dot_pos+1);		pvalue.ptr = dot_pos + 1;		hdr->q1000 = pj_strtoul_mindigit(&pvalue, 3);	    }    	} else if (!parser_stricmp(pname, pjsip_EXPIRES_STR) && pvalue.slen) {	    hdr->expires = pj_strtoul(&pvalue);	} else {	    pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param));	    p->name = pname;	    p->value = pvalue;	    pj_list_insert_before(&hdr->other_param, p);	}    }}/* Parse Contact header. */static pjsip_hdr* parse_hdr_contact( pjsip_parse_ctx *ctx ){    pjsip_contact_hdr *first = NULL;    pj_scanner *scanner = ctx->scanner;        do {	pjsip_contact_hdr *hdr = pjsip_contact_hdr_create(ctx->pool);	if (first == NULL)	    first = hdr;	else	    pj_list_insert_before(first, hdr);	if (*scanner->curptr == '*') {	    pj_scan_get_char(scanner);	    hdr->star = 1;	} else {	    hdr->star = 0;	    hdr->uri = int_parse_uri_or_name_addr(scanner, ctx->pool,                                                   PJSIP_PARSE_URI_AS_NAMEADDR |						  PJSIP_PARSE_URI_IN_FROM_TO_HDR);	    int_parse_contact_param(hdr, scanner, ctx->pool);	}	if (*scanner->curptr != ',')	    break;	pj_scan_get_char(scanner);    } while (1);    parse_hdr_end(scanner);    return (pjsip_hdr*)first;}/* Parse Content-Length header. */static pjsip_hdr* parse_hdr_content_len( pjsip_parse_ctx *ctx ){    pj_str_t digit;    pjsip_clen_hdr *hdr;    hdr = pjsip_clen_hdr_create(ctx->pool);    pj_scan_get(ctx->scanner, &pjsip_DIGIT_SPEC, &digit);    hdr->len = pj_strtoul(&digit);    parse_hdr_end(ctx->scanner);    if (ctx->rdata)        ctx->rdata->msg_info.clen = hdr;    return (pjsip_hdr*)hdr;}/* Parse Content-Type header. */static pjsip_hdr* parse_hdr_content_type( pjsip_parse_ctx *ctx ){    pjsip_ctype_hdr *hdr;    pj_scanner *scanner = ctx->scanner;    hdr = pjsip_ctype_hdr_create(ctx->pool);        /* Parse media type and subtype. */    pj_scan_get(scanner, &pjsip_TOKEN_SPEC, &hdr->media.type);    pj_scan_get_char(scanner);    pj_scan_get(scanner, &pjsip_TOKEN_SPEC, &hdr->media.subtype);    /* Parse media parameters */    while (*scanner->curptr == ';') {	pj_str_t pname, pvalue;	int_parse_param(scanner, ctx->pool, &pname, &pvalue, 0);	concat_param(&hdr->media.param, ctx->pool, &pname, &pvalue);    }    parse_hdr_end(ctx->scanner);    if (ctx->rdata)        ctx->rdata->msg_info.ctype = hdr;    return (pjsip_hdr*)hdr;}/* Parse CSeq header. */static pjsip_hdr* parse_hdr_cseq( pjsip_parse_ctx *ctx ){    pj_str_t cseq, method;    pjsip_cseq_hdr *hdr;    hdr = pjsip_cseq_hdr_create(ctx->pool);    pj_scan_get( ctx->scanner, &pjsip_DIGIT_SPEC, &cseq);    hdr->cseq = pj_strtoul(&cseq);    pj_scan_get( ctx->scanner, &pjsip_TOKEN_SPEC, &method);    pjsip_method_init_np(&hdr->method, &method);    parse_hdr_end( ctx->scanner );    if (ctx->rdata)        ctx->rdata->msg_info.cseq = hdr;    return (pjsip_hdr*)hdr;}/* Parse Expires header. */static pjsip_hdr* parse_hdr_expires(pjsip_parse_ctx *ctx){    pjsip_expires_hdr *hdr = pjsip_expires_hdr_create(ctx->pool, 0);    parse_generic_int_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Parse From: or To: header. */static void parse_hdr_fromto( pj_scanner *scanner, 			      pj_pool_t *pool, 			      pjsip_from_hdr *hdr){    hdr->uri = int_parse_uri_or_name_addr(scanner, pool, 					  PJSIP_PARSE_URI_AS_NAMEADDR |					  PJSIP_PARSE_URI_IN_FROM_TO_HDR);    while ( *scanner->curptr == ';' ) {	pj_str_t pname, pvalue;	int_parse_param( scanner, pool, &pname, &pvalue, 0);	if (!parser_stricmp(pname, pjsip_TAG_STR)) {	    hdr->tag = pvalue;	    	} else {	    pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param));	    p->name = pname;	    p->value = pvalue;	    pj_list_insert_before(&hdr->other_param, p);	}    }    parse_hdr_end(scanner);}/* Parse From: header. */static pjsip_hdr* parse_hdr_from( pjsip_parse_ctx *ctx ){    pjsip_from_hdr *hdr = pjsip_from_hdr_create(ctx->pool);    parse_hdr_fromto(ctx->scanner, ctx->pool, hdr);    if (ctx->rdata)        ctx->rdata->msg_info.from = hdr;    return (pjsip_hdr*)hdr;}/* Parse Require: header. */static pjsip_hdr* parse_hdr_require( pjsip_parse_ctx *ctx ){    pjsip_require_hdr *hdr = pjsip_require_hdr_create(ctx->pool);    parse_generic_array_hdr(hdr, ctx->scanner);    if (ctx->rdata && ctx->rdata->msg_info.require == NULL)        ctx->rdata->msg_info.require = hdr;    return (pjsip_hdr*)hdr;}/* Parse Retry-After: header. */static pjsip_hdr* parse_hdr_retry_after(pjsip_parse_ctx *ctx){    pjsip_retry_after_hdr *hdr;    hdr = pjsip_retry_after_hdr_create(ctx->pool, 0);    parse_generic_int_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Parse Supported: header. */static pjsip_hdr* parse_hdr_supported(pjsip_parse_ctx *ctx){    pjsip_supported_hdr *hdr = pjsip_supported_hdr_create(ctx->pool);    parse_generic_array_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Parse To: header. */static pjsip_hdr* parse_hdr_to( pjsip_parse_ctx *ctx ){    pjsip_to_hdr *hdr = pjsip_to_hdr_create(ctx->pool);    parse_hdr_fromto(ctx->scanner, ctx->pool, hdr);    if (ctx->rdata)        ctx->rdata->msg_info.to = hdr;    return (pjsip_hdr*)hdr;}/* Parse Unsupported: header. */static pjsip_hdr* parse_hdr_unsupported(pjsip_parse_ctx *ctx){    pjsip_unsupported_hdr *hdr = pjsip_unsupported_hdr_create(ctx->pool);    parse_generic_array_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Parse and interpret Via parameters. */static void int_parse_via_param( pjsip_via_hdr *hdr, pj_scanner *scanner,				 pj_pool_t *pool){    while ( *scanner->curptr == ';' ) {	pj_str_t pname, pvalue;	int_parse_param( scanner, pool, &pname, &pvalue, 0);	if (!parser_stricmp(pname, pjsip_BRANCH_STR) && pvalue.slen) {	    hdr->branch_param = pvalue;	} else if (!parser_stricmp(pname, pjsip_TTL_STR) && pvalue.slen) {	    hdr->ttl_param = pj_strtoul(&pvalue);	    	} else if (!parser_stricmp(pname, pjsip_MADDR_STR) && pvalue.slen) {	    hdr->maddr_param = pvalue;	} else if (!parser_stricmp(pname, pjsip_RECEIVED_STR) && pvalue.slen) {	    hdr->recvd_param = pvalue;	} else if (!parser_stricmp(pname, pjsip_RPORT_STR)) {	    if (pvalue.slen)		hdr->rport_param = pj_strtoul(&pvalue);	    else		hdr->rport_param = 0;	} else {	    pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param));	    p->name = pname;	    p->value = pvalue;	    pj_list_insert_before(&hdr->other_param, p);	}    }}/* Parse Max-Forwards header. */static pjsip_hdr* parse_hdr_max_forwards( pjsip_parse_ctx *ctx ){    pjsip_max_fwd_hdr *hdr;    hdr = pjsip_max_fwd_hdr_create(ctx->pool, 0);    parse_generic_int_hdr(hdr, ctx->scanner);    if (ctx->rdata)        ctx->rdata->msg_info.max_fwd = hdr;    return (pjsip_hdr*)hdr;}/* Parse Min-Expires header. */static pjsip_hdr* parse_hdr_min_expires(pjsip_parse_ctx *ctx){    pjsip_min_expires_hdr *hdr;    hdr = pjsip_min_expires_hdr_create(ctx->pool, 0);    parse_generic_int_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Parse Route: or Record-Route: header. */static void parse_hdr_rr_route( pj_scanner *scanner, pj_pool_t *pool,				pjsip_routing_hdr *hdr ){    pjsip_name_addr *temp=int_parse_name_addr(scanner, pool);    pj_memcpy(&hdr->name_addr, temp, sizeof(*temp));    while (*scanner->curptr == ';') {	pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param));	int_parse_param(scanner, pool, &p->name, &p->value, 0);	pj_list_insert_before(&hdr->other_param, p);    }}/* Parse Record-Route header. */static pjsip_hdr* parse_hdr_rr( pjsip_parse_ctx *ctx){    pjsip_rr_hdr *first = NULL;    pj_scanner *scanner = ctx->scanner;    do {	pjsip_rr_hdr *hdr = pjsip_rr_hdr_create(ctx->pool);	if (!first) {	    first = hdr;	} else {	    pj_list_insert_before(first, hdr);	}	parse_hdr_rr_route(scanner, ctx->pool, hdr);	if (*scanner->curptr == ',') {	    pj_scan_get_char(scanner);	} else {	    break;	}    } while (1);    parse_hdr_end(scanner);    if (ctx->rdata && ctx->rdata->msg_info.record_route==NULL)        ctx->rdata->msg_info.record_route = first;    return (pjsip_hdr*)first;}/* Parse Route: header. */static pjsip_hdr* parse_hdr_route( pjsip_parse_ctx *ctx ){    pjsip_route_hdr *first = NULL;    pj_scanner *scanner = ctx->scanner;    do {	pjsip_route_hdr *hdr = pjsip_route_hdr_create(ctx->pool);	if (!first) {	    first = hdr;	} else {	    pj_list_insert_before(first, hdr);	}	parse_hdr_rr_route(scanner, ctx->pool, hdr);	if (*scanner->curptr == ',') {	    pj_scan_get_char(scanner);	} else {	    break;	}    } while (1);    parse_hdr_end(scanner);    if (ctx->rdata && ctx->rdata->msg_info.route==NULL)        ctx->rdata->msg_info.route = first;    return (pjsip_hdr*)first;}/* Parse Via: header. */static pjsip_hdr* parse_hdr_via( pjsip_parse_ctx *ctx ){    pjsip_via_hdr *first = NULL;    pj_scanner *scanner = ctx->scanner;    do {	pjsip_via_hdr *hdr = pjsip_via_hdr_create(ctx->pool);	if (!first)	    first = hdr;	else	    pj_list_insert_before(first, hdr);	if (pj_scan_stricmp_alnum( scanner, PJSIP_VERSION "/", 8) != 0)	    PJ_THROW(PJSIP_SYN_ERR_EXCEPTION);	pj_scan_advance_n( scanner, 8, 1);	pj_scan_get( scanner, &pjsip_TOKEN_SPEC, &hdr->transport);	pj_scan_get( scanner, &pjsip_HOST_SPEC, &hdr->sent_by.host);	if (*scanner->curptr==':') {	    pj_str_t digit;	    pj_scan_get_char(scanner);	    pj_scan_get(scanner, &pjsip_DIGIT_SPEC, &digit);	    hdr->sent_by.port = pj_strtoul(&digit);	}		int_parse_via_param(hdr, scanner, ctx->pool);	if (*scanner->curptr == '(') {	    pj_scan_get_char(scanner);	    pj_scan_get_until_ch( scanner, ')', &hdr->comment);	    pj_scan_get_char( scanner );	}	if (*scanner->curptr != ',')	    break;	pj_scan_get_char(scanner);    } while (1);    parse_hdr_end(scanner);    if (ctx->rdata && ctx->rdata->msg_info.via == NULL)        ctx->rdata->msg_info.via = first;    return (pjsip_hdr*)first;}/* Parse generic header. */static pjsip_hdr* parse_hdr_generic_string( pjsip_parse_ctx *ctx ){    pjsip_generic_string_hdr *hdr;    hdr = pjsip_generic_string_hdr_create(ctx->pool, NULL, NULL);    parse_generic_string_hdr(hdr, ctx->scanner);    return (pjsip_hdr*)hdr;}/* Public function to parse a header value. */PJ_DEF(void*) pjsip_parse_hdr( pj_pool_t *pool, const pj_str_t *hname,			       char *buf, pj_size_t size, int *parsed_len ){    pj_scanner scanner;    pjsip_hdr *hdr = NULL;    pjsip_parse_ctx context;    PJ_USE_EXCEPTION;    pj_scan_init(&scanner, buf, size, PJ_SCAN_AUTOSKIP_WS_HEADER,                  &on_syntax_error);    context.scanner = &scanner;    context.pool = pool;    context.rdata = NULL;    PJ_TRY {	pjsip_parse_hdr_func *handler = find_handler(hname);	if (handler) {	    hdr = (*handler)(&context);	} else {	    hdr = parse_hdr_generic_string(&context);	    hdr->type = PJSIP_H_OTHER;	    pj_strdup(pool, &hdr->name, hname);	    hdr->sname = hdr->name;	}    }     PJ_CATCH_ANY {	hdr = NULL;    }    PJ_END    if (parsed_len) {	*parsed_len = (scanner.curptr - scanner.begin);    }    pj_scan_fini(&scanner);    return hdr;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -