[Asterisk-cvs] asterisk/channels chan_agent.c,1.148,1.149

kpfleming kpfleming
Tue Sep 13 20:29:31 CDT 2005


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

Modified Files:
	chan_agent.c 
Log Message:
partial formatting cleanup


Index: chan_agent.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_agent.c,v
retrieving revision 1.148
retrieving revision 1.149
diff -u -d -r1.148 -r1.149
--- chan_agent.c	7 Sep 2005 20:44:57 -0000	1.148
+++ chan_agent.c	14 Sep 2005 00:28:06 -0000	1.149
@@ -549,7 +549,7 @@
 	ast_mutex_lock(&p->lock);
 	if (p->chan) {
 		if ((f->frametype != AST_FRAME_VOICE) ||
-			(f->subclass == p->chan->writeformat)) {
+		    (f->subclass == p->chan->writeformat)) {
 			res = ast_write(p->chan, f);
 		} else {
 			ast_log(LOG_DEBUG, "Dropping one incompatible voice frame on '%s' to '%s'\n", ast->name, p->chan->name);
@@ -752,12 +752,12 @@
 				p->loginstart = 0;
 				ast_log(LOG_NOTICE, "Agent '%s' didn't answer/confirm within %d seconds (waited %d)\n", p->name, p->autologoff, howlong);
 				manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
-					"Agent: %s\r\n"
-					"Loginchan: %s\r\n"
-					"Logintime: %ld\r\n"
-					"Reason: Autologoff\r\n"
-					"Uniqueid: %s\r\n",
-					p->agent, p->loginchan, logintime, ast->uniqueid);
+					      "Agent: %s\r\n"
+					      "Loginchan: %s\r\n"
+					      "Logintime: %ld\r\n"
+					      "Reason: Autologoff\r\n"
+					      "Uniqueid: %s\r\n",
+					      p->agent, p->loginchan, logintime, ast->uniqueid);
 				snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
 				ast_queue_log("NONE", ast->uniqueid, agent, "AGENTCALLBACKLOGOFF", "%s|%ld|%s", p->loginchan, logintime, "Autologoff");
 				p->loginchan[0] = '\0';
@@ -774,21 +774,6 @@
 			ast_mutex_unlock(&p->chan->lock);
 		}
 	}
-#if 0
-		ast_mutex_unlock(&p->lock);
-		/* Release ownership of the agent to other threads (presumably running the login app). */
-		ast_mutex_unlock(&p->app_lock);
-	} else if (p->dead) {
-		/* Go ahead and lose it */
-		ast_mutex_unlock(&p->lock);
-		/* Release ownership of the agent to other threads (presumably running the login app). */
-		ast_mutex_unlock(&p->app_lock);
-	} else {
-		ast_mutex_unlock(&p->lock);
-		/* Release ownership of the agent to other threads (presumably running the login app). */
-		ast_mutex_unlock(&p->app_lock);
-	}
-#endif	
 	ast_mutex_unlock(&p->lock);
 	ast_device_state_changed("Agent/%s", p->agent);
 
