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

📄 isdn_msg_parser.c

📁 asterisk 是一个很有知名度开源软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	int cause;	iframe_t *frm = (iframe_t*) msg->data;	struct misdn_stack *stack=get_stack_by_bc(bc);	mISDNuser_head_t *hh;	hh=(mISDNuser_head_t*)msg->data;	/*hh=(mISDN_head_t*)msg->data;	mISDN_head_t *hh;*/	if (nt) {		if (hh->prim == (CC_RELEASE_COMPLETE|CONFIRM)) {			cb_log(0, stack->port, "CC_RELEASE_COMPLETE|CONFIRM [NT] \n");			return;		}	} else {		if (frm->prim == (CC_RELEASE_COMPLETE|CONFIRM)) {			cb_log(0, stack->port, "CC_RELEASE_COMPLETE|CONFIRM [TE] \n");			return;		}	}	dec_ie_cause(release_complete->CAUSE, (Q931_info_t *)(release_complete), &location, &cause, nt,bc);	if (cause>0) bc->cause=cause;#ifdef DEBUG 	printf("Parsing RELEASE_COMPLETE Msg\n"); #endif}static 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 (bc->uulen) {		int  protocol=4;		enc_ie_useruser(&release_complete->USER_USER, msg, protocol, bc->uu, bc->uulen, nt,bc);		cb_log(1,bc->port,"ENCODING USERUESRINFO:%s\n",bc->uu);	}  #ifdef DEBUG 	printf("Building RELEASE_COMPLETE Msg\n"); #endif	return msg; }static 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*)(msg->data+HEADER_LEN); 	Q931_info_t *qi = (Q931_info_t*)(msg->data+HEADER_LEN);  	unsigned char *p = NULL;	int err;#ifdef DEBUG 	printf("Parsing FACILITY Msg\n"); #endif	if (!bc->nt) {		if (qi->QI_ELEMENT(facility))			p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(facility) + 1;	} else {		p = facility->FACILITY;	}	if (!p)		return;		err = decodeFac(p, &(bc->fac_in));	if (err) {		cb_log(5, bc->port, "Decoding FACILITY failed! (%d)\n", err);	}}static msg_t *build_facility (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt) {	int len,		HEADER_LEN = nt ? mISDNUSER_HEAD_SIZE : mISDN_HEADER_LEN;	unsigned char *ie_fac,				  fac_tmp[256];	msg_t *msg =(msg_t*)create_l3msg(CC_FACILITY | REQUEST, MT_FACILITY,  bc?bc->l3_id:-1, sizeof(FACILITY_t) ,nt);	FACILITY_t *facility = (FACILITY_t*)(msg->data+HEADER_LEN); 	Q931_info_t *qi;#ifdef DEBUG 	printf("Building FACILITY Msg\n"); #endif		len = encodeFac(fac_tmp, &(bc->fac_out));	if (len <= 0)		return NULL;	ie_fac = msg_put(msg, len);	if (bc->nt) {		facility->FACILITY = ie_fac + 1;	} else {		qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);		qi->QI_ELEMENT(facility) = ie_fac - (unsigned char *)qi - sizeof(Q931_info_t);	}	memcpy(ie_fac, fac_tmp, len);	if (*bc->display) {		printf("Sending %s as Display\n", bc->display);		enc_ie_display(&facility->DISPLAY, msg, bc->display, nt,bc);	}	return msg; }static void parse_notify (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#ifdef DEBUG 	printf("Parsing NOTIFY Msg\n"); #endif}static 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)); #ifdef DEBUG 	printf("Building NOTIFY Msg\n"); #endif	return msg; }static void parse_status_enquiry (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#ifdef DEBUG 	printf("Parsing STATUS_ENQUIRY Msg\n"); #endif}static 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)); #ifdef DEBUG 	printf("Building STATUS_ENQUIRY Msg\n"); #endif	return msg; }static 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, number, sizeof(number)-1, nt, bc);		dec_ie_keypad(information->KEYPAD, (Q931_info_t *)information, keypad, sizeof(keypad)-1, nt, bc);		strcpy(bc->info_dad, number);		strcpy(bc->keypad,keypad);	}#ifdef DEBUG 	printf("Parsing INFORMATION Msg\n"); #endif}static 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);		}	}  #ifdef DEBUG 	printf("Building INFORMATION Msg\n"); #endif	return msg; }static 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;	int cause;  	dec_ie_cause(status->CAUSE, (Q931_info_t *)(status), &location, &cause, nt,bc);	if (cause>0) bc->cause=cause;	;#ifdef DEBUG 	printf("Parsing STATUS Msg\n"); #endif}static 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)); #ifdef DEBUG 	printf("Building STATUS Msg\n"); #endif	return msg; }static void parse_timeout (struct isdn_msg msgs[], msg_t *msg, struct misdn_bchannel *bc, int nt) {#ifdef DEBUG 	printf("Parsing STATUS Msg\n"); #endif }static 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)); #ifdef DEBUG 	printf("Building STATUS Msg\n"); #endif	return msg; }/************************************//** Msg Array **/struct isdn_msg msgs_g[] = {	{CC_PROCEEDING,L3,EVENT_PROCEEDING,	 parse_proceeding,build_proceeding,	 "PROCEEDING"},	{CC_ALERTING,L3,EVENT_ALERTING,	 parse_alerting,build_alerting,	 "ALERTING"},	{CC_PROGRESS,L3,EVENT_PROGRESS,	 parse_progress,build_progress,	 "PROGRESS"},	{CC_SETUP,L3,EVENT_SETUP,	 parse_setup,build_setup,	 "SETUP"},	{CC_CONNECT,L3,EVENT_CONNECT,	 parse_connect,build_connect,	 "CONNECT"},	{CC_SETUP_ACKNOWLEDGE,L3,EVENT_SETUP_ACKNOWLEDGE,	 parse_setup_acknowledge,build_setup_acknowledge,	 "SETUP_ACKNOWLEDGE"},	{CC_CONNECT_ACKNOWLEDGE ,L3,EVENT_CONNECT_ACKNOWLEDGE ,	 parse_connect_acknowledge ,build_connect_acknowledge,	 "CONNECT_ACKNOWLEDGE "},	{CC_USER_INFORMATION,L3,EVENT_USER_INFORMATION,	 parse_user_information,build_user_information,	 "USER_INFORMATION"},	{CC_SUSPEND_REJECT,L3,EVENT_SUSPEND_REJECT,	 parse_suspend_reject,build_suspend_reject,	 "SUSPEND_REJECT"},	{CC_RESUME_REJECT,L3,EVENT_RESUME_REJECT,	 parse_resume_reject,build_resume_reject,	 "RESUME_REJECT"},	{CC_HOLD,L3,EVENT_HOLD,	 parse_hold,build_hold,	 "HOLD"},	{CC_SUSPEND,L3,EVENT_SUSPEND,	 parse_suspend,build_suspend,	 "SUSPEND"},	{CC_RESUME,L3,EVENT_RESUME,	 parse_resume,build_resume,	 "RESUME"},	{CC_HOLD_ACKNOWLEDGE,L3,EVENT_HOLD_ACKNOWLEDGE,	 parse_hold_acknowledge,build_hold_acknowledge,	 "HOLD_ACKNOWLEDGE"},	{CC_SUSPEND_ACKNOWLEDGE,L3,EVENT_SUSPEND_ACKNOWLEDGE,	 parse_suspend_acknowledge,build_suspend_acknowledge,	 "SUSPEND_ACKNOWLEDGE"},	{CC_RESUME_ACKNOWLEDGE,L3,EVENT_RESUME_ACKNOWLEDGE,	 parse_resume_acknowledge,build_resume_acknowledge,	 "RESUME_ACKNOWLEDGE"},	{CC_HOLD_REJECT,L3,EVENT_HOLD_REJECT,	 parse_hold_reject,build_hold_reject,	 "HOLD_REJECT"},	{CC_RETRIEVE,L3,EVENT_RETRIEVE,	 parse_retrieve,build_retrieve,	 "RETRIEVE"},	{CC_RETRIEVE_ACKNOWLEDGE,L3,EVENT_RETRIEVE_ACKNOWLEDGE,	 parse_retrieve_acknowledge,build_retrieve_acknowledge,	 "RETRIEVE_ACKNOWLEDGE"},	{CC_RETRIEVE_REJECT,L3,EVENT_RETRIEVE_REJECT,	 parse_retrieve_reject,build_retrieve_reject,	 "RETRIEVE_REJECT"},	{CC_DISCONNECT,L3,EVENT_DISCONNECT,	 parse_disconnect,build_disconnect,	 "DISCONNECT"},	{CC_RESTART,L3,EVENT_RESTART,	 parse_restart,build_restart,	 "RESTART"},	{CC_RELEASE,L3,EVENT_RELEASE,	 parse_release,build_release,	 "RELEASE"},	{CC_RELEASE_COMPLETE,L3,EVENT_RELEASE_COMPLETE,	 parse_release_complete,build_release_complete,	 "RELEASE_COMPLETE"},	{CC_FACILITY,L3,EVENT_FACILITY,	 parse_facility,build_facility,	 "FACILITY"},	{CC_NOTIFY,L3,EVENT_NOTIFY,	 parse_notify,build_notify,	 "NOTIFY"},	{CC_STATUS_ENQUIRY,L3,EVENT_STATUS_ENQUIRY,	 parse_status_enquiry,build_status_enquiry,	 "STATUS_ENQUIRY"},	{CC_INFORMATION,L3,EVENT_INFORMATION,	 parse_information,build_information,	 "INFORMATION"},	{CC_STATUS,L3,EVENT_STATUS,	 parse_status,build_status,	 "STATUS"},	{CC_TIMEOUT,L3,EVENT_TIMEOUT,	 parse_timeout,build_timeout,	 "TIMEOUT"},	{0,0,0,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){		mISDNuser_head_t *hh = (mISDNuser_head_t*)msg->data;				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(10,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_PORT_ALARM_INFO[] = "ALARM";char EVENT_NEW_CHANNEL_INFO[] = "NEW_CHANNEL";char EVENT_BCHAN_DATA_INFO[] = "BCHAN_DATA";char EVENT_BCHAN_ACTIVATED_INFO[] = "BCHAN_ACTIVATED";char EVENT_TONE_GENERATE_INFO[] = "TONE_GENERATE";char EVENT_BCHAN_ERROR_INFO[] = "BCHAN_ERROR";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_NEW_CHANNEL) return EVENT_NEW_CHANNEL_INFO;	if (event == EVENT_BCHAN_DATA) return EVENT_BCHAN_DATA_INFO;	if (event == EVENT_BCHAN_ACTIVATED) return EVENT_BCHAN_ACTIVATED_INFO;	if (event == EVENT_TONE_GENERATE) return EVENT_TONE_GENERATE_INFO;	if (event == EVENT_PORT_ALARM) return EVENT_PORT_ALARM_INFO;	if (event == EVENT_BCHAN_ERROR) return EVENT_BCHAN_ERROR_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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -