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

📄 msg_cparser.c

📁 libosip-0.9.7源码
💻 C
字号:
/*  The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)  Copyright (C) 2001,2002,2003  Aymeric MOIZARD jack@atosc.org    This library is free software; you can redistribute it and/or  modify it under the terms of the GNU Lesser General Public  License as published by the Free Software Foundation; either  version 2.1 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public  License along with this library; if not, write to the Free Software  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include <osip/smsg.h>#include <osip/port.h>#include "msg.h"#ifndef USE_GPREFstatic parser_config_t pconfig[NUMBER_OF_HEADERS];/*  list of compact header:  i: Call-ID   => ok  m: Contact   => ok  e: Content-Encoding   => ok  l: Content-Length   => ok  c: Content-Type   => ok  f: From   => ok  s: Subject   => NOT A KNOWN HEADER! will be                 available in the list of unknown headers  t: To   => ok  v: Via   => ok  k: Supported  -> NOT A KNOWN HEADER! will be                 available in the list of unknown headers*//* This method must be called before using the parser */intparser_init (){  pconfig[0].hname = ACCEPT;  pconfig[0].setheader = (&msg_setaccept);  pconfig[1].hname = ACCEPT_ENCODING;  pconfig[1].setheader = (&msg_setaccept_encoding);  pconfig[2].hname = ACCEPT_LANGUAGE;  pconfig[2].setheader = (&msg_setaccept_language);  pconfig[3].hname = ALERT_INFO;  pconfig[3].setheader = (&msg_setalert_info);  pconfig[4].hname = ALLOW;  pconfig[4].setheader = (&msg_setallow);  pconfig[5].hname = AUTHORIZATION;  pconfig[5].setheader = (&msg_setauthorization);  pconfig[6].hname = CONTENT_TYPE_SHORT;	/* "l" */  pconfig[6].setheader = (&msg_setcontent_type);  pconfig[7].hname = CALL_ID;  pconfig[7].setheader = (&msg_setcall_id);  pconfig[8].hname = CALL_INFO;  pconfig[8].setheader = (&msg_setcall_info);  pconfig[9].hname = CONTACT;  pconfig[9].setheader = (&msg_setcontact);  pconfig[10].hname = CONTENT_ENCODING;  pconfig[10].setheader = (&msg_setcontent_encoding);  pconfig[11].hname = CONTENT_LENGTH;  pconfig[11].setheader = (&msg_setcontent_length);  pconfig[12].hname = CONTENT_TYPE;  pconfig[12].setheader = (&msg_setcontent_type);  pconfig[13].hname = CSEQ;  pconfig[13].setheader = (&msg_setcseq);  pconfig[14].hname = CONTENT_ENCODING_SHORT;	/* "e" */  pconfig[14].setheader = (&msg_setcontent_encoding);  pconfig[15].hname = ERROR_INFO;  pconfig[15].setheader = (&msg_seterror_info);  pconfig[16].hname = FROM_SHORT;	/* "f" */  pconfig[16].setheader = (&msg_setfrom);  pconfig[17].hname = FROM;  pconfig[17].setheader = (&msg_setfrom);  pconfig[18].hname = CALL_ID_SHORT;	/* "i" */  pconfig[18].setheader = (&msg_setcall_id);  pconfig[19].hname = CONTENT_LENGTH_SHORT;	/* "l" */  pconfig[19].setheader = (&msg_setcontent_length);  pconfig[20].hname = CONTACT_SHORT;	/* "m" */  pconfig[20].setheader = (&msg_setcontact);  pconfig[21].hname = MIME_VERSION;  pconfig[21].setheader = (&msg_setmime_version);  pconfig[22].hname = PROXY_AUTHENTICATE;  pconfig[22].setheader = (&msg_setproxy_authenticate);  pconfig[23].hname = PROXY_AUTHORIZATION;  pconfig[23].setheader = (&msg_setproxy_authorization);  pconfig[24].hname = RECORD_ROUTE;  pconfig[24].setheader = (&msg_setrecord_route);  pconfig[25].hname = ROUTE;  pconfig[25].setheader = (&msg_setroute);  pconfig[26].hname = TO_SHORT;  pconfig[26].setheader = (&msg_setto);  pconfig[27].hname = TO;  pconfig[27].setheader = (&msg_setto);  pconfig[28].hname = VIA_SHORT;  pconfig[28].setheader = (&msg_setvia);  pconfig[29].hname = VIA;  pconfig[29].setheader = (&msg_setvia);  pconfig[30].hname = WWW_AUTHENTICATE;  pconfig[30].setheader = (&msg_setwww_authenticate);  return 0;}/* search the header hname through pconfig[] tab.    A quicker algorithm should be used.   It returns the index of the header in the parser_config_t tab.*/intparser_isknownheader (char *hname){  size_t length;  int iinf = 0;  int isup = NUMBER_OF_HEADERS;  int i = NUMBER_OF_HEADERS / 2;  length = strlen (hname);  for (;;)    {      if (i < 0 || i > NUMBER_OF_HEADERS - 1)	return -1;      if ((length == strlen (pconfig[i].hname))	  && strncmp ((const char *) hname,		      (const char *) pconfig[i].hname, length) == 0)	return i;      if (iinf == isup)	return -1;		/* not found */      if (iinf == isup - 1)	{	  if ((i < NUMBER_OF_HEADERS - 1)	      && (length == strlen (pconfig[i + 1].hname))	      && strncmp ((const char *) hname,			  (const char *) pconfig[i + 1].hname, length) == 0)	    return i + 1;	  else	    return -1;/* Unreachable code??	  if ((i > 0) && (length == strlen (pconfig[i - 1].hname))	      && strncmp ((const char *) hname,			  (const char *) pconfig[i - 1].hname, length) == 0)	    return i - 1;	  else	    return -1;*/	}      if (0 < strncmp ((const char *) hname,		       (const char *) pconfig[i].hname, length))	{	  /* if this is true, search further */	  iinf = i;	  if (i == i + (isup - i) / 2)	    i++;	  else	    i = i + (isup - i) / 2;	}      else	{	  isup = i;	  if (i == i - (i - iinf) / 2)	    i--;	  else	    i = i - (i - iinf) / 2;	}    }				/* end of (while (1)) */  return -1;}#else /* USE_GPREF *//* C code produced by gperf version 2.7.2 *//* Command-line: gperf sip.gperf  */#define TOTAL_KEYWORDS 53#define MIN_WORD_LENGTH 1#define MAX_WORD_LENGTH 19#define MIN_HASH_VALUE 1#define MAX_HASH_VALUE 132/* maximum key range = 132, duplicates = 0 */#ifdef __GNUC____inline#else#ifdef __cplusplusinline#endif#endifstatic unsigned char asso_values[] = {  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 20, 133, 25,  41, 0, 5, 20, 25, 1, 133, 133, 10, 60,  60, 0, 0, 0, 45, 15, 45, 30, 40, 0,  133, 15, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133, 133, 133, 133, 133,  133, 133, 133, 133, 133, 133};static const parser_config_t pconfig[133] = {  {"", NULL},  {CONTENT_ENCODING_SHORT, &msg_setcontent_encoding},  {"", NULL},  {CALL_ID_SHORT, &msg_setcall_id},  {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL},  {ERROR_INFO, &msg_seterror_info},  {FROM_SHORT, &msg_setfrom},  {IN_REPLY_TO, NULL},  {PROXY_REQUIRE, NULL},  {"", NULL}, {"", NULL},  {WWW_AUTHENTICATE, &msg_setwww_authenticate},  {"", NULL},  {PROXY_AUTHENTICATE, &msg_setproxy_authenticate},  {"", NULL}, {"", NULL},  {CONTENT_LENGTH_SHORT, &msg_setcontent_length},  {EXPIRES, NULL},  {PRIORITY, NULL},  {"", NULL},  {ALLOW, &msg_setallow},  {"", NULL},  {WARNING, NULL},  {"", NULL},  {CSEQ, &msg_setcseq},  {ALERT_INFO, &msg_setalert_info},  {SUBJECT_SHORT, NULL},  {"", NULL}, {"", NULL},  {CALL_INFO, &msg_setcall_info},  {ACCEPT_LANGUAGE, &msg_setaccept_language},  {"", NULL},  {CONTENT_TYPE, &msg_setcontent_type},  {"", NULL},  {AUTHENTICATION_INFO, NULL},  {"", NULL},  {CONTENT_LANGUAGE, NULL},  {"", NULL}, {"", NULL}, {"", NULL},  {SIPDATE, NULL},  {"", NULL},  {"to", &msg_setto},  {"", NULL}, {"", NULL},  {ROUTE, &msg_setroute},  {CONTENT_TYPE_SHORT, &msg_setcontent_type},  {REQUIRE, NULL},  {REPLY_TO, NULL},  {TIMESTAMP, NULL},  {ACCEPT_ENCODING, &msg_setaccept_encoding},  {"", NULL},  {RECORD_ROUTE, &msg_setrecord_route},  {"", NULL}, {"", NULL}, {"", NULL},  {CONTENT_ENCODING, &msg_setcontent_encoding},  {"", NULL},  {VIA, &msg_setvia},  {CONTENT_LENGTH, &msg_setcontent_length},  {SUPPORTED, NULL},  {SERVER, NULL},  {SUBJECT, NULL},  {"", NULL},  {FROM, &msg_setfrom},  {"", NULL},  {ACCEPT, &msg_setaccept},  {ORGANIZATION, NULL},  {CALL_ID, &msg_setcall_id},  {"", NULL}, {"", NULL}, {"", NULL},  {CONTACT, &msg_setcontact},  {"", NULL},  {PROXY_AUTHORIZATION, &msg_setproxy_authorization},  {"", NULL},  {VIA_SHORT, &msg_setvia},  {UNSUPPORTED, NULL},  {"", NULL}, {"", NULL},  {USER_AGENT, NULL},  {MIN_EXPIRES, NULL},  {MAX_FORWARDS, NULL},  {"", NULL}, {"", NULL}, {"", NULL},  {TO_SHORT, &msg_setto},  {"", NULL},  {AUTHORIZATION, &msg_setauthorization},  {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"",									   NULL},  {RETRY_AFTER, NULL},  {"", NULL}, {"", NULL},  {CONTENT_DISPOSITION, NULL},  {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"",									   NULL},  {"", NULL}, {"", NULL},  {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"",									   NULL},  {CONTACT_SHORT, &msg_setcontact},  {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"",									   NULL},  {"", NULL}, {"", NULL},  {"", NULL},  {MIME_VERSION, &msg_setmime_version}};static unsigned inthash (str, len)     register const char *str;     register unsigned int len;{  return len + asso_values[(unsigned char) str[len - 1]] +    asso_values[(unsigned char) str[0]];}#ifdef __GNUC____inline#endif  intin_word_set (str, len)     register const char *str;     register unsigned int len;{  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)    {      register int key = hash (str, len);      if (key <= MAX_HASH_VALUE && key >= 0)	{	  register const char *s = pconfig[key].hname;	  if (*str == *s && !strcmp (str + 1, s + 1)	      && (pconfig[key].setheader != NULL))	    return key;	}    }  return -1;}intparser_init (){  return 0;			/* do not need initialization when using gpref */}intparser_isknownheader (char *hname){  int iLength;  iLength = strlen (hname);  return in_word_set (hname, iLength);}#endif/* This method calls the method that is able to parse the header */intparser_callmethod (int i, sip_t * dest, char *hvalue){  return pconfig[i].setheader (dest, hvalue);}

⌨️ 快捷键说明

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