@@ -1271,7 +1256,7 @@
 	while(p) {
 		ast_mutex_lock(&p->lock);
 		if (!p->pending && ((groupmatch && (p->group & groupmatch)) || !strcmp(data, p->agent)) &&
-				ast_strlen_zero(p->loginchan)) {
+		    ast_strlen_zero(p->loginchan)) {
 			if (p->chan)
 				hasagent++;
 			if (!p->lastdisc.tv_sec) {
@@ -1376,10 +1361,10 @@
         	ast_mutex_lock(&p->lock);
 
 		/* Status Values:
-			AGENT_LOGGEDOFF - Agent isn't logged in
-			AGENT_IDLE      - Agent is logged in, and waiting for call
-			AGENT_ONCALL    - Agent is logged in, and on a call
-			AGENT_UNKNOWN   - Don't know anything about agent. Shouldn't ever get this. */
+		   AGENT_LOGGEDOFF - Agent isn't logged in
+		   AGENT_IDLE      - Agent is logged in, and waiting for call
+		   AGENT_ONCALL    - Agent is logged in, and on a call
+		   AGENT_UNKNOWN   - Don't know anything about agent. Shouldn't ever get this. */
 
 		if(!ast_strlen_zero(p->name)) {
 			username = p->name;
@@ -1413,22 +1398,22 @@
 		}
 
 		ast_cli(s->fd, "Event: Agents\r\n"
-				"Agent: %s\r\n"
-				"Name: %s\r\n"
-				"Status: %s\r\n"
-				"LoggedInChan: %s\r\n"
-				"LoggedInTime: %ld\r\n"
-				"TalkingTo: %s\r\n"
-				"%s"
-				"\r\n",
-				p->agent,p->name,status,loginChan,p->loginstart,talkingtoChan,idText);
+			"Agent: %s\r\n"
+			"Name: %s\r\n"
+			"Status: %s\r\n"
+			"LoggedInChan: %s\r\n"
+			"LoggedInTime: %ld\r\n"
+			"TalkingTo: %s\r\n"
+			"%s"
+			"\r\n",
+			p->agent,p->name,status,loginChan,p->loginstart,talkingtoChan,idText);
 		ast_mutex_unlock(&p->lock);
 		p = p->next;
 	}
 	ast_mutex_unlock(&agentlock);
 	ast_cli(s->fd, "Event: AgentsComplete\r\n"
-			"%s"
-			"\r\n",idText);
+		"%s"
+		"\r\n",idText);
 	ast_mutex_unlock(&s->lock);
 
 	return 0;
@@ -1455,10 +1440,10 @@
 			p->loginstart = 0;
 			
 			manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
-				"Agent: %s\r\n"
-				"Loginchan: %s\r\n"
-				"Logintime: %ld\r\n",
-				p->agent, p->loginchan, logintime);
+				      "Agent: %s\r\n"
+				      "Loginchan: %s\r\n"
+				      "Logintime: %ld\r\n",
+				      p->agent, p->loginchan, logintime);
 			ast_queue_log("NONE", "NONE", agent, "AGENTCALLBACKLOGOFF", "%s|%ld|%s", p->loginchan, logintime, "CommandLogoff");
 			p->loginchan[0] = '\0';
 			set_agentbycallerid(p);
@@ -1589,7 +1574,7 @@
 			if (!ast_strlen_zero(p->moh))
 				snprintf(moh, sizeof(moh), " (musiconhold is '%s')", p->moh);
 			ast_cli(fd, "%-12.12s %s%s%s%s\n", p->agent, 
-					username, location, talkingto, moh);
+				username, location, talkingto, moh);
 			count_agents++;
 		}
 		ast_mutex_unlock(&p->lock);
@@ -1685,7 +1670,7 @@
 	}
 	/* End Channel Specific Login Overrides */
 	/* Read command line options */
