From 1f4eadaf6a4840773cb44aa9be4ded233b72540f Mon Sep 17 00:00:00 2001
From: Jeremy McNamara <jj@nufone.net>
Date: Tue, 15 Jun 2004 20:56:06 +0000
Subject: [PATCH] check to make sure the extension exists b4 actually accepting
 the call and lets hope this gives Open H.323 enough time to sync up (bug
 #1714)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3220 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_h323.c       | 33 +++++++++++++++++++++++++++++++--
 channels/h323/ast_h323.cpp |  7 ++++++-
 channels/h323/chan_h323.h  |  6 +++++-
 3 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index ae1a6bbf2b..e016b48123 100755
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -1007,7 +1007,7 @@ int setup_incoming_call(call_details_t cd)
 {
 	
 	struct oh323_pvt *p = NULL;
-	struct ast_channel *c = NULL;
+/*	struct ast_channel *c = NULL; */
 	struct oh323_user *user = NULL;
 	struct oh323_alias *alias = NULL;
 
@@ -1118,13 +1118,41 @@ int setup_incoming_call(call_details_t cd)
 	}
 
 exit:
+#if 0
 	/* allocate a channel and tell asterisk about it */
 	c = oh323_new(p, AST_STATE_RINGING, cd.call_token);
 	if (!c) {
 		ast_log(LOG_ERROR, "Couldn't create channel. This is bad\n");
 		return 0;
 	}
+#endif
+	return 1;
+}
 
+/**
+ * Call-back function to start PBX when OpenH323 ready to serve incoming call
+ *
+ * Returns 1 on success
+ */
+static int answer_call(unsigned call_reference)
+{
+	struct oh323_pvt *p = NULL;
+	struct ast_channel *c = NULL;
+	
+	/* Find the call or allocate a private structure if call not found */
+	p = find_call(call_reference);
+	
+	if (!p) {
+		ast_log(LOG_ERROR, "Something is wrong: answer_call\n");
+		return 0;
+	}
+	
+	/* allocate a channel and tell asterisk about it */
+	c = oh323_new(p, AST_STATE_RINGING, p->cd.call_token);
+	if (!c) {
+		ast_log(LOG_ERROR, "Couldn't create channel. This is bad\n");
+		return 0;
+	}
 	return 1;
 }
 
@@ -1857,7 +1885,8 @@ int load_module()
 				       cleanup_connection, 
 				       chan_ringing,
 				       connection_made, 
-				       send_digit);	
+				       send_digit,
+				       answer_call);
 	
 
 		/* start the h.323 listener */
diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp
index cb78730af7..e1d396999d 100755
--- a/channels/h323/ast_h323.cpp
+++ b/channels/h323/ast_h323.cpp
@@ -489,6 +489,9 @@ H323Connection::AnswerCallResponse MyH323Connection::OnAnswerCall(const PString
 																   const H323SignalPDU & /*setupPDU*/,
 																   H323SignalPDU & /*connectPDU*/)
 {
+	if (!on_answer_call(GetCallReference()))
+		return H323Connection::AnswerCallDenied;
+
 	/* The call will be answered later with "AnsweringCall()" function.
 	 */ 
 	return H323Connection::AnswerCallDeferred;
@@ -835,7 +838,8 @@ void h323_callback_register(setup_incoming_cb  	ifunc,
  			    clear_con_cb	clfunc,
  			    chan_ringing_cb     rfunc,
 			    con_established_cb 	efunc,
- 			    send_digit_cb	dfunc)
+ 			    send_digit_cb	dfunc,
+ 			    answer_call_cb	acfunc)
 {
 	on_incoming_call = ifunc;
 	on_outgoing_call = sfunc;
@@ -845,6 +849,7 @@ void h323_callback_register(setup_incoming_cb  	ifunc,
 	on_chan_ringing = rfunc;
 	on_connection_established = efunc;
 	on_send_digit = dfunc;
+	on_answer_call = acfunc;
 }
 
 /**
diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h
index 198247cc0a..23e583f897 100755
--- a/channels/h323/chan_h323.h
+++ b/channels/h323/chan_h323.h
@@ -153,6 +153,9 @@ con_established_cb		on_connection_established;
 typedef void (*clear_con_cb)(call_details_t);
 clear_con_cb		on_connection_cleared;
 
+typedef int (*answer_call_cb)(unsigned);
+answer_call_cb		on_answer_call;
+
 /* debug flag */
 int h323debug;
 
@@ -178,7 +181,8 @@ extern "C" {
  				    clear_con_cb,
  				    chan_ringing_cb,
 				    con_established_cb,
- 				    send_digit_cb);
+ 				    send_digit_cb,
+ 				    answer_call_cb);
 
 
 	int h323_set_capability(int, int);
-- 
GitLab