osip_parser_cfg.c
来自「最新osip源代码」· C语言 代码 · 共 374 行
C
374 行
/* The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-) Copyright (C) 2001,2002,2003,2004,2005 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 <osipparser2/osip_port.h>#include <osipparser2/osip_parser.h>#include "parser.h"#ifndef USE_GPERFstatic __osip_message_config_t pconfig[NUMBER_OF_HEADERS];/* The size of the hash table seems large for a limited number of possible entries * The 'problem' is that the header name are too much alike for the osip_hash() function * which gives a poor deviation. * Anyway, this mechanism improves the search time (from binary seach (log(n)) to 1). */#define HASH_TABLE_SIZE 150 /* set this to the hash table size, 150 is the first size where no conflicts occur */static int hdr_ref_table[HASH_TABLE_SIZE]; /* the hashtable contains indices to the pconfig table *//* 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 SUPPORTED HEADER! will be available in the list of unknown headers t: To => ok v: Via => ok*//* This method must be called before using the parser */intparser_init (void){ int i = 0; pconfig[i].hname = ACCEPT; pconfig[i++].setheader = (&osip_message_set_accept); pconfig[i].hname = ACCEPT_ENCODING; pconfig[i++].setheader = (&osip_message_set_accept_encoding); pconfig[i].hname = ACCEPT_LANGUAGE; pconfig[i++].setheader = (&osip_message_set_accept_language); pconfig[i].hname = ALERT_INFO; pconfig[i++].setheader = (&osip_message_set_alert_info); pconfig[i].hname = ALLOW; pconfig[i++].setheader = (&osip_message_set_allow); pconfig[i].hname = AUTHENTICATION_INFO; pconfig[i++].setheader = (&osip_message_set_authentication_info); pconfig[i].hname = AUTHORIZATION; pconfig[i++].setheader = (&osip_message_set_authorization); pconfig[i].hname = CONTENT_TYPE_SHORT; /* "l" */ pconfig[i++].setheader = (&osip_message_set_content_type); pconfig[i].hname = CALL_ID; pconfig[i++].setheader = (&osip_message_set_call_id); pconfig[i].hname = CALL_INFO; pconfig[i++].setheader = (&osip_message_set_call_info); pconfig[i].hname = CONTACT; pconfig[i++].setheader = (&osip_message_set_contact); pconfig[i].hname = CONTENT_ENCODING; pconfig[i++].setheader = (&osip_message_set_content_encoding); pconfig[i].hname = CONTENT_LENGTH; pconfig[i++].setheader = (&osip_message_set_content_length); pconfig[i].hname = CONTENT_TYPE; pconfig[i++].setheader = (&osip_message_set_content_type); pconfig[i].hname = CSEQ; pconfig[i++].setheader = (&osip_message_set_cseq); pconfig[i].hname = CONTENT_ENCODING_SHORT; /* "e" */ pconfig[i++].setheader = (&osip_message_set_content_encoding); pconfig[i].hname = ERROR_INFO; pconfig[i++].setheader = (&osip_message_set_error_info); pconfig[i].hname = FROM_SHORT; /* "f" */ pconfig[i++].setheader = (&osip_message_set_from); pconfig[i].hname = FROM; pconfig[i++].setheader = (&osip_message_set_from); pconfig[i].hname = CALL_ID_SHORT; /* "i" */ pconfig[i++].setheader = (&osip_message_set_call_id); pconfig[i].hname = CONTENT_LENGTH_SHORT; /* "l" */ pconfig[i++].setheader = (&osip_message_set_content_length); pconfig[i].hname = CONTACT_SHORT; /* "m" */ pconfig[i++].setheader = (&osip_message_set_contact); pconfig[i].hname = MIME_VERSION; pconfig[i++].setheader = (&osip_message_set_mime_version); pconfig[i].hname = PROXY_AUTHENTICATE; pconfig[i++].setheader = (&osip_message_set_proxy_authenticate); pconfig[i].hname = PROXY_AUTHENTICATION_INFO; pconfig[i++].setheader = (&osip_message_set_proxy_authentication_info); pconfig[i].hname = PROXY_AUTHORIZATION; pconfig[i++].setheader = (&osip_message_set_proxy_authorization); pconfig[i].hname = RECORD_ROUTE; pconfig[i++].setheader = (&osip_message_set_record_route); pconfig[i].hname = ROUTE; pconfig[i++].setheader = (&osip_message_set_route); pconfig[i].hname = TO_SHORT; pconfig[i++].setheader = (&osip_message_set_to); pconfig[i].hname = TO; pconfig[i++].setheader = (&osip_message_set_to); pconfig[i].hname = VIA_SHORT; pconfig[i++].setheader = (&osip_message_set_via); pconfig[i].hname = VIA; pconfig[i++].setheader = (&osip_message_set_via); pconfig[i].hname = WWW_AUTHENTICATE; pconfig[i++].setheader = (&osip_message_set_www_authenticate); /* build up hash table for fast header lookup */ /* initialize the table */ for (i = 0; i < HASH_TABLE_SIZE; i++) { hdr_ref_table[i] = -1; /* -1 -> no entry */ } for (i = 0; i < NUMBER_OF_HEADERS; i++) { unsigned long hash; /* calculate hash value using lower case */ /* Fixed: do not lower constant... osip_tolower( pconfig[i].hname ); */ hash = osip_hash (pconfig[i].hname); hash = hash % HASH_TABLE_SIZE; if (hdr_ref_table[hash] == -1) { /* store reference(index) to pconfig table */ hdr_ref_table[hash] = i; } else { /* oops, conflict!-> change the hash table or use another hash function size */ return -1; } } return 0;}/* improved look-up mechanism precondition: hname is all lowercase */int__osip_message_is_known_header (const char *hname){ unsigned long hash; int result = -1; int index; hash = osip_hash (hname); hash = hash % HASH_TABLE_SIZE; index = hdr_ref_table[hash]; if ((index != -1) && (0 == strcmp (pconfig[index].hname, hname))) { result = index; } return result;}#else /* USE_GPERF *//* 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 __osip_message_config_t pconfig[133] = { {"", NULL}, {CONTENT_ENCODING_SHORT, &osip_message_set_content_encoding}, {"", NULL}, {CALL_ID_SHORT, &osip_message_set_call_id}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {ERROR_INFO, &osip_message_set_error_info}, {FROM_SHORT, &osip_message_set_from}, {IN_REPLY_TO, NULL}, {PROXY_REQUIRE, NULL}, {"", NULL}, {"", NULL}, {WWW_AUTHENTICATE, &osip_message_set_www_authenticate}, {"", NULL}, {PROXY_AUTHENTICATE, &osip_message_set_proxy_authenticate}, {"", NULL}, {"", NULL}, {CONTENT_LENGTH_SHORT, &osip_message_set_content_length}, {EXPIRES, NULL}, {PRIORITY, NULL}, {"", NULL}, {ALLOW, &osip_message_set_allow}, {"", NULL}, {WARNING, NULL}, {"", NULL}, {CSEQ, &osip_message_set_cseq}, {ALERT_INFO, &osip_message_set_alert_info}, {SUBJECT_SHORT, NULL}, {"", NULL}, {"", NULL}, {CALL_INFO, &osip_message_set_call_info}, {ACCEPT_LANGUAGE, &osip_message_set_accept_language}, {"", NULL}, {CONTENT_TYPE, &osip_message_set_content_type}, {"", NULL}, {AUTHENTICATION_INFO, NULL}, {"", NULL}, {CONTENT_LANGUAGE, NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {SIPDATE, NULL}, {"", NULL}, {"to", &osip_message_set_to}, {"", NULL}, {"", NULL}, {ROUTE, &osip_message_set_route}, {CONTENT_TYPE_SHORT, &osip_message_set_content_type}, {REQUIRE, NULL}, {REPLY_TO, NULL}, {TIMESTAMP, NULL}, {ACCEPT_ENCODING, &osip_message_set_accept_encoding}, {"", NULL}, {RECORD_ROUTE, &osip_message_set_record_route}, {"", NULL}, {"", NULL}, {"", NULL}, {CONTENT_ENCODING, &osip_message_set_content_encoding}, {"", NULL}, {VIA, &osip_message_set_via}, {CONTENT_LENGTH, &osip_message_set_content_length}, {SUPPORTED, NULL}, {SERVER, NULL}, {SUBJECT, NULL}, {"", NULL}, {FROM, &osip_message_set_from}, {"", NULL}, {ACCEPT, &osip_message_set_accept}, {ORGANIZATION, NULL}, {CALL_ID, &osip_message_set_call_id}, {"", NULL}, {"", NULL}, {"", NULL}, {CONTACT, &osip_message_set_contact}, {"", NULL}, {PROXY_AUTHORIZATION, &osip_message_set_proxy_authorization}, {"", NULL}, {VIA_SHORT, &osip_message_set_via}, {UNSUPPORTED, NULL}, {"", NULL}, {"", NULL}, {USER_AGENT, NULL}, {MIN_EXPIRES, NULL}, {MAX_FORWARDS, NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {TO_SHORT, &osip_message_set_to}, {"", NULL}, {AUTHORIZATION, &osip_message_set_authorization}, {"", 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, &osip_message_set_contact}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}, {MIME_VERSION, &osip_message_set_mime_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 gperf */}int__osip_message_is_known_header (const 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 */int__osip_message_call_method (int i, osip_message_t * dest, const char *hvalue){ return pconfig[i].setheader (dest, hvalue);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?