diff options
author | Benny Prijono <bennylp@teluu.com> | 2010-08-01 09:24:58 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2010-08-01 09:24:58 +0000 |
commit | 42cd3a38756cc1baef47cd808273435518c56401 (patch) | |
tree | 2092f37d8bcc0bb0cb170a08a79a4d382fb92fc2 /pjsip/src/pjsip/sip_msg.c | |
parent | 311528e2bc573606fb611175fbd7b981780664e2 (diff) |
Re #1070 (support for multipart bodies): modified the param field of pjsip_media_type from a simple string to pjsip_param, to support a more complex use of this field
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3241 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsip/sip_msg.c')
-rw-r--r-- | pjsip/src/pjsip/sip_msg.c | 113 |
1 files changed, 91 insertions, 22 deletions
diff --git a/pjsip/src/pjsip/sip_msg.c b/pjsip/src/pjsip/sip_msg.c index fe86362e..4c6b376c 100644 --- a/pjsip/src/pjsip/sip_msg.c +++ b/pjsip/src/pjsip/sip_msg.c @@ -22,6 +22,7 @@ #include <pjsip/print_util.h> #include <pjsip/sip_errno.h> #include <pj/ctype.h> +#include <pj/guid.h> #include <pj/string.h> #include <pj/pool.h> #include <pj/assert.h> @@ -145,7 +146,8 @@ const pjsip_hdr_name_info_t pjsip_hdr_names[] = pj_bool_t pjsip_use_compact_form = PJSIP_ENCODE_SHORT_HNAME; static pj_str_t status_phrase[710]; -static int print_media_type(char *buf, const pjsip_media_type *media); +static int print_media_type(char *buf, unsigned len, + const pjsip_media_type *media); static int init_status_phrase() { @@ -489,14 +491,12 @@ PJ_DEF(pj_ssize_t) pjsip_msg_print( const pjsip_msg *msg, } /* Add Content-Type header. */ - if ( (end-p) < 24 + media->type.slen + media->subtype.slen + - media->param.slen) - { + if ( (end-p) < 24 + media->type.slen + media->subtype.slen) { return -1; } pj_memcpy(p, ctype_hdr.ptr, ctype_hdr.slen); p += ctype_hdr.slen; - p += print_media_type(p, media); + p += print_media_type(p, end-p, media); *p++ = '\r'; *p++ = '\n'; @@ -602,6 +602,65 @@ PJ_DEF(const pj_str_t*) pjsip_get_status_text(int code) /* * Media type */ +/* + * Init media type. + */ +PJ_DEF(void) pjsip_media_type_init( pjsip_media_type *mt, + pj_str_t *type, + pj_str_t *subtype) +{ + pj_bzero(mt, sizeof(*mt)); + pj_list_init(&mt->param); + if (type) + mt->type = *type; + if (subtype) + mt->subtype = *subtype; +} + +PJ_DEF(void) pjsip_media_type_init2( pjsip_media_type *mt, + char *type, + char *subtype) +{ + pj_str_t s_type, s_subtype; + + if (type) { + s_type = pj_str(type); + } else { + s_type.ptr = NULL; + s_type.slen = 0; + } + + if (subtype) { + s_subtype = pj_str(subtype); + } else { + s_subtype.ptr = NULL; + s_subtype.slen = 0; + } + + pjsip_media_type_init(mt, &s_type, &s_subtype); +} + +/* + * Compare two media types. + */ +PJ_DEF(int) pjsip_media_type_cmp( const pjsip_media_type *mt1, + const pjsip_media_type *mt2) +{ + int rc; + + PJ_ASSERT_RETURN(mt1 && mt2, 1); + + rc = pj_stricmp(&mt1->type, &mt2->type); + if (rc) return rc; + + rc = pj_stricmp(&mt1->subtype, &mt2->subtype); + if (rc) return rc; + + rc = pjsip_param_cmp(&mt1->param, &mt2->param, 0); + + return rc; +} + PJ_DEF(void) pjsip_media_type_cp( pj_pool_t *pool, pjsip_media_type *dst, const pjsip_media_type *src) @@ -609,7 +668,7 @@ PJ_DEF(void) pjsip_media_type_cp( pj_pool_t *pool, PJ_ASSERT_ON_FAIL(pool && dst && src, return); pj_strdup(pool, &dst->type, &src->type); pj_strdup(pool, &dst->subtype, &src->subtype); - pj_strdup(pool, &dst->param, &src->param); + pjsip_param_clone(pool, &dst->param, &src->param); } /////////////////////////////////////////////////////////////////////////////// @@ -1263,6 +1322,7 @@ PJ_DEF(pjsip_ctype_hdr*) pjsip_ctype_hdr_init( pj_pool_t *pool, pj_bzero(mem, sizeof(pjsip_ctype_hdr)); init_hdr(hdr, PJSIP_H_CONTENT_TYPE, &ctype_hdr_vptr); + pj_list_init(&hdr->media.param); return hdr; } @@ -1273,9 +1333,12 @@ PJ_DEF(pjsip_ctype_hdr*) pjsip_ctype_hdr_create( pj_pool_t *pool ) return pjsip_ctype_hdr_init(pool, mem); } -static int print_media_type(char *buf, const pjsip_media_type *media) +static int print_media_type(char *buf, unsigned len, + const pjsip_media_type *media) { char *p = buf; + pj_ssize_t printed; + const pjsip_parser_const_t *pc; pj_memcpy(p, media->type.ptr, media->type.slen); p += media->type.slen; @@ -1283,14 +1346,25 @@ static int print_media_type(char *buf, const pjsip_media_type *media) pj_memcpy(p, media->subtype.ptr, media->subtype.slen); p += media->subtype.slen; - if (media->param.slen) { - pj_memcpy(p, media->param.ptr, media->param.slen); - p += media->param.slen; - } + pc = pjsip_parser_const(); + printed = pjsip_param_print_on(&media->param, p, buf+len-p, + &pc->pjsip_TOKEN_SPEC, + &pc->pjsip_TOKEN_SPEC, ';'); + if (printed < 0) + return -1; + + p += printed; return p-buf; } + +PJ_DEF(int) pjsip_media_type_print(char *buf, unsigned len, + const pjsip_media_type *media) +{ + return print_media_type(buf, len, media); +} + static int pjsip_ctype_hdr_print( pjsip_ctype_hdr *hdr, char *buf, pj_size_t size) { @@ -1299,8 +1373,7 @@ static int pjsip_ctype_hdr_print( pjsip_ctype_hdr *hdr, const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; if ((pj_ssize_t)size < hname->slen + - hdr->media.type.slen + hdr->media.subtype.slen + - hdr->media.param.slen + 8) + hdr->media.type.slen + hdr->media.subtype.slen + 8) { return -1; } @@ -1310,7 +1383,7 @@ static int pjsip_ctype_hdr_print( pjsip_ctype_hdr *hdr, *p++ = ':'; *p++ = ' '; - len = print_media_type(p, &hdr->media); + len = print_media_type(p, buf+size-p, &hdr->media); p += len; *p = '\0'; @@ -1323,7 +1396,7 @@ static pjsip_ctype_hdr* pjsip_ctype_hdr_clone( pj_pool_t *pool, pjsip_ctype_hdr *hdr = pjsip_ctype_hdr_create(pool); pj_strdup(pool, &hdr->media.type, &rhs->media.type); pj_strdup(pool, &hdr->media.subtype, &rhs->media.subtype); - pj_strdup(pool, &hdr->media.param, &rhs->media.param); + pjsip_param_clone(pool, &hdr->media.param, &rhs->media.param); return hdr; } @@ -2078,12 +2151,8 @@ PJ_DEF(pj_status_t) pjsip_msg_body_copy( pj_pool_t *pool, 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); + pjsip_media_type_cp(pool, &dst_body->content_type, + &src_body->content_type); /* Duplicate data. */ dst_body->data = (*src_body->clone_data)(pool, src_body->data, @@ -2129,7 +2198,7 @@ PJ_DEF(pjsip_msg_body*) pjsip_msg_body_create( pj_pool_t *pool, pj_strdup(pool, &body->content_type.type, type); pj_strdup(pool, &body->content_type.subtype, subtype); - body->content_type.param.slen = 0; + pj_list_init(&body->content_type.param); body->data = pj_pool_alloc(pool, text->slen); pj_memcpy(body->data, text->ptr, text->slen); |