[Asterisk-cvs] asterisk/channels chan_h323.c,1.52,1.53

jeremy at lists.digium.com jeremy at lists.digium.com
Thu May 20 02:54:39 CDT 2004


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv3471

Modified Files:
	chan_h323.c 
Log Message:
properly send call progress and alerting PDUs, re-fix one-way audio on call manager, and hopefully add call progress (N+101) support (not tested)

Index: chan_h323.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_h323.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- chan_h323.c	18 May 2004 16:06:30 -0000	1.52
+++ chan_h323.c	20 May 2004 07:07:18 -0000	1.53
@@ -393,7 +393,7 @@
 	int res;
 	struct oh323_pvt *p = c->pvt->pvt;
 	char called_addr[256];
-	char *tmp;
+	char *tmp, *cid, *cidname, oldcid[256];
 
 	strtok_r(dest, "/", &(tmp));
 
@@ -424,15 +424,46 @@
 
 	/* Copy callerid, if there is any */
 	if (c->callerid) {
-		char *tmp = strchr(c->callerid, '"');
-		if (!tmp) {
-			p->calloptions.callerid = malloc(80); // evil
-			// sprintf(p->calloptions.callerid, "\"%s\"", c->callerid);
-			sprintf(p->calloptions.callerid, "\"\" <%s>", c->callerid);
-		} else {
-			p->calloptions.callerid = strdup(c->callerid);
-		}	
-	 }
+                memset(oldcid, 0, sizeof(oldcid));
+                memcpy(oldcid, c->callerid, strlen(c->callerid));
+                oldcid[sizeof(oldcid)-1] = '\0';
+                ast_callerid_parse(oldcid, &cidname, &cid);
+                if (p->calloptions.callerid) {
+                        free(p->calloptions.callerid);
+                        p->calloptions.callerid = NULL;
+                }
+                if (p->calloptions.callername) {
+                        free(p->calloptions.callername);
+                        p->calloptions.callername = NULL;
+                }
+                p->calloptions.callerid = (char*)malloc(256);
+                if (p->calloptions.callerid == NULL) {
+                        ast_log(LOG_ERROR, "Not enough memory.\n");
+                        return(-1);
+                }
+                memset(p->calloptions.callerid, 0, 256);
+                if ((cid != NULL)&&(strlen(cid) > 0))
+                        strncpy(p->calloptions.callerid, cid, 255);
+
+                p->calloptions.callername = (char*)malloc(256);
+                if (p->calloptions.callername == NULL) {
+                        ast_log(LOG_ERROR, "Not enough memory.\n");
+                        return(-1);
+                }
+                memset(p->calloptions.callername, 0, 256);
+                if ((cidname != NULL)&&(strlen(cidname) > 0))
+                        strncpy(p->calloptions.callername, cidname, 255);
+
+        } else {
+                if (p->calloptions.callerid) {
+                        free(p->calloptions.callerid);
+                        p->calloptions.callerid = NULL;
+                }
+                if (p->calloptions.callername) {
+                        free(p->calloptions.callername);
+                        p->calloptions.callername = NULL;
+                }
+        }
 
 	res = h323_make_call(called_addr, &(p->cd), p->calloptions);
 
@@ -440,12 +471,9 @@
 		ast_log(LOG_NOTICE, "h323_make_call failed(%s)\n", c->name);
 		return -1;
 	}
-
-	ast_setstate(c, AST_STATE_RINGING);
 	return 0;
 }
 