-	 if( opt_user ) {
+	if( opt_user ) {
 		options = strchr(opt_user, '|');
 		if (options) {
 			*options = '\0';
@@ -1762,272 +1747,272 @@
 		while(p) {
 			ast_mutex_lock(&p->lock);
 			if (!strcmp(p->agent, user) &&
-				!strcmp(p->password, pass) && !p->pending) {
-					login_state = 1; /* Successful Login */
-					/* Set Channel Specific Agent Overides */
-					if (pbx_builtin_getvar_helper(chan, "AGENTACKCALL") && strlen(pbx_builtin_getvar_helper(chan, "AGENTACKCALL"))) {
-						if (!strcasecmp(pbx_builtin_getvar_helper(chan, "AGENTACKCALL"), "always"))
-							p->ackcall = 2;
-						else if (ast_true(pbx_builtin_getvar_helper(chan, "AGENTACKCALL")))
-							p->ackcall = 1;
-						else
-							p->ackcall = 0;
-						tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTACKCALL");
-						if (option_verbose > 2)
-							ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTACKCALL=%s, setting ackcall to: %d for Agent '%s'.\n",tmpoptions,p->ackcall,p->agent);
-					}
-					if (pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF") && strlen(pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF"))) {
-						p->autologoff = atoi(pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF"));
-						if (p->autologoff < 0)
-							p->autologoff = 0;
-						tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF");
-						if (option_verbose > 2)
-							ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTAUTOLOGOFF=%s, setting autologff to: %d for Agent '%s'.\n",tmpoptions,p->autologoff,p->agent);
-					}
-					if (pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME") && strlen(pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME"))) {
-						p->wrapuptime = atoi(pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME"));
-						if (p->wrapuptime < 0)
-							p->wrapuptime = 0;
-						tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME");
-						if (option_verbose > 2)
-							ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTWRAPUPTIME=%s, setting wrapuptime to: %d for Agent '%s'.\n",tmpoptions,p->wrapuptime,p->agent);
-					}
-					/* End Channel Specific Agent Overides */
-					if (!p->chan) {
-						char last_loginchan[80] = "";
-						long logintime;
-						snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
+			    !strcmp(p->password, pass) && !p->pending) {
+				login_state = 1; /* Successful Login */
+				/* Set Channel Specific Agent Overides */
+				if (pbx_builtin_getvar_helper(chan, "AGENTACKCALL") && strlen(pbx_builtin_getvar_helper(chan, "AGENTACKCALL"))) {
+					if (!strcasecmp(pbx_builtin_getvar_helper(chan, "AGENTACKCALL"), "always"))
+						p->ackcall = 2;
+					else if (ast_true(pbx_builtin_getvar_helper(chan, "AGENTACKCALL")))
+						p->ackcall = 1;
+					else
+						p->ackcall = 0;
+					tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTACKCALL");
+					if (option_verbose > 2)
+						ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTACKCALL=%s, setting ackcall to: %d for Agent '%s'.\n",tmpoptions,p->ackcall,p->agent);
+				}
+				if (pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF") && strlen(pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF"))) {
+					p->autologoff = atoi(pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF"));
+					if (p->autologoff < 0)
+						p->autologoff = 0;
+					tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTAUTOLOGOFF");
+					if (option_verbose > 2)
+						ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTAUTOLOGOFF=%s, setting autologff to: %d for Agent '%s'.\n",tmpoptions,p->autologoff,p->agent);
+				}
+				if (pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME") && strlen(pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME"))) {
+					p->wrapuptime = atoi(pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME"));
+					if (p->wrapuptime < 0)
+						p->wrapuptime = 0;
+					tmpoptions=pbx_builtin_getvar_helper(chan, "AGENTWRAPUPTIME");
+					if (option_verbose > 2)
+						ast_verbose(VERBOSE_PREFIX_3 "Saw variable AGENTWRAPUPTIME=%s, setting wrapuptime to: %d for Agent '%s'.\n",tmpoptions,p->wrapuptime,p->agent);
+				}
+				/* End Channel Specific Agent Overides */
+				if (!p->chan) {
+					char last_loginchan[80] = "";
+					long logintime;
+					snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
 
-						if (callbackmode) {
-							char tmpchan[AST_MAX_BUF] = "";
-							int pos = 0;
-							/* Retrieve login chan */
-							for (;;) {
-								if (exten) {
-									ast_copy_string(tmpchan, exten, sizeof(tmpchan));
-									res = 0;
-								} else
-									res = ast_app_getdata(chan, "agent-newlocation", tmpchan+pos, sizeof(tmpchan) - 2, 0);
-								if (ast_strlen_zero(tmpchan) || ast_exists_extension(chan, context && !ast_strlen_zero(context) ? context : "default", tmpchan,
-											1, NULL))
-									break;
-								if (exten) {
-									ast_log(LOG_WARNING, "Extension '%s' is not valid for automatic login of agent '%s'\n", exten, p->agent);
-									exten = NULL;
-									pos = 0;
+					if (callbackmode) {
+						char tmpchan[AST_MAX_BUF] = "";
+						int pos = 0;
+						/* Retrieve login chan */
+						for (;;) {
+							if (exten) {
+								ast_copy_string(tmpchan, exten, sizeof(tmpchan));
+								res = 0;
+							} else
+								res = ast_app_getdata(chan, "agent-newlocation", tmpchan+pos, sizeof(tmpchan) - 2, 0);
+							if (ast_strlen_zero(tmpchan) || ast_exists_extension(chan, context && !ast_strlen_zero(context) ? context : "default", tmpchan,
+													     1, NULL))
+								break;
+							if (exten) {
+								ast_log(LOG_WARNING, "Extension '%s' is not valid for automatic login of agent '%s'\n", exten, p->agent);
+								exten = NULL;
+								pos = 0;
+							} else {
+								ast_log(LOG_WARNING, "Extension '%s@%s' is not valid for automatic login of agent '%s'\n", tmpchan, context && !ast_strlen_zero(context) ? context : "default", p->agent);
+								res = ast_streamfile(chan, "invalid", chan->language);
+								if (!res)
+									res = ast_waitstream(chan, AST_DIGIT_ANY);
+								if (res > 0) {
+									tmpchan[0] = res;
+									tmpchan[1] = '\0';
+									pos = 1;
 								} else {
-									ast_log(LOG_WARNING, "Extension '%s@%s' is not valid for automatic login of agent '%s'\n", tmpchan, context && !ast_strlen_zero(context) ? context : "default", p->agent);
-									res = ast_streamfile(chan, "invalid", chan->language);
-									if (!res)
-										res = ast_waitstream(chan, AST_DIGIT_ANY);
-									if (res > 0) {
-										tmpchan[0] = res;
-										tmpchan[1] = '\0';
-										pos = 1;
-									} else {
-										tmpchan[0] = '\0';
-										pos = 0;
-									}
+									tmpchan[0] = '\0';
+									pos = 0;
 								}
 							}
-							exten = tmpchan;
-							if (!res) {
-								if (context && !ast_strlen_zero(context) && !ast_strlen_zero(tmpchan))
-									snprintf(p->loginchan, sizeof(p->loginchan), "%s@%s", tmpchan, context);
-								else {
-	                                                                ast_copy_string(last_loginchan, p->loginchan, sizeof(last_loginchan));
-									ast_copy_string(p->loginchan, tmpchan, sizeof(p->loginchan));
-								}
-								p->acknowledged = 0;
-								if (ast_strlen_zero(p->loginchan)) {
-									login_state = 2;
-									filename = "agent-loggedoff";
+						}
+						exten = tmpchan;
+						if (!res) {
+							if (context && !ast_strlen_zero(context) && !ast_strlen_zero(tmpchan))
+								snprintf(p->loginchan, sizeof(p->loginchan), "%s@%s", tmpchan, context);
+							else {
+								ast_copy_string(last_loginchan, p->loginchan, sizeof(last_loginchan));
+								ast_copy_string(p->loginchan, tmpchan, sizeof(p->loginchan));
+							}
+							p->acknowledged = 0;
+							if (ast_strlen_zero(p->loginchan)) {
+								login_state = 2;
+								filename = "agent-loggedoff";
+								set_agentbycallerid(p);
+							} else {
+								if (chan->cid.cid_num) {
+									ast_copy_string(p->logincallerid, chan->cid.cid_num, sizeof(p->logincallerid));
 									set_agentbycallerid(p);
-								} else {
-									if (chan->cid.cid_num) {
-										ast_copy_string(p->logincallerid, chan->cid.cid_num, sizeof(p->logincallerid));
-										set_agentbycallerid(p);
-									} else
-										p->logincallerid[0] = '\0';
-								}
+								} else
+									p->logincallerid[0] = '\0';
+							}
 
-								if(update_cdr && chan->cdr)
-									snprintf(chan->cdr->channel, sizeof(chan->cdr->channel), "Agent/%s", p->agent);
+							if(update_cdr && chan->cdr)
+								snprintf(chan->cdr->channel, sizeof(chan->cdr->channel), "Agent/%s", p->agent);
 
-							}
+						}
+					} else {
+						p->loginchan[0] = '\0';
+						p->logincallerid[0] = '\0';
+						p->acknowledged = 0;
+					}
+					ast_mutex_unlock(&p->lock);
+					ast_mutex_unlock(&agentlock);
+					if( !res && play_announcement==1 )
+						res = ast_streamfile(chan, filename, chan->language);
+					if (!res)
+						ast_waitstream(chan, "");
+					ast_mutex_lock(&agentlock);
+					ast_mutex_lock(&p->lock);
+					if (!res) {
+						res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats));
+						if (res)
+							ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(chan->nativeformats));
+					}
+					if (!res) {
+						res = ast_set_write_format(chan, ast_best_codec(chan->nativeformats));
+						if (res)
+							ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(chan->nativeformats));
+					}
+					/* Check once more just in case */
+					if (p->chan)
+						res = -1;
+					if (callbackmode && !res) {
+						/* Just say goodbye and be done with it */
+						if (!ast_strlen_zero(p->loginchan)) {
+							if (p->loginstart == 0)
+								time(&p->loginstart);
+							manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogin",
+								      "Agent: %s\r\n"
+								      "Loginchan: %s\r\n"
+								      "Uniqueid: %s\r\n",
+								      p->agent, p->loginchan, chan->uniqueid);
+							ast_queue_log("NONE", chan->uniqueid, agent, "AGENTCALLBACKLOGIN", "%s", p->loginchan);
+							if (option_verbose > 1)
+								ast_verbose(VERBOSE_PREFIX_2 "Callback Agent '%s' logged in on %s\n", p->agent, p->loginchan);
+							ast_device_state_changed("Agent/%s", p->agent);
 						} else {
-							p->loginchan[0] = '\0';
-							p->logincallerid[0] = '\0';
-							p->acknowledged = 0;
+							logintime = time(NULL) - p->loginstart;
+							p->loginstart = 0;
+							manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
+								      "Agent: %s\r\n"
+								      "Loginchan: %s\r\n"
+								      "Logintime: %ld\r\n"
+								      "Uniqueid: %s\r\n",
+								      p->agent, last_loginchan, logintime, chan->uniqueid);
+							ast_queue_log("NONE", chan->uniqueid, agent, "AGENTCALLBACKLOGOFF", "%s|%ld|", last_loginchan, logintime);
+							if (option_verbose > 1)
+								ast_verbose(VERBOSE_PREFIX_2 "Callback Agent '%s' logged out\n", p->agent);
+							ast_device_state_changed("Agent/%s", p->agent);
 						}
-						ast_mutex_unlock(&p->lock);
 						ast_mutex_unlock(&agentlock);
-						if( !res && play_announcement==1 )
-							res = ast_streamfile(chan, filename, chan->language);
 						if (!res)
-							ast_waitstream(chan, "");
-						ast_mutex_lock(&agentlock);
-						ast_mutex_lock(&p->lock);
-						if (!res) {
-							res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats));
-							if (res)
-								ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(chan->nativeformats));
-						}
-						if (!res) {
-							res = ast_set_write_format(chan, ast_best_codec(chan->nativeformats));
+							res = ast_safe_sleep(chan, 500);
+						ast_mutex_unlock(&p->lock);
+						if (persistent_agents)
+							dump_agents();
+					} else if (!res) {
+#ifdef HONOR_MUSIC_CLASS
+						/* check if the moh class was changed with setmusiconhold */
+						if (*(chan->musicclass))
+							ast_copy_string(p->moh, chan->musicclass, sizeof(p->moh));
+#endif								
+						ast_moh_start(chan, p->moh);
+						if (p->loginstart == 0)
+							time(&p->loginstart);
+						manager_event(EVENT_FLAG_AGENT, "Agentlogin",
+							      "Agent: %s\r\n"
+							      "Channel: %s\r\n"
+							      "Uniqueid: %s\r\n",
+							      p->agent, chan->name, chan->uniqueid);
+						if (update_cdr && chan->cdr)
+							snprintf(chan->cdr->channel, sizeof(chan->cdr->channel), "Agent/%s", p->agent);
+						ast_queue_log("NONE", chan->uniqueid, agent, "AGENTLOGIN", "%s", chan->name);
+						if (option_verbose > 1)
+							ast_verbose(VERBOSE_PREFIX_2 "Agent '%s' logged in (format %s/%s)\n", p->agent,
+								    ast_getformatname(chan->readformat), ast_getformatname(chan->writeformat));
+						/* Login this channel and wait for it to
+						   go away */
+						p->chan = chan;
+						if (p->ackcall > 1)
+							check_beep(p, 0);
+						else
+							check_availability(p, 0);
+						ast_mutex_unlock(&p->lock);
+						ast_mutex_unlock(&agentlock);
+						ast_device_state_changed("Agent/%s", p->agent);
+						while (res >= 0) {
+							ast_mutex_lock(&p->lock);
+							if (p->chan != chan)
+								res = -1;
+							ast_mutex_unlock(&p->lock);
+							/* Yield here so other interested threads can kick in. */
+							sched_yield();
 							if (res)
-								ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(chan->nativeformats));
-						}
-						/* Check once more just in case */
-						if (p->chan)
-							res = -1;
-						if (callbackmode && !res) {
-							/* Just say goodbye and be done with it */
-							if (!ast_strlen_zero(p->loginchan)) {
-								if (p->loginstart == 0)
-									time(&p->loginstart);
-								manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogin",
-									"Agent: %s\r\n"
-									"Loginchan: %s\r\n"
-									"Uniqueid: %s\r\n",
-									p->agent, p->loginchan, chan->uniqueid);
-								ast_queue_log("NONE", chan->uniqueid, agent, "AGENTCALLBACKLOGIN", "%s", p->loginchan);
-								if (option_verbose > 1)
-									ast_verbose(VERBOSE_PREFIX_2 "Callback Agent '%s' logged in on %s\n", p->agent, p->loginchan);
-								ast_device_state_changed("Agent/%s", p->agent);
-							} else {
-								logintime = time(NULL) - p->loginstart;
-								p->loginstart = 0;
-								manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogoff",
-									"Agent: %s\r\n"
-									"Loginchan: %s\r\n"
-									"Logintime: %ld\r\n"
-									"Uniqueid: %s\r\n",
-									p->agent, last_loginchan, logintime, chan->uniqueid);
-								ast_queue_log("NONE", chan->uniqueid, agent, "AGENTCALLBACKLOGOFF", "%s|%ld|", last_loginchan, logintime);
-								if (option_verbose > 1)
-									ast_verbose(VERBOSE_PREFIX_2 "Callback Agent '%s' logged out\n", p->agent);
-								ast_device_state_changed("Agent/%s", p->agent);
+								break;
+
+							ast_mutex_lock(&agentlock);
+							ast_mutex_lock(&p->lock);
+							if (p->lastdisc.tv_sec) {
+								if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > p->wrapuptime) {
+									if (option_debug)
+										ast_log(LOG_DEBUG, "Wrapup time for %s expired!\n", p->agent);
+									p->lastdisc = ast_tv(0, 0);
+									if (p->ackcall > 1)
+										check_beep(p, 0);
+									else
+										check_availability(p, 0);
+								}
 							}
