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

📄 sdp.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 4 页
字号:
  c->c_next = NULL;  STR_DUP(p, c, src, c_address);  assert((size_t)(p - *pp) == connection_xtra(src));  *pp = p;  return c;}static size_t bandwidth_xtra(sdp_bandwidth_t const *b){  size_t rv = sizeof(*b);  STR_XTRA(rv, b->b_modifier_name);  return rv;}staticsdp_bandwidth_t *bandwidth_dup(char **pp, sdp_bandwidth_t const *src){  char *p;  sdp_bandwidth_t *b;  p = *pp;  STRUCT_DUP(p, b, src);  b->b_next = NULL;  STR_DUP(p, b, src, b_modifier_name);  assert((size_t)(p - *pp) == bandwidth_xtra(src));  *pp = p;  return b;}static size_t time_xtra(sdp_time_t const *t){  size_t rv = sizeof(*t);  PTR_XTRA(rv, t->t_repeat, repeat_xtra);  PTR_XTRA(rv, t->t_zone, zone_xtra);  return rv;}staticsdp_time_t *time_dup(char **pp, sdp_time_t const *src){  char *p;  sdp_time_t *t;  p = *pp;  STRUCT_DUP(p, t, src);  t->t_next = NULL;  PTR_DUP(p, t, src, t_repeat, repeat_dup);  PTR_DUP(p, t, src, t_zone, zone_dup);  assert((size_t)(p - *pp) == time_xtra(src));  *pp = p;  return t;}static size_t repeat_xtra(sdp_repeat_t const *r){  return (size_t)r->r_size;}staticsdp_repeat_t *repeat_dup(char **pp, sdp_repeat_t const *src){  char *p;  sdp_repeat_t *r;  p = *pp;  STRUCT_DUP2(p, r, src);  assert((size_t)(p - *pp) == repeat_xtra(src));  *pp = p;  return r;}static size_t zone_xtra(sdp_zone_t const *z){  return z->z_size;}staticsdp_zone_t *zone_dup(char **pp, sdp_zone_t const *src){  char *p;  sdp_zone_t *z;  p = *pp;  STRUCT_DUP2(p, z, src);  assert((size_t)(p - *pp) == zone_xtra(src));  *pp = p;  return z;}static size_t key_xtra(sdp_key_t const *k){  size_t rv = sizeof(*k);  STR_XTRA(rv, k->k_method_name);  STR_XTRA(rv, k->k_material);  return rv;}staticsdp_key_t *key_dup(char **pp, sdp_key_t const *src){  char *p;  sdp_key_t *k;  p = *pp;  STRUCT_DUP(p, k, src);  STR_DUP(p, k, src, k_method_name);  STR_DUP(p, k, src, k_material);  assert((size_t)(p - *pp) == key_xtra(src));  *pp = p;  return k;}static size_t attribute_xtra(sdp_attribute_t const *a){  size_t rv = sizeof(*a);  STR_XTRA(rv, a->a_name);  STR_XTRA(rv, a->a_value);  return rv;}staticsdp_attribute_t *attribute_dup(char **pp, sdp_attribute_t const *src){  char *p;  sdp_attribute_t *a;  p = *pp;  STRUCT_DUP(p, a, src);  a->a_next = NULL;  STR_DUP(p, a, src, a_name);  STR_DUP(p, a, src, a_value);  assert((size_t)(p - *pp) == attribute_xtra(src));  *pp = p;  return a;}static size_t media_xtra(sdp_media_t const *m){  size_t rv = sizeof(*m);  STR_XTRA(rv, m->m_type_name);  STR_XTRA(rv, m->m_proto_name);  LST_XTRA(rv, m->m_format, list_xtra);  LST_XTRA(rv, m->m_rtpmaps, rtpmap_xtra);  STR_XTRA(rv, m->m_information);  LST_XTRA(rv, m->m_connections, connection_xtra);  LST_XTRA(rv, m->m_bandwidths, bandwidth_xtra);  PTR_XTRA(rv, m->m_key, key_xtra);  LST_XTRA(rv, m->m_attributes, attribute_xtra);    return rv;}staticsdp_media_t *media_dup(char **pp, 		       sdp_media_t const *src,		       sdp_session_t *sdp){  char *p;  sdp_media_t *m;  p = *pp;  STRUCT_DUP(p, m, src);  m->m_next = NULL;  STR_DUP(p, m, src, m_type_name);  STR_DUP(p, m, src, m_proto_name);  LST_DUP(p, m, src, m_format, list_dup);  LST_DUP(p, m, src, m_rtpmaps, rtpmap_dup);  STR_DUP(p, m, src, m_information);  LST_DUP(p, m, src, m_connections, connection_dup);  LST_DUP(p, m, src, m_bandwidths, bandwidth_dup);  PTR_DUP(p, m, src, m_key, key_dup);  LST_DUP(p, m, src, m_attributes, attribute_dup);  /* note! we must not implicitly use 'src->m_session' as it            might point to a temporary session */  m->m_session = sdp;      m->m_rejected = src->m_rejected;   m->m_mode = src->m_mode;  assert((size_t)(p - *pp) == media_xtra(src));  *pp = p;  return m;}#ifdef nomorestaticint media_xtra_ex(sdp_media_t const *m, sdp_connection_t const *c){  int rv = 0;  for (; m; m = m->m_next) {    rv += STRUCT_ALIGN(rv);    rv += sizeof(*m);    STR_XTRA(rv, m->m_type_name);    STR_XTRA(rv, m->m_proto_name);    LST_XTRA(rv, m->m_format, list_xtra);    LST_XTRA(rv, m->m_rtpmaps, rtpmap_xtra);    STR_XTRA(rv, m->m_information);    if (c != m->m_connections)      LST_XTRA(rv, m->m_connections, connection_xtra);    LST_XTRA(rv, m->m_bandwidths, bandwidth_xtra);    PTR_XTRA(rv, m->m_key, key_xtra);    LST_XTRA(rv, m->m_attributes, attribute_xtra);  }  return rv;}staticsdp_media_t *media_dup_ex(char **pp, 			  sdp_media_t const *src,			  sdp_session_t *sdp,			  sdp_connection_t *dst_c,			  sdp_connection_t const *src_c){  char *p;  sdp_media_t *retval = NULL, *m, **mm = &retval;  int xtra = media_xtra_ex(src, src_c);  p = *pp;  for (; src; src = src->m_next) {    p += STRUCT_ALIGN(p);    STRUCT_DUP(p, m, src);    m->m_next = NULL;    STR_DUP(p, m, src, m_type_name);    STR_DUP(p, m, src, m_proto_name);    LST_DUP(p, m, src, m_format, list_dup);    LST_DUP(p, m, src, m_rtpmaps, rtpmap_dup);    STR_DUP(p, m, src, m_information);    if (src_c != src->m_connections)      LST_DUP(p, m, src, m_connections, connection_dup);    else      m->m_connections = dst_c;    LST_DUP(p, m, src, m_bandwidths, bandwidth_dup);    PTR_DUP(p, m, src, m_key, key_dup);    LST_DUP(p, m, src, m_attributes, attribute_dup);        /* note! we must not implicitly use 'src->m_session' as it        might point to a temporary session */    m->m_session = sdp;        m->m_rejected = src->m_rejected;     m->m_mode = src->m_mode;    assert(m);    *mm = m; mm = &m->m_next;  }  assert(p - *pp == xtra);  *pp = p;  return retval;}#endifstatic size_t media_xtra_all(sdp_media_t const *m){  size_t rv = 0;  for (; m; m = m->m_next) {    rv += STRUCT_ALIGN(rv);    rv += media_xtra(m);  }  return rv;}staticsdp_media_t *media_dup_all(char **pp, 			   sdp_media_t const *src,			   sdp_session_t *sdp){  char *p;  sdp_media_t *retval = NULL, *m, **mm = &retval;  p = *pp;  for (; src; src = src->m_next) {    p += STRUCT_ALIGN(p);    m = media_dup(&p, src, sdp);    assert(m);    *mm = m; mm = &m->m_next;  }  *pp = p;  return retval;}static size_t list_xtra(sdp_list_t const *l){  size_t rv = sizeof(*l);  rv += strlen(l->l_text) + 1;  return rv;}staticsdp_list_t *list_dup(char **pp, sdp_list_t const *src){  char *p;  sdp_list_t *l;  p = *pp;   STRUCT_DUP(p, l, src);  l->l_next = NULL;  STR_DUP(p, l, src, l_text);  assert((size_t)(p - *pp) == list_xtra(src));  *pp = p;  return l;}static size_t rtpmap_xtra(sdp_rtpmap_t const *rm){  size_t rv = sizeof(*rm);  STR_XTRA(rv, rm->rm_encoding);  STR_XTRA(rv, rm->rm_params);  STR_XTRA(rv, rm->rm_fmtp);  return rv;}staticsdp_rtpmap_t *rtpmap_dup(char **pp, sdp_rtpmap_t const *src){  char *p;  sdp_rtpmap_t *rm;  p = *pp;   STRUCT_DUP(p, rm, src);  rm->rm_next = NULL;  STR_DUP(p, rm, src, rm_encoding);  STR_DUP(p, rm, src, rm_params);  STR_DUP(p, rm, src, rm_fmtp);  assert((size_t)(p - *pp) == rtpmap_xtra(src));  *pp = p;  return rm;}/** Return total size of a list, including size of all nodes */static size_t list_xtra_all(xtra_f *xtra, void const *v){  size_t rv = 0;  sdp_list_t const *l;  for (l = v; l; l = l->l_next) {    rv += STRUCT_ALIGN(rv);    rv += xtra(l);  }  return rv;}staticvoid *list_dup_all(dup_f *dup, char **pp, void const *vsrc){  char *p;  sdp_list_t const *src;  sdp_list_t *retval = NULL, *l, **ll = &retval;  p = *pp;  for (src = vsrc; src; src = src->l_next) {    p += STRUCT_ALIGN(p);    l = dup(&p, src);    assert(l);    *ll = l; ll = &l->l_next;  }  *pp = p;  return retval;}#if 0static size_t XXX_xtra(sdp_XXX_t const *YYY){  size_t rv = sizeof(*YYY);  rv += strlen(YYY->YYY_encoding) + 1;  if (YYY->YYY_params);    rv += strlen(YYY->YYY_params) + 1;  return rv;}staticsdp_XXX_t *XXX_dup(char **pp, sdp_XXX_t const *src){  char *p;  sdp_XXX_t *YYY;  p = *pp; ASSERT_STRUCT_ALIGN(p);  YYY = memcpy(p, src, src->YYY_size);  p += src->YYY_size;  YYY->YYY_next = NULL;  ZZZ  *pp = p;  return YYY;}#endifstatic size_t session_xtra(sdp_session_t const *sdp){  size_t rv = sizeof(*sdp);  PTR_XTRA(rv, sdp->sdp_origin, origin_xtra);  STR_XTRA(rv, sdp->sdp_subject);  STR_XTRA(rv, sdp->sdp_information);  STR_XTRA(rv, sdp->sdp_uri);  LST_XTRA(rv, sdp->sdp_emails, list_xtra);  LST_XTRA(rv, sdp->sdp_phones, list_xtra);  LST_XTRA(rv, sdp->sdp_connection, connection_xtra);  LST_XTRA(rv, sdp->sdp_bandwidths, bandwidth_xtra);  LST_XTRA(rv, sdp->sdp_time, time_xtra);  PTR_XTRA(rv, sdp->sdp_key, key_xtra);  LST_XTRA(rv, sdp->sdp_attributes, attribute_xtra);  STR_XTRA(rv, sdp->sdp_charset);  MED_XTRA_ALL(rv, sdp->sdp_media);  return rv;}staticsdp_session_t *session_dup(char **pp, sdp_session_t const *src){  char *p;  sdp_session_t *sdp;  p = *pp;   STRUCT_DUP(p, sdp, src);  sdp->sdp_next = NULL;  PTR_DUP(p, sdp, src, sdp_origin, origin_dup);  STR_DUP(p, sdp, src, sdp_subject);  STR_DUP(p, sdp, src, sdp_information);  STR_DUP(p, sdp, src, sdp_uri);  LST_DUP(p, sdp, src, sdp_emails, list_dup);  LST_DUP(p, sdp, src, sdp_phones, list_dup);  LST_DUP(p, sdp, src, sdp_connection, connection_dup);  LST_DUP(p, sdp, src, sdp_bandwidths, bandwidth_dup);  LST_DUP(p, sdp, src, sdp_time, time_dup);  PTR_DUP(p, sdp, src, sdp_key, key_dup);  LST_DUP(p, sdp, src, sdp_attributes, attribute_dup);  STR_DUP(p, sdp, src, sdp_charset);  MED_DUP_ALL(p, sdp, src, sdp_media);  assert((size_t)(p - *pp) == session_xtra(src));  *pp = p;

⌨️ 快捷键说明

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