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

📄 osip_uri.c

📁 libosip2-3.0.3最新版本
💻 C
📖 第 1 页 / 共 2 页
字号:
    return -1;  if (url->scheme == NULL && url->string != NULL)    return -1;  if (url->string == NULL && url->scheme == NULL)    scheme = "sip";             /* default is sipurl */  else    scheme = url->scheme;  if (url->string != NULL)    {      buf = (char *) osip_malloc (strlen (scheme) + strlen (url->string) + 3);      if (buf == NULL)        return -1;      *dest = buf;      sprintf (buf, "%s:", scheme);      buf = buf + strlen (scheme) + 1;      sprintf (buf, "%s", url->string);      buf = buf + strlen (url->string);      return 0;    }  len = strlen (scheme) + 1 + strlen (url->host) + 5;  if (url->username != NULL)    len = len + (strlen (url->username) * 3) + 1;       /* count escaped char */  if (url->password != NULL)    len = len + (strlen (url->password) * 3) + 1;  if (url->port != NULL)    len = len + strlen (url->port) + 3;  buf = (char *) osip_malloc (len);  if (buf == NULL)    return -1;  tmp = buf;  sprintf (tmp, "%s:", scheme);  tmp = tmp + strlen (tmp);  if (url->username != NULL)    {      char *tmp2 = __osip_uri_escape_userinfo (url->username);      sprintf (tmp, "%s", tmp2);      osip_free (tmp2);      tmp = tmp + strlen (tmp);    }  if ((url->password != NULL) && (url->username != NULL))    {                           /* be sure that when a password is given, a username is also given */      char *tmp2 = __osip_uri_escape_password (url->password);      sprintf (tmp, ":%s", tmp2);      osip_free (tmp2);      tmp = tmp + strlen (tmp);    }  if (url->username != NULL)    {                           /* we add a '@' only when username is present... */      sprintf (tmp, "@");      tmp++;    }  if (strchr (url->host, ':') != NULL)    {      sprintf (tmp, "[%s]", url->host);      tmp = tmp + strlen (tmp);  } else    {      sprintf (tmp, "%s", url->host);      tmp = tmp + strlen (tmp);    }  if (url->port != NULL)    {      sprintf (tmp, ":%s", url->port);      tmp = tmp + strlen (tmp);    }  {    int pos = 0;    osip_uri_param_t *u_param;    while (!osip_list_eol (&url->url_params, pos))      {        char *tmp1;        char *tmp2 = NULL;        u_param = (osip_uri_param_t *) osip_list_get (&url->url_params, pos);        tmp1 = __osip_uri_escape_uri_param (u_param->gname);        if (u_param->gvalue == NULL)          plen = strlen (tmp1) + 2;        else          {            tmp2 = __osip_uri_escape_uri_param (u_param->gvalue);            plen = strlen (tmp1) + strlen (tmp2) + 3;          }        len = len + plen;        buf = (char *) osip_realloc (buf, len);        tmp = buf;        tmp = tmp + strlen (tmp);        if (u_param->gvalue == NULL)          sprintf (tmp, ";%s", tmp1);        else          {            sprintf (tmp, ";%s=%s", tmp1, tmp2);            osip_free (tmp2);          }        osip_free (tmp1);        pos++;      }  }  {    int pos = 0;    osip_uri_header_t *u_header;    while (!osip_list_eol (&url->url_headers, pos))      {        char *tmp1;        char *tmp2;        u_header = (osip_uri_header_t *) osip_list_get (&url->url_headers, pos);        tmp1 = __osip_uri_escape_header_param (u_header->gname);        if (tmp1 == NULL)          {            osip_free (buf);            return -1;          }        tmp2 = __osip_uri_escape_header_param (u_header->gvalue);        if (tmp2 == NULL)          {            osip_free (tmp1);            osip_free (buf);            return -1;          }        plen = strlen (tmp1) + strlen (tmp2) + 4;        len = len + plen;        buf = (char *) osip_realloc (buf, len);        tmp = buf;        tmp = tmp + strlen (tmp);        if (pos == 0)          sprintf (tmp, "?%s=%s", tmp1, tmp2);        else          sprintf (tmp, "&%s=%s", tmp1, tmp2);        osip_free (tmp1);        osip_free (tmp2);        pos++;      }  }  *dest = buf;  return 0;}voidosip_uri_free (osip_uri_t * url){  int pos = 0;  if (url == NULL)    return;  osip_free (url->scheme);  osip_free (url->username);  osip_free (url->password);  osip_free (url->host);  osip_free (url->port);  osip_uri_param_freelist (&url->url_params);  {    osip_uri_header_t *u_header;    while (!osip_list_eol (&url->url_headers, pos))      {        u_header = (osip_uri_header_t *) osip_list_get (&url->url_headers, pos);        osip_list_remove (&url->url_headers, pos);        osip_uri_header_free (u_header);      }  }  osip_free (url->string);  osip_free (url);}intosip_uri_clone (const osip_uri_t * url, osip_uri_t ** dest){  int i;  osip_uri_t *ur;  *dest = NULL;  if (url == NULL)    return -1;  if (url->host == NULL && url->string == NULL)    return -1;  i = osip_uri_init (&ur);  if (i == -1)                  /* allocation failed */    return -1;  if (url->scheme != NULL)    ur->scheme = osip_strdup (url->scheme);  if (url->username != NULL)    ur->username = osip_strdup (url->username);  if (url->password != NULL)    ur->password = osip_strdup (url->password);  if (url->host != NULL)    ur->host = osip_strdup (url->host);  if (url->port != NULL)    ur->port = osip_strdup (url->port);  if (url->string != NULL)    ur->string = osip_strdup (url->string);  i = osip_list_clone(&url->url_params, &ur->url_params, (int *(*)(void *, void *)) &osip_uri_param_clone);  if (i != 0)    {      osip_uri_free(ur);      return -1;    }  i = osip_list_clone(&url->url_headers, &ur->url_headers, (int *(*)(void *, void *)) &osip_uri_param_clone);  if (i != 0)    {      osip_uri_free(ur);      return -1;    }  *dest = ur;  return 0;}intosip_uri_param_init (osip_uri_param_t ** url_param){  *url_param = (osip_uri_param_t *) osip_malloc (sizeof (osip_uri_param_t));  (*url_param)->gname = NULL;  (*url_param)->gvalue = NULL;  return 0;}voidosip_uri_param_free (osip_uri_param_t * url_param){  osip_free (url_param->gname);  osip_free (url_param->gvalue);  osip_free (url_param);}intosip_uri_param_set (osip_uri_param_t * url_param, char *pname, char *pvalue){  url_param->gname = pname;  /* not needed for url, but for all other generic params */  osip_clrspace (url_param->gname);  url_param->gvalue = pvalue;  if (url_param->gvalue != NULL)    osip_clrspace (url_param->gvalue);  return 0;}intosip_uri_param_add (osip_list_t * url_params, char *pname, char *pvalue){  int i;  osip_uri_param_t *url_param;  i = osip_uri_param_init (&url_param);  if (i != 0)    return -1;  i = osip_uri_param_set (url_param, pname, pvalue);  if (i != 0)    {      osip_uri_param_free (url_param);      return -1;    }  osip_list_add (url_params, url_param, -1);  return 0;}voidosip_uri_param_freelist (osip_list_t * params){  osip_uri_param_t *u_param;  while (!osip_list_eol (params, 0))    {      u_param = (osip_uri_param_t *) osip_list_get (params, 0);      osip_list_remove (params, 0);      osip_uri_param_free (u_param);    }}intosip_uri_param_get_byname (osip_list_t * params, char *pname,                           osip_uri_param_t ** url_param){  int pos = 0;  size_t pname_len;  osip_uri_param_t *u_param;  *url_param = NULL;  if (pname == NULL)    return -1;  pname_len = strlen (pname);  if (pname_len <= 0)    return -1;  while (!osip_list_eol (params, pos))    {      size_t len;      u_param = (osip_uri_param_t *) osip_list_get (params, pos);      len = strlen (u_param->gname);      if (pname_len == len          && osip_strncasecmp (u_param->gname, pname, strlen (pname)) == 0)        {          *url_param = u_param;          return 0;        }      pos++;    }  return -1;}intosip_uri_param_clone (const osip_uri_param_t * uparam, osip_uri_param_t ** dest){  int i;  osip_uri_param_t *up;  *dest = NULL;  if (uparam == NULL)    return -1;  if (uparam->gname == NULL)    return -1;                  /* name is mandatory */  i = osip_uri_param_init (&up);  if (i != 0)                   /* allocation failed */    return -1;  up->gname = osip_strdup (uparam->gname);  if (uparam->gvalue != NULL)    up->gvalue = osip_strdup (uparam->gvalue);  else    up->gvalue = NULL;  *dest = up;  return 0;}#define _ALPHANUM_ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\0"#define _RESERVED_ ";/?:@&=+$\0"#define _MARK_ "-_.!~*'()\0"#define _MARK__USER_UNRESERVED_ "-_.!~*'()&=+$,;?/\0"#define _MARK__PWORD_UNRESERVED_ "-_.!~*'()&=+$,\0"#define _MARK__URI_PARAM_UNRESERVED_ "-_.!~*'()[]/:&+$\0"#define _MARK__HEADER_PARAM_UNRESERVED_ "-_.!~*'()[]/?:+$\0"#define osip_is_alphanum(in) (  \       (in >= 'a' && in <= 'z') || \       (in >= 'A' && in <= 'Z') || \       (in >= '0' && in <= '9'))char *__osip_uri_escape_nonascii_and_nondef (const char *string, const char *def){  size_t alloc = strlen (string) + 1;  size_t length;  char *ns = osip_malloc (alloc);  unsigned char in;  size_t newlen = alloc;  int index = 0;  const char *tmp;  int i;  length = alloc - 1;  while (length--)    {      in = *string;      i = 0;      tmp = NULL;      if (osip_is_alphanum (in))        tmp = string;      else        {          for (; def[i] != '\0' && def[i] != in; i++)            {            }          if (def[i] != '\0')            tmp = string;        }      if (tmp == NULL)        {          /* encode it */          newlen += 2;          /* the size grows with two, since this'll become a %XX */          if (newlen > alloc)            {              alloc *= 2;              ns = osip_realloc (ns, alloc);              if (!ns)                return NULL;            }          sprintf (&ns[index], "%%%02X", in);          index += 3;      } else        {          /* just copy this */          ns[index++] = in;        }      string++;    }  ns[index] = 0;                /* terminate it */  return ns;}/* user =  *( unreserved / escaped / user-unreserved ) */const char *userinfo_def = /* implied _ALPHANUM_ */ _MARK__USER_UNRESERVED_;char *__osip_uri_escape_userinfo (const char *string){  return __osip_uri_escape_nonascii_and_nondef (string, userinfo_def);}/* user =  *( unreserved / escaped / user-unreserved ) */const char *password_def = _MARK__PWORD_UNRESERVED_;char *__osip_uri_escape_password (const char *string){  return __osip_uri_escape_nonascii_and_nondef (string, password_def);}const char *uri_param_def = _MARK__URI_PARAM_UNRESERVED_;char *__osip_uri_escape_uri_param (char *string){  return __osip_uri_escape_nonascii_and_nondef (string, uri_param_def);}const char *header_param_def = _MARK__HEADER_PARAM_UNRESERVED_;char *__osip_uri_escape_header_param (char *string){  return __osip_uri_escape_nonascii_and_nondef (string, header_param_def);}void__osip_uri_unescape (char *string){  size_t alloc = strlen (string) + 1;  unsigned char in;  int index = 0;  unsigned int hex;  char *ptr;  ptr = string;  while (--alloc > 0)    {      in = *ptr;      if ('%' == in)        {          /* encoded part */          if (alloc > 2 && sscanf (ptr + 1, "%02X", &hex) == 1)            {              in = (unsigned char) hex;              if (*(ptr + 2) &&                  ((*(ptr + 2) >= '0' && *(ptr + 2) <= '9') ||                   (*(ptr + 2) >= 'a' && *(ptr + 2) <= 'f') ||                   (*(ptr + 2) >= 'A' && *(ptr + 2) <= 'F')))                {                  alloc -= 2;                  ptr += 2;              } else                {                  alloc -= 1;                  ptr += 1;                }            }          else            {              break;            }        }      string[index++] = in;      ptr++;    }  string[index] = 0;            /* terminate it */}/* RFC3261 16.5  */intosip_uri_to_str_canonical (const osip_uri_t * url, char **dest){  int result;  *dest = NULL;  result = osip_uri_to_str (url, dest);  if (result == 0)    {      /*         tmp = strchr(*dest, ";");         if (tmp !=NULL) {         buf=strndup(*dest, tmp-(*dest));         osip_free(*dest);         *dest=buf;         }       */      __osip_uri_unescape (*dest);    }  return result;}

⌨️ 快捷键说明

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