+							ast_mutex_unlock(&p->lock);
 							ast_mutex_unlock(&agentlock);
-							if (!res)
-								res = ast_safe_sleep(chan, 500);
+							/*	Synchronize channel ownership between call to agent and itself. */
+							ast_mutex_lock( &p->app_lock );
+							ast_mutex_lock(&p->lock);
+							p->owning_app = pthread_self();
 							ast_mutex_unlock(&p->lock);
-							if (persistent_agents)
-								dump_agents();
-						} else if (!res) {
-#ifdef HONOR_MUSIC_CLASS
-							/* check if the moh class was changed with setmusiconhold */
-							if (*(chan->musicclass))
-								ast_copy_string(p->moh, chan->musicclass, sizeof(p->moh));
-#endif								
-							ast_moh_start(chan, p->moh);
-							if (p->loginstart == 0)
-								time(&p->loginstart);
-							manager_event(EVENT_FLAG_AGENT, "Agentlogin",
-								"Agent: %s\r\n"
-								"Channel: %s\r\n"
-								"Uniqueid: %s\r\n",
-								p->agent, chan->name, chan->uniqueid);
-							if (update_cdr && chan->cdr)
-								snprintf(chan->cdr->channel, sizeof(chan->cdr->channel), "Agent/%s", p->agent);
-							ast_queue_log("NONE", chan->uniqueid, agent, "AGENTLOGIN", "%s", chan->name);
-							if (option_verbose > 1)
-								ast_verbose(VERBOSE_PREFIX_2 "Agent '%s' logged in (format %s/%s)\n", p->agent,
-												ast_getformatname(chan->readformat), ast_getformatname(chan->writeformat));
-							/* Login this channel and wait for it to
-							   go away */
-							p->chan = chan;
-							if (p->ackcall > 1)
-								check_beep(p, 0);
+							if (p->ackcall > 1) 
+								res = agent_ack_sleep(p);
 							else
-								check_availability(p, 0);
-							ast_mutex_unlock(&p->lock);
-							ast_mutex_unlock(&agentlock);
-							ast_device_state_changed("Agent/%s", p->agent);
-							while (res >= 0) {
-								ast_mutex_lock(&p->lock);
-								if (p->chan != chan)
-									res = -1;
-								ast_mutex_unlock(&p->lock);
-								/* Yield here so other interested threads can kick in. */
-								sched_yield();
-								if (res)
-									break;
-
+								res = ast_safe_sleep_conditional( chan, 1000,
+												  agent_cont_sleep, p );
+							ast_mutex_unlock( &p->app_lock );
+							if ((p->ackcall > 1)  && (res == 1)) {
 								ast_mutex_lock(&agentlock);
 								ast_mutex_lock(&p->lock);
-								if (p->lastdisc.tv_sec) {
-									if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > p->wrapuptime) {
-											if (option_debug)
-												ast_log(LOG_DEBUG, "Wrapup time for %s expired!\n", p->agent);
-										p->lastdisc = ast_tv(0, 0);
-										if (p->ackcall > 1)
-											check_beep(p, 0);
-										else
-											check_availability(p, 0);
-									}
-								}
+								check_availability(p, 0);
 								ast_mutex_unlock(&p->lock);
 								ast_mutex_unlock(&agentlock);
-								/*	Synchronize channel ownership between call to agent and itself. */
-								ast_mutex_lock( &p->app_lock );
-								ast_mutex_lock(&p->lock);
-								p->owning_app = pthread_self();
-								ast_mutex_unlock(&p->lock);
-								if (p->ackcall > 1) 
-									res = agent_ack_sleep(p);
-								else
-									res = ast_safe_sleep_conditional( chan, 1000,
-													agent_cont_sleep, p );
-								ast_mutex_unlock( &p->app_lock );
-								if ((p->ackcall > 1)  && (res == 1)) {
-									ast_mutex_lock(&agentlock);
-									ast_mutex_lock(&p->lock);
-									check_availability(p, 0);
-									ast_mutex_unlock(&p->lock);
-									ast_mutex_unlock(&agentlock);
-									res = 0;
-								}
-								sched_yield();
-							}
-							ast_mutex_lock(&p->lock);
-							if (res && p->owner) 
-								ast_log(LOG_WARNING, "Huh?  We broke out when there was still an owner?\n");
-							/* Log us off if appropriate */
-							if (p->chan == chan)
-								p->chan = NULL;
-							p->acknowledged = 0;
-							logintime = time(NULL) - p->loginstart;
-							p->loginstart = 0;
-							ast_mutex_unlock(&p->lock);
-							manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
-								"Agent: %s\r\n"
-								"Logintime: %ld\r\n"
-								"Uniqueid: %s\r\n",
-								p->agent, logintime, chan->uniqueid);
-							ast_queue_log("NONE", chan->uniqueid, agent, "AGENTLOGOFF", "%s|%ld", chan->name, logintime);
-							if (option_verbose > 1)
-								ast_verbose(VERBOSE_PREFIX_2 "Agent '%s' logged out\n", p->agent);
-							/* If there is no owner, go ahead and kill it now */
-							ast_device_state_changed("Agent/%s", p->agent);
-							if (p->dead && !p->owner) {
-								ast_mutex_destroy(&p->lock);
-								ast_mutex_destroy(&p->app_lock);
-								free(p);
+								res = 0;
 							}
