Q/CT XXXX.1-2008
osip_message_set_multiple_headerÀ´½âÎö¸ÃheaderµÄhvalue×Ö·û´®£»½âÎö³É¹¦ºó£¬ÖÃstart_of_headerΪÒѾ½âÎöÍêµÄheaderµÄend_of_header£¬¿ªÊ¼½âÎöÏÂÒ»¸öheader¡£
ÔÚosip_message_set_multiple_headerÖУ¬½«headers·ÖΪÁ½À࣬һÀàÈçÉÏÃæÀý×ÓÖеÄSubject£¬Ö»ÔÊÐíÒ»¸öÖµ£¬ÔòÖ±½Óµ÷ÓÃosip_message_set__header½øÐнâÎö£»Ò»ÀàÈçÉÏÃæÀý×ÓÖеÄRouter£¬ÔÊÐí¶à¸öÖµ£¬¸ù¾ÝsipÐÒ飬ÿ¸öÖµÖ®¼äÒÔ¡°£¬¡±½øÐзָô£¬ËùÒÔÐèÒª²éѯÕû¸öhvalue×Ö·û´®£¬¸ù¾Ý¡±,¡±½«hvalue·Ö¸ô³É¶à¸öÖµ£¬Ã¿¸öÖµµ÷ÓÃosip_message_set__header½øÐнâÎö²¢±£´æ½âÎö½á¹ûµ½osip_messageµÄÊý¾Ý³ÉÔ±±äÁ¿ÖС£ÒòΪhvalueÔÊÐíʹÓÃÒýºÅ½«ÖµÒýÆðÀ´£¬ËùÒÔÐèÒªÌØ±ð´¦Àí¡°£¬¡±ÊÇ·ñ³öÏÖÔÚÒýºÅÄÚ²¿µÄÎÊÌâ¡£Ö»ÓÐÔÚÒýºÅÍⲿµÄ¡°£¬¡±²ÅÊÇheaderÖµµÄ·Ö¸ô·û£¬¶øÄÚ²¿µÄ¡°£¬¡±Ö»ÊÇÒ»¸öheaderÖµµÄÒ»²¿·Ö¡£
osipÔ´ÂëÖÐosip_message_set__header¶ÔÓÚmessage headersµÄ½âÎö²ÉÓÃ×¢²áº¯ÊýµÄ·½Ê½ÊµÏÖ£¬²ÉÓÃÕâÖÖ·½Ê½Äܹ»ÔÚºó¼Ì°æ±¾ºÜ·½±ãµÄ½øÐÐеÄheaderµÄÌí¼Ó£¬²¢ÇÒ²»»áÓ°Ïìµ½Õû¸öÔ´´úÂëµÄ¿ò¼ÜÁ÷³Ì¡£
Osip_parser_cfg.cÎļþÖж¨ÒåÁËheaderÍ·½âÎöËùʹÓõ½µÄÈ«¾Ö¹ÜÀí±äÁ¿£ºstatic __osip_message_config_t pconfig[NUMBER_OF_HEADERS];
__osip_message_config_tµÄ½á¹¹¶¨ÒåÈçÏ£º typedef struct ___osip_message_config_t {
char *hname;
int (*setheader) (osip_message_t *, const char *); int ignored_when_invalid; }__osip_message_config_t;
hnameΪsipÐÒ鶨ÒåµÄÍ·×ֶεÄ×Ö·û´®£¬ÕâЩ×Ö·û´®¶¨ÒåÔÚosip_const.hÎļþÖУ»º¯ÊýÖ¸ÕësetheaderΪ¸ÃÐÒéheaderµÄ¶ÔÓ¦µÄ½âÎöº¯Êý£»ignored_when_invalidΪÊÇ·ñºöÂÔ¸Ãheader½âÎö´íÎóµÄ±êÖ¾£¬¸Ã±ê־ֵΪ1ʱ£¬ÔÚ½âÎö¸ÃÐÒéheader·¢ËÍ´íÎóʱ£¬ºöÂԸôíÎ󣬳ýsipÐÒ鹿¶¨µÄ¼¸¸ö±ØÒªheaderÖ®Í⣬ÆäËûÍ·Ó¦¸Ã²ÉÓúöÂÔ·½Ê½¡£
ΪÁ˸ü¿ìµÄ¸ù¾ÝheaderµÄhname£¬ÕÒµ½¶ÔÓ¦µÄsetheader½âÎöº¯Êý£¬²ÉÓÃÁËhash±íµÄ²éѯ·½Ê½£¬¸ù¾ÝhnameÉú³ÉÒ»¸öhashÖµ£¬²¢ÇÒÐèÒª±£Ö¤Ã»ÓÐÁ½¸ö²»Í¬µÄhname¶ÔÓ¦µ½Í¬Ò»¸öhashÖµÖУ¬ÒÔÌá¸ß²éѯµÄËÙ¶È¡£µ÷ÓÃ__osip_message_is_known_header (hname)»ñÈ¡µ½ÔÚÊý×éÖеÄindex, µ÷ÓÃ__osip_message_call_method (my_index, sip, hvalue)½âÎöÐÒéheader£¬²¢ÇÒ½â
ÖйúIMSÍøÂçSIPÐÒ鹿·¶×ÜÌå¼¼ÊõÒªÇó - 13 -
Q/CT XXXX.1-2008
ÎöµÄ½á¹û±£´æÔڽṹosip_message_t * dest,ÖС£
ÿһ¸öheader¶¼°üº¬¼¸¸öͨÓõIJÙ×÷£ºheader×Ö·û´®µÄ½âÎöº¯Êý£¬¼´É϶ν²µ½µÄosip_message_set_xxx½âÎöº¯Êý£»header½âÎöºóµÄ½á¹¹µÄ»ñÈ¡º¯Êý£¬osip_message_get_xxxº¯Êý£»¸ù¾Ýheader½âÎöºóµÄ½á¹¹Éú³É×Ö·û´®µÄº¯Êý£ºosip_xxx_str£»header½âÎöºóµÄ½á¹¹µÄcopyº¯Êýosip_xxx_clone£»header½âÎöºóµÄ½á¹¹µÄÊÇ·ñº¯Êý£ºosip_xxx_free£»ÒÔ¼°header½âÎö½á¹¹µÄ³õʼ»¯º¯Êý£ºosip_xxx_init¡£
¶Ôÿ¸öheaderµÄ¼¸¸öÏà¹Ø²Ù×÷×îÖÕÄ¿µÄÊÇÌṩÐÒéµÄÕû¸öheaderµÄÕûÌå²Ù×÷£¬°üÀ¨osip_message_init£¬osip_message_free£¬osip_message_cloneºÍosip_message_parse¡£ 3.3.3
uriµÄ½âÎö
¾ø´ó²¿·ÖµÄheaderµÄ½âÎö¶¼ÊÇÏàʶµÄ£¬Ö»ÓÐÆäÖÐÓвÎÊýµÄ²¿·ÖµÄheaderµÄ½âÎö»á±È½Ï¸´ÔÓ£¬×îÖ÷ÒªµÄÓÐfrom¡¢to¡¢contactµÈ£¬ÒòΪ³ýÁ˱¾Éí¾ÍÓвÎÊýÖ®Í⣬ÆäÖµÖеÄrequest_uri±¾ÉíÒ²¿ÉÒÔ°üº¬ÓвÎÊý£¬¶øÕâÁ½ÖÖ²ÎÊýÖ®¼äÊÇÓÐÇø±ðµÄ¡£
SipÐÒéÕ»¹æ¶¨headerµÄ±íʾ·ÖΪ header¡¯s name, header¡¯s valueºÍheader¡¯s parameter¡£ÆäÖÐnameºÍvalueÖ®¼äÓá°£º¡±·Ö¸ô£¬valueÓëparameterÖ®¼äÓá°£»¡±·Ö¸ô£¬parameterÖ®¼äҲʹÓá°£»¡±Ïà·Ö¸ô¡£
Ôڽṹ¶¨ÒåÖÐheaderµÄvalue¸ù¾Ý¾ßÌåheader°üº¬µÄÐÅÏ¢½øÐнṹ±äÁ¿µÄ¶¨Ò壬¶øÈç¹û°üº¬parameterÔòÖ±½Ó¶¨ÒåÒ»¸ögen_paramsµÄÁ´±í£¬ËùÓеÄparameter¶¼±£´æÔÚÕâ¸öÁ´±íÖС£
ÈçÏÂÃæfromµÄ¶¨Ò壬°üº¬ÓÐfromµÄÃû³Æ¼°Ò»¸öurl£¬¼°Ïà¹ØµÄparameter£º
struct osip_from {
char *displayname; /**< Display Name */ osip_uri_t *url; /**< url */
osip_list_t gen_params; /**< other From parameters */
ÖйúIMSÍøÂçSIPÐÒ鹿·¶×ÜÌå¼¼ÊõÒªÇó - 14 -
Q/CT XXXX.1-2008
};
¶ÔÓ¦parameterµÄ½âÎöÖ±½Óµ÷ÓÃ__osip_generic_param_parseall£¬¸Ãº¯Êý½âÎöheaderµÄµ¥¸öhvalue×Ö·û´®Öаüº¬µÄËùÓÐparameter£¬ÔÚº¯ÊýÄÚ²¿»á¸ù¾Ý¡°£»¡±½«×Ö·û´®»®·ÖΪ¼¸¸öparameter£¬È»ºó½âÎöÿ¸öparameter£¬½«½âÎö½á¹û±£´æÔÚgen_paramsÁ´±íÖС£ParameterµÄ¸ñʽΪpname=pvalueÀàÐÍ£¬µÈºÅÁ½±ßÔÊÐí¿Õ¸ñ¡£
From¡¢to¡¢contactÒÔ¼°viaÖм䶼¿ÉÄܳöÏÖurl¡£urlµÄ½âÎö½Ó¿ÚΪosip_uri_parse£¬ÊäÈëΪurlµÄ×Ö·û´®£¬½âÎöµÄ½á¹¹±£´æÔڽṹosip_uri_tÖ®ÖС£url°üº¬ÓÐÈý²¿·ÖÄÚÈÝ£ºurlµÄ»ù±¾ÐÅÏ¢£¬urlµÄheaderÍ·²¿·ÖºÍurlµÄ²ÎÊý²¿·Ö¡£¿ªÊ¼²¿·ÖÓëheaderÍ·²¿·ÖÓá°?¡±½øÐзָô£¬headerÍ·Ö®¼äÓá±&¡±½øÐзָô£¬headerÍ·²¿·ÖÓë²ÎÊý²¿·ÖÓá±;¡±½øÐзָô£¬²ÎÊýÖ®¼äҲʹÓá°£»¡±½øÐзָô¡£Header²¿·Öµ÷Óú¯Êýosip_uri_parse_headers½øÐнâÎö£¬½á¹û±£´æÔÚosip_uri_t½á¹¹ÖеÄurl_headers³ÉÔ±±äÁ¿ÖУ»parameter²¿·Öµ÷Óú¯Êýosip_uri_parse_params½øÐнâÎö£¬Æä½á¹û±£´æÔÚosip_uri_tµÄurl_params³ÉÔ±±äÁ¿ÖС£
ÔÚfrom¡¢to¡¢contactµÈ°üº¬urlµÄheaderÖУ¬Èç¹ûurlÖаüº¬parameter£¬ÔòÕû¸öurl±ØÐèʹÓá°<¡± ¡°>¡±À¨ÆðÀ´£¬ÒÔ±íʾһ¸öÍêÕûurl²¿·Ö¡£ËùÒÔ½âÎöfromµÈheaderʱÐèÒª¼ì²éÊÇ·ñ°üº¬¡±<¡±×Ö·û¡£ 3.3.4 1)
Ìí¼ÓÒ»¸öеÄÐÒéheader×Ö¶Î
ÐèÒªÌí¼Ó¶à¸öÒ»¸ö¶Ô¸Ã×ֶνøÐнâÎöµÄÎļþ£¬°üº¬Ò»¸öheader³£Óõ½µÄ¼¸¸ö»ù±¾Í¨ÓòÙ×÷£¬Èç¹û¸ÃheaderÓÐÌØÊâµÄµØ·½ÐèÒª´¦Àí£¬ÐèÒªÔö¼ÓÏà¹ØµÄ´¦Àíº¯Êý£¬ÎļþÃûÒ»°ã¶¨ÒåΪosip_xxx.cºÍosip_xxx.h
2) ÐèÒªÔÚparser_initÖÐ×¢²áеÄheaderµÄ½âÎöº¯Êý£¬ÐèÒªÐÞ¸Ästatic __osip_message_config_t
pconfig[NUMBER_OF_HEADERS]
ÖÐ
µÄ
NUMBER_OF_HEADERSºêÖµ¡£
3)
ÔÚosip_const.hÖÐÌí¼ÓеÄheaderµÄºê¶¨Ò壬osipµÄÏà¹ØµÄ³£Á¿ºê¶¨Òå¶¼¶¨ÒåÔÚ¸ÃÎļþ
4) ÔÚosip_message.cÎļþ¶îosip_message_initº¯ÊýÖÐÌí¼Ó¶Ô¸ÃheaderÏà¹Ø½á¹¹µÄ³õʼ»¯²Ù×÷¡£ÔÚosip_message_freeº¯ÊýÖÐͬÑùÌí¼Ó¶Ô¸ÃheaderµÄÏà¹ØÊͷŲÙ×÷£¬ÔÚosip_message_cloneÖÐÌí¼Ó¶Ô¸ÃheaderµÄcloneÏà¹Ø²Ù×÷¡£
ÖйúIMSÍøÂçSIPÐÒ鹿·¶×ÜÌå¼¼ÊõÒªÇó - 15 -
Q/CT XXXX.1-2008
5) ÔÚosip_message_to_str.cÎļþÖеÄ_osip_message_to_strº¯ÊýÖÐÌí¼Ó¸Ãheaderת»¯ÎªstringµÄº¯Êý×¢²á¡£
6) Èç¹û¸Ãheader²»ÔÊÐíÖØ¸´¶à¸ö³öÏÖ£¬¼´²»ÔÊÐímultiple header£¬ÔòÔÚosip_message_parse.cÎļþµÄ osip_message_set_multiple_headerº¯ÊýÖÐÌí¼Ó¶Ô¸ÃheaderµÄ´¦Àí¡£
7) 8)
ÔÚosip_message.hµÄÍ·ÎļþÖеÄosip_message½á¹¹ÖÐÌí¼Ó¶Ô¸Ãheader×ֶεĽṹ¡£ ÔÚosip_headers.hÎļþÖÐÌí¼ÓеÄheaderµÄÍ·ÎļþÒýÓá£
3.4 osipµÄtransactionµÄ¹ÜÀí
transactionµÄ²Ù×÷Ö÷Òª°üÀ¨transactionµÄ³õʼ»¯¡¢transactionµÄfree¡¢transactionµÄÆ¥Åä¡¢´ÓtransactionÖлñÈ¡ÐÅÏ¢ºÍÉèÖÃtransactionÐÅÏ¢¡£
¸ù¾ÝsipÐÒéÃèÊöÒ»¸ötransactionÓÉ5¸ö±ØÒª²¿·Ö×é³É£ºfrom¡¢to¡¢topvia¡¢call-idºÍcseq£¬Õâ5¸ö²¿·ÖÒ»Æðʶ±ðijһ¸ötransaction£¬Èç¹ûȱÉÙÈκÎÒ»²¿·Ö£¬¸Ãtransaction¾Í»áÉèÖÃʧ°Ü¡£
ËùÒÔ¶Ôÿ¸ö²¿·ÖµÄÉèÖö¼»áÓÐÒ»¸öÉèÖú¯Êý£º__osip_transaction_set_topviaÓÃÓÚÉèÖÃtopvia£¬¶ÔÓÚ·¢ËͶËtopviaΪ×Ô¼ºµÄvia£¬¶ÔÓÚ½ÓÊÕ¶ËtopviaΪ½«messageת·¢µ½×Ô¼ºµÄ×îºóÒ»¸ösip-proxy·þÎñÆ÷£¬__osip_transaction_set_fromÓÃÓÚÉèÖÃmessageµÄ·¢ËͶˣ¬__osip_transaction_set_toÓÃÓÚÉèÖÃmessageµÄ½ÓÊÕ¶Ë£¬__osip_transaction_set_call_idÓÃÓÚÉèÖÃÒ»¸ödialogµÄ±êʶֵ£¬¸ÃÖµÊÇËæ»úÉú³ÉµÄ£¬Ëã·¨±£Ö¤ºÜ³¤Ò»¶Îʱ¼äÄÚÉú³ÉµÄcal_idÊDz»ÏàͬµÄ£¬__osip_transaction_set_cseqÓÃÓÚÉèÖÃcseqÖµ£¬¸ÃÖµÔÚͬһ¸ödialogÄÚ²¿ÊÇÒ»Ö±±£³ÖÔö³¤µÄ£¬¼´Í¬Ò»¸ödialogµÄºóÃæµÄtransactionµÄcseq»á±ÈÇ°ÃæµÄtransactionµÄÖµ´ó£¬°´ÕÕsipÐÒéÆä³õʼֵ¿ÉÒÔÊÇËæ»úÊý£¬´úÂëʵÏÖÖÐÈç¹ûÊÇ·ÇregisterÇëÇ󣬴Ó1¿ªÊ¼£¬Èç¹ûÊÇregisterÇëÇóµÄdialog£¬´Ó20¿ªÊ¼¡£
TransactionµÄ³õʼ»¯·¢ÉúÔÚ½ÓÊÕµ½Ò»¸öеÄÇëÇó»ò·¢ËÍÒ»¸öÇëÇóµÄʱºò£¬¸ÃÇëÇóÒÔ¼°¾¹ý½âÎö³ÉΪһ¸ö¿ÉÒÔÖ±½ÓʹÓÃÇëÇóÐÅÏ¢µÄ½á¹¹osip_message_t¡£Æä³õʼ»¯¾ßÌå¹ý³ÌÈçÉÏÃæËùÊö£¬ÔÚÉèÖÃÍêÄÇ5¸ö²¿·Öºó£¬»¹ÐèÒª³õʼ»¯eventµÄ¶ÓÁУ¬ÒÔ¼°¸ù¾Ýosip_message_tµÄtype³õʼ»¯Ê¹Óõ½µÄ¶¨Ê±Æ÷½á¹¹£¬ÈçICTµÄict_context¡£ÆäËü²¿·ÖµÄ³õʼ»¯ÔÚexosipÔ´´úÂëÖÐʵÏÖ£¬Ïà¹ØµÄÈçyour_instance¡¢in_socket¡¢out_socketºÍrecord¶¼ÊÇδÁË·½±ãexosipÖжÔtransactionµÄ¹ÜÀí¶øÉèÖõġ£
TransactionÖеÄeventµÄÏà¹Ø²Ù×÷ÔÚÈçÇ°ÃæËùÊö¡£
ÖйúIMSÍøÂçSIPÐÒ鹿·¶×ÜÌå¼¼ÊõÒªÇó - 16 -