-
 static int oh323_answer(struct ast_channel *c)
 {
 	int res;
@@ -597,24 +625,34 @@
 	
 	switch(condition) {
 	case AST_CONTROL_RINGING:
-		if (c->_state == AST_STATE_RING) {
-			return -1;
+		if (c->_state == AST_STATE_RING || c->_state == AST_STATE_RINGING) {
+			h323_send_alerting(p->cd.call_token);
+ 			break;
+ 		}		
+		return -1;
+	case AST_CONTROL_PROGRESS:
+		if (c->_state != AST_STATE_UP) {
+			h323_send_progress(p->cd.call_token);
+			break;
 		}
-		return 0;
+		return -1;
+
 	case AST_CONTROL_BUSY:
 		if (c->_state != AST_STATE_UP) {
-			p->alreadygone = 1;
-			ast_softhangup(c, AST_SOFTHANGUP_DEV);
+			h323_answering_call(p->cd.call_token, 1);
+ 			p->alreadygone = 1;
+			ast_softhangup_nolock(c, AST_SOFTHANGUP_DEV);			
 			break;
 		}
-		return 0;
+		return -1;
 	case AST_CONTROL_CONGESTION:
 		if (c->_state != AST_STATE_UP) {
+			h323_answering_call(p->cd.call_token, 1);
 			p->alreadygone = 1;
-			ast_softhangup(c, AST_SOFTHANGUP_DEV);
+			ast_softhangup_nolock(c, AST_SOFTHANGUP_DEV);
 			break;
 		}
-		return 0;
+		return -1;
 	case -1:
 		return -1;
 	default:
@@ -986,13 +1024,14 @@
 	p->cd.call_token = cd.call_token;
 	p->cd.call_source_aliases = cd.call_source_aliases;
 	p->cd.call_dest_alias = cd.call_dest_alias;
+	p->cd.call_source_name = cd.call_source_name;
 	p->cd.call_source_e164 = cd.call_source_e164;
 	p->cd.call_dest_e164 = cd.call_dest_e164;
 
 	if (h323debug) {
 		ast_verbose(VERBOSE_PREFIX_3 "Setting up Call\n");
 		ast_verbose(VERBOSE_PREFIX_3 "	   Call token:  [%s]\n", p->cd.call_token);
-		ast_verbose(VERBOSE_PREFIX_3 "	   Calling party name:  [%s]\n", p->cd.call_source_aliases);
+		ast_verbose(VERBOSE_PREFIX_3 "	   Calling party name:  [%s]\n", p->cd.call_source_name);
 		ast_verbose(VERBOSE_PREFIX_3 "	   Calling party number:  [%s]\n", p->cd.call_source_e164);
 		ast_verbose(VERBOSE_PREFIX_3 "	   Called  party name:  [%s]\n", p->cd.call_dest_alias);
 		ast_verbose(VERBOSE_PREFIX_3 "	   Called  party number:  [%s]\n", p->cd.call_dest_e164);
@@ -1014,17 +1053,14 @@
 			strncpy(p->exten, alias->name, sizeof(p->exten)-1);
 			strncpy(p->context, alias->context, sizeof(p->context)-1);
 		}
-
-
-		sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164);
-
+		sprintf(p->callerid, "%s <%s>", p->cd.call_source_name, p->cd.call_source_e164);
 	} else { 
 		/* Either this call is not from the Gatekeeper 
 		   or we are not allowing gk routed calls */
 		user  = find_user(cd);
 
 		if (!user) {
-			sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164); 
+			sprintf(p->callerid, "%s <%s>", p->cd.call_source_name, p->cd.call_source_e164);
 			if (!ast_strlen_zero(p->cd.call_dest_e164)) {
 				strncpy(p->exten, cd.call_dest_e164, sizeof(p->exten)-1);
 			} else {
@@ -1061,11 +1097,11 @@
 			p->bridge = user->bridge;
                       p->nat = user->nat;
 
-			if (!ast_strlen_zero(user->callerid)) 
+			if (!ast_strlen_zero(user->callerid)) {
 				strncpy(p->callerid, user->callerid, sizeof(p->callerid) - 1);
-			else
-				sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164); 
-
+			} else {
+				 sprintf(p->callerid, "%s <%s>", p->cd.call_source_name, p->cd.call_source_e164); 
+			}
 			if (!ast_strlen_zero(p->cd.call_dest_e164)) {
 				strncpy(p->exten, cd.call_dest_e164, sizeof(p->exten)-1);
 			} else {
@@ -1161,17 +1197,43 @@
 	c = p->owner;	
 
 	ast_setstate(c, AST_STATE_UP);
+	ast_queue_control(c, AST_CONTROL_ANSWER);
 	return;
 }
 
 /**
+  *  Call-back function to signal asterisk that the channel is ringing
+  *  Returns nothing
+  */
+void chan_ringing(unsigned call_reference)
+{
+        struct ast_channel *c = NULL;
+        struct oh323_pvt *p = NULL;
+
+        p = find_call(call_reference);
+
+        if (!p) {
+                ast_log(LOG_ERROR, "Something is wrong: ringing\n");
+	}
+
+        if (!p->owner) {
+                ast_log(LOG_ERROR, "Channel has no owner\n");
+                return;
+        }
+        c = p->owner;
+        ast_setstate(c, AST_STATE_RINGING);
+        ast_queue_control(c, AST_CONTROL_RINGING);
+        return;
+}
+
+/**
   * Call-back function to cleanup communication
   * Returns nothing,
   */
 void cleanup_connection(call_details_t cd)
 {	
 	struct oh323_pvt *p = NULL;
-//	struct oh323_peer *peer = NULL;
+/*	struct oh323_peer *peer = NULL; */
 	struct oh323_user *user = NULL;
 	struct ast_rtp *rtp = NULL;
 	
@@ -1793,6 +1855,7 @@
 	 			       create_connection, 
 				       setup_rtp_connection, 
 				       cleanup_connection, 
+				       chan_ringing,
 				       connection_made, 
 				       send_digit);	
 	
@@ -1800,7 +1863,6 @@
 		/* start the h.323 listener */
 		if (h323_start_listener(port, bindaddr)) {
 			ast_log(LOG_ERROR, "Unable to create H323 listener.\n");
-//			h323_end_process();
 			return -1;
 		}
 
@@ -1808,7 +1870,6 @@
 		if (gatekeeper_disable == 0) {
 			if (h323_set_gk(gatekeeper_discover, gatekeeper, secret)) {
 				ast_log(LOG_ERROR, "Gatekeeper registration failed.\n");
-//				h323_end_process();
 				return 0;
 			}
 		}




More information about the svn-commits mailing list