isdn_msg_parser.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 1,357 行 · 第 1/3 页

C
1,357
字号
	if (nt) {		if (hh->prim == (CC_RELEASE_COMPLETE|CONFIRM)) {			cb_log(0, stack->port, "CC_RELEASE_COMPLETE|CONFIRM [NT] port:%d\n",stack->port);			return;		}	} else {		if (frm->prim == (CC_RELEASE_COMPLETE|CONFIRM)) {			cb_log(0, stack->port, "CC_RELEASE_COMPLETE|CONFIRM [TE] port:%d\n",stack->port);			return;		}	}	dec_ie_cause(release_complete->CAUSE, (Q931_info_t *)(release_complete), &location, &bc->cause, nt,bc);  #if DEBUG 	printf("Parsing RELEASE_COMPLETE Msg\n"); #endif }msg_t *build_release_complete (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	RELEASE_COMPLETE_t *release_complete;	msg_t *msg =(msg_t*)create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE,  bc?bc->l3_id:-1, sizeof(RELEASE_COMPLETE_t) ,nt);  	release_complete=(RELEASE_COMPLETE_t*)((msg->data+HEADER_LEN)); 		enc_ie_cause(&release_complete->CAUSE, msg, nt?1:0, bc->out_cause, nt,bc);  #if DEBUG 	printf("Building RELEASE_COMPLETE Msg\n"); #endif	return msg; }void print_release_complete (struct isdn_msg msgs[]) {}void parse_facility (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	FACILITY_t *facility=(FACILITY_t*)((unsigned long)(msg->data+HEADER_LEN)); 	Q931_info_t *qi=(Q931_info_t*)(msg->data+HEADER_LEN);  #if DEBUG 	printf("Parsing FACILITY Msg\n"); #endif	{		char fac[128];		int facility_len;				dec_ie_facility(facility->FACILITY, qi, fac, &facility_len,  nt, bc);	}		 }msg_t *build_facility (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	FACILITY_t *facility;	msg_t *msg =(msg_t*)create_l3msg(CC_FACILITY | REQUEST, MT_FACILITY,  bc?bc->l3_id:-1, sizeof(FACILITY_t) ,nt);  	facility=(FACILITY_t*)((msg->data+HEADER_LEN)); 	{		if (*bc->display) {			printf("Sending %s as Display\n", bc->display);			enc_ie_display(&facility->DISPLAY, msg, bc->display, nt,bc);		}						switch ( bc->facility ) {		case FACILITY_CALLDEFLECT:			enc_facility_calldeflect(&facility->FACILITY, msg, bc->facility_calldeflect_nr, nt, bc);						break;		case FACILITY_NONE:			break;		}			}	#if DEBUG 	printf("Building FACILITY Msg\n"); #endif	return msg; }void print_facility (struct isdn_msg msgs[]) {}void parse_notify (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#if DEBUG 	printf("Parsing NOTIFY Msg\n"); #endif }msg_t *build_notify (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	NOTIFY_t *notify;	msg_t *msg =(msg_t*)create_l3msg(CC_NOTIFY | REQUEST, MT_NOTIFY,  bc?bc->l3_id:-1, sizeof(NOTIFY_t) ,nt);  	notify=(NOTIFY_t*)((msg->data+HEADER_LEN)); #if DEBUG 	printf("Building NOTIFY Msg\n"); #endif	return msg; }void print_notify (struct isdn_msg msgs[]) {}void parse_status_enquiry (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#if DEBUG 	printf("Parsing STATUS_ENQUIRY Msg\n"); #endif }msg_t *build_status_enquiry (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	STATUS_ENQUIRY_t *status_enquiry;	msg_t *msg =(msg_t*)create_l3msg(CC_STATUS_ENQUIRY | REQUEST, MT_STATUS_ENQUIRY,  bc?bc->l3_id:-1, sizeof(STATUS_ENQUIRY_t) ,nt);  	status_enquiry=(STATUS_ENQUIRY_t*)((msg->data+HEADER_LEN)); #if DEBUG 	printf("Building STATUS_ENQUIRY Msg\n"); #endif	return msg; }void print_status_enquiry (struct isdn_msg msgs[]) {}void parse_information (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	INFORMATION_t *information=(INFORMATION_t*)((unsigned long)(msg->data+HEADER_LEN));	{		int  type, plan;		char number[32];		char keypad[32];		dec_ie_called_pn(information->CALLED_PN, (Q931_info_t *)information, &type, &plan, (unsigned char *)number, sizeof(number), nt,bc);		dec_ie_keypad(information->KEYPAD, (Q931_info_t *)information, (unsigned char *)keypad, sizeof(keypad), nt,bc);		strcpy(bc->info_dad, number);		strcpy(bc->keypad,keypad);    	}#if DEBUG 	printf("Parsing INFORMATION Msg\n"); #endif }msg_t *build_information (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	INFORMATION_t *information;	msg_t *msg =(msg_t*)create_l3msg(CC_INFORMATION | REQUEST, MT_INFORMATION,  bc?bc->l3_id:-1, sizeof(INFORMATION_t) ,nt);  	information=(INFORMATION_t*)((msg->data+HEADER_LEN));   	{		enc_ie_called_pn(&information->CALLED_PN, msg, 0, 1, bc->info_dad, nt,bc);	}	{		if (*bc->display) {			printf("Sending %s as Display\n", bc->display);			enc_ie_display(&information->DISPLAY, msg, bc->display, nt,bc);		}	}  #if DEBUG 	printf("Building INFORMATION Msg\n"); #endif	return msg; }void print_information (struct isdn_msg msgs[]) {}void parse_status (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	STATUS_t *status=(STATUS_t*)((unsigned long)(msg->data+HEADER_LEN));	int location;  	dec_ie_cause(status->CAUSE, (Q931_info_t *)(status), &location, &bc->cause, nt,bc);	;#if DEBUG 	printf("Parsing STATUS Msg\n"); #endif }msg_t *build_status (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	STATUS_t *status;	msg_t *msg =(msg_t*)create_l3msg(CC_STATUS | REQUEST, MT_STATUS,  bc?bc->l3_id:-1, sizeof(STATUS_t) ,nt);  	status=(STATUS_t*)((msg->data+HEADER_LEN)); #if DEBUG 	printf("Building STATUS Msg\n"); #endif	return msg; }void print_status (struct isdn_msg msgs[]) {}void parse_timeout (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#if DEBUG 	printf("Parsing STATUS Msg\n"); #endif }msg_t *build_timeout (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int HEADER_LEN = nt?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;	STATUS_t *status;	msg_t *msg =(msg_t*)create_l3msg(CC_STATUS | REQUEST, MT_STATUS,  bc?bc->l3_id:-1, sizeof(STATUS_t) ,nt);  	status=(STATUS_t*)((msg->data+HEADER_LEN)); #if DEBUG 	printf("Building STATUS Msg\n"); #endif	return msg; }void print_timeout (struct isdn_msg msgs[]) {}/************************************//** Msg Array **/struct isdn_msg msgs_g[] = {	{CC_PROCEEDING,L3,EVENT_PROCEEDING,	 parse_proceeding,build_proceeding,print_proceeding,	 "PROCEEDING"},	{CC_ALERTING,L3,EVENT_ALERTING,	 parse_alerting,build_alerting,print_alerting,	 "ALERTING"},	{CC_PROGRESS,L3,EVENT_PROGRESS,	 parse_progress,build_progress,print_progress,	 "PROGRESS"},	{CC_SETUP,L3,EVENT_SETUP,	 parse_setup,build_setup,print_setup,	 "SETUP"},	{CC_CONNECT,L3,EVENT_CONNECT,	 parse_connect,build_connect,print_connect,	 "CONNECT"},	{CC_SETUP_ACKNOWLEDGE,L3,EVENT_SETUP_ACKNOWLEDGE,	 parse_setup_acknowledge,build_setup_acknowledge,print_setup_acknowledge,	 "SETUP_ACKNOWLEDGE"},	{CC_CONNECT_ACKNOWLEDGE ,L3,EVENT_CONNECT_ACKNOWLEDGE ,	 parse_connect_acknowledge ,build_connect_acknowledge ,print_connect_acknowledge ,	 "CONNECT_ACKNOWLEDGE "},	{CC_USER_INFORMATION,L3,EVENT_USER_INFORMATION,	 parse_user_information,build_user_information,print_user_information,	 "USER_INFORMATION"},	{CC_SUSPEND_REJECT,L3,EVENT_SUSPEND_REJECT,	 parse_suspend_reject,build_suspend_reject,print_suspend_reject,	 "SUSPEND_REJECT"},	{CC_RESUME_REJECT,L3,EVENT_RESUME_REJECT,	 parse_resume_reject,build_resume_reject,print_resume_reject,	 "RESUME_REJECT"},	{CC_HOLD,L3,EVENT_HOLD,	 parse_hold,build_hold,print_hold,	 "HOLD"},	{CC_SUSPEND,L3,EVENT_SUSPEND,	 parse_suspend,build_suspend,print_suspend,	 "SUSPEND"},	{CC_RESUME,L3,EVENT_RESUME,	 parse_resume,build_resume,print_resume,	 "RESUME"},	{CC_HOLD_ACKNOWLEDGE,L3,EVENT_HOLD_ACKNOWLEDGE,	 parse_hold_acknowledge,build_hold_acknowledge,print_hold_acknowledge,	 "HOLD_ACKNOWLEDGE"},	{CC_SUSPEND_ACKNOWLEDGE,L3,EVENT_SUSPEND_ACKNOWLEDGE,	 parse_suspend_acknowledge,build_suspend_acknowledge,print_suspend_acknowledge,	 "SUSPEND_ACKNOWLEDGE"},	{CC_RESUME_ACKNOWLEDGE,L3,EVENT_RESUME_ACKNOWLEDGE,	 parse_resume_acknowledge,build_resume_acknowledge,print_resume_acknowledge,	 "RESUME_ACKNOWLEDGE"},	{CC_HOLD_REJECT,L3,EVENT_HOLD_REJECT,	 parse_hold_reject,build_hold_reject,print_hold_reject,	 "HOLD_REJECT"},	{CC_RETRIEVE,L3,EVENT_RETRIEVE,	 parse_retrieve,build_retrieve,print_retrieve,	 "RETRIEVE"},	{CC_RETRIEVE_ACKNOWLEDGE,L3,EVENT_RETRIEVE_ACKNOWLEDGE,	 parse_retrieve_acknowledge,build_retrieve_acknowledge,print_retrieve_acknowledge,	 "RETRIEVE_ACKNOWLEDGE"},	{CC_RETRIEVE_REJECT,L3,EVENT_RETRIEVE_REJECT,	 parse_retrieve_reject,build_retrieve_reject,print_retrieve_reject,	 "RETRIEVE_REJECT"},	{CC_DISCONNECT,L3,EVENT_DISCONNECT,	 parse_disconnect,build_disconnect,print_disconnect,	 "DISCONNECT"},	{CC_RESTART,L3,EVENT_RESTART,	 parse_restart,build_restart,print_restart,	 "RESTART"},	{CC_RELEASE,L3,EVENT_RELEASE,	 parse_release,build_release,print_release,	 "RELEASE"},	{CC_RELEASE_COMPLETE,L3,EVENT_RELEASE_COMPLETE,	 parse_release_complete,build_release_complete,print_release_complete,	 "RELEASE_COMPLETE"},	{CC_FACILITY,L3,EVENT_FACILITY,	 parse_facility,build_facility,print_facility,	 "FACILITY"},	{CC_NOTIFY,L3,EVENT_NOTIFY,	 parse_notify,build_notify,print_notify,	 "NOTIFY"},	{CC_STATUS_ENQUIRY,L3,EVENT_STATUS_ENQUIRY,	 parse_status_enquiry,build_status_enquiry,print_status_enquiry,	 "STATUS_ENQUIRY"},	{CC_INFORMATION,L3,EVENT_INFORMATION,	 parse_information,build_information,print_information,	 "INFORMATION"},	{CC_STATUS,L3,EVENT_STATUS,	 parse_status,build_status,print_status,	 "STATUS"},	{CC_TIMEOUT,L3,EVENT_TIMEOUT,	 parse_timeout,build_timeout,print_timeout,	 "TIMEOUT"},	{0,0,0,NULL,NULL,NULL,NULL}};#define msgs_max (sizeof(msgs_g)/sizeof(struct isdn_msg))/** INTERFACE FCTS ***/int isdn_msg_get_index(struct isdn_msg msgs[], msg_t *msg, int nt){	int i;	if (nt){#ifdef MISDNUSER_JOLLY		mISDNuser_head_t *hh = (mISDNuser_head_t*)msg->data;#else		mISDN_head_t *hh = (mISDN_head_t*)msg->data;#endif    		for (i=0; i< msgs_max -1; i++) 			if ( (hh->prim&COMMAND_MASK)==(msgs[i].misdn_msg&COMMAND_MASK)) return i;    	} else {		iframe_t *frm = (iframe_t*)msg->data;    		for (i=0; i< msgs_max -1; i++) 			if ( (frm->prim&COMMAND_MASK)==(msgs[i].misdn_msg&COMMAND_MASK)) return i;	}	return -1;}int isdn_msg_get_index_by_event(struct isdn_msg msgs[], enum event_e event, int nt){	int i;	for (i=0; i< msgs_max; i++) 		if ( event == msgs[i].event) return i;	cb_log(4,0, "get_index: EVENT NOT FOUND!!\n");		return -1;}enum event_e isdn_msg_get_event(struct isdn_msg msgs[], msg_t *msg, int nt){	int i=isdn_msg_get_index(msgs, msg, nt);	if(i>=0) return msgs[i].event;	return EVENT_UNKNOWN;}char * isdn_msg_get_info(struct isdn_msg msgs[], msg_t *msg, int nt){	int i=isdn_msg_get_index(msgs, msg, nt);	if(i>=0) return msgs[i].info;	return NULL;}char EVENT_CLEAN_INFO[] = "CLEAN_UP";char EVENT_DTMF_TONE_INFO[] = "DTMF_TONE";char EVENT_NEW_L3ID_INFO[] = "NEW_L3ID";char EVENT_NEW_BC_INFO[] = "NEW_BC";char EVENT_BCHAN_DATA_INFO[] = "BCHAN_DATA";char * isdn_get_info(struct isdn_msg msgs[], enum event_e event, int nt){	int i=isdn_msg_get_index_by_event(msgs, event, nt);		if(i>=0) return msgs[i].info;		if (event == EVENT_CLEANUP) return EVENT_CLEAN_INFO;	if (event == EVENT_DTMF_TONE) return EVENT_DTMF_TONE_INFO;	if (event == EVENT_NEW_L3ID) return EVENT_NEW_L3ID_INFO;	if (event == EVENT_NEW_BC) return EVENT_NEW_BC_INFO;	if (event == EVENT_BCHAN_DATA) return EVENT_BCHAN_DATA_INFO;		return NULL;}int isdn_msg_parse_event(struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt){	int i=isdn_msg_get_index(msgs, msg, nt);	if(i<0) return -1;	msgs[i].msg_parser(msgs, msg, bc, nt);	return 0;}msg_t * isdn_msg_build_event(struct isdn_msg msgs[], struct misdn_bchannel *bc, enum event_e event, int nt){	int i=isdn_msg_get_index_by_event(msgs, event, nt);	if(i<0) return NULL;  	return  msgs[i].msg_builder(msgs, bc, nt);}

⌨️ 快捷键说明

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