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

📄 sdp_print.c

📁 sip协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
  const char *nettype;  const char *addrtype;  switch (c->c_nettype) {  case sdp_net_x:    nettype = NULL;    break;  case sdp_net_in:    nettype = "IN ";    break;  default:    printing_error(p, "unknown nettype %u", c->c_nettype);    return;  }  switch (c->c_addrtype) {  case sdp_addr_x:    addrtype = NULL;    break;  case sdp_addr_ip4:    nettype = "IN ";    addrtype = "IP4 ";    break;  case sdp_addr_ip6:    nettype = "IN ";    addrtype = "IP6 ";    break;  default:    printing_error(p, "unknown address type %u", c->c_addrtype);    return;  }  if (c->c_address == NULL) {    printing_error(p, "missing address");    return;  }  sdp_printf(p, "%s%s%s", nettype, addrtype, c->c_address);  if (c->c_mcast || c->c_ttl) {    sdp_printf(p, "/%u", c->c_ttl);    if (c->c_groups > 1)      sdp_printf(p, "/%u", c->c_groups);  }  sdp_printf(p, CRLF);}static void print_bandwidths(sdp_printer_t *p, sdp_bandwidth_t const *b){  for (; b ; b = b->b_next) {    char const *name;        switch (b->b_modifier) {    case sdp_bw_ct: name = "CT"; break;    case sdp_bw_as: name = "AS"; break;    default:        name = b->b_modifier_name; break;    }        sdp_printf(p, "b=%s:%lu" CRLF, name, b->b_value);  }}static void print_time(sdp_printer_t *p, sdp_time_t const *t){  if (t || p->pr_strict)    sdp_printf(p, "t=%lu %lu" CRLF, t ? t->t_start : 0L, t ? t->t_stop : 0L);}static void print_repeat(sdp_printer_t *p, sdp_repeat_t const *r){  int i;  sdp_printf(p, "r=");  print_typed_time(p, r->r_interval);  sdp_printf(p, " ");  print_typed_time(p, r->r_duration);  for (i = 0; i < r->r_number_of_offsets; i++) {    sdp_printf(p, " ");    print_typed_time(p, r->r_offsets[i]);  }  sdp_printf(p, CRLF);}static void print_zone(sdp_printer_t *p, sdp_zone_t const *z){  int i;  sdp_printf(p, "z=");  for (i = 0; i < z->z_number_of_adjustments; i++) {    int negative = z->z_adjustments[i].z_offset < 0L;    sdp_printf(p, "%s%lu %s", 	       i > 0 ? " " : "",	       z->z_adjustments[i].z_at, 	       negative ? "-" : "");    if (negative)      print_typed_time(p, -z->z_adjustments[i].z_offset);    else      print_typed_time(p, z->z_adjustments[i].z_offset);  }  sdp_printf(p, CRLF);}static void  print_typed_time(sdp_printer_t *p, unsigned long t){  if (t % 60 || t == 0) {    sdp_printf(p, "%lu", t);  }  else {    t /= 60;    if (t % 60) {      sdp_printf(p, "%lum", t); /* minutes */    }    else {      t /= 60;      if (t % 24) {	sdp_printf(p, "%luh", t); /* hours */      }      else {	t /= 24;	sdp_printf(p, "%lud", t);	/* days */      }    }  }}static void print_key(sdp_printer_t *p, sdp_key_t const *k){  const char *method;  int have_material = k->k_material != NULL;  switch (k->k_method) {  case sdp_key_x:    method = k->k_method_name; break;  case sdp_key_clear:    method = "clear"; break;  case sdp_key_base64:    method = "base64"; break;  case sdp_key_uri:    method = "uri"; break;  case sdp_key_prompt:    method = "prompt"; break;  default:    printing_error(p, "unknown key method (%d)", k->k_method);    return;  }  sdp_printf(p, "k=%s%s%s" CRLF, method, 	     have_material ? ":" : "",	     have_material ? k->k_material : "");}static void print_attributes(sdp_printer_t *p, sdp_attribute_t const *a){  for (;a; a = a->a_next) {    char const *name = a->a_name;    char const *value = a->a_value;    sdp_printf(p, "a=%s%s%s" CRLF, name, value ? ":" : "", value ? value : "");  }}static void print_attributes_without_mode(sdp_printer_t *p, sdp_attribute_t const *a){  for (;a; a = a->a_next) {    char const *name = a->a_name;    char const *value = a->a_value;    if (strcasecmp(name, "inactive") == 0 ||	strcasecmp(name, "sendonly") == 0 ||	strcasecmp(name, "recvonly") == 0 ||	strcasecmp(name, "sendrecv") == 0)      continue;    sdp_printf(p, "a=%s%s%s" CRLF, name, value ? ":" : "", value ? value : "");  }}static void print_charset(sdp_printer_t *p, sdp_text_t *charset){  sdp_printf(p, "a=charset%s%s" CRLF, charset ? ":" : "", charset ? charset : "");}static void print_media(sdp_printer_t *p, 			sdp_session_t const *sdp,			sdp_media_t const *m){  char const *media, *proto;  sdp_rtpmap_t *rm;  sdp_mode_t session_mode = sdp_sendrecv;  if (!p->pr_mode_manual)    session_mode = sdp_attribute_mode(sdp->sdp_attributes, sdp_sendrecv);  for (;m ; m = m->m_next) {    switch (m->m_type) {    case sdp_media_audio:       media = "audio"; break;    case sdp_media_video:       media = "video"; break;    case sdp_media_application: media = "application"; break;    case sdp_media_data:        media = "data"; break;    case sdp_media_control:     media = "control"; break;    case sdp_media_message:     media = "message"; break;    case sdp_media_image  :     media = "image"; break;    default:                    media = m->m_type_name;    }        switch (m->m_proto) {    case sdp_proto_rtp:   proto = "RTP/AVP"; break;    case sdp_proto_udp:   proto = "udp"; break;    case sdp_proto_tcp:   proto = "tcp"; break;    case sdp_proto_tls:   proto = "tls"; break;    default:              proto = m->m_proto_name; break;    }        if (m->m_number_of_ports <= 1)      sdp_printf(p, "m=%s %u %s", media, m->m_port, proto);    else      sdp_printf(p, "m=%s %u/%u %s", 		 media, m->m_port, m->m_number_of_ports, proto);    if (m->m_rtpmaps) {      for (rm = m->m_rtpmaps; rm; rm = rm->rm_next) {	if (rm->rm_any)	  sdp_printf(p, " *");	else	  sdp_printf(p, " %u", (unsigned)rm->rm_pt);      }    }    else if (m->m_format) {      sdp_list_t *l = m->m_format;      for (; l; l = l->l_next)	sdp_printf(p, " %s", l->l_text);    }    else {      sdp_printf(p, " 9");      /* SDP syntax requires at least one format.				   9 is used by nobody, right?. */    }    sdp_printf(p, CRLF);    if (m->m_information)      print_information(p, m->m_information);    if (m->m_connections)#ifdef nomore    if (m->m_connections != sdp->sdp_connection)#endif            print_connection_list(p, m->m_connections);    if (m->m_bandwidths)      print_bandwidths(p, m->m_bandwidths);    if (m->m_key)      print_key(p, m->m_key);    for (rm = m->m_rtpmaps; rm; rm = rm->rm_next) {      if (!rm->rm_predef || p->pr_all_rtpmaps)	sdp_printf(p, "a=rtpmap:%u %s/%lu%s%s" CRLF,		   rm->rm_pt, rm->rm_encoding, rm->rm_rate,		   rm->rm_params ? "/" : "", 		   rm->rm_params ? rm->rm_params : "");      if (rm->rm_fmtp)	sdp_printf(p, "a=fmtp:%u %s" CRLF, 		   rm->rm_pt, rm->rm_fmtp);    }    if (!p->pr_mode_manual && !m->m_rejected &&	(m->m_mode != session_mode || p->pr_mode_always)) {      switch (m->m_mode) {      case sdp_inactive:	sdp_printf(p, "a=inactive" CRLF);	break;      case sdp_sendonly:	sdp_printf(p, "a=sendonly" CRLF);	break;      case sdp_recvonly:	sdp_printf(p, "a=recvonly" CRLF);	break;      case sdp_sendrecv:	sdp_printf(p, "a=sendrecv" CRLF);	break;      default:	break;      }    }    if (p->pr_mode_manual)      print_attributes(p, m->m_attributes);    else      print_attributes_without_mode(p, m->m_attributes);  }}static void print_text_list(sdp_printer_t *p, 			    const char *fmt, sdp_list_t const *l){  for (;l; l = l->l_next) {    sdp_printf(p, fmt, l->l_text);  }}static void printing_error(sdp_printer_t *p, const char *fmt, ...){  va_list ap;  va_start(ap, fmt);     if (p->pr_ok) {    int n;    n = vsnprintf(p->pr_buffer, p->pr_bsiz, fmt, ap);        p->pr_ok = 0;  }  va_end(ap);}static void sdp_printf(sdp_printer_t *p, const char *fmt, ...){  va_list ap;  while (p->pr_ok) {    int n;        va_start(ap, fmt);     n = vsnprintf(p->pr_buffer + p->pr_used, p->pr_bsiz - p->pr_used, fmt, ap);    va_end(ap);        if (n > -1 && n < p->pr_bsiz - p->pr_used) {      p->pr_used += n;      break;    }    else {      if (p->pr_owns_buffer) {	p->pr_buffer = su_realloc(p->pr_home, p->pr_buffer, 2 * p->pr_bsiz);	if (p->pr_buffer) {	  p->pr_bsiz = 2 * p->pr_bsiz;	  continue;	}	p->pr_owns_buffer = 0;      }      else if (p->pr_may_realloc) {		char *buffer;	int size;	if (p->pr_bsiz < SDP_BLOCK)	  size = SDP_BLOCK;	else	  size = 2 * p->pr_bsiz;	buffer = su_alloc(p->pr_home, size);	if (buffer) {	  p->pr_owns_buffer = 1;	  p->pr_buffer = memcpy(buffer, p->pr_buffer, p->pr_bsiz);	  p->pr_bsiz = size;	  continue;	}      }      p->pr_ok = 0;      p->pr_buffer = "Memory exhausted";    }  }}

⌨️ 快捷键说明

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