📄 sip_msg.c
字号:
}////////////////////////////////////////////////////////////////////////////////* * Record-Route and Route header. */static int pjsip_routing_hdr_print( pjsip_routing_hdr *r, char *buf, pj_size_t size );static pjsip_routing_hdr* pjsip_routing_hdr_clone( pj_pool_t *pool, const pjsip_routing_hdr *r );static pjsip_routing_hdr* pjsip_routing_hdr_shallow_clone( pj_pool_t *pool, const pjsip_routing_hdr *r );static pjsip_hdr_vptr routing_hdr_vptr = { (pjsip_hdr_clone_fptr) &pjsip_routing_hdr_clone, (pjsip_hdr_clone_fptr) &pjsip_routing_hdr_shallow_clone, (pjsip_hdr_print_fptr) &pjsip_routing_hdr_print,};PJ_DEF(pjsip_rr_hdr*) pjsip_rr_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_rr_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_RECORD_ROUTE, &routing_hdr_vptr); pjsip_name_addr_init(&hdr->name_addr); pj_list_init(&hdr->other_param); return hdr;}PJ_DEF(pjsip_rr_hdr*) pjsip_rr_hdr_create( pj_pool_t *pool ){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_rr_hdr)); return pjsip_rr_hdr_init(pool, mem);}PJ_DEF(pjsip_route_hdr*) pjsip_route_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_route_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_ROUTE, &routing_hdr_vptr); pjsip_name_addr_init(&hdr->name_addr); pj_list_init(&hdr->other_param); return hdr;}PJ_DEF(pjsip_route_hdr*) pjsip_route_hdr_create( pj_pool_t *pool ){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_route_hdr)); return pjsip_route_hdr_init(pool, mem);}PJ_DEF(pjsip_rr_hdr*) pjsip_routing_hdr_set_rr( pjsip_routing_hdr *hdr ){ hdr->type = PJSIP_H_RECORD_ROUTE; hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_RECORD_ROUTE]; return hdr;}PJ_DEF(pjsip_route_hdr*) pjsip_routing_hdr_set_route( pjsip_routing_hdr *hdr ){ hdr->type = PJSIP_H_ROUTE; hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_ROUTE]; return hdr;}static int pjsip_routing_hdr_print( pjsip_routing_hdr *hdr, char *buf, pj_size_t size ){ int printed; char *startbuf = buf; char *endbuf = buf + size; copy_advance(buf, hdr->name); *buf++ = ':'; *buf++ = ' '; printed = pjsip_uri_print(PJSIP_URI_IN_ROUTING_HDR, &hdr->name_addr, buf, endbuf-buf); if (printed < 1) return -1; buf += printed; printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf, &pjsip_TOKEN_SPEC, &pjsip_TOKEN_SPEC, ';'); if (printed < 0) return -1; buf += printed; return buf-startbuf;}static pjsip_routing_hdr* pjsip_routing_hdr_clone( pj_pool_t *pool, const pjsip_routing_hdr *rhs ){ pjsip_routing_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); init_hdr(hdr, rhs->type, rhs->vptr); pjsip_name_addr_init(&hdr->name_addr); pjsip_name_addr_assign(pool, &hdr->name_addr, &rhs->name_addr); pjsip_param_clone( pool, &hdr->other_param, &rhs->other_param); return hdr;}static pjsip_routing_hdr* pjsip_routing_hdr_shallow_clone( pj_pool_t *pool, const pjsip_routing_hdr *rhs ){ pjsip_routing_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); pj_memcpy(hdr, rhs, sizeof(*hdr)); pjsip_param_shallow_clone( pool, &hdr->other_param, &rhs->other_param); return hdr;}////////////////////////////////////////////////////////////////////////////////* * Require header. */PJ_DEF(pjsip_require_hdr*) pjsip_require_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_require_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_REQUIRE, &generic_array_hdr_vptr); hdr->count = 0; return hdr;}PJ_DEF(pjsip_require_hdr*) pjsip_require_hdr_create(pj_pool_t *pool){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_require_hdr)); return pjsip_require_hdr_init(pool, mem);}////////////////////////////////////////////////////////////////////////////////* * Retry-After header. */PJ_DEF(pjsip_retry_after_hdr*) pjsip_retry_after_hdr_init( pj_pool_t *pool, void *mem, int value ){ pjsip_retry_after_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_RETRY_AFTER, &generic_int_hdr_vptr); hdr->ivalue = value; return hdr;}PJ_DEF(pjsip_retry_after_hdr*) pjsip_retry_after_hdr_create(pj_pool_t *pool, int value ){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_retry_after_hdr)); return pjsip_retry_after_hdr_init(pool, mem, value );}////////////////////////////////////////////////////////////////////////////////* * Supported header. */PJ_DEF(pjsip_supported_hdr*) pjsip_supported_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_supported_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_SUPPORTED, &generic_array_hdr_vptr); hdr->count = 0; return hdr;}PJ_DEF(pjsip_supported_hdr*) pjsip_supported_hdr_create(pj_pool_t *pool){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_supported_hdr)); return pjsip_supported_hdr_init(pool, mem);}////////////////////////////////////////////////////////////////////////////////* * Unsupported header. */PJ_DEF(pjsip_unsupported_hdr*) pjsip_unsupported_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_unsupported_hdr *hdr = mem; PJ_UNUSED_ARG(pool); init_hdr(hdr, PJSIP_H_UNSUPPORTED, &generic_array_hdr_vptr); hdr->count = 0; return hdr;}PJ_DEF(pjsip_unsupported_hdr*) pjsip_unsupported_hdr_create(pj_pool_t *pool){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_unsupported_hdr)); return pjsip_unsupported_hdr_init(pool, mem);}////////////////////////////////////////////////////////////////////////////////* * Via header. */static int pjsip_via_hdr_print( pjsip_via_hdr *hdr, char *buf, pj_size_t size);static pjsip_via_hdr* pjsip_via_hdr_clone( pj_pool_t *pool, const pjsip_via_hdr *hdr);static pjsip_via_hdr* pjsip_via_hdr_shallow_clone( pj_pool_t *pool, const pjsip_via_hdr *hdr );static pjsip_hdr_vptr via_hdr_vptr = { (pjsip_hdr_clone_fptr) &pjsip_via_hdr_clone, (pjsip_hdr_clone_fptr) &pjsip_via_hdr_shallow_clone, (pjsip_hdr_print_fptr) &pjsip_via_hdr_print,};PJ_DEF(pjsip_via_hdr*) pjsip_via_hdr_init( pj_pool_t *pool, void *mem ){ pjsip_via_hdr *hdr = mem; PJ_UNUSED_ARG(pool); pj_bzero(mem, sizeof(pjsip_via_hdr)); init_hdr(hdr, PJSIP_H_VIA, &via_hdr_vptr); hdr->ttl_param = -1; hdr->rport_param = -1; pj_list_init(&hdr->other_param); return hdr;}PJ_DEF(pjsip_via_hdr*) pjsip_via_hdr_create( pj_pool_t *pool ){ void *mem = pj_pool_alloc(pool, sizeof(pjsip_via_hdr)); return pjsip_via_hdr_init(pool, mem);}static int pjsip_via_hdr_print( pjsip_via_hdr *hdr, char *buf, pj_size_t size){ int printed; char *startbuf = buf; char *endbuf = buf + size; pj_str_t sip_ver = { "SIP/2.0/", 8 }; if ((pj_ssize_t)size < hdr->name.slen + sip_ver.slen + hdr->transport.slen + hdr->sent_by.host.slen + 12) { return -1; } /* pjsip_hdr_names */ copy_advance(buf, hdr->name); *buf++ = ':'; *buf++ = ' '; /* SIP/2.0/transport host:port */ pj_memcpy(buf, sip_ver.ptr, sip_ver.slen); buf += sip_ver.slen; pj_memcpy(buf, hdr->transport.ptr, hdr->transport.slen); buf += hdr->transport.slen; *buf++ = ' '; pj_memcpy(buf, hdr->sent_by.host.ptr, hdr->sent_by.host.slen); buf += hdr->sent_by.host.slen; if (hdr->sent_by.port != 0) { *buf++ = ':'; printed = pj_utoa(hdr->sent_by.port, buf); buf += printed; } if (hdr->ttl_param >= 0) { size = endbuf-buf; if (size < 14) return -1; pj_memcpy(buf, ";ttl=", 5); printed = pj_utoa(hdr->ttl_param, buf+5); buf += printed + 5; } if (hdr->rport_param >= 0) { size = endbuf-buf; if (size < 14) return -1; pj_memcpy(buf, ";rport", 6); buf += 6; if (hdr->rport_param > 0) { *buf++ = '='; buf += pj_utoa(hdr->rport_param, buf); } } copy_advance_pair(buf, ";maddr=", 7, hdr->maddr_param); copy_advance_pair(buf, ";received=", 10, hdr->recvd_param); copy_advance_pair(buf, ";branch=", 8, hdr->branch_param); printed = pjsip_param_print_on(&hdr->other_param, buf, endbuf-buf, &pjsip_TOKEN_SPEC, &pjsip_TOKEN_SPEC, ';'); if (printed < 0) return -1; buf += printed; return buf-startbuf;}static pjsip_via_hdr* pjsip_via_hdr_clone( pj_pool_t *pool, const pjsip_via_hdr *rhs){ pjsip_via_hdr *hdr = pjsip_via_hdr_create(pool); pj_strdup(pool, &hdr->transport, &rhs->transport); pj_strdup(pool, &hdr->sent_by.host, &rhs->sent_by.host); hdr->sent_by.port = rhs->sent_by.port; hdr->ttl_param = rhs->ttl_param; hdr->rport_param = rhs->rport_param; pj_strdup(pool, &hdr->maddr_param, &rhs->maddr_param); pj_strdup(pool, &hdr->recvd_param, &rhs->recvd_param); pj_strdup(pool, &hdr->branch_param, &rhs->branch_param); pjsip_param_clone(pool, &hdr->other_param, &rhs->other_param); return hdr;}static pjsip_via_hdr* pjsip_via_hdr_shallow_clone( pj_pool_t *pool, const pjsip_via_hdr *rhs ){ pjsip_via_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); pj_memcpy(hdr, rhs, sizeof(*hdr)); pjsip_param_shallow_clone(pool, &hdr->other_param, &rhs->other_param); return hdr;}////////////////////////////////////////////////////////////////////////////////* * Warning header. */PJ_DEF(pjsip_warning_hdr*) pjsip_warning_hdr_create( pj_pool_t *pool, int code, const pj_str_t *host, const pj_str_t *text){ const pj_str_t str_warning = { "Warning", 7 }; pj_str_t hvalue; hvalue.ptr = pj_pool_alloc(pool, 10 + /* code */ host->slen + 2 + /* host */ text->slen + 2); /* text */ hvalue.slen = pj_ansi_sprintf(hvalue.ptr, "%u %.*s \"%.*s\"", code, (int)host->slen, host->ptr, (int)text->slen, text->ptr); return pjsip_generic_string_hdr_create(pool, &str_warning, &hvalue);}PJ_DEF(pjsip_warning_hdr*) pjsip_warning_hdr_create_from_status( pj_pool_t *pool, const pj_str_t *host, pj_status_t status){ char errbuf[PJ_ERR_MSG_SIZE]; pj_str_t text; text = pj_strerror(status, errbuf, sizeof(errbuf)); return pjsip_warning_hdr_create(pool, 399, host, &text);}////////////////////////////////////////////////////////////////////////////////* * Message body manipulations. */PJ_DEF(int) pjsip_print_text_body(pjsip_msg_body *msg_body, char *buf, pj_size_t size){ if (size < msg_body->len) return -1; pj_memcpy(buf, msg_body->data, msg_body->len); return msg_body->len;}PJ_DEF(void*) pjsip_clone_text_data( pj_pool_t *pool, const void *data, unsigned len){ char *newdata = ""; if (len) { newdata = pj_pool_alloc(pool, len); pj_memcpy(newdata, data, len); } return newdata;}PJ_DEF(pj_status_t) pjsip_msg_body_copy( pj_pool_t *pool, pjsip_msg_body *dst_body, const pjsip_msg_body *src_body ){ /* First check if clone_data field is initialized. */ PJ_ASSERT_RETURN( src_body->clone_data!=NULL, PJ_EINVAL ); /* Duplicate content-type */ pj_strdup(pool, &dst_body->content_type.type, &src_body->content_type.type); pj_strdup(pool, &dst_body->content_type.subtype, &src_body->content_type.subtype); pj_strdup(pool, &dst_body->content_type.param, &src_body->content_type.param); /* Duplicate data. */ dst_body->data = (*src_body->clone_data)(pool, src_body->data, src_body->len ); /* Length. */ dst_body->len = src_body->len; /* Function pointers. */ dst_body->print_body = src_body->print_body; dst_body->clone_data = src_body->clone_data; return PJ_SUCCESS;}PJ_DEF(pjsip_msg_body*) pjsip_msg_body_clone( pj_pool_t *pool, const pjsip_msg_body *body ){ pjsip_msg_body *new_body; pj_status_t status; new_body = pj_pool_alloc(pool, sizeof(pjsip_msg_body)); PJ_ASSERT_RETURN(new_body, NULL); status = pjsip_msg_body_copy(pool, new_body, body); return (status==PJ_SUCCESS) ? new_body : NULL;}PJ_DEF(pjsip_msg_body*) pjsip_msg_body_create( pj_pool_t *pool, const pj_str_t *type, const pj_str_t *subtype, const pj_str_t *text ){ pjsip_msg_body *body; PJ_ASSERT_RETURN(pool && type && subtype && text, NULL); body = pj_pool_zalloc(pool, sizeof(pjsip_msg_body)); PJ_ASSERT_RETURN(body != NULL, NULL); pj_strdup(pool, &body->content_type.type, type); pj_strdup(pool, &body->content_type.subtype, subtype); body->content_type.param.slen = 0; body->data = pj_pool_alloc(pool, text->slen); pj_memcpy(body->data, text->ptr, text->slen); body->len = text->slen; body->clone_data = &pjsip_clone_text_data; body->print_body = &pjsip_print_text_body; return body;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -