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

📄 sdp.c

📁 sip协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
{  int 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(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;}#endifstaticint media_xtra_all(sdp_media_t const *m){  int 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;}int list_xtra(sdp_list_t const *l){  int 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(p - *pp == list_xtra(src));  *pp = p;  return l;}int rtpmap_xtra(sdp_rtpmap_t const *rm){  int 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(p - *pp == rtpmap_xtra(src));  *pp = p;  return rm;}/** Return total size of a list, including size of all nodes */staticint list_xtra_all(xtra_f *xtra,		  void const *v){  int 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 0int XXX_xtra(sdp_XXX_t const *YYY){  int 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;}#endifstaticint session_xtra(sdp_session_t const *sdp){  int 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(p - *pp == session_xtra(src));  *pp = p;  return sdp;}/**Duplicate an SDP session description. * * The function sdp_session_dup() duplicates (deeply copies) an SDP * session description燖a sdp allocating memory using memory @a home. * * @param h   Memory home * @param sdp SDP session description to be duplicated * * @return  * If successful, a pointer to newly allocated sdp_session_t structure is * returned, otherwise NULL is returned. */sdp_session_t *sdp_session_dup(su_home_t *h, sdp_session_t const *sdp){   SDP_DUP(session, sdp);}/* ---------------------------------------------------------------------- */staticint session_without_media_xtra(sdp_session_t const *sdp){  int 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);  return rv;}staticsdp_session_t *session_without_media_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);  sdp->sdp_media = NULL;    assert(p - *pp == session_without_media_xtra(src));  *pp = p;  return sdp;}/* SDP_DUP macro requires this */typedef sdp_session_t sdp_session_without_media_t;/**Duplicate an SDP session description without media descriptions. * * The function sdp_session_dup() duplicates (deeply copies) an SDP session * description燖a sdp allocating memory using memory @a home. It does not * copy the media descriptions, however. * * @param h     memory h * @param sdp   SDP session description to be duplicated * * @return  * If successful, a pointer to newly allocated sdp_session_t structure is * returned, otherwise NULL is returned. */sdp_session_t *sdp_session_dup_without_media(su_home_t *h, 					     sdp_session_t const *sdp){   SDP_DUP(session_without_media, sdp);}/* ---------------------------------------------------------------------- *//* SDP Tag classes */#include <sofia-sip/su_tag_class.h>size_t sdptag_session_xtra(tagi_t const *t, size_t offset){  sdp_session_t const *sdp = (sdp_session_t *)t->t_value;  if (sdp)     return STRUCT_ALIGN(offset) + session_xtra(sdp);  else    return 0;}tagi_t *sdptag_session_dup(tagi_t *dst, tagi_t const *src, void **bb){  sdp_session_t *sdp;  sdp_session_t const *srcsdp;  char *b;  assert(src); assert(*bb);   b = *bb;  b += STRUCT_ALIGN(b);  srcsdp = (sdp_session_t *)src->t_value;  sdp = session_dup(&b, srcsdp);  dst->t_tag = src->t_tag;  dst->t_value = (tag_value_t)sdp;  *bb = b;  return dst + 1;}int sdptag_session_snprintf(tagi_t const *t, char b[], size_t size){  sdp_session_t const *sdp;  sdp_printer_t *print;  int retval;  assert(t);  if (!t || !t->t_value) {     if (size && b) b[0] = 0;     return 0;   }  sdp = (sdp_session_t const *)t->t_value;  print = sdp_print(NULL, sdp, b, size, 0);  retval = sdp_message_size(print);    sdp_printer_free(print);  return retval;}/** Tag class for SDP tags. @HIDE */tag_class_t sdptag_session_class[1] =   {{    sizeof(sdptag_session_class),    /* tc_next */     NULL,    /* tc_len */      NULL,    /* tc_move */     NULL,    /* tc_xtra */     sdptag_session_xtra,    /* tc_dup */      sdptag_session_dup,    /* tc_free */     NULL,    /* tc_find */     NULL,    /* tc_snprintf */ sdptag_session_snprintf,    /* tc_filter */   NULL /* msgtag_str_filter */,    /* tc_ref_set */  t_ptr_ref_set,  }};/* ---------------------------------------------------------------------- *//* Compare two string pointers */static inline int str0cmp(char const *a, char const *b){  if (a == NULL) a = "";  if (b == NULL) b = "";  return strcmp(a, b);}/* Compare two string pointers ignoring case. */static inline int str0casecmp(char const *a, char const *b){  if (a == NULL) a = "";  if (b == NULL) b = "";  return strcasecmp(a, b);}/** Compare two session descriptions  */int sdp_session_cmp(sdp_session_t const *a, sdp_session_t const *b){  int rv;   sdp_bandwidth_t const *ab, *bb;  sdp_attribute_t const *aa, *ba;  sdp_media_t const *am, *bm;   if ((rv = (a != NULL) - (b != NULL)))     return rv;  if (a == b)    return 0;  if ((rv = (a->sdp_version[0] - b->sdp_version[0])))    return rv;  if ((rv = sdp_origin_cmp(a->sdp_origin, b->sdp_origin)))    return rv;  if ((rv = str0cmp(a->sdp_subject, b->sdp_subject)))    return rv;  if ((rv = str0cmp(a->sdp_information, b->sdp_information)))    return rv;  if ((rv = str0cmp(a->sdp_uri, b->sdp_uri)))    return rv;  if ((rv = sdp_list_cmp(a->sdp_emails, b->sdp_emails)))    return rv;  if ((rv = sdp_list_cmp(a->sdp_phones, b->sdp_phones)))    return rv;  if ((rv = sdp_connection_cmp(a->sdp_connection, b->sdp_connection)))    return rv;  for (ab = a->sdp_bandwidths, bb = b->sdp_bandwidths;        ab || bb;        ab = ab->b_next, bb = bb->b_next)    if ((rv = sdp_bandwidth_cmp(a->sdp_bandwidths, b->sdp_bandwidths)))      return rv;  if ((rv = sdp_time_cmp(a->sdp_time, b->sdp_time)))    return rv;  if ((rv = sdp_key_cmp(a->sdp_key, b->sdp_key)))    return rv;  for (aa = a->sdp_attributes, ba = b->sdp_attributes;        aa || bb;        aa = aa->a_next, ba = ba->a_next)    if ((rv = sdp_attribute_cmp(aa, ba)))      return rv;  for (am = a->sdp_media, bm = b->sdp_media;        am || bb;        am = am->m_next, bm = bm->m_next)    if ((rv = sdp_media_cmp(am, bm)))      return rv;  return 0;}/** Compare two origin fields  */int sdp_origin_cmp(sdp_origin_t const *a, sdp_origin_t const *b){  int rv; int64_t rv64;  if ((rv = (a != NULL) - (b != NULL)))     return rv;  if (a == b)    return 0;  if ((rv64 = ((int64_t)a->o_version - (int64_t)b->o_version)))    return rv64 < 0 ? -1 : 1;  if ((rv64 = ((int64_t)a->o_id - (int64_t)b->o_id)))    return rv64 < 0 ? -1 : 1;  if ((rv = strcasecmp(a->o_username, b->o_username)))    return rv;  if ((rv = strcasecmp(a->o_address->c_address, b->o_address->c_address)))    return rv;  return 0;}/** Compare two connection fields  */int sdp_connection_cmp(sdp_connection_t const *a, sdp_connection_t const *b){  int rv;  if ((rv = (a != NULL) - (b != NULL)))     return rv;  if (a == b)    return 0;  if ((rv = a->c_nettype - b->c_nettype))    return rv;  if ((rv = a->c_addrtype - b->c_addrtype))    return rv;  if ((rv = a->c_ttl - b->c_ttl))    return rv;  if ((rv = a->c_groups - b->c_groups))    return rv;  return 0;}/** Compare two bandwidth (b=) fields */int sdp_bandwidth_cmp(sdp_bandwidth_t const *a, sdp_bandwidth_t const *b){

⌨️ 快捷键说明

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