[asterisk-commits] moy: branch moy/mfcr2-1.4 r184833 - /team/moy/mfcr2-1.4/channels/chan_dahdi.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Mar 28 14:28:43 CDT 2009


Author: moy
Date: Sat Mar 28 14:28:37 2009
New Revision: 184833

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=184833
Log:
added DADHIAcceptR2Call application

Modified:
    team/moy/mfcr2-1.4/channels/chan_dahdi.c

Modified: team/moy/mfcr2-1.4/channels/chan_dahdi.c
URL: http://svn.digium.com/svn-view/asterisk/team/moy/mfcr2-1.4/channels/chan_dahdi.c?view=diff&rev=184833&r1=184832&r2=184833
==============================================================================
--- team/moy/mfcr2-1.4/channels/chan_dahdi.c (original)
+++ team/moy/mfcr2-1.4/channels/chan_dahdi.c Sat Mar 28 14:28:37 2009
@@ -3079,6 +3079,126 @@
 #endif
 
 #ifdef HAVE_OPENR2
+static char *dahdi_accept_r2_call_app = "DAHDIAcceptR2Call";
+static char *zap_accept_r2_call_app = "ZapAcceptR2Call";
+
+static char *dahdi_accept_r2_call_synopsis = "Accept an R2 call if its not already accepted (you still need to answer it)";
+static char *zap_accept_r2_call_synopsis = "Accept an R2 call if its not already accepted (you still need to answer it)";
+
+static char *dahdi_accept_r2_call_descrip = 
+"  DAHDIAcceptR2Call(): This application will accept the current MFC/R2 call\n"
+"  You can specify yes or no as argument to accept with or without charge.\n";
+
+static char *zap_accept_r2_call_descrip = 
+"  ZapAcceptR2Call(): This application will accept the current MFC/R2 call\n"
+"  You can specify yes or no as argument to accept with or without charge.\n";
+
+static int dahdi_accept_r2_call_exec(struct ast_channel *chan, void *data)
+{
+	/* data is whether to accept with charge or no charge */
+	openr2_call_mode_t accept_mode;
+	int res, timeout, maxloops;
+	struct ast_frame *f;
+	struct dahdi_pvt *p;
+	char *parse;
+	AST_DECLARE_APP_ARGS(args,
+			AST_APP_ARG(charge);
+	);
+
+	if (ast_strlen_zero(data)) {
+		ast_log(LOG_DEBUG, "No data sent to application!\n");
+		return -1;
+	}
+
+	if (chan->tech != &dahdi_tech) {
+		ast_log(LOG_DEBUG, "Only DAHDI technology accepted!\n");
+		return -1;
+	}
+
+	p = (struct dahdi_pvt *)chan->tech_pvt;
+	if (!p) {
+		ast_log(LOG_DEBUG, "Unable to find technology private!\n");
+		return -1;
+	}
+
+	parse = ast_strdupa(data);
+	AST_STANDARD_APP_ARGS(args, parse);
+
+	if (ast_strlen_zero(args.charge)) {
+		ast_log(LOG_WARNING, "DAHDIAcceptR2Call requires 'yes' or 'no' for the charge parameter\n");
+		return -1;
+	}
+
+	ast_mutex_lock(&p->lock);
+	if (!p->mfcr2 || !p->mfcr2call) {
+		ast_mutex_unlock(&p->lock);
+		ast_log(LOG_DEBUG, "Channel %s does not seems to be an R2 active channel!\n", chan->name);
+		return -1;
+	}
+
+	if (p->mfcr2_call_accepted) {
+		ast_mutex_unlock(&p->lock);
+		ast_log(LOG_DEBUG, "MFC/R2 call already accepted on channel %s!\n", chan->name);
+		return 0;
+	}
+	accept_mode = ast_true(args.charge) ? OR2_CALL_WITH_CHARGE : OR2_CALL_NO_CHARGE;
+	if (openr2_chan_accept_call(p->r2chan, accept_mode)) {
+		ast_mutex_unlock(&p->lock);
+		ast_log(LOG_WARNING, "Failed to accept MFC/R2 call!\n");
+		return -1;
+	}
+	ast_mutex_unlock(&p->lock);
+
+	res = 0;
+	timeout = 100;
+	maxloops = 50; /* wait up to 5 seconds */
+	/* we need to read() until the call is accepted */
+	while (maxloops > 0) {
+		maxloops--;
+		if (ast_check_hangup(chan)) {
+			break;
+		}
+		res = ast_waitfor(chan, timeout);
+		if (res < 0) {
+			ast_log(LOG_DEBUG, "ast_waitfor failed on channel %s, going out ...\n", chan->name);
+			res = -1;
+			break;
+		}
+		if (res == 0) {
+			continue;
+		}
+		f = ast_read(chan);
+		if (!f) {
+			ast_log(LOG_DEBUG, "No frame read on channel %s, going out ...\n", chan->name);
+			res = -1;
+			break;
+		}
+		if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
+			ast_log(LOG_DEBUG, "Got HANGUP frame on channel %s, going out ...\n", chan->name);
+			ast_frfree(f);
+			res = -1;
+			break;
+		}
+		ast_frfree(f);
+		ast_mutex_lock(&p->lock);
+		if (p->mfcr2_call_accepted) {
+			ast_mutex_unlock(&p->lock);
+			ast_log(LOG_DEBUG, "Accepted MFC/R2 call!\n");
+			break;
+		}
+		ast_mutex_unlock(&p->lock);
+	}
+	if (res == -1) {
+		ast_log(LOG_WARNING, "Failed to accept MFC/R2 call!\n");
+	}
+	return res;
+}
+
+static int zap_accept_r2_call_exec(struct ast_channel *chan, void *data)
+{
+	return dahdi_accept_r2_call_exec(chan, data);
+}
+
 static openr2_call_disconnect_cause_t dahdi_ast_cause_to_r2_cause(int cause)
 {
 	openr2_call_disconnect_cause_t r2cause = OR2_CAUSE_NORMAL_CLEARING;
@@ -12094,6 +12214,10 @@
 		}
 	}
 	ast_cli_unregister_multiple(dahdi_mfcr2_cli, sizeof(dahdi_mfcr2_cli) / sizeof(dahdi_mfcr2_cli[0]));