+							sched_yield();
 						}
-						else {
-							ast_mutex_unlock(&p->lock);
-							p = NULL;
+						ast_mutex_lock(&p->lock);
+						if (res && p->owner) 
+							ast_log(LOG_WARNING, "Huh?  We broke out when there was still an owner?\n");
+						/* Log us off if appropriate */
+						if (p->chan == chan)
+							p->chan = NULL;
+						p->acknowledged = 0;
+						logintime = time(NULL) - p->loginstart;
+						p->loginstart = 0;
+						ast_mutex_unlock(&p->lock);
+						manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
+							      "Agent: %s\r\n"
+							      "Logintime: %ld\r\n"
+							      "Uniqueid: %s\r\n",
+							      p->agent, logintime, chan->uniqueid);
+						ast_queue_log("NONE", chan->uniqueid, agent, "AGENTLOGOFF", "%s|%ld", chan->name, logintime);
+						if (option_verbose > 1)
+							ast_verbose(VERBOSE_PREFIX_2 "Agent '%s' logged out\n", p->agent);
+						/* If there is no owner, go ahead and kill it now */
+						ast_device_state_changed("Agent/%s", p->agent);
+						if (p->dead && !p->owner) {
+							ast_mutex_destroy(&p->lock);
+							ast_mutex_destroy(&p->app_lock);
+							free(p);
 						}
