mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
Version 0.1.2 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -11,7 +11,7 @@
|
|||||||
# the GNU General Public License
|
# the GNU General Public License
|
||||||
#
|
#
|
||||||
|
|
||||||
APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so
|
APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so app_system.so app_echo.so
|
||||||
|
|
||||||
CFLAGS+=
|
CFLAGS+=
|
||||||
|
|
||||||
|
80
apps/app_echo.c
Executable file
80
apps/app_echo.c
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- A telephony toolkit for Linux.
|
||||||
|
*
|
||||||
|
* Echo application -- play back what you hear to evaluate latency
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999, Mark Spencer
|
||||||
|
*
|
||||||
|
* Mark Spencer <markster@linux-support.net>
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asterisk/file.h>
|
||||||
|
#include <asterisk/logger.h>
|
||||||
|
#include <asterisk/channel.h>
|
||||||
|
#include <asterisk/pbx.h>
|
||||||
|
#include <asterisk/module.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
|
||||||
|
static char *tdesc = "Simple Echo Application";
|
||||||
|
|
||||||
|
static char *app = "Echo";
|
||||||
|
|
||||||
|
STANDARD_LOCAL_USER;
|
||||||
|
|
||||||
|
LOCAL_USER_DECL;
|
||||||
|
|
||||||
|
static int skel_exec(struct ast_channel *chan, void *data)
|
||||||
|
{
|
||||||
|
int res=-1;
|
||||||
|
struct localuser *u;
|
||||||
|
struct ast_frame *f;
|
||||||
|
LOCAL_USER_ADD(u);
|
||||||
|
/* Do our thing here */
|
||||||
|
while((f = ast_read(chan))) {
|
||||||
|
if (f->frametype == AST_FRAME_VOICE) {
|
||||||
|
if (ast_write(chan, f))
|
||||||
|
break;
|
||||||
|
} else if (f->frametype == AST_FRAME_DTMF) {
|
||||||
|
if (f->subclass == '#') {
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
if (ast_write(chan, f))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOCAL_USER_REMOVE(u);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int unload_module(void)
|
||||||
|
{
|
||||||
|
STANDARD_HANGUP_LOCALUSERS;
|
||||||
|
return ast_unregister_application(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_module(void)
|
||||||
|
{
|
||||||
|
return ast_register_application(app, skel_exec);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *description(void)
|
||||||
|
{
|
||||||
|
return tdesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int usecount(void)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
STANDARD_USECOUNT(res);
|
||||||
|
return res;
|
||||||
|
}
|
@@ -15,6 +15,7 @@
|
|||||||
#include <asterisk/logger.h>
|
#include <asterisk/logger.h>
|
||||||
#include <asterisk/channel.h>
|
#include <asterisk/channel.h>
|
||||||
#include <asterisk/pbx.h>
|
#include <asterisk/pbx.h>
|
||||||
|
#include <asterisk/module.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -22,63 +23,32 @@
|
|||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
static pthread_mutex_t skellock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
static int usecnt=0;
|
|
||||||
|
|
||||||
static char *tdesc = "Trivial skeleton Application";
|
static char *tdesc = "Trivial skeleton Application";
|
||||||
|
|
||||||
static char *app = "skel";
|
static char *app = "skel";
|
||||||
|
|
||||||
struct skeluser {
|
STANDARD_LOCAL_USER;
|
||||||
struct ast_channel *chan;
|
|
||||||
struct skeluser *next;
|
LOCAL_USER_DECL;
|
||||||
} *users = NULL;
|
|
||||||
|
|
||||||
static int skel_exec(struct ast_channel *chan, void *data)
|
static int skel_exec(struct ast_channel *chan, void *data)
|
||||||
{
|
{
|
||||||
int res=0;
|
int res=0;
|
||||||
struct skeluser *u, *ul=NULL;
|
struct localuser *u;
|
||||||
if (!data) {
|
if (!data) {
|
||||||
ast_log(LOG_WARNING, "skel requires an argument (filename)\n");
|
ast_log(LOG_WARNING, "skel requires an argument (filename)\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!(u=malloc(sizeof(struct skeluser)))) {
|
LOCAL_USER_ADD(u);
|
||||||
ast_log(LOG_WARNING, "Out of memory\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pthread_mutex_lock(&skellock);
|
|
||||||
u->chan = chan;
|
|
||||||
u->next = users;
|
|
||||||
users = u;
|
|
||||||
usecnt++;
|
|
||||||
pthread_mutex_unlock(&skellock);
|
|
||||||
/* Do our thing here */
|
/* Do our thing here */
|
||||||
pthread_mutex_lock(&skellock);
|
LOCAL_USER_REMOVE(u);
|
||||||
u = users;
|
|
||||||
while(u) {
|
|
||||||
if (ul)
|
|
||||||
ul->next = u->next;
|
|
||||||
else
|
|
||||||
users = u->next;
|
|
||||||
u = u->next;
|
|
||||||
}
|
|
||||||
usecnt--;
|
|
||||||
pthread_mutex_unlock(&skellock);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int unload_module(void)
|
int unload_module(void)
|
||||||
{
|
{
|
||||||
struct skeluser *u;
|
STANDARD_HANGUP_LOCALUSERS;
|
||||||
pthread_mutex_lock(&skellock);
|
|
||||||
u = users;
|
|
||||||
while(u) {
|
|
||||||
/* Hang up anybody who is using us */
|
|
||||||
ast_softhangup(u->chan);
|
|
||||||
u = u->next;
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&skellock);
|
|
||||||
return ast_unregister_application(app);
|
return ast_unregister_application(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,8 +65,6 @@ char *description(void)
|
|||||||
int usecount(void)
|
int usecount(void)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
pthread_mutex_lock(&skellock);
|
STANDARD_USECOUNT(res);
|
||||||
res = usecnt;
|
|
||||||
pthread_mutex_unlock(&skellock);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
82
apps/app_system.c
Executable file
82
apps/app_system.c
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- A telephony toolkit for Linux.
|
||||||
|
*
|
||||||
|
* Execute arbitrary system commands
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999, Mark Spencer
|
||||||
|
*
|
||||||
|
* Mark Spencer <markster@linux-support.net>
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asterisk/file.h>
|
||||||
|
#include <asterisk/logger.h>
|
||||||
|
#include <asterisk/channel.h>
|
||||||
|
#include <asterisk/pbx.h>
|
||||||
|
#include <asterisk/module.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
|
||||||
|
static char *tdesc = "Generic System() application";
|
||||||
|
|
||||||
|
static char *app = "System";
|
||||||
|
|
||||||
|
STANDARD_LOCAL_USER;
|
||||||
|
|
||||||
|
LOCAL_USER_DECL;
|
||||||
|
|
||||||
|
static int skel_exec(struct ast_channel *chan, void *data)
|
||||||
|
{
|
||||||
|
int res=0;
|
||||||
|
struct localuser *u;
|
||||||
|
if (!data) {
|
||||||
|
ast_log(LOG_WARNING, "System requires an argument(command)\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
LOCAL_USER_ADD(u);
|
||||||
|
/* Do our thing here */
|
||||||
|
res = system((char *)data);
|
||||||
|
if (res < 0) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to execute '%s'\n", data);
|
||||||
|
res = -1;
|
||||||
|
} else if (res == 127) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to execute '%s'\n", data);
|
||||||
|
res = -1;
|
||||||
|
} else {
|
||||||
|
if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101))
|
||||||
|
chan->priority+=100;
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
LOCAL_USER_REMOVE(u);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int unload_module(void)
|
||||||
|
{
|
||||||
|
STANDARD_HANGUP_LOCALUSERS;
|
||||||
|
return ast_unregister_application(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_module(void)
|
||||||
|
{
|
||||||
|
return ast_register_application(app, skel_exec);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *description(void)
|
||||||
|
{
|
||||||
|
return tdesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int usecount(void)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
STANDARD_USECOUNT(res);
|
||||||
|
return res;
|
||||||
|
}
|
@@ -141,7 +141,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
|
|||||||
struct ast_config *cfg;
|
struct ast_config *cfg;
|
||||||
char *copy, *name, *passwd, *email, *dir, *fmt, *fmts, *fn=NULL;
|
char *copy, *name, *passwd, *email, *dir, *fmt, *fmts, *fn=NULL;
|
||||||
char comment[256];
|
char comment[256];
|
||||||
struct ast_filestream *writer, *others[MAX_OTHER_FORMATS];
|
struct ast_filestream *writer=NULL, *others[MAX_OTHER_FORMATS];
|
||||||
char *sfmt[MAX_OTHER_FORMATS];
|
char *sfmt[MAX_OTHER_FORMATS];
|
||||||
int res = -1, fmtcnt=0, x;
|
int res = -1, fmtcnt=0, x;
|
||||||
int msgnum;
|
int msgnum;
|
||||||
@@ -182,8 +182,12 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
|
|||||||
snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n",
|
snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n",
|
||||||
(chan->callerid ? chan->callerid : "Unknown"),
|
(chan->callerid ? chan->callerid : "Unknown"),
|
||||||
name, ext, chan->name);
|
name, ext, chan->name);
|
||||||
|
if (ast_fileexists(fn, NULL) > 0) {
|
||||||
|
msgnum++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
writer = ast_writefile(fn, fmt, comment, O_EXCL, 1 /* check for other formats */, 0700);
|
writer = ast_writefile(fn, fmt, comment, O_EXCL, 1 /* check for other formats */, 0700);
|
||||||
if (!writer && (errno != EEXIST))
|
if (!writer)
|
||||||
break;
|
break;
|
||||||
msgnum++;
|
msgnum++;
|
||||||
} while(!writer && (msgnum < MAXMSG));
|
} while(!writer && (msgnum < MAXMSG));
|
||||||
@@ -221,9 +225,14 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
|
|||||||
if (f->frametype == AST_FRAME_VOICE) {
|
if (f->frametype == AST_FRAME_VOICE) {
|
||||||
/* Write the primary format */
|
/* Write the primary format */
|
||||||
res = ast_writestream(writer, f);
|
res = ast_writestream(writer, f);
|
||||||
|
if (res) {
|
||||||
|
ast_log(LOG_WARNING, "Error writing primary frame\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* And each of the others */
|
/* And each of the others */
|
||||||
for (x=0;x<fmtcnt;x++)
|
for (x=0;x<fmtcnt;x++) {
|
||||||
res |= ast_writestream(others[x], f);
|
res |= ast_writestream(others[x], f);
|
||||||
|
}
|
||||||
ast_frfree(f);
|
ast_frfree(f);
|
||||||
/* Exit on any error */
|
/* Exit on any error */
|
||||||
if (res) {
|
if (res) {
|
||||||
@@ -314,20 +323,30 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
|||||||
ast_log(LOG_WARNING, "No voicemail configuration\n");
|
ast_log(LOG_WARNING, "No voicemail configuration\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (ast_streamfile(chan, "vm-login"))
|
if (ast_streamfile(chan, "vm-login")) {
|
||||||
|
ast_log(LOG_WARNING, "Couldn't stream login file\n");
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
do {
|
do {
|
||||||
/* Prompt for, and read in the username */
|
/* Prompt for, and read in the username */
|
||||||
if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#"))
|
if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#")) {
|
||||||
|
ast_log(LOG_WARNING, "Couldn't read username\n");
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
if (!strlen(username)) {
|
if (!strlen(username)) {
|
||||||
|
if (option_verbose > 2)
|
||||||
|
ast_verbose(VERBOSE_PREFIX_3 "Username not entered\n");
|
||||||
res = 0;
|
res = 0;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (ast_streamfile(chan, "vm-password"))
|
if (ast_streamfile(chan, "vm-password")) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to stream password file\n");
|
||||||
goto out;
|
goto out;
|
||||||
if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#"))
|
}
|
||||||
|
if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#")) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to read password\n");
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
copy = ast_variable_retrieve(cfg, NULL, username);
|
copy = ast_variable_retrieve(cfg, NULL, username);
|
||||||
if (copy) {
|
if (copy) {
|
||||||
copy = strdup(copy);
|
copy = strdup(copy);
|
||||||
|
42
asterisk.c
42
asterisk.c
@@ -28,7 +28,9 @@ int option_verbose=0;
|
|||||||
int option_debug=0;
|
int option_debug=0;
|
||||||
int option_nofork=0;
|
int option_nofork=0;
|
||||||
int option_quiet=0;
|
int option_quiet=0;
|
||||||
|
int option_console=0;
|
||||||
int option_highpriority=0;
|
int option_highpriority=0;
|
||||||
|
int fully_booted = 0;
|
||||||
|
|
||||||
#define HIGH_PRIORITY 1
|
#define HIGH_PRIORITY 1
|
||||||
#define HIGH_PRIORITY_SCHED SCHED_RR
|
#define HIGH_PRIORITY_SCHED SCHED_RR
|
||||||
@@ -39,6 +41,7 @@ static void urg_handler(int num)
|
|||||||
system call. We don't actually need to do anything though. */
|
system call. We don't actually need to do anything though. */
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Urgent handler\n");
|
ast_log(LOG_DEBUG, "Urgent handler\n");
|
||||||
|
signal(num, urg_handler);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +92,7 @@ static void console_verboser(char *s, int pos, int replace, int complete)
|
|||||||
if (!pos)
|
if (!pos)
|
||||||
fprintf(stdout, "\r");
|
fprintf(stdout, "\r");
|
||||||
fprintf(stdout, s + pos);
|
fprintf(stdout, s + pos);
|
||||||
|
fflush(stdout);
|
||||||
if (complete)
|
if (complete)
|
||||||
/* Wake up a select()ing console */
|
/* Wake up a select()ing console */
|
||||||
pthread_kill(consolethread, SIGURG);
|
pthread_kill(consolethread, SIGURG);
|
||||||
@@ -99,8 +103,19 @@ static void consolehandler(char *s)
|
|||||||
/* Called when readline data is available */
|
/* Called when readline data is available */
|
||||||
if (s && strlen(s))
|
if (s && strlen(s))
|
||||||
add_history(s);
|
add_history(s);
|
||||||
if (s)
|
/* Give the console access to the shell */
|
||||||
|
if (s) {
|
||||||
|
if (s[0] == '!') {
|
||||||
|
if (s[1])
|
||||||
|
system(s+1);
|
||||||
|
else
|
||||||
|
system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
|
||||||
|
} else
|
||||||
ast_cli_command(STDOUT_FILENO, s);
|
ast_cli_command(STDOUT_FILENO, s);
|
||||||
|
if (!strcasecmp(s, "help"))
|
||||||
|
fprintf(stdout, " !<command> Executes a given shell command\n");
|
||||||
|
} else
|
||||||
|
fprintf(stdout, "\nUse \"quit\" to exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static char quit_help[] =
|
static char quit_help[] =
|
||||||
@@ -138,17 +153,21 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
/* Check for options */
|
/* Check for options */
|
||||||
while((c=getopt(argc, argv, "dvqp")) != EOF) {
|
while((c=getopt(argc, argv, "dvqpc")) != EOF) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'd':
|
case 'd':
|
||||||
option_debug++;
|
option_debug++;
|
||||||
option_nofork++;
|
option_nofork++;
|
||||||
break;
|
break;
|
||||||
|
case 'c':
|
||||||
|
option_console++;
|
||||||
|
option_nofork++;
|
||||||
case 'p':
|
case 'p':
|
||||||
option_highpriority++;
|
option_highpriority++;
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
option_verbose++;
|
option_verbose++;
|
||||||
|
option_nofork++;
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
option_quiet++;
|
option_quiet++;
|
||||||
@@ -157,12 +176,15 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ast_register_verbose(console_verboser);
|
||||||
/* Print a welcome message if desired */
|
/* Print a welcome message if desired */
|
||||||
if (option_verbose) {
|
if (option_verbose || option_console) {
|
||||||
ast_verbose( "Asterisk, Copyright (C) 1999 Mark Spencer\n");
|
ast_verbose( "Asterisk, Copyright (C) 1999 Mark Spencer\n");
|
||||||
ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
|
ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
|
||||||
ast_verbose( "=========================================================================\n");
|
ast_verbose( "=========================================================================\n");
|
||||||
}
|
}
|
||||||
|
if (option_console && !option_verbose)
|
||||||
|
ast_verbose("[ Booting...");
|
||||||
signal(SIGURG, urg_handler);
|
signal(SIGURG, urg_handler);
|
||||||
signal(SIGINT, quit_handler);
|
signal(SIGINT, quit_handler);
|
||||||
signal(SIGTERM, quit_handler);
|
signal(SIGTERM, quit_handler);
|
||||||
@@ -177,14 +199,16 @@ int main(int argc, char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
/* We might have the option of showing a console, but for now just
|
/* We might have the option of showing a console, but for now just
|
||||||
do nothing... */
|
do nothing... */
|
||||||
|
if (option_console && !option_verbose)
|
||||||
|
ast_verbose(" ]\n");
|
||||||
|
if (option_verbose || option_console)
|
||||||
|
ast_verbose( "Asterisk Ready.\n");
|
||||||
|
fully_booted = 1;
|
||||||
|
if (option_console) {
|
||||||
/* Console stuff now... */
|
/* Console stuff now... */
|
||||||
/* Register our quit function */
|
/* Register our quit function */
|
||||||
ast_cli_register(&quit);
|
ast_cli_register(&quit);
|
||||||
consolethread = pthread_self();
|
consolethread = pthread_self();
|
||||||
ast_register_verbose(console_verboser);
|
|
||||||
if (option_verbose)
|
|
||||||
ast_verbose( "Asterisk Ready.\n");
|
|
||||||
if (strlen(filename))
|
if (strlen(filename))
|
||||||
read_history(filename);
|
read_history(filename);
|
||||||
rl_callback_handler_install(ASTERISK_PROMPT, consolehandler);
|
rl_callback_handler_install(ASTERISK_PROMPT, consolehandler);
|
||||||
@@ -200,5 +224,9 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
/* Do nothing */
|
||||||
|
select(0,NULL,NULL,NULL,NULL);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
61
channel.c
61
channel.c
@@ -18,6 +18,7 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <asterisk/sched.h>
|
#include <asterisk/sched.h>
|
||||||
#include <asterisk/options.h>
|
#include <asterisk/options.h>
|
||||||
#include <asterisk/channel.h>
|
#include <asterisk/channel.h>
|
||||||
@@ -26,6 +27,27 @@
|
|||||||
#include <asterisk/file.h>
|
#include <asterisk/file.h>
|
||||||
#include <asterisk/translate.h>
|
#include <asterisk/translate.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_MUTEX
|
||||||
|
/* Convenient mutex debugging functions */
|
||||||
|
#define PTHREAD_MUTEX_LOCK(a) __PTHREAD_MUTEX_LOCK(__FUNCTION__, a)
|
||||||
|
#define PTHREAD_MUTEX_UNLOCK(a) __PTHREAD_MUTEX_UNLOCK(__FUNCTION__, a)
|
||||||
|
|
||||||
|
static int __PTHREAD_MUTEX_LOCK(char *f, pthread_mutex_t *a) {
|
||||||
|
ast_log(LOG_DEBUG, "Locking %p (%s)\n", a, f);
|
||||||
|
return pthread_mutex_lock(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __PTHREAD_MUTEX_UNLOCK(char *f, pthread_mutex_t *a) {
|
||||||
|
ast_log(LOG_DEBUG, "Unlocking %p (%s)\n", a, f);
|
||||||
|
return pthread_mutex_unlock(a);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define PTHREAD_MUTEX_LOCK(a) pthread_mutex_lock(a)
|
||||||
|
#define PTHREAD_MUTEX_UNLOCK(a) pthread_mutex_unlock(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
struct chanlist {
|
struct chanlist {
|
||||||
char type[80];
|
char type[80];
|
||||||
char description[80];
|
char description[80];
|
||||||
@@ -33,7 +55,6 @@ struct chanlist {
|
|||||||
struct ast_channel * (*requester)(char *type, int format, void *data);
|
struct ast_channel * (*requester)(char *type, int format, void *data);
|
||||||
struct chanlist *next;
|
struct chanlist *next;
|
||||||
} *backends = NULL;
|
} *backends = NULL;
|
||||||
|
|
||||||
struct ast_channel *channels = NULL;
|
struct ast_channel *channels = NULL;
|
||||||
|
|
||||||
/* Protect the channel list (highly unlikely that two things would change
|
/* Protect the channel list (highly unlikely that two things would change
|
||||||
@@ -45,7 +66,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
|
|||||||
struct ast_channel *(*requester)(char *type, int format, void *data))
|
struct ast_channel *(*requester)(char *type, int format, void *data))
|
||||||
{
|
{
|
||||||
struct chanlist *chan, *last=NULL;
|
struct chanlist *chan, *last=NULL;
|
||||||
if (pthread_mutex_lock(&chlock)) {
|
if (PTHREAD_MUTEX_LOCK(&chlock)) {
|
||||||
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -53,7 +74,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
|
|||||||
while(chan) {
|
while(chan) {
|
||||||
if (!strcasecmp(type, chan->type)) {
|
if (!strcasecmp(type, chan->type)) {
|
||||||
ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", type);
|
ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", type);
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
last = chan;
|
last = chan;
|
||||||
@@ -62,7 +83,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
|
|||||||
chan = malloc(sizeof(struct chanlist));
|
chan = malloc(sizeof(struct chanlist));
|
||||||
if (!chan) {
|
if (!chan) {
|
||||||
ast_log(LOG_WARNING, "Out of memory\n");
|
ast_log(LOG_WARNING, "Out of memory\n");
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
strncpy(chan->type, type, sizeof(chan->type));
|
strncpy(chan->type, type, sizeof(chan->type));
|
||||||
@@ -78,7 +99,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
|
|||||||
ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->type, chan->description);
|
ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->type, chan->description);
|
||||||
else if (option_verbose > 1)
|
else if (option_verbose > 1)
|
||||||
ast_verbose( VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->type, chan->description);
|
ast_verbose( VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->type, chan->description);
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +107,7 @@ struct ast_channel *ast_channel_alloc(void)
|
|||||||
{
|
{
|
||||||
struct ast_channel *tmp;
|
struct ast_channel *tmp;
|
||||||
struct ast_channel_pvt *pvt;
|
struct ast_channel_pvt *pvt;
|
||||||
pthread_mutex_lock(&chlock);
|
PTHREAD_MUTEX_LOCK(&chlock);
|
||||||
tmp = malloc(sizeof(struct ast_channel));
|
tmp = malloc(sizeof(struct ast_channel));
|
||||||
memset(tmp, 0, sizeof(struct ast_channel));
|
memset(tmp, 0, sizeof(struct ast_channel));
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
@@ -121,17 +142,17 @@ struct ast_channel *ast_channel_alloc(void)
|
|||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
ast_log(LOG_WARNING, "Out of memory\n");
|
ast_log(LOG_WARNING, "Out of memory\n");
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ast_channel *ast_channel_walk(struct ast_channel *prev)
|
struct ast_channel *ast_channel_walk(struct ast_channel *prev)
|
||||||
{
|
{
|
||||||
struct ast_channel *l, *ret=NULL;
|
struct ast_channel *l, *ret=NULL;
|
||||||
pthread_mutex_lock(&chlock);
|
PTHREAD_MUTEX_LOCK(&chlock);
|
||||||
l = channels;
|
l = channels;
|
||||||
if (!prev) {
|
if (!prev) {
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
while(l) {
|
while(l) {
|
||||||
@@ -139,7 +160,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev)
|
|||||||
ret = l->next;
|
ret = l->next;
|
||||||
l = l->next;
|
l = l->next;
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -147,7 +168,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev)
|
|||||||
void ast_channel_free(struct ast_channel *chan)
|
void ast_channel_free(struct ast_channel *chan)
|
||||||
{
|
{
|
||||||
struct ast_channel *last=NULL, *cur;
|
struct ast_channel *last=NULL, *cur;
|
||||||
pthread_mutex_lock(&chlock);
|
PTHREAD_MUTEX_LOCK(&chlock);
|
||||||
cur = channels;
|
cur = channels;
|
||||||
while(cur) {
|
while(cur) {
|
||||||
if (cur == chan) {
|
if (cur == chan) {
|
||||||
@@ -174,7 +195,7 @@ void ast_channel_free(struct ast_channel *chan)
|
|||||||
free(chan->callerid);
|
free(chan->callerid);
|
||||||
pthread_mutex_destroy(&chan->lock);
|
pthread_mutex_destroy(&chan->lock);
|
||||||
free(chan);
|
free(chan);
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_softhangup(struct ast_channel *chan)
|
int ast_softhangup(struct ast_channel *chan)
|
||||||
@@ -220,7 +241,7 @@ void ast_channel_unregister(char *type)
|
|||||||
struct chanlist *chan, *last=NULL;
|
struct chanlist *chan, *last=NULL;
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", type);
|
ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", type);
|
||||||
if (pthread_mutex_lock(&chlock)) {
|
if (PTHREAD_MUTEX_LOCK(&chlock)) {
|
||||||
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -232,13 +253,13 @@ void ast_channel_unregister(char *type)
|
|||||||
else
|
else
|
||||||
backends = backends->next;
|
backends = backends->next;
|
||||||
free(chan);
|
free(chan);
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
last = chan;
|
last = chan;
|
||||||
chan = chan->next;
|
chan = chan->next;
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&chlock);
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_answer(struct ast_channel *chan)
|
int ast_answer(struct ast_channel *chan)
|
||||||
@@ -392,7 +413,7 @@ struct ast_channel *ast_request(char *type, int format, void *data)
|
|||||||
{
|
{
|
||||||
struct chanlist *chan;
|
struct chanlist *chan;
|
||||||
struct ast_channel *c = NULL;
|
struct ast_channel *c = NULL;
|
||||||
if (pthread_mutex_lock(&chlock)) {
|
if (PTHREAD_MUTEX_LOCK(&chlock)) {
|
||||||
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
ast_log(LOG_WARNING, "Unable to lock channel list\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -402,15 +423,16 @@ struct ast_channel *ast_request(char *type, int format, void *data)
|
|||||||
if (!(chan->capabilities & format)) {
|
if (!(chan->capabilities & format)) {
|
||||||
format = ast_translator_best_choice(format, chan->capabilities);
|
format = ast_translator_best_choice(format, chan->capabilities);
|
||||||
}
|
}
|
||||||
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
if (chan->requester)
|
if (chan->requester)
|
||||||
c = chan->requester(type, format, data);
|
c = chan->requester(type, format, data);
|
||||||
pthread_mutex_unlock(&chlock);
|
return c;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
chan = chan->next;
|
chan = chan->next;
|
||||||
}
|
}
|
||||||
if (!chan)
|
if (!chan)
|
||||||
ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
|
ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
|
||||||
|
PTHREAD_MUTEX_UNLOCK(&chlock);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,9 +455,10 @@ int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int fti
|
|||||||
if (!len)
|
if (!len)
|
||||||
return -1;
|
return -1;
|
||||||
do {
|
do {
|
||||||
if (c->streamid > -1) {
|
if ((c->streamid > -1) || (c->trans && (c->trans->streamid > -1))) {
|
||||||
d = ast_waitstream(c, AST_DIGIT_ANY);
|
d = ast_waitstream(c, AST_DIGIT_ANY);
|
||||||
ast_stopstream(c);
|
ast_stopstream(c);
|
||||||
|
usleep(1000);
|
||||||
if (!d)
|
if (!d)
|
||||||
d = ast_waitfordigit(c, to);
|
d = ast_waitfordigit(c, to);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -200,7 +200,7 @@ static int g723tolin_framein(struct ast_translator_pvt *pvt, struct ast_frame *f
|
|||||||
#ifdef ANNEX_B
|
#ifdef ANNEX_B
|
||||||
Decod(&tmp->dec, tmpdata, f->data, 0);
|
Decod(&tmp->dec, tmpdata, f->data, 0);
|
||||||
for (x=0;x<Frame;x++)
|
for (x=0;x<Frame;x++)
|
||||||
(tmp->buf + tmp->tail)[x] = tmpdata[x];
|
(tmp->buf + tmp->tail)[x] = (short)tmpdata[x];
|
||||||
#else
|
#else
|
||||||
Decod(&tmp->dec, tmp->buf + tmp->tail, f->data, 0);
|
Decod(&tmp->dec, tmp->buf + tmp->tail, f->data, 0);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -6,8 +6,10 @@
|
|||||||
[interfaces]
|
[interfaces]
|
||||||
;
|
;
|
||||||
; Lines for which we are the user termination. They accept incoming
|
; Lines for which we are the user termination. They accept incoming
|
||||||
; and outgoing calls.
|
; and outgoing calls. We use the default context on the first 8 lines
|
||||||
|
; used by internal phones.
|
||||||
;
|
;
|
||||||
|
context=default
|
||||||
;user=voice00
|
;user=voice00
|
||||||
;user=voice01
|
;user=voice01
|
||||||
;user=voice02
|
;user=voice02
|
||||||
@@ -16,15 +18,11 @@
|
|||||||
;user=voice05
|
;user=voice05
|
||||||
;user=voice06
|
;user=voice06
|
||||||
;user=voice07
|
;user=voice07
|
||||||
context=default
|
|
||||||
user=voice13
|
|
||||||
user=voice14
|
|
||||||
user=voice15
|
|
||||||
; Calls on 16 and 17 come from the outside world, so they get
|
; Calls on 16 and 17 come from the outside world, so they get
|
||||||
; a little bit special treatment
|
; a little bit special treatment
|
||||||
context=remote
|
context=remote
|
||||||
user=voice16
|
;user=voice16
|
||||||
user=voice17
|
;user=voice17
|
||||||
;
|
;
|
||||||
; Next we have lines which we only accept calls on, and typically
|
; Next we have lines which we only accept calls on, and typically
|
||||||
; do not send outgoing calls on (i.e. these are where we are the
|
; do not send outgoing calls on (i.e. these are where we are the
|
||||||
|
@@ -26,8 +26,8 @@ stripmsd=1
|
|||||||
;
|
;
|
||||||
; Type of dialing
|
; Type of dialing
|
||||||
;
|
;
|
||||||
;dialtype=tone
|
dialtype=tone
|
||||||
dialtype=pulse
|
;dialtype=pulse
|
||||||
;
|
;
|
||||||
; Mode selection. "Immediate" means that as soon as you dial, you're connected
|
; Mode selection. "Immediate" means that as soon as you dial, you're connected
|
||||||
; and the line is considered up. "Ring" means we wait until the ring cadence
|
; and the line is considered up. "Ring" means we wait until the ring cadence
|
||||||
@@ -39,4 +39,4 @@ mode=immediate
|
|||||||
;
|
;
|
||||||
; List all devices we can use.
|
; List all devices we can use.
|
||||||
;
|
;
|
||||||
device=/dev/ttyS3
|
;device=/dev/ttyS3
|
||||||
|
@@ -3,12 +3,26 @@
|
|||||||
;
|
;
|
||||||
; Module Loader configuration file
|
; Module Loader configuration file
|
||||||
;
|
;
|
||||||
|
|
||||||
[modules]
|
[modules]
|
||||||
autoload=yes
|
autoload=yes
|
||||||
;load=pbx_gtkconsole.so
|
;
|
||||||
|
; If you want, load the GTK console right away.
|
||||||
|
; Don't load the KDE console since
|
||||||
|
; it's not as sophisticated right now.
|
||||||
|
;
|
||||||
noload=pbx_gtkconsole.so
|
noload=pbx_gtkconsole.so
|
||||||
|
;load=pbx_gtkconsole.so
|
||||||
noload=pbx_kdeconsole.so
|
noload=pbx_kdeconsole.so
|
||||||
|
;
|
||||||
|
; Intercom application is obsoleted by
|
||||||
|
; chan_oss. Don't load it.
|
||||||
|
;
|
||||||
noload=app_intercom.so
|
noload=app_intercom.so
|
||||||
;load=chan_vofr.so
|
|
||||||
;load=chan_h323.so
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Module names listed in "global" section will have symbols globally
|
||||||
|
; exported to modules loaded after them.
|
||||||
|
;
|
||||||
|
[global]
|
||||||
|
chan_modem.so=yes
|
||||||
|
@@ -2,13 +2,19 @@
|
|||||||
; Voicemail Configuration
|
; Voicemail Configuration
|
||||||
;
|
;
|
||||||
[general]
|
[general]
|
||||||
; Default format for writing Voicemail
|
; Default formats for writing Voicemail
|
||||||
; format=g723sf|rawgsm|mp3|wav
|
;format=g723sf|wav49|wav
|
||||||
format=g723sf|wav49|wav
|
format=gsm|wav49|wav
|
||||||
|
|
||||||
|
;
|
||||||
|
; Each mailbox is listed in the form <mailbox>=<password>,<name>,<email>
|
||||||
|
; if the e-mail is specified, a message will be sent when a message is
|
||||||
|
; received, to the given mailbox.
|
||||||
|
;
|
||||||
[default]
|
[default]
|
||||||
4200=2345,Mark Spencer,markster@linux-support.net
|
1234=4242,Example Mailbox,root@localhost
|
||||||
4300=2345,Ben Rigas,ben@american-computer.net
|
;4200=9855,Mark Spencer,markster@linux-support.net
|
||||||
4310=2345,Sales,sales@marko.net
|
;4300=3456,Ben Rigas,ben@american-computer.net
|
||||||
4069=2345,Matt Brooks,matt@marko.net
|
;4310=5432,Sales,sales@marko.net
|
||||||
4110=1379,Rob Flynn,rflynn@blueridge.net
|
;4069=6522,Matt Brooks,matt@marko.net
|
||||||
|
;4110=3443,Rob Flynn,rflynn@blueridge.net
|
||||||
|
@@ -143,12 +143,14 @@ char ast_waitfordigit(struct ast_channel *c, int ms);
|
|||||||
for the first digit */
|
for the first digit */
|
||||||
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders);
|
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders);
|
||||||
#define CHECK_BLOCKING(c) { \
|
#define CHECK_BLOCKING(c) { \
|
||||||
if ((c)->blocking) \
|
if ((c)->blocking) {\
|
||||||
ast_log(LOG_WARNING, "Blocking '%s', already blocked by thread %ld in procedure %s\n", (c)->name, (c)->blocker, (c)->blockproc); \
|
ast_log(LOG_WARNING, "Blocking '%s', already blocked by thread %ld in procedure %s\n", (c)->name, (c)->blocker, (c)->blockproc); \
|
||||||
else { \
|
/* *((int *)0)=0; */ \
|
||||||
|
} else { \
|
||||||
(c)->blocker = pthread_self(); \
|
(c)->blocker = pthread_self(); \
|
||||||
(c)->blockproc = __PRETTY_FUNCTION__; \
|
(c)->blockproc = __PRETTY_FUNCTION__; \
|
||||||
c->blocking = -1; } }
|
c->blocking = -1; \
|
||||||
|
} }
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
}
|
}
|
||||||
|
36
loader.c
36
loader.c
@@ -92,6 +92,22 @@ int ast_load_resource(char *resource_name)
|
|||||||
int errors=0;
|
int errors=0;
|
||||||
int res;
|
int res;
|
||||||
struct module *m;
|
struct module *m;
|
||||||
|
int flags=0;
|
||||||
|
char *val;
|
||||||
|
int o;
|
||||||
|
struct ast_config *cfg;
|
||||||
|
/* Keep the module file parsing silent */
|
||||||
|
o = option_verbose;
|
||||||
|
option_verbose = 0;
|
||||||
|
cfg = ast_load(AST_MODULE_CONFIG);
|
||||||
|
option_verbose = o;
|
||||||
|
if (cfg) {
|
||||||
|
if ((val = ast_variable_retrieve(cfg, "global", resource_name))
|
||||||
|
&& ast_true(val))
|
||||||
|
flags |= RTLD_GLOBAL;
|
||||||
|
ast_destroy(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
if (pthread_mutex_lock(&modlock))
|
if (pthread_mutex_lock(&modlock))
|
||||||
ast_log(LOG_WARNING, "Failed to lock\n");
|
ast_log(LOG_WARNING, "Failed to lock\n");
|
||||||
m = module_list;
|
m = module_list;
|
||||||
@@ -115,7 +131,7 @@ int ast_load_resource(char *resource_name)
|
|||||||
} else {
|
} else {
|
||||||
snprintf(fn, sizeof(fn), "%s/%s", AST_MODULE_DIR, resource_name);
|
snprintf(fn, sizeof(fn), "%s/%s", AST_MODULE_DIR, resource_name);
|
||||||
}
|
}
|
||||||
m->lib = dlopen(fn, RTLD_NOW | RTLD_GLOBAL);
|
m->lib = dlopen(fn, RTLD_NOW | flags);
|
||||||
if (!m->lib) {
|
if (!m->lib) {
|
||||||
ast_log(LOG_WARNING, "%s\n", dlerror());
|
ast_log(LOG_WARNING, "%s\n", dlerror());
|
||||||
free(m);
|
free(m);
|
||||||
@@ -149,16 +165,24 @@ int ast_load_resource(char *resource_name)
|
|||||||
pthread_mutex_unlock(&modlock);
|
pthread_mutex_unlock(&modlock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (!fully_booted) {
|
||||||
if (option_verbose)
|
if (option_verbose)
|
||||||
ast_verbose( " => (%s)\n", m->description());
|
ast_verbose( " => (%s)\n", m->description());
|
||||||
pthread_mutex_unlock(&modlock);
|
if (option_console && !option_verbose)
|
||||||
if ((res = m->load_module())) {
|
ast_verbose( ".");
|
||||||
ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, fn, res);
|
} else {
|
||||||
ast_unload_resource(resource_name, 0);
|
if (option_verbose)
|
||||||
return -1;
|
ast_verbose(VERBOSE_PREFIX_1 "Loaded %s => (%s)\n", fn, m->description());
|
||||||
}
|
}
|
||||||
m->next = module_list;
|
m->next = module_list;
|
||||||
module_list = m;
|
module_list = m;
|
||||||
|
pthread_mutex_unlock(&modlock);
|
||||||
|
if ((res = m->load_module())) {
|
||||||
|
ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res);
|
||||||
|
ast_unload_resource(resource_name, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ast_update_use_count();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,12 +25,15 @@
|
|||||||
#include <asterisk/module.h>
|
#include <asterisk/module.h>
|
||||||
#include <asterisk/logger.h>
|
#include <asterisk/logger.h>
|
||||||
#include <asterisk/options.h>
|
#include <asterisk/options.h>
|
||||||
|
#include <asterisk/cli.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/signal.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
@@ -42,6 +45,9 @@ static pthread_mutex_t verb_lock = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
static pthread_t console_thread;
|
static pthread_t console_thread;
|
||||||
|
|
||||||
static int inuse=0;
|
static int inuse=0;
|
||||||
|
static int clipipe[2];
|
||||||
|
static int cleanupid = -1;
|
||||||
|
|
||||||
static char *dtext = "Asterisk PBX Console (GTK Version)";
|
static char *dtext = "Asterisk PBX Console (GTK Version)";
|
||||||
|
|
||||||
static GtkWidget *window;
|
static GtkWidget *window;
|
||||||
@@ -50,6 +56,9 @@ static GtkWidget *closew;
|
|||||||
static GtkWidget *verb;
|
static GtkWidget *verb;
|
||||||
static GtkWidget *modules;
|
static GtkWidget *modules;
|
||||||
static GtkWidget *statusbar;
|
static GtkWidget *statusbar;
|
||||||
|
static GtkWidget *cli;
|
||||||
|
|
||||||
|
static struct timeval last;
|
||||||
|
|
||||||
static void update_statusbar(char *msg)
|
static void update_statusbar(char *msg)
|
||||||
{
|
{
|
||||||
@@ -65,26 +74,101 @@ int unload_module(void)
|
|||||||
gdk_threads_enter();
|
gdk_threads_enter();
|
||||||
gtk_widget_destroy(window);
|
gtk_widget_destroy(window);
|
||||||
gdk_threads_leave();
|
gdk_threads_leave();
|
||||||
|
close(clipipe[0]);
|
||||||
|
close(clipipe[1]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cleanup(void *useless)
|
||||||
|
{
|
||||||
|
gdk_threads_enter();
|
||||||
|
gtk_clist_thaw(GTK_CLIST(verb));
|
||||||
|
gtk_widget_queue_resize(verb->parent);
|
||||||
|
gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0);
|
||||||
|
cleanupid = -1;
|
||||||
|
gdk_threads_leave();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void verboser(char *stuff, int opos, int replacelast, int complete)
|
|
||||||
|
static void __verboser(char *stuff, int opos, int replacelast, int complete)
|
||||||
{
|
{
|
||||||
char *s2[2];
|
char *s2[2];
|
||||||
pthread_mutex_lock(&verb_lock);
|
struct timeval tv;
|
||||||
|
int ms;
|
||||||
s2[0] = stuff;
|
s2[0] = stuff;
|
||||||
s2[1] = NULL;
|
s2[1] = NULL;
|
||||||
gdk_threads_enter();
|
gtk_clist_freeze(GTK_CLIST(verb));
|
||||||
if (replacelast)
|
if (replacelast)
|
||||||
gtk_clist_remove(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1);
|
gtk_clist_remove(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1);
|
||||||
gtk_clist_append(GTK_CLIST(verb), s2);
|
gtk_clist_append(GTK_CLIST(verb), s2);
|
||||||
gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0);
|
if (last.tv_sec || last.tv_usec) {
|
||||||
gdk_threads_leave();
|
gdk_threads_leave();
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
if (cleanupid > -1)
|
||||||
|
gtk_timeout_remove(cleanupid);
|
||||||
|
ms = (tv.tv_sec - last.tv_sec) * 1000 + (tv.tv_usec - last.tv_usec) / 1000;
|
||||||
|
if (ms < 100) {
|
||||||
|
/* We just got a message within 100ms, so just schedule an update
|
||||||
|
in the near future */
|
||||||
|
cleanupid = gtk_timeout_add(200, cleanup, NULL);
|
||||||
|
} else {
|
||||||
|
cleanup(&cleanupid);
|
||||||
|
}
|
||||||
|
last = tv;
|
||||||
|
} else {
|
||||||
|
gettimeofday(&last, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void verboser(char *stuff, int opos, int replacelast, int complete)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&verb_lock);
|
||||||
|
/* Lock appropriately if we're really being called in verbose mode */
|
||||||
|
__verboser(stuff, opos, replacelast, complete);
|
||||||
pthread_mutex_unlock(&verb_lock);
|
pthread_mutex_unlock(&verb_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cliinput(void *data, int source, GdkInputCondition ic)
|
||||||
|
{
|
||||||
|
static char buf[256];
|
||||||
|
static int offset = 0;
|
||||||
|
int res;
|
||||||
|
char *c;
|
||||||
|
char *l;
|
||||||
|
char n;
|
||||||
|
/* Read as much stuff is there */
|
||||||
|
res = read(source, buf + offset, sizeof(buf) - 1 - offset);
|
||||||
|
if (res > -1)
|
||||||
|
buf[res + offset] = '\0';
|
||||||
|
/* make sure we've null terminated whatever we have so far */
|
||||||
|
c = buf;
|
||||||
|
l = buf;
|
||||||
|
while(*c) {
|
||||||
|
if (*c == '\n') {
|
||||||
|
/* Keep the trailing \n */
|
||||||
|
c++;
|
||||||
|
n = *c;
|
||||||
|
*c = '\0';
|
||||||
|
__verboser(l, 0, 0, 1);
|
||||||
|
*(c - 1) = '\0';
|
||||||
|
*c = n;
|
||||||
|
l = c;
|
||||||
|
} else
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
if (strlen(l)) {
|
||||||
|
/* We have some left over */
|
||||||
|
memmove(buf, l, strlen(l) + 1);
|
||||||
|
offset = strlen(buf);
|
||||||
|
} else {
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void remove_module()
|
static void remove_module()
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
@@ -194,14 +278,12 @@ static int mod_update(void)
|
|||||||
if (GTK_CLIST(modules)->selection) {
|
if (GTK_CLIST(modules)->selection) {
|
||||||
module= (char *)gtk_clist_get_row_data(GTK_CLIST(modules), (int) GTK_CLIST(modules)->selection->data);
|
module= (char *)gtk_clist_get_row_data(GTK_CLIST(modules), (int) GTK_CLIST(modules)->selection->data);
|
||||||
}
|
}
|
||||||
gdk_threads_enter();
|
|
||||||
gtk_clist_freeze(GTK_CLIST(modules));
|
gtk_clist_freeze(GTK_CLIST(modules));
|
||||||
gtk_clist_clear(GTK_CLIST(modules));
|
gtk_clist_clear(GTK_CLIST(modules));
|
||||||
ast_update_module_list(add_mod);
|
ast_update_module_list(add_mod);
|
||||||
if (module)
|
if (module)
|
||||||
gtk_clist_select_row(GTK_CLIST(modules), gtk_clist_find_row_from_data(GTK_CLIST(modules), module), -1);
|
gtk_clist_select_row(GTK_CLIST(modules), gtk_clist_find_row_from_data(GTK_CLIST(modules), module), -1);
|
||||||
gtk_clist_thaw(GTK_CLIST(modules));
|
gtk_clist_thaw(GTK_CLIST(modules));
|
||||||
gdk_threads_leave();
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,8 +302,12 @@ static void exit_now(GtkWidget *widget, gpointer data)
|
|||||||
|
|
||||||
static void exit_completely(GtkWidget *widget, gpointer data)
|
static void exit_completely(GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
/* This is the wrong way to do this. We need an ast_clean_exit() routine */
|
#if 0
|
||||||
exit(0);
|
/* Clever... */
|
||||||
|
ast_cli_command(clipipe[1], "quit");
|
||||||
|
#else
|
||||||
|
kill(getpid(), SIGTERM);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exit_nicely(GtkWidget *widget, gpointer data)
|
static void exit_nicely(GtkWidget *widget, gpointer data)
|
||||||
@@ -239,6 +325,17 @@ static void *consolethread(void *data)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cli_activate()
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
strncpy(buf, gtk_entry_get_text(GTK_ENTRY(cli)), sizeof(buf));
|
||||||
|
gtk_entry_set_text(GTK_ENTRY(cli), "");
|
||||||
|
if (strlen(buf)) {
|
||||||
|
ast_cli_command(clipipe[1], buf);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static int show_console()
|
static int show_console()
|
||||||
{
|
{
|
||||||
GtkWidget *hbox;
|
GtkWidget *hbox;
|
||||||
@@ -276,7 +373,7 @@ static int show_console()
|
|||||||
gtk_container_add(GTK_CONTAINER(sw), verb);
|
gtk_container_add(GTK_CONTAINER(sw), verb);
|
||||||
gtk_widget_show(verb);
|
gtk_widget_show(verb);
|
||||||
gtk_widget_show(sw);
|
gtk_widget_show(sw);
|
||||||
gtk_widget_set_usize(verb, 600, 400);
|
gtk_widget_set_usize(verb, 640, 400);
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, gtk_label_new("Verbose Status"));
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, gtk_label_new("Verbose Status"));
|
||||||
|
|
||||||
|
|
||||||
@@ -334,13 +431,20 @@ static int show_console()
|
|||||||
hbox = gtk_vbox_new(FALSE, 0);
|
hbox = gtk_vbox_new(FALSE, 0);
|
||||||
gtk_widget_show(hbox);
|
gtk_widget_show(hbox);
|
||||||
|
|
||||||
|
/* Command line */
|
||||||
|
cli = gtk_entry_new();
|
||||||
|
gtk_widget_show(cli);
|
||||||
|
|
||||||
|
gtk_signal_connect(GTK_OBJECT(cli), "activate",
|
||||||
|
GTK_SIGNAL_FUNC (cli_activate), NULL);
|
||||||
|
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 5);
|
gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 5);
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), wbox, FALSE, FALSE, 5);
|
gtk_box_pack_start(GTK_BOX(hbox), wbox, FALSE, FALSE, 5);
|
||||||
|
gtk_box_pack_start(GTK_BOX(hbox), cli, FALSE, FALSE, 0);
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), statusbar, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(hbox), statusbar, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
|
||||||
gtk_container_add(GTK_CONTAINER(window), hbox);
|
gtk_container_add(GTK_CONTAINER(window), hbox);
|
||||||
gtk_window_set_title(GTK_WINDOW(window), "Asterisk Console");
|
gtk_window_set_title(GTK_WINDOW(window), "Asterisk Console");
|
||||||
|
gtk_widget_grab_focus(cli);
|
||||||
pthread_create(&console_thread, NULL, consolethread, NULL);
|
pthread_create(&console_thread, NULL, consolethread, NULL);
|
||||||
/* XXX Okay, seriously fix me! XXX */
|
/* XXX Okay, seriously fix me! XXX */
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
@@ -348,6 +452,7 @@ static int show_console()
|
|||||||
gtk_clist_freeze(GTK_CLIST(verb));
|
gtk_clist_freeze(GTK_CLIST(verb));
|
||||||
ast_loader_register(mod_update);
|
ast_loader_register(mod_update);
|
||||||
gtk_clist_thaw(GTK_CLIST(verb));
|
gtk_clist_thaw(GTK_CLIST(verb));
|
||||||
|
gdk_input_add(clipipe[0], GDK_INPUT_READ, cliinput, NULL);
|
||||||
mod_update();
|
mod_update();
|
||||||
update_statusbar("Asterisk Console Ready");
|
update_statusbar("Asterisk Console Ready");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -356,6 +461,10 @@ static int show_console()
|
|||||||
|
|
||||||
int load_module(void)
|
int load_module(void)
|
||||||
{
|
{
|
||||||
|
if (pipe(clipipe)) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to create CLI pipe\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
g_thread_init(NULL);
|
g_thread_init(NULL);
|
||||||
if (gtk_init_check(NULL, NULL)) {
|
if (gtk_init_check(NULL, NULL)) {
|
||||||
/* XXX Do we need to call this twice? XXX */
|
/* XXX Do we need to call this twice? XXX */
|
||||||
|
10
say.c
10
say.c
@@ -42,8 +42,13 @@ int ast_say_digits(struct ast_channel *chan, int num)
|
|||||||
int ast_say_number(struct ast_channel *chan, int num)
|
int ast_say_number(struct ast_channel *chan, int num)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
int playh = 0;
|
||||||
char fn[256] = "";
|
char fn[256] = "";
|
||||||
while(num && !res) {
|
while(num && !res) {
|
||||||
|
if (playh) {
|
||||||
|
snprintf(fn, sizeof(fn), "digits/hundred");
|
||||||
|
playh = 0;
|
||||||
|
} else
|
||||||
if (num < 20) {
|
if (num < 20) {
|
||||||
snprintf(fn, sizeof(fn), "digits/%d", num);
|
snprintf(fn, sizeof(fn), "digits/%d", num);
|
||||||
num = 0;
|
num = 0;
|
||||||
@@ -51,10 +56,15 @@ int ast_say_number(struct ast_channel *chan, int num)
|
|||||||
if (num < 100) {
|
if (num < 100) {
|
||||||
snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
|
snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
|
||||||
num -= ((num / 10) * 10);
|
num -= ((num / 10) * 10);
|
||||||
|
} else {
|
||||||
|
if (num < 1000){
|
||||||
|
snprintf(fn, sizeof(fn), "digits/%d", (num/100));
|
||||||
|
playh++;
|
||||||
} else {
|
} else {
|
||||||
ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
|
ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!res) {
|
if (!res) {
|
||||||
res = ast_streamfile(chan, fn);
|
res = ast_streamfile(chan, fn);
|
||||||
if (!res)
|
if (!res)
|
||||||
|
BIN
sounds/beep.gsm
Executable file
BIN
sounds/beep.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-abouttotry.gsm
Executable file
BIN
sounds/demo-abouttotry.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-congrats.gsm
Executable file
BIN
sounds/demo-congrats.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-echodone.gsm
Executable file
BIN
sounds/demo-echodone.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-echotest.gsm
Executable file
BIN
sounds/demo-echotest.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-instruct.gsm
Executable file
BIN
sounds/demo-instruct.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-nogo.gsm
Executable file
BIN
sounds/demo-nogo.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-thanks.gsm
Executable file
BIN
sounds/demo-thanks.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/0.gsm
Executable file
BIN
sounds/digits/0.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/1.gsm
Executable file
BIN
sounds/digits/1.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/10.gsm
Executable file
BIN
sounds/digits/10.gsm
Executable file
Binary file not shown.
5
sounds/digits/11.gsm
Executable file
5
sounds/digits/11.gsm
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
<EFBFBD><17><>S^<5E><><15>Ue<><65>M-W<>V<EFBFBD><56><EFBFBD>J<EFBFBD>[<5B><>jm<><6D><EFBFBD><EFBFBD><EFBFBD>#<23><>֒<EFBFBD>CK<43><4B>8<EFBFBD>1<EFBFBD><05><>8ԱjMo!<21><1B><>i<EFBFBD>v<EFBFBD><1D>sdH<0B><>eb<65>,<2C>]<5D>օ<>۞%<25>^$)n8<6E><38>k<EFBFBD><6B>k<EFBFBD>Ũ<EFBFBD><C5A8>Ӣ<EFBFBD><D3A2>G<EFBFBD><47> <20>o<EFBFBD>6<EFBFBD><36><EFBFBD>ڄ<><DA84>d4<0B>5<EFBFBD>!k<><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>d<EFBFBD><64>ȓ<EFBFBD>;?<3F><><EFBFBD><1D><>*<2A>$&<26>r[<5B><>1<EFBFBD><31>붃%<19><><03>D9^<5E>:ܑ"<22>ڀ<EFBFBD>]<5D>#<23><>V<EFBFBD><14>4<EFBFBD>"<22>"q<>/<2F>!a&<26><0C><><EFBFBD>'M<><4D><EFBFBD><EFBFBD>Zi<10><>3<EFBFBD>is<69>¹ <20>U<14><><EFBFBD>!<21><> ",ށ<><DE81>}ⵝ<>W <20>q<EFBFBD>e{{<7B>)<1C>;o{<7B><>T<EFBFBD><54><EFBFBD>w<EFBFBD>4<>E(s*(<28>ML<4D><4C>s<EFBFBD><73>yw<79>U<16><>r<EFBFBD>I<EFBFBD>-<2D><>qP<71>Q<>mkM<6B><4D>N<EFBFBD><4E><EFBFBD>/<2F>:q<>/'je*o<><6F>ט<>m2<6D><32>.'oo<6F>+<2B><18>c<EFBFBD>m<EFBFBD>[x۰<78><DBB0>7@<40><>Q<EFBFBD><51><EFBFBD>S\kQ<6B><51>jG=<3D>P<EFBFBD><50>P<EFBFBD><50><EFBFBD>,<2C>_pk<70><6B><EFBFBD>磌k<EFAAAB>b<EFBFBD><62><EFBFBD>Cis<69>f<><66><EFBFBD>MT<4D>p6%Ӭ<>_pkPߎU<DF8E><55><EFBFBD><EFBFBD>V<EFBFBD>5wk<><6B><EFBFBD>xd5n<35><6E><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:kp=<3D>Rơ<52><C6A1>X+<2B><>
|
||||||
|
<EFBFBD>JHɅ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<0E>b<EFBFBD><62>y<EFBFBD>k<6B><EEA997>h<<3C><>9[<5B><><EFBFBD>~<7E>h$<24><>솲9[<5B>j<EFBFBD>j<><6A>h<EFBFBD><68>fʅ#<23><><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>^
|
||||||
|
r4<EFBFBD><EFBFBD>j<EFBFBD>gq<EFBFBD><EFBFBD>9Rr<EFBFBD>4<EFBFBD><EFBFBD>МR<EFBFBD><EFBFBD><EFBFBD><EFBFBD>W5Aٓ<EFBFBD><08>u0<75>ӫd3<64><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԉ<EFBFBD><D489>
|
||||||
|
<EFBFBD>=p<>(<28><>Q<EFBFBD>X<EFBFBD>((͞Ѥ<CD9E><D1A4><EFBFBD>gh<67>LK<4C>h<1A>˧c<CBA7>;"<22>'<27>0<>S<EFBFBD> )\<5C><>T<EFBFBD>(<28><>``<60>9km&<1A>v<><0C>f<EFBFBD>Yc<59><63>ī'<27>2<EFBFBD>E<1B>)u3 <20>C>U<><18>
|
||||||
|
r<EFBFBD>qR#<23>BV<42>ܯe<DCAF>M$<24><><EFBFBD><EFBFBD><EFBFBD>(<28><>d<EFBFBD>r+c<>ƶ<EFBFBD>7<1C><><EFBFBD>e!<21><><EFBFBD><EFBFBD>5"<22><><EFBFBD>ҟwe<77><65><EFBFBD>G.<2E>S<><53>F<EFBFBD><46><EFBFBD><03><><EFBFBD>Z<EFBFBD><5A><EFBFBD>b<EFBFBD>{<7B>[<5B><><EFBFBD>W
|
BIN
sounds/digits/12.gsm
Executable file
BIN
sounds/digits/12.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/13.gsm
Executable file
BIN
sounds/digits/13.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/14.gsm
Executable file
BIN
sounds/digits/14.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/15.gsm
Executable file
BIN
sounds/digits/15.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/16.gsm
Executable file
BIN
sounds/digits/16.gsm
Executable file
Binary file not shown.
4
sounds/digits/17.gsm
Executable file
4
sounds/digits/17.gsm
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
<EFBFBD><1D>-<2D>R<EFBFBD>4t`֡f<D6A1><66><EFBFBD><EFBFBD>*<2A>¶<EFBFBD>4;p<>Q<EFBFBD>I^<5E>֝y`<60><>"<22>IV<49><56><EFBFBD>
|
||||||
|
<EFBFBD>c,<2C><><EFBFBD>U\Oګ<4F><DAAB>˥U<CBA5><55><EFBFBD><EFBFBD>x<EFBFBD><78>|<7C>(<28>V<EFBFBD><56><1A><>ᙩsS<73><53><EFBFBD><EFBFBD><16>4<EFBFBD><34>[xؑء<D891><D8A1><EFBFBD>Fͺ<46><18>nD<6E><44><EFBFBD>6ͦ<36>(<28>⛢5f<35>՜`<60>Y<EFBFBD>#<23><>fh<66><68><01><>n<EFBFBD>C<EFBFBD>bԢ7fY$<24><>i7&ԝr<D49D>rw%(<28><><EFBFBD><14><><EFBFBD><EFBFBD>m<EFBFBD>6X<36>T0&˛+7,<2C><>%Ԧd<1A>_<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD>\l<><1B>6<EFBFBD>y[uDny13#nJ<6E><4A>&u8<><38><EFBFBD>-`<60>]w<>;<3B>IƓwQ$<24><><EFBFBD>+<2B><><EFBFBD><EFBFBD><1E><>t<EFBFBD><74><EFBFBD>RK<52>m8<6D>w1<06><>q[ul&<26>1<EFBFBD><31>u0<75>,<2C><>L<EFBFBD><4C>|<7C><><EFBFBD>/4<><34>$<24><>F̉Iot͊<74>i<EFBFBD><69><EFBFBD><EFBFBD>9%<25><18><>*[Zr<5A><72><EFBFBD>42',<2C>Ȅ<EFBFBD>><3E>[}E<><45><EFBFBD><EFBFBD>&v<><76>a8<61><38>hd<16>}<7D><>+if<69>}<7D>F<EFBFBD>y<EFBFBD><79>vÈ<76>,V{<7B>C<EFBFBD>q<EFBFBD><71>Ԧc<D4A6>1{<7B>9$<24>A%<25><>
|
||||||
|
D)vw<76>KD<4B>'#w<><77><EFBFBD><EFBFBD><1C><>c<EFBFBD>0qh<71><68>E)Ws<%m<>b<EFBFBD>G7-<2D>.<2E><><EFBFBD>%Zm˷<6D><CBB7>l<EFBFBD>(<28><>#h<><1A><><EFBFBD>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD>`<60>mɿ<6D>Ŏeq<65>i<EFBFBD>%<25><>x<>9w<39><77>=K<><4B>Cx49-z<><7A>m<EFBFBD>G#<23>&<26>X<EFBFBD><58>䖥N<E496A5>{B<><42><EFBFBD>4<EFBFBD>~û]<5D>&㢢(<28>vɧ<76>'<27>$<24><><EFBFBD>-D<><44><EFBFBD><EFBFBD>at<61><74>K<EFBFBD><4B>I+5ꁪ<>v<EFBFBD><76><EFBFBD><EFBFBD>L<EFBFBD><4C>P<EFBFBD>g<EFBFBD><67><EFBFBD>n<EFBFBD><6E>L<EFBFBD><4C>j3<6A><33>R<EFBFBD>)w<1B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><1B>b<EFBFBD>$<24><><EFBFBD><EFBFBD> <09>1%<25><>摇<EFBFBD><E69187>h<EFBFBD><1A>.<2E>ĦD<C4A6>d<EFBFBD>X<EFBFBD>إ<EFBFBD>%"<22><>=<3D>m<><6D>G<0C>
|
||||||
|
<EFBFBD><EFBFBD>l<EFBFBD>8<EFBFBD><EFBFBD>Lӹi(<28><11><><EFBFBD>h<EFBFBD>]pj<70><14><15><><EFBFBD><EFBFBD>;<16><><EFBFBD><EFBFBD><EFBFBD>؝<EFBFBD><D89D><<3C><08>fn<66><6E><EFBFBD>dp<64>q<EFBFBD><71>k<EFBFBD>}9i<39><69><EFBFBD>S<><53><EFBFBD><EFBFBD><17><><EFBFBD><EFBFBD>d彭Nh<4E><68>Lr<4C><72>h8<68><38><EFBFBD><EFBFBD>dǶ<64>@<40><EFBFBD>Bm<42><6D>}-H<><48><EFBFBD>$՞D<D59E>(<28><>I<08><><0C>h<EFBFBD><68><EFBFBD><EFBFBD>ہh\M<>7?<3F><>b<EFBFBD><62><EFBFBD>=<3D>E<>؋G'oʜ<6F><CA9C>%<25><><EFBFBD><12><04>7<EFBFBD>YԦ
|
BIN
sounds/digits/18.gsm
Executable file
BIN
sounds/digits/18.gsm
Executable file
Binary file not shown.
1
sounds/digits/19.gsm
Executable file
1
sounds/digits/19.gsm
Executable file
@@ -0,0 +1 @@
|
|||||||
|
Ԡc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rXS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)Ԝ<><D49C>Z<EFBFBD>ڝ_<DA9D><5F><EFBFBD>&j<><6A><EFBFBD>zX<7A>h<EFBFBD>r<EFBFBD><72>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V撠٪<E692A0>Y3<59><33><EFBFBD>#M8[<5B><><EFBFBD><18><><EFBFBD><EFBFBD>Q<><51>Ԡ'esY<73><59><EFBFBD>˭RF<52>t<EFBFBD>
|
BIN
sounds/digits/2.gsm
Executable file
BIN
sounds/digits/2.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/20.gsm
Executable file
BIN
sounds/digits/20.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/3.gsm
Executable file
BIN
sounds/digits/3.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/30.gsm
Executable file
BIN
sounds/digits/30.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/4.gsm
Executable file
BIN
sounds/digits/4.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/40.gsm
Executable file
BIN
sounds/digits/40.gsm
Executable file
Binary file not shown.
4
sounds/digits/5.gsm
Executable file
4
sounds/digits/5.gsm
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
<EFBFBD><EFBFBD>i<EFBFBD><12><><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD>b<EFBFBD><62><EFBFBD>vó̠<C3B3>Ӎʤn<CAA4>D<EFBFBD>X<EFBFBD>o<EFBFBD>]z"<22><>X$9<>S<EFBFBD><53><[s(<28><><EFBFBD><EFBFBD>!vEUv<55>}<7D>!<21>j<><1A>@<40><1C><><EFBFBD>R<EFBFBD>YW<59>+\<5C><<3C><>p<EFBFBD><70>3<13><><EFBFBD><EFBFBD>]zY<19><><EFBFBD>*Q<>+<2B><><EFBFBD>,<2C>Kz<>ԭQ<16>h<EFBFBD><68>v,<2C><>߂`<60>րɣ<D680><C9A3>$<24><><EFBFBD>ԌȢf<C8A2><14><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>աzY<><59><EFBFBD>a<EFBFBD><61>"r`ߛ<>Y<1D><><EFBFBD>ܔ<EFBFBD>$<24><>%<13>I<EFBFBD><49><EFBFBD><EFBFBD>eb<65><62>F<EFBFBD>Q"<22><><EFBFBD><EFBFBD>&<26>˶_<CBB6><5F>ͶAdRH1<48>M"<22><>1<EFBFBD><31>:ZD<5A>@)5$<24>CW[<5B><><EFBFBD>Y<EFBFBD>G#m<>/a<><61>$dԕ<64><D495><EFBFBD><EFBFBD>=]<5D>9<EFBFBD><39><EFBFBD>$s<>"<22><>+q<10>Ynq<>C[v%<25>ԯ<EFBFBD>սqϸ/<2F>9qQ8!<21>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0*q<>V<EFBFBD><56>8<EFBFBD><38><EFBFBD>Ù<EFBFBD>o<EFBFBD>v<EFBFBD><76><EFBFBD>'mP7L))/o<>Q[<5B>*<2A>m<EFBFBD>9'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<10>#V]Emm3<6D><33>%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>m<><6D>\8<><38><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>m7<6D>َ<06><><EFBFBD>"o<><6F><EFBFBD>Ԧ<EFBFBD><D4A6>Q<EFBFBD><51><EFBFBD>H<EFBFBD>Ա<EFBFBD>;o̎W*<2A>m<0E><>f1
|
||||||
|
o<EFBFBD>Mn<>c<EFBFBD><63>*4<><34>/<2F><><EFBFBD><19>q
|
||||||
|
<EFBFBD>J)/q<>zr<7A>#<23><><EFBFBD>#7#<23>3<EFBFBD>*n=<3D><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>,<2C><><06><>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>X<EFBFBD><58>N[u
|
||||||
|
h<EFBFBD>"<22><>1<EFBFBD>R:u<>22<32><32>Uu<55><75>S<EFBFBD>t<EFBFBD>w,<2C>aM#/<2F>1Q]MGE<47>2<EFBFBD><32>y<EFBFBD><79><EFBFBD>*<2A><03>{<7B>y<EFBFBD>r9|{<7B>#<23><>Ȣ}<7D>'^<5E><1E><>q<EFBFBD>z<><7A><EFBFBD><EFBFBD>'}1oErD<72><44>O<EFBFBD><4F><EFBFBD><EFBFBD>D<EFBFBD><44>I[l<10><>m<EFBFBD>y<><79><EFBFBD>L<EFBFBD>֪<EFBFBD><D6AA><EFBFBD>4<EFBFBD>U<13><>qdP<64><50><EFBFBD><EFBFBD>H<EFBFBD><48>DŽխ<C784><D5AD><EFBFBD>ز<EFBFBD>#u&Î<><C38E>,<2C>"<22>N<EFBFBD><4E>Q<EFBFBD><14><><EFBFBD><EFBFBD>G#ժ<>"<22><>0F<30>c'$<24>
|
BIN
sounds/digits/50.gsm
Executable file
BIN
sounds/digits/50.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/6.gsm
Executable file
BIN
sounds/digits/6.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/60.gsm
Executable file
BIN
sounds/digits/60.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/7.gsm
Executable file
BIN
sounds/digits/7.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/70.gsm
Executable file
BIN
sounds/digits/70.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/8.gsm
Executable file
BIN
sounds/digits/8.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/80.gsm
Executable file
BIN
sounds/digits/80.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/9.gsm
Executable file
BIN
sounds/digits/9.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/90.gsm
Executable file
BIN
sounds/digits/90.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/hundred.gsm
Executable file
BIN
sounds/digits/hundred.gsm
Executable file
Binary file not shown.
BIN
sounds/transfer.gsm
Executable file
BIN
sounds/transfer.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-deleted.gsm
Executable file
BIN
sounds/vm-deleted.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-goodbye.gsm
Executable file
BIN
sounds/vm-goodbye.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-incorrect.gsm
Executable file
BIN
sounds/vm-incorrect.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-instructions.gsm
Executable file
BIN
sounds/vm-instructions.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-intro.gsm
Executable file
BIN
sounds/vm-intro.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-isonphone.gsm
Executable file
BIN
sounds/vm-isonphone.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-isunavail.gsm
Executable file
BIN
sounds/vm-isunavail.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-login.gsm
Executable file
BIN
sounds/vm-login.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-message.gsm
Executable file
BIN
sounds/vm-message.gsm
Executable file
Binary file not shown.
5
sounds/vm-messages.gsm
Executable file
5
sounds/vm-messages.gsm
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
<EFBFBD>EP<45><50><EFBFBD>Z<EFBFBD>S<EFBFBD>]<5D><>X|<7C><><EFBFBD>|<7C><>Lo39\AT-<2D>V<EFBFBD>fr<66>Y<EFBFBD><59><EFBFBD>;2|<7C>V<01>N6<4E>ʀ<EFBFBD>fGH<47><48>A(<28>i
|
||||||
|
ҧz<EFBFBD><1A>!)a<>]mR<6D><52>+u<>
|
||||||
|
<EFBFBD><EFBFBD>"e$Kk<4B><6B>E⭛e<E2AD9B>鋕Q<E98B95><51><19>J٬p<D9AC><70>Q4<51><34><EFBFBD><EFBFBD>f<>%<25><>\<5C>V<1A><>h<EFBFBD>Q!dmrL<72>l<EFBFBD>j[<5B><>u<EFBFBD><75>8S$Z<>X<EFBFBD>Pl)Z<>ңe<D2A3>cQe+۷By%j<><6A>[#:ݜ<>k<6B>Ȋq<1F>Ҥvl<76><6C>%<12>N1<4E>o&<26>|rĢoC<6F> O<>jĖl)<29>o<EFBFBD><6F><EFBFBD>-<2D>o<EFBFBD><6F><EFBFBD><EFBFBD>K<1C>ʩ<CAA9>T<EFBFBD>k-<2D>$v<>$k<>:\<5C><><EFBFBD>өlz<6C>iM<69>uN<75>k-;wU<77><55>i<EFBFBD> L<><4C><EFBFBD>i<EFBFBD>̜<EFBFBD>Y<EFBFBD><59>h\<5C><>ijyC<79>&<26><><EFBFBD>kD<6B><44><EFBFBD>g,<2C><><EFBFBD>KK͉<4B><CD89><EFBFBD>K*<2A><>m<EFBFBD>(g v<>ѦeN<65>$j<><1A>
|
||||||
|
ƾ<11><><EFBFBD>M<EFBFBD>嗶<EFBFBD><E597B6>hT<68><54><EFBFBD>-4,R<>z|<7C>(<28><06><>gL<67>m4<6D>kH<6B>5<EFBFBD>'#ԦRi<52><69>)<04>N<EFBFBD>k<EFBFBD>E<EFBFBD><45><12><><EFBFBD><06>6M<36><4D><EFBFBD><EFBFBD>=b<>m|<7C>i<><69><EFBFBD>CH<1E><>1<EFBFBD><31>G<16>'n<><6E><EFBFBD>ܩi<DCA9>ʣ<EFBFBD>.<2E>k<EFBFBD>id<69><64><EFBFBD>!<21><>t<EFBFBD><74>$<24> ٯ%x<>
|
||||||
|
<EFBFBD><04>x<EFBFBD>&<26>%<25><><1A><><EFBFBD><EFBFBD>㙌<EFBFBD>td<74><64><EFBFBD>Aդ"֤2!<21>(<28><>%<07>v<EFBFBD>k<EFBFBD><6B>sq<73>ge.Uy<55>oɨ;mw<6D><77>f<EFBFBD>8<EFBFBD>mI7<49>)&#<23><13>%e*<2A>v<EFBFBD><76>-<2D>9"v<>G<EFBFBD>)/}<7D><0E>,<2C><><EFBFBD><05><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L*x<><78>㥀<><E3A580><EFBFBD>X<EFBFBD>Sf<53><66><EFBFBD>3CWKi<4B><69><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD>bq<62><71><05><0E><><1B>X<>U(<28><><EFBFBD>ڦi<DAA6>Ԏ<EFBFBD>ϒ.ԝ<>b<EFBFBD><62><EFBFBD>rD}*2<><15>C<EFBFBD>H<EFBFBD><48>,<2C>"<22>X<EFBFBD><16><><EFBFBD>"<22><>:<3A>Ӟ<EFBFBD>m<EFBFBD>V»<56>)GBR<42>U]r<><72>A<EFBFBD><EFBFBD><14>".f*<2A>*<2A>Z<EFBFBD>i<EFBFBD>ܢ<1B> <09><><EFBFBD>#<23><><EFBFBD>J<EFBFBD><4A><EFBFBD>1$m<>ۄ<EFBFBD><DB84>7y<37>Cڔq&<19>e<EFBFBD><65><EFBFBD>|<7C><>F١ꧧDm)<29>z<EFBFBD><7A>P<EFBFBD>(<28><>Z<EFBFBD>r-p<><70><1F>9+<2B>I<EFBFBD><49>
|
BIN
sounds/vm-msginstruct.gsm
Executable file
BIN
sounds/vm-msginstruct.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-msgsaved.gsm
Executable file
BIN
sounds/vm-msgsaved.gsm
Executable file
Binary file not shown.
1
sounds/vm-no.gsm
Executable file
1
sounds/vm-no.gsm
Executable file
@@ -0,0 +1 @@
|
|||||||
|
<EFBFBD>d<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B6<EFBFBD><EFBFBD><EFBFBD><EFBFBD>q4T<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>
|
BIN
sounds/vm-nomore.gsm
Executable file
BIN
sounds/vm-nomore.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-password.gsm
Executable file
BIN
sounds/vm-password.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-theperson.gsm
Executable file
BIN
sounds/vm-theperson.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-undeleted.gsm
Executable file
BIN
sounds/vm-undeleted.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-youhave.gsm
Executable file
BIN
sounds/vm-youhave.gsm
Executable file
Binary file not shown.
Reference in New Issue
Block a user