+	if (*dahdi_chan_mode == CHAN_DAHDI_PLUS_ZAP_MODE) {
+		ast_unregister_application(dahdi_accept_r2_call_app);
+	}
+	ast_unregister_application(zap_accept_r2_call_app);
 #endif
 	ast_cli_unregister_multiple(dahdi_cli, sizeof(dahdi_cli) / sizeof(struct ast_cli_entry));
 	local_astman_unregister("DialOffHook");
@@ -13053,7 +13177,7 @@
 #ifdef HAVE_ZAPTEL
 	int load_from_zapata_conf = 1;
 #else
-	int load_from_zapata_conf = (dahdi_chan_mode == CHAN_ZAP_MODE);
+	int load_from_zapata_conf = (*dahdi_chan_mode == CHAN_ZAP_MODE);
 #endif
 
 	if (load_from_zapata_conf) {
@@ -13223,6 +13347,12 @@
 #endif
 #ifdef HAVE_OPENR2
 	init_mfcr2_globals();
+	if (*dahdi_chan_mode == CHAN_DAHDI_PLUS_ZAP_MODE) {
+		ast_register_application(dahdi_accept_r2_call_app, dahdi_accept_r2_call_exec,
+			dahdi_accept_r2_call_synopsis, dahdi_accept_r2_call_descrip);
+	}
+	ast_register_application(zap_accept_r2_call_app, zap_accept_r2_call_exec,
+		zap_accept_r2_call_synopsis, zap_accept_r2_call_descrip);
 #endif
 	if ((res = setup_dahdi(0))) {
 		return AST_MODULE_LOAD_DECLINE;




More information about the asterisk-commits mailing list