[svn-commits] nadi: branch group/trunk-cm-csel-hash r47723 - /team/group/trunk-cm-csel-hash...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu Nov 16 05:11:27 MST 2006


Author: nadi
Date: Thu Nov 16 06:11:27 2006
New Revision: 47723

URL: http://svn.digium.com/view/asterisk?view=rev&rev=47723
Log:
reworked a lot in cb_events

Modified:
    team/group/trunk-cm-csel-hash/channels/chan_misdn.c

Modified: team/group/trunk-cm-csel-hash/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/team/group/trunk-cm-csel-hash/channels/chan_misdn.c?view=diff&rev=47723&r1=47722&r2=47723
==============================================================================
--- team/group/trunk-cm-csel-hash/channels/chan_misdn.c (original)
+++ team/group/trunk-cm-csel-hash/channels/chan_misdn.c Thu Nov 16 06:11:27 2006
@@ -4035,26 +4035,7 @@
 		}
 	}
 
-	if (ch) {
-		switch (event) {
-		case EVENT_TONE_GENERATE:
-			break;
-		case EVENT_DISCONNECT:
-		case EVENT_RELEASE:
-		case EVENT_RELEASE_COMPLETE:
-		case EVENT_CLEANUP:
-		case EVENT_TIMEOUT:
-			if (!ch->ast)
-				chan_misdn_log(3, bc->port, "ast_hangup already called, so we have no ast ptr anymore in event(%s)\n", manager_isdn_get_info(event));
-			break;
-		default:
-			if (!ch->ast || !MISDN_ASTERISK_PVT(ch->ast) || !MISDN_ASTERISK_TECH_PVT(ch->ast)) {
-				if (event != EVENT_BCHAN_DATA)
-					ast_log(LOG_NOTICE, "No Ast or No private Pointer in Event (%d:%s)\n", event, manager_isdn_get_info(event));
-				return -1;
-			}
-		}
-	} else {
+	if (!ch) {
 		switch (event) {
 		case EVENT_RETRIEVE:
 			ch = find_holded_l3(cl_te, bc->l3_id, 1);
@@ -4065,13 +4046,12 @@
 			}
 			ch->bc = bc;
 			break;
+		case EVENT_DISCONNECT:
+			bc->out_cause = -1;
 		case EVENT_SETUP:
 		case EVENT_PORT_ALARM:
 		case EVENT_NEW_BC:
 		case EVENT_FACILITY:
-			break;
-		case EVENT_DISCONNECT:
-			bc->out_cause = -1;
 			break;
 		case EVENT_RELEASE_COMPLETE:
 			chan_misdn_log(2, bc->port, " --> no Ch, so we've already released.\n");
@@ -4084,137 +4064,163 @@
 						   bc->l3_id, bc, manager_isdn_get_info(event), bc->port, bc->channel);
 			return -1;
 		}
