diff options
Diffstat (limited to 'channels/chan_agent.c')
-rwxr-xr-x | channels/chan_agent.c | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 593de03cf..90734a61b 100755 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -72,6 +72,7 @@ static char *descrip2 = static char moh[80] = "default"; #define AST_MAX_AGENT 80 /* Agent ID or Password max length */ +#define AST_MAX_BUF 256 static int capability = -1; @@ -86,6 +87,13 @@ static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER; /* Protect the interface list (of sip_pvt's) */ static ast_mutex_t agentlock = AST_MUTEX_INITIALIZER; +int recordagentcalls = 0; +char recordformat[AST_MAX_BUF]; +char recordformatext[AST_MAX_BUF]; +int createlink = 0; +char urlprefix[AST_MAX_BUF]; +char savecallsin[AST_MAX_BUF]; + static struct agent_pvt { ast_mutex_t lock; /* Channel private lock */ int dead; /* Poised for destruction? */ @@ -164,7 +172,7 @@ static void agent_unlink(struct agent_pvt *agent) static struct agent_pvt *add_agent(char *agent, int pending) { - char tmp[256]; + char tmp[AST_MAX_BUF]; char *password=NULL, *name=NULL; struct agent_pvt *p, *prev; @@ -244,6 +252,33 @@ static int agent_answer(struct ast_channel *ast) return -1; } +static int agent_start_monitoring(struct ast_channel *ast, int needlock) +{ + struct agent_pvt *p = ast->pvt->pvt; + char tmp[AST_MAX_BUF],tmp2[AST_MAX_BUF], *pointer; + char filename[AST_MAX_BUF]; + int res = -1; + if (!p) + return -1; + if (!ast->monitor) { + snprintf(filename, sizeof(filename), "agent-%s-%s",p->agent, ast->uniqueid); + snprintf(tmp, sizeof(tmp), "%s%s",savecallsin ? savecallsin : "", filename); + if ((pointer = strchr(tmp, '.'))) + *pointer = '-'; + ast_monitor_start(ast, recordformat, tmp, needlock); + ast_monitor_setjoinfiles(ast, 1); + snprintf(tmp2, sizeof(tmp2), "%s%s.%s", urlprefix ? urlprefix : "", filename, recordformatext); +#if 0 + ast_verbose("name is %s, link is %s\n",tmp, tmp2); +#endif + if (!ast->cdr) + ast->cdr = ast_cdr_alloc(); + ast_cdr_setuserfield(ast, tmp2); + res = 0; + } else + ast_log(LOG_ERROR, "Recording already started on that call.\n"); + return res; +} static struct ast_frame *agent_read(struct ast_channel *ast) { struct agent_pvt *p = ast->pvt->pvt; @@ -302,6 +337,8 @@ static struct ast_frame *agent_read(struct ast_channel *ast) } CLEANUP(ast,p); ast_mutex_unlock(&p->lock); + if (f == &answer_frame) + agent_start_monitoring(ast,0); return f; } @@ -430,6 +467,7 @@ static int agent_call(struct ast_channel *ast, char *dest, int timeout) ast_setstate(ast, AST_STATE_RINGING); else { ast_setstate(ast, AST_STATE_UP); + agent_start_monitoring(ast,0); p->acknowledged = 1; } res = 0; @@ -703,6 +741,14 @@ static int read_agent_config(void) p = p->next; } strcpy(moh, "default"); + /* set the default recording values */ + recordagentcalls = 0; + createlink = 0; + strcpy(recordformat, "wav"); + strcpy(recordformatext, "wav"); + strcpy(urlprefix, ""); + strcpy(savecallsin, ""); + v = ast_variable_browse(cfg, "agents"); while(v) { /* Create the interface list */ @@ -727,6 +773,27 @@ static int read_agent_config(void) wrapuptime = 0; } else if (!strcasecmp(v->name, "musiconhold")) { strncpy(moh, v->value, sizeof(moh) - 1); + } else if (!strcasecmp(v->name, "recordagentcalls")) { + recordagentcalls = ast_true(v->value); + } else if (!strcasecmp(v->name, "createlink")) { + createlink = ast_true(v->value); + } else if (!strcasecmp(v->name, "recordformat")) { + strncpy(recordformat, v->value, sizeof(recordformat) - 1); + if (!strcasecmp(v->value, "wav49")) + strcpy(recordformatext, "WAV"); + else + strncpy(recordformatext, v->value, sizeof(recordformat) - 1); + } else if (!strcasecmp(v->name, "urlprefix")) { + strncpy(urlprefix, v->value, sizeof(urlprefix) - 2); + if (urlprefix[strlen(urlprefix) - 1] != '/') + strcat(urlprefix, "/"); + } else if (!strcasecmp(v->name, "savecallsin")) { + if (v->value[0] == '/') + strncpy(savecallsin, v->value, sizeof(savecallsin) - 2); + else + snprintf(savecallsin, sizeof(savecallsin) - 2, "/%s", v->value); + if (savecallsin[strlen(savecallsin) - 1] != '/') + strcat(savecallsin, "/"); } v = v->next; } @@ -965,10 +1032,10 @@ static int powerof(unsigned int v) static int agents_show(int fd, int argc, char **argv) { struct agent_pvt *p; - char username[256]; - char location[256]; - char talkingto[256]; - char moh[256]; + char username[AST_MAX_BUF]; + char location[AST_MAX_BUF]; + char talkingto[AST_MAX_BUF]; + char moh[AST_MAX_BUF]; if (argc != 2) return RESULT_SHOWUSAGE; @@ -1107,7 +1174,7 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode) !strcmp(p->password, pass) && !p->pending) { if (!p->chan) { if (callbackmode) { - char tmpchan[256] = ""; + char tmpchan[AST_MAX_BUF] = ""; int pos = 0; /* Retrieve login chan */ for (;;) { |