osip_negotiation.c

来自「最新osip源代码」· C语言 代码 · 共 1,298 行 · 第 1/3 页

C
1,298
字号
                            }                        }                    }                }              k++;            }          while (payload != NULL);        }      i++;    }  return 0;}intosip_negotiation_ctx_execute_negotiation (osip_negotiation_t * config,                                          osip_negotiation_ctx_t * context){  int m_lines_that_match = 0;  sdp_message_t *remote;  sdp_message_t *local;  int i;  if (context == NULL)    return -1;  remote = context->remote;  if (remote == NULL)    return -1;  i = sdp_message_init (&local);  if (i != 0)    return -1;  if (0 != strncmp (remote->v_version, "0", 1))    {      sdp_message_free (local);      /*      sdp_context->fcn_wrong_version(context); */      return 406;               /* Not Acceptable */    }  i = sdp_partial_clone (config, context, remote, &local);  if (i != 0)    {      sdp_message_free (local);      return -1;    }  i = sdp_confirm_media (config, context, remote, &local);  if (i != 0)    {      sdp_message_free (local);      return i;    }  i = 0;  while (!sdp_message_endof_media (local, i))    {      /* this is to refuse each line with no codec that matches! */      if (NULL == sdp_message_m_payload_get (local, i, 0))        {          sdp_media_t *med = osip_list_get ((local)->m_medias, i);          char *str = sdp_message_m_payload_get (remote, i, 0);          sdp_message_m_payload_add (local, i, osip_strdup (str));          osip_free (med->m_port);          med->m_port = osip_strdup ("0");      /* refuse this line */      } else        {                       /* number of "m" lines that match */          sdp_media_t *med = osip_list_get (local->m_medias, i);          m_lines_that_match++;          osip_free (med->m_port);          /* AMD: use the correct fcn_get_xxx_port method: */          if (0 == strcmp (med->m_media, "audio"))            {              if (config->fcn_get_audio_port != NULL)                med->m_port = config->fcn_get_audio_port (context, i);              else                med->m_port = osip_strdup ("0");        /* should never happen */          } else if (0 == strcmp (med->m_media, "video"))            {              if (config->fcn_get_video_port != NULL)                med->m_port = config->fcn_get_video_port (context, i);              else                med->m_port = osip_strdup ("0");        /* should never happen */          } else            {              if (config->fcn_get_other_port != NULL)                med->m_port = config->fcn_get_other_port (context, i);              else                med->m_port = osip_strdup ("0");        /* should never happen */            }        }      i++;    }  if (m_lines_that_match > 0)    {      context->local = local;      return 200;  } else    {      sdp_message_free (local);      return 415;    }}intosip_negotiation_sdp_build_offer (osip_negotiation_t * config,                                  osip_negotiation_ctx_t * con,                                  sdp_message_t ** sdp, char *audio_port,                                  char *video_port){  int i;  int media_line = 0;  i = sdp_message_init (sdp);  if (i != 0)    return -1;  sdp_message_v_version_set (*sdp, osip_strdup ("0"));  /* those fields MUST be set */  sdp_message_o_origin_set (*sdp,                            osip_strdup (config->o_username),                            osip_strdup (config->o_session_id),                            osip_strdup (config->o_session_version),                            osip_strdup (config->o_nettype),                            osip_strdup (config->o_addrtype),                            osip_strdup (config->o_addr));  sdp_message_s_name_set (*sdp, osip_strdup ("A call"));  if (config->fcn_set_info != NULL)    config->fcn_set_info (con, *sdp);  if (config->fcn_set_uri != NULL)    config->fcn_set_uri (con, *sdp);  if (config->fcn_set_emails != NULL)    config->fcn_set_emails (con, *sdp);  if (config->fcn_set_phones != NULL)    config->fcn_set_phones (con, *sdp);  if (config->c_nettype != NULL)    sdp_message_c_connection_add (*sdp, -1,                                  osip_strdup (config->c_nettype),                                  osip_strdup (config->c_addrtype),                                  osip_strdup (config->c_addr),                                  osip_strdup (config->c_addr_multicast_ttl),                                  osip_strdup (config->c_addr_multicast_int));  i = sdp_message_t_time_descr_add (*sdp, osip_strdup ("0"), osip_strdup ("0"));  if (i != 0)    return -1;  if (config->fcn_set_attributes != NULL)    config->fcn_set_attributes (con, *sdp, -1);  /* add all audio codec */  if (!osip_list_eol (config->audio_codec, 0))    {      int pos = 0;      __payload_t *my = (__payload_t *) osip_list_get (config->audio_codec, pos);      /* all media MUST have the same PROTO, PORT. */      sdp_message_m_media_add (*sdp, osip_strdup ("audio"),                               osip_strdup (audio_port),                               osip_strdup (my->number_of_port),                               osip_strdup (my->proto));      while (!osip_list_eol (config->audio_codec, pos))        {          my = (__payload_t *) osip_list_get (config->audio_codec, pos);          sdp_message_m_payload_add (*sdp, media_line, osip_strdup (my->payload));          if (my->a_rtpmap != NULL)            sdp_message_a_attribute_add (*sdp, media_line,                                         osip_strdup ("rtpmap"),                                         osip_strdup (my->a_rtpmap));          pos++;        }      media_line++;    }  /* add all video codec */  if (!osip_list_eol (config->video_codec, 0))    {      int pos = 0;      __payload_t *my = (__payload_t *) osip_list_get (config->video_codec, pos);      /* all media MUST have the same PROTO, PORT. */      sdp_message_m_media_add (*sdp, osip_strdup ("video"),                               osip_strdup (video_port),                               osip_strdup (my->number_of_port),                               osip_strdup (my->proto));      while (!osip_list_eol (config->video_codec, pos))        {          my = (__payload_t *) osip_list_get (config->video_codec, pos);          sdp_message_m_payload_add (*sdp, media_line, osip_strdup (my->payload));          if (my->a_rtpmap != NULL)            sdp_message_a_attribute_add (*sdp, media_line,                                         osip_strdup ("rtpmap"),                                         osip_strdup (my->a_rtpmap));          pos++;        }      media_line++;    }  return 0;}/* build the SDP packet with only one audio codec and one video codec. * - Usefull if you don't want to restrict proposal to one codec only - * - Limitation, only one codec will be proposed */int__osip_negotiation_sdp_build_offer (osip_negotiation_t * config,                                    osip_negotiation_ctx_t * con,                                    sdp_message_t ** sdp, char *audio_port,                                    char *video_port, char *audio_codec,                                    char *video_codec){  int i;  int media_line = 0;  i = sdp_message_init (sdp);  if (i != 0)    return -1;  sdp_message_v_version_set (*sdp, osip_strdup ("0"));  /* those fields MUST be set */  sdp_message_o_origin_set (*sdp,                            osip_strdup (config->o_username),                            osip_strdup (config->o_session_id),                            osip_strdup (config->o_session_version),                            osip_strdup (config->o_nettype),                            osip_strdup (config->o_addrtype),                            osip_strdup (config->o_addr));  sdp_message_s_name_set (*sdp, osip_strdup ("A call"));  if (config->fcn_set_info != NULL)    config->fcn_set_info (con, *sdp);  if (config->fcn_set_uri != NULL)    config->fcn_set_uri (con, *sdp);  if (config->fcn_set_emails != NULL)    config->fcn_set_emails (con, *sdp);  if (config->fcn_set_phones != NULL)    config->fcn_set_phones (con, *sdp);  if (config->c_nettype != NULL)    sdp_message_c_connection_add (*sdp, -1,                                  osip_strdup (config->c_nettype),                                  osip_strdup (config->c_addrtype),                                  osip_strdup (config->c_addr),                                  osip_strdup (config->c_addr_multicast_ttl),                                  osip_strdup (config->c_addr_multicast_int));  {                             /* offer-answer draft says we must copy the "t=" line */    time_t now = time (NULL);    char *tmp = osip_malloc (15);    char *tmp2 = osip_malloc (15);    sprintf (tmp, "%li", now);    sprintf (tmp2, "%li", now + 3600);    i = sdp_message_t_time_descr_add (*sdp, tmp, tmp2);    if (i != 0)      return -1;  }  if (config->fcn_set_attributes != NULL)    config->fcn_set_attributes (con, *sdp, -1);  /* add all audio codec */  if (audio_codec != NULL)    {      if (!osip_list_eol (config->audio_codec, 0))        {          int pos = 0;          __payload_t *my =            (__payload_t *) osip_list_get (config->audio_codec, pos);          while (!osip_list_eol (config->audio_codec, pos))            {              my = (__payload_t *) osip_list_get (config->audio_codec, pos);              if (0 == strcmp (audio_codec, my->payload))                {                  /* all media MUST have the same PROTO, PORT. */                  sdp_message_m_media_add (*sdp, osip_strdup ("audio"),                                           osip_strdup (audio_port),                                           osip_strdup (my->number_of_port),                                           osip_strdup (my->proto));                  sdp_message_m_payload_add (*sdp, media_line,                                             osip_strdup (my->payload));                  if (my->a_rtpmap != NULL)                    sdp_message_a_attribute_add (*sdp, media_line,                                                 osip_strdup ("rtpmap"),                                                 osip_strdup (my->a_rtpmap));                  media_line++;                  break;                }              pos++;            }        }    }  /* add all video codec */  if (video_codec != NULL)    {      if (!osip_list_eol (config->video_codec, 0))        {          int pos = 0;          __payload_t *my =            (__payload_t *) osip_list_get (config->video_codec, pos);          while (!osip_list_eol (config->video_codec, pos))            {              my = (__payload_t *) osip_list_get (config->video_codec, pos);              if (0 == strcmp (video_codec, my->payload))                {                  /* all media MUST have the same PROTO, PORT. */                  sdp_message_m_media_add (*sdp, osip_strdup ("video"),                                           osip_strdup (video_port),                                           osip_strdup (my->number_of_port),                                           osip_strdup (my->proto));                  sdp_message_m_payload_add (*sdp, media_line,                                             osip_strdup (my->payload));                  if (my->a_rtpmap != NULL)                    sdp_message_a_attribute_add (*sdp, media_line,                                                 osip_strdup ("rtpmap"),                                                 osip_strdup (my->a_rtpmap));                  media_line++;                  break;                }              pos++;            }        }    }  return 0;}intosip_negotiation_sdp_message_put_on_hold (sdp_message_t * sdp){  int pos;  int pos_media = -1;  char *rcvsnd;  int recv_send = -1;  pos = 0;  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);  while (rcvsnd != NULL)    {      if (rcvsnd != NULL && 0 == strcmp (rcvsnd, "sendonly"))        {          recv_send = 0;      } else if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "recvonly")                                    || 0 == strcmp (rcvsnd, "sendrecv")))        {          recv_send = 0;          sprintf (rcvsnd, "sendonly");        }      pos++;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);    }  pos_media = 0;  while (!sdp_message_endof_media (sdp, pos_media))    {      pos = 0;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);      while (rcvsnd != NULL)        {          if (rcvsnd != NULL && 0 == strcmp (rcvsnd, "sendonly"))            {              recv_send = 0;          } else if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "recvonly")                                        || 0 == strcmp (rcvsnd, "sendrecv")))            {              recv_send = 0;              sprintf (rcvsnd, "sendonly");            }          pos++;          rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);        }      pos_media++;    }  if (recv_send == -1)    {      /* we need to add a global attribute with a field set to "sendonly" */      sdp_message_a_attribute_add (sdp, -1, osip_strdup ("sendonly"), NULL);    }  return 0;}intosip_negotiation_sdp_message_put_off_hold (sdp_message_t * sdp){  int pos;  int pos_media = -1;  char *rcvsnd;  pos = 0;  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);  while (rcvsnd != NULL)    {      if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "sendonly")                             || 0 == strcmp (rcvsnd, "recvonly")))        {          sprintf (rcvsnd, "sendrecv");        }      pos++;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);    }  pos_media = 0;  while (!sdp_message_endof_media (sdp, pos_media))    {      pos = 0;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);      while (rcvsnd != NULL)        {          if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "sendonly")                                 || 0 == strcmp (rcvsnd, "recvonly")))            {              sprintf (rcvsnd, "sendrecv");            }          pos++;          rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);        }      pos_media++;    }  return 0;}

⌨️ 快捷键说明

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