-	}
-
-	if (event == EVENT_BCHAN_DATA) {
-		struct ast_frame frame;
-		struct timeval tv;
-		int t;
-
-		if (!misdn_cap_is_speech(ch->bc->capability)) {
-			/* in data modes we queue frames */
-			frame.frametype = AST_FRAME_VOICE; /* we have no data frames yet */
-			frame.subclass = AST_FORMAT_ALAW;
-			frame.datalen = bc->bframe_len;
-			frame.samples = bc->bframe_len;
-			frame.mallocd =	frame.offset = 0;
-			frame.delivery = ast_tv(0, 0);
-			frame.src = NULL;
-			frame.data = bc->bframe;
-			ast_queue_frame(ch->ast, &frame);
-		} else {
-			fd_set wrfs;
-			tv.tv_sec = 0;
-			tv.tv_usec = 0;
-			FD_ZERO(&wrfs);
-			FD_SET(ch->pipe[1], &wrfs);
-			t = select(FD_SETSIZE, NULL, &wrfs, NULL, &tv);
-			if (!t) {
-				chan_misdn_log(9, bc->port, "Select Timed out\n");
+	} else {
+		switch (event) {
+		case EVENT_DISCONNECT:
+		case EVENT_RELEASE:
+		case EVENT_RELEASE_COMPLETE:
+		case EVENT_CLEANUP:
+		case EVENT_TIMEOUT:
+			if (!ch->ast)
+				chan_misdn_log(3, bc->port, "ast_hangup already called, so we have no ast ptr anymore in event(%s)\n", manager_isdn_get_info(event));
+		case EVENT_TONE_GENERATE:
+			break;
+		default:
+			if (!ch->ast || !MISDN_ASTERISK_PVT(ch->ast) || !MISDN_ASTERISK_TECH_PVT(ch->ast)) {
+				if (event != EVENT_BCHAN_DATA)
+					ast_log(LOG_NOTICE, "No Ast or No private Pointer in Event (%d:%s)\n", event, manager_isdn_get_info(event));
+				return -1;
+			}
+		}
+	}
+
+	switch (event) {
+	case EVENT_BCHAN_DATA:
+		{
+			struct ast_frame frame;
+			struct timeval tv;
+			int t;
+
+			if (!misdn_cap_is_speech(ch->bc->capability)) {
+				/* in data modes we queue frames */
+				frame.frametype = AST_FRAME_VOICE; /* we have no data frames yet */
+				frame.subclass = AST_FORMAT_ALAW;
+				frame.datalen = bc->bframe_len;
+				frame.samples = bc->bframe_len;
+				frame.mallocd =	frame.offset = 0;
+				frame.delivery = ast_tv(0, 0);
+				frame.src = NULL;
+				frame.data = bc->bframe;
+				ast_queue_frame(ch->ast, &frame);
+			} else {
+				fd_set wrfs;
+				tv.tv_sec = 0;
+				tv.tv_usec = 0;
+				FD_ZERO(&wrfs);
+				FD_SET(ch->pipe[1], &wrfs);
+				t = select(FD_SETSIZE, NULL, &wrfs, NULL, &tv);
+				if (!t)
+					chan_misdn_log(9, bc->port, "Select Timed out\n");
+				else if (t < 0)
+					chan_misdn_log(-1, bc->port, "Select Error (err = %s)\n", strerror(errno));
+				else if (FD_ISSET(ch->pipe[1], &wrfs)) {
+					chan_misdn_log(9, bc->port, "writing %d bytes to asterisk\n", bc->bframe_len);
+					if (write(ch->pipe[1], bc->bframe, bc->bframe_len) <= 0)
+						chan_misdn_log(-1, bc->port, "Write returned <= 0 (err = %s)\n", strerror(errno));
+				} else
+					chan_misdn_log(2, bc->port, "Wripe Pipe full!\n");
+			}
+			return RESPONSE_OK;
+		}
+	case EVENT_TONE_GENERATE:
+		{
+			int tone_len = bc->tone_cnt,
+				res;
+			struct ast_channel *ast = ch->ast;
+			void *tmp;
+
+			if (!ast || !ast->generator)
 				return RESPONSE_OK;
+
+			chan_misdn_log(9, bc->port, "TONE_GEN: len:%d\n");
+			tmp = ast->generatordata;
+			ast->generatordata = NULL;
+			if (tone_len < 0 || tone_len > 512) {
+				ast_log(LOG_NOTICE, "TONE_GEN: len was %d, set to 128\n", tone_len);
+				tone_len = 128;
 			}
-			if (t < 0) {
-				chan_misdn_log(-1, bc->port, "Select Error (err = %s)\n", strerror(errno));
-				return RESPONSE_OK;
+			res = ast->generator->generate(ast, tmp, tone_len, tone_len);
+			ast->generatordata = tmp;
+			if (res) {
+				ast_log(LOG_WARNING, "Auto-deactivating generator\n");
+				ast_deactivate_generator(ast);
+			} else
+				bc->tone_cnt = 0;
+
+			return RESPONSE_OK;
+		}
+	case EVENT_SETUP:
+		{
+			char msns[BUFFERSIZE],
+				 tmp[16];
+			int msn_valid = 0,
+				exceed;
+
+			if (ch) {
+				if (statemachine_get_state(ch->sm) == MISDN_NOTHING)
+					ch = NULL;
+				else {
+					chan_misdn_log(2, bc->port, " --> Ignoring Call we already have one\n");
+					return RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE;
+				}
 			}
-			if (FD_ISSET(ch->pipe[1], &wrfs)) {
-				chan_misdn_log(9, bc->port, "writing %d bytes to asterisk\n", bc->bframe_len);
-				if (write(ch->pipe[1], bc->bframe, bc->bframe_len) <= 0)
-					chan_misdn_log(-1, bc->port, "Write returned <= 0 (err = %s)\n", strerror(errno));
-			} else
-				chan_misdn_log(2, bc->port, "Wripe Pipe full!\n");
-		}
-		return RESPONSE_OK;
-	}
-
-	if (event == EVENT_TONE_GENERATE) {
-		int tone_len = bc->tone_cnt,
-			res;
-		struct ast_channel *ast = ch->ast;
-		void *tmp;
-
-		chan_misdn_log(9, bc->port, "TONE_GEN: len:%d\n");
-		if (!ast || !ast->generator)
+
+			if (!cm_get(misdn_cm, msns, sizeof(msns), PORT, MCFG_MSNS, bc->port))
+				msn_valid = is_msn_valid(msns, bc->dad);
+
+			if (!bc->nt && !msn_valid) {
+				chan_misdn_log(2, bc->port, " --> Ignoring Call, its not in our MSN List\n");
+				return RESPONSE_IGNORE_SETUP; /*  Ignore MSNs which are not in our list. */
+			}
+
+			if (bc->cw) {
+				chan_misdn_log(0, bc->port, " --> Call Waiting on PMP sending RELEASE_COMPLETE\n");
+				if (cm_get_int(misdn_cm, bc->out_cause, PORT, MCFG_REJECT_CAUSE, bc->port))
+					bc->out_cause = 0;
+				if (!bc->out_cause)
+					bc->out_cause = 16;
+				return RESPONSE_RELEASE_SETUP;
+			}
+
+			print_bearer(bc);
+
+			ch = init_chan_list(ORG_MISDN);
+			if (!ch) {
+				chan_misdn_log(-1, bc->port, "cb_events: malloc for chan_list failed!\n");
+				return RESPONSE_IGNORE_SETUP;
+			}
+
+			ch->bc = bc;
+			ch->l3id = bc->l3_id;
+			ch->addr = bc->addr;
+			ch->orginator = ORG_MISDN;
+			ch->ast = misdn_new(ch, AST_STATE_RESERVED, bc->dad, bc->oad, AST_FORMAT_ALAW, bc->port, bc->channel);
+
+			if ((exceed = add_in_calls(bc->port))) {
+				snprintf(tmp, sizeof(tmp), "%d", exceed);
+				pbx_builtin_setvar_helper(ch->ast, "MAX_OVERFLOW", tmp);
+			}
+
+			config_ch(ch, ORG_MISDN);
+			config_ch_pres_screen(ch);
+			export_chan(ch->ast, bc, ch);
+
+			cl_queue_chan(&cl_te, ch) ;
+			
+			break; /* continue with statemachine */
+		}
+	case EVENT_NEW_BC:
+		{
+			if (!ch)
+				ch = find_holded(cl_te, bc);
+			if (!ch)
+				ast_log(LOG_WARNING, "NEW_BC without chan_list?\n");
+			else if (bc)
+				ch->bc = user_data;
 			return RESPONSE_OK;
-		tmp = ast->generatordata;
-		ast->generatordata = NULL;
-		if (tone_len < 0 || tone_len > 512) {
-			ast_log(LOG_NOTICE, "TONE_GEN: len was %d, set to 128\n", tone_len);
-			tone_len = 128;
-		}
-		res = ast->generator->generate(ast, tmp, tone_len, tone_len);
-		ast->generatordata = tmp;
-		if (res) {
-			ast_log(LOG_WARNING, "Auto-deactivating generator\n");
-			ast_deactivate_generator(ast);
-		} else
-			bc->tone_cnt = 0;
-		return RESPONSE_OK;
-	}
-
-	if (event == EVENT_SETUP) {
-		char msns[BUFFERSIZE],
-			 tmp[16];
-		int msn_valid = 0,
-			exceed;
-		if (ch) {
-			if (statemachine_get_state(ch->sm) == MISDN_NOTHING)
-				ch = NULL;
-			else {
-				chan_misdn_log(2, bc->port, " --> Ignoring Call we already have one\n");
-				return RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE;
-			}
-		}
-		if (!cm_get(misdn_cm, msns, sizeof(msns), PORT, MCFG_MSNS, bc->port))
-			msn_valid = is_msn_valid(msns, bc->dad);
-		if (!bc->nt && !msn_valid) {
-			chan_misdn_log(2, bc->port, " --> Ignoring Call, its not in our MSN List\n");
-			return RESPONSE_IGNORE_SETUP; /*  Ignore MSNs which are not in our list. */
-		}
-
-		if (bc->cw) {
-			chan_misdn_log(0, bc->port, " --> Call Waiting on PMP sending RELEASE_COMPLETE\n");
-			if (cm_get_int(misdn_cm, bc->out_cause, PORT, MCFG_REJECT_CAUSE, bc->port))
-				bc->out_cause = 0;
-			if (!bc->out_cause)
-				bc->out_cause = 16;
-			return RESPONSE_RELEASE_SETUP;
-		}
-
-		print_bearer(bc);
-
-		ch = init_chan_list(ORG_MISDN);
-		if (!ch) {
-			chan_misdn_log(-1, bc->port, "cb_events: malloc for chan_list failed!\n");
-			return RESPONSE_IGNORE_SETUP;
-		}
-
-		ch->bc = bc;
-		ch->l3id = bc->l3_id;
-		ch->addr = bc->addr;
-		ch->orginator = ORG_MISDN;
-		ch->ast = misdn_new(ch, AST_STATE_RESERVED, bc->dad, bc->oad, AST_FORMAT_ALAW, bc->port, bc->channel);
-
-		if ((exceed = add_in_calls(bc->port))) {
-			snprintf(tmp, sizeof(tmp), "%d", exceed);
-			pbx_builtin_setvar_helper(ch->ast, "MAX_OVERFLOW", tmp);
-		}
-
-		config_ch(ch, ORG_MISDN);
-		config_ch_pres_screen(ch);
-		export_chan(ch->ast, bc, ch);
-		
-		cl_queue_chan(&cl_te, ch) ;
-	}
-
-	if (event == EVENT_NEW_BC) {
-		if (!ch)
-			ch = find_holded(cl_te, bc);
-		if (!ch)
-			ast_log(LOG_WARNING, "NEW_BC without chan_list?\n");
-		else if (bc)
-			ch->bc = user_data;
-		return RESPONSE_OK;
+		}
+	default:
+		break;
 	}
 
 	/*
@@ -4223,13 +4229,8 @@
 	if (ch && !statemachine_run(ch->sm, event)) {
 		if (ch->destroy_me)
 			release_chan(ch);
-		return RESPONSE_OK;
-	}
-
-	/*
-	 * this is for events not (yet) handled by our statemachine
-	 */
-	ast_log(LOG_NOTICE, "Got Unknown Event\n");
+	} else
+		ast_log(LOG_NOTICE, "Got unhandled event: %d\n", event);
 
 	return RESPONSE_OK;
 }



More information about the svn-commits mailing list