On Sunday 05 October 2003 16:41, Robert Hajime Lanning wrote:
> I sent this earlier under "Editting variable contents" but no-one
> has responded. So, the subject is now more to the problem, instead
> of the solution I was trying to implement.
>
> ChanIsAvail returns the channel ID plus "-<session>".
>
> How can I edit ${AVAILCHAN} to remove this session ID, so I can use
> its contents in a subsequent Dial statement?
Oh, it's quite simple. You just write your own application to remove
the suffix. Or you wait for someone else to write it.
Untested code. UAYOR.
-Tilghman
/*
* Asterisk -- A telephony toolkit for Linux.
*
* Cut application
*
* Copyright (c) 2003 Tilghman Lesher. All rights reserved.
*
* Tilghman Lesher <[EMAIL PROTECTED]>
*
* This code is released by the author with no restrictions on usage.
*
*/
#include <asterisk/file.h>
#include <asterisk/logger.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/pbx.h>
#include <asterisk/module.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
static char *tdesc = "Cuts up variables";
static char *app_cut = "Cut";
static char *cut_synopsis = "Cut(newvar=varname|delimiter|field)";
static char *cut_descrip =
"Cut(varname=wholestring,delimiter,field)\n"
" newvar - result string is set to this variable\n"
" varname - variable you want cut\n"
" delimiter - defaults to -\n"
" field - number of the field you want (1-based offset)\n"
" Returns 0 or -1 on hangup or error.\n";
STANDARD_LOCAL_USER;
LOCAL_USER_DECL;
static int cut_exec(struct ast_channel *chan, void *data)
{
int res=0;
struct localuser *u;
char *s, *newvar, *varname, *delimiter, *field;
int fieldnum, args_okay = 0;
LOCAL_USER_ADD(u);
/* Check and parse arguments */
if (data) {
s = strdupa((char *)data);
if (s) {
newvar = strsep(&s, "=");
if (newvar && (newvar[0] != '\0')) {
varname = strsep(&s, "|");
if (varname && (varname[0] != '\0')) {
delimiter = strsep(&s, "|");
if (delimiter) {
field = strsep(&s, "|");
if (field && (sscanf(field,"%d",&fieldnum) == 1)) {
args_okay = 1;
}
}
}
}
} else {
ast_log(LOG_ERROR, "Out of memory\n");
res = -1;
}
}
if (args_okay) {
char d;
char *tmp;
if (delimiter[0])
d = delimiter[0];
else
d = '-';
tmp = pbx_builtin_getvar_helper(chan, varname);
if (tmp) {
tmp = strdupa(tmp);
if (tmp) {
int i;
for (i=1;i<fieldnum;i++)
if (tmp && (tmp[0] != '\0'))
tmp = index(tmp, d) + 1;
} else {
ast_log(LOG_ERROR, "Out of memory\n");
res = -1;
}
}
if (tmp) {
/* Get end, if any */
/* (if no further fields, then tmp -> NULL, but we don't care anymore) */
char *value = strsep(&tmp, &d);
pbx_builtin_setvar_helper(chan, newvar, value);
}
} else {
ast_log(LOG_ERROR, "Usage: %s\n", cut_synopsis);
res = -1;
}
LOCAL_USER_REMOVE(u);
return res;
}
int unload_module(void)
{
STANDARD_HANGUP_LOCALUSERS;
return ast_unregister_application(app_cut);
}
int load_module(void)
{
return ast_register_application(app_cut, cut_exec, cut_synopsis, cut_descrip);
}
char *description(void)
{
return tdesc;
}
int usecount(void)
{
int res;
STANDARD_USECOUNT(res);
return res;
}
char *key()
{
return ASTERISK_GPL_KEY;
}