-						res = -1;
-					} else {
+					}
+					else {
 						ast_mutex_unlock(&p->lock);
-						errmsg = "agent-alreadyon";
 						p = NULL;
 					}
-					break;
+					res = -1;
+				} else {
+					ast_mutex_unlock(&p->lock);
+					errmsg = "agent-alreadyon";
+					p = NULL;
+				}
+				break;
 			}
 			ast_mutex_unlock(&p->lock);
 			p = p->next;
@@ -2144,9 +2129,9 @@
 		if (p->loginstart == 0)
 			time(&p->loginstart);
 		manager_event(EVENT_FLAG_AGENT, "Agentcallbacklogin",
-			"Agent: %s\r\n"
-			"Loginchan: %s\r\n",
-			p->agent, p->loginchan);
+			      "Agent: %s\r\n"
+			      "Loginchan: %s\r\n",
+			      p->agent, p->loginchan);
 		ast_queue_log("NONE", "NONE", agent, "AGENTCALLBACKLOGIN", "%s", p->loginchan);
 		if (option_verbose > 1)
 			ast_verbose(VERBOSE_PREFIX_2 "Callback Agent '%s' logged in on %s\n", p->agent, p->loginchan);
@@ -2210,11 +2195,11 @@
 	}
 	/* check if there is n + 101 priority */
 	if (res) {
-	       if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) {
+		if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) {
 			chan->priority+=100;
 			if (option_verbose > 2)
 				ast_verbose(VERBOSE_PREFIX_3 "Going to %d priority because there is no callerid or the agentid cannot be found.\n",chan->priority);
-	       }
+		}
 		else if (exitifnoagentid)
 			return res;
 	}
@@ -2302,7 +2287,6 @@
 	}
 }
 
-
 /*--- agent_devicestate: Part of PBX channel interface ---*/
 static int agent_devicestate(void *data)
 {




More information about the svn-commits mailing list