Remove many deprecated modules

Billing records are fair,
To get paid is quite bright,
You should really use ODBC;
Good-bye cdr_sqlite.

Microsoft did once push H.323,
Hell, we all remember NetMeeting.
But try to compile chan_h323 now
And you will take quite a beating.

The XMPP and SIP war was fierce,
And in the distant fray
Was birthed res_jabber/chan_jingle;
But neither to stay.

For everyone did care and chase what Google professed.
"Free Internet Calling" was what devotees cried,
But Google did change the specs so often
That the developers were happy the day chan_gtalk died.

And then there was that odd application
Dedicated to the Polish tongue.
app_saycountpl was subsumed by Say;
One could say its bell was rung.

To read and parse a file from the dialplan
You could (I guess) use an application.
app_readfile did fill that purpose, but I think
A function is perhaps better in its creation.

Barging is rude, I'm not sure why we do it.
Inwardly, the caller will probably sigh.
But if you really must do it,
Don't use app_dahdibarge, use ChanSpy.

We all despise the sound of tinny robots
It makes our queues so cold.
To control such an abomination
It's better to not use Wait/SetMusicOnHold.

It's often nice to know properties of a channel
It makes our calls right
We have a nice function called CHANNEL
And so SIPCHANINFO is sent off into the night.

And now things get odd;
Apparently one could delimit with a colon
Properties from the SIPPEER function!
Commas are in; all others are done.

Finally, a word on pipes and commas.
We're sorry. We can't say it enough.
But those compatibility options in asterisk.conf;
To maintain them forever was just too tough.

This patch removes:

* cdr_sqlite
* chan_gtalk
* chan_jingle
* chan_h323
* res_jabber
* app_saycountpl
* app_readfile
* app_dahdibarge

It removes the following applications/functions:

* WaitMusicOnHold
* SetMusicOnHold
* SIPCHANINFO

It removes the colon delimiter from the SIPPEER function.

Finally, it also removes all compatibility options that were configurable from
asterisk.conf, as these all applied to compatibility with Asterisk 1.4 systems.

Review: https://reviewboard.asterisk.org/r/3698/



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418019 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/97/197/1
Matthew Jordan 11 years ago
parent 3bd495a688
commit 97834718c2

@ -12,6 +12,21 @@
--- Functionality changes from Asterisk 12 to Asterisk 13 --------------------
------------------------------------------------------------------------------
app_dahdibarge
------------------
* This module was deprecated and has been removed. Users of app_dahdibarge
should use ChanSpy instead.
app_readfile
------------------
* This module was deprecated and has been removed. Users of app_readfile
should use func_env's FILE function instead.
app_saycountpl
------------------
* This module was deprecated and has been removed. Users of app_saycountpl
should use the Say family of applications.
AMI
------------------
* New DeviceStateChanged and PresenceStateChanged AMI events have been added.
@ -30,6 +45,11 @@ AMI
* New AMI actions PRIDebugSet, PRIDebugFileSet, and PRIDebugFileUnset
enable manager control over PRI debugging levels and file output.
cdr_sqlite
-----------------
* This module was deprecated and has been removed. Users of cdr_sqlite
should use cdr_sqlite3_custom.
CEL
------------------
* The "bridge_technology" extra field key has been added to BRIDGE_ENTER
@ -47,6 +67,30 @@ chan_dahdi
* Added several SS7 config option parameters described in
chan_dahdi.conf.sample.
chan_gtalk
------------------
* This module was deprecated and has been removed. Users of chan_gtalk
should use chan_motif.
chan_h323
------------------
* This module was deprecated and has been removed. Users of chan_h323
should use chan_ooh323.
chan_jingle
------------------
* This module was deprecated and has been removed. Users of chan_jingle
should use chan_motif.
chan_sip
------------------
* The SIPPEER dialplan function no longer supports using a colon as a
delimiter for parameters. The parameters for the function should be
delimited using a comma.
* The SIPCHANINFO dialplan function was deprecated and has been removed. Users
of the function should use the CHANNEL function instead.
Core
------------------
* The TLS core in Asterisk now supports Perfect Forward Secrecy (PFS).
@ -80,6 +124,16 @@ JACK_HOOK
* The JACK_HOOK function now supports audio with a sample rate higher than
8kHz.
MusicOnHold
------------------
* The SetMusicOnHold dialplan application was deprecated and has been removed.
Users of the application should use the CHANNEL function's musicclass
setting instead.
* The WaitMusicOnHold dialplan application was deprecated and has been
removed. Users of the application should use MusicOnHold with a duration
parameter instead.
Say
------------------
* The 'say' family of dialplan applications now support the Japanese

@ -43,6 +43,13 @@ From 12 to 13:
directly. This change also includes a new script, refcounter.py, in the
contrib folder that will process the refs log file.
- The asterisk compatibility options in asterisk.conf have been removed.
These options enabled certain backwards compatibility features for
pbx_realtime, res_agi, and app_set that made their behaviour similar to
Asterisk 1.4. Users who used these backwards compatibility settings should
update their dialplans to use ',' instead of '|' as a delimiter, and should
use the Set dialplan application instead of the MSet dialplan application.
ARI:
- The ARI version has been changed from 1.0.0 to 1.1.0. This is to reflect
the backwards compatible changes listed below.
@ -117,6 +124,9 @@ CDRs:
handler subroutine). In general, this is not the preferred default: this
causes extra CDRs to be generated for a channel in many common dialplans.
- The cdr_sqlite module was deprecated and has been removed. Users of this
module should use the cdr_sqlite3_custom module instead.
chan_dahdi:
- SS7 support now requires libss7 v2.0 or later.
@ -125,6 +135,18 @@ chan_dahdi:
SETUP ACKNOWLEDGE message.
Default is now no.
chan_gtalk
- This module was deprecated and has been removed. Users of chan_gtalk
should use chan_motif.
chan_h323
- This module was deprecated and has been removed. Users of chan_h323
should use chan_ooh323.
chan_jingle
- This module was deprecated and has been removed. Users of chan_jingle
should use chan_motif.
chan_pjsip:
- Added a 'force_avp' option to chan_pjsip which will force the usage of
'RTP/AVP', 'RTP/AVPF', 'RTP/SAVP', or 'RTP/SAVPF' as the media transport type
@ -139,6 +161,13 @@ chan_sip:
- Made set SIPREFERREDBYHDR as inheritable for better chan_pjsip
interoperability.
- The SIPPEER dialplan function no longer supports using a colon as a
delimiter for parameters. The parameters for the function should be
delimited using a comma.
- The SIPCHANINFO dialplan function was deprecated and has been removed. Users
of the function should use the CHANNEL function instead.
- Added a 'force_avp' option for chan_sip. When enabled this option will
cause the media transport in the offer or answer SDP to be 'RTP/AVP',
'RTP/AVPF', 'RTP/SAVP', or 'RTP/SAVPF' even if a DTLS stream has been
@ -195,6 +224,15 @@ HTTP:
keep alive time between HTTP requests is configured in http.conf with the
session_keep_alive parameter.
MusicOnHold
- The SetMusicOnHold dialplan application was deprecated and has been removed.
Users of the application should use the CHANNEL function's musicclass
setting instead.
- The WaitMusicOnHold dialplan application was deprecated and has been
removed. Users of the application should use MusicOnHold with a duration
parameter instead.
ODBC:
- The compatibility setting, allow_empty_string_in_nontext, has been removed.
Empty column values will be stored as empty strings during realtime updates.
@ -241,6 +279,10 @@ Realtime Configuration:
- A new set of Alembic scripts has been added for CDR tables. This will create
a 'cdr' table with the default schema that Asterisk expects.
res_jabber:
- This module was deprecated and has been removed. Users of this module should
use res_xmpp instead.
safe_asterisk:
- The safe_asterisk script was previously not installed on top of an existing
version. This caused bug-fixes in that script not to be deployed. If your
@ -270,6 +312,5 @@ WebSockets:
In such cases, it may be necessary to adjust this value.
Default is 100 ms.
===========================================================
===========================================================

@ -27,7 +27,6 @@ H323OBJS:=ooCmdChannel.o ooLogChan.o ooUtils.o ooGkClient.o context.o \
H323CFLAGS:=-Iooh323c/src -Iooh323c/src/h323
ALL_C_MODS:=app_mysql \
app_saycountpl \
cdr_mysql \
chan_mobile \
chan_ooh323 \

@ -1,138 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2004, Andy Powell & TAAN Softworks Corp.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*!
* \file
* \brief Say Polish counting words
* \author Andy Powell
*/
/*** MODULEINFO
<defaultenabled>no</defaultenabled>
<support_level>deprecated</support_level>
<replacement>say.conf</replacement>
***/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
/*** DOCUMENTATION
<application name="SayCountPL" language="en_US">
<synopsis>
Say Polish counting words.
</synopsis>
<syntax>
<parameter name="word1" required="true" />
<parameter name="word2" required="true" />
<parameter name="word5" required="true" />
<parameter name="number" required="true" />
</syntax>
<description>
<para>Polish grammar has some funny rules for counting words. for example 1 zloty,
2 zlote, 5 zlotych. This application will take the words for 1, 2-4 and 5 and
decide based on grammar rules which one to use with the number you pass to it.</para>
<para>Example: SayCountPL(zloty,zlote,zlotych,122) will give: zlote</para>
</description>
</application>
***/
static const char app[] = "SayCountPL";
static int saywords(struct ast_channel *chan, char *word1, char *word2, char *word5, int num)
{
/* Put this in a separate proc because it's bound to change */
int d = 0;
if (num > 0) {
if (num % 1000 == 1) {
ast_streamfile(chan, word1, ast_channel_language(chan));
d = ast_waitstream(chan,"");
} else if (((num % 10) >= 2) && ((num % 10) <= 4 ) && ((num % 100) < 10 || (num % 100) > 20)) {
ast_streamfile(chan, word2, ast_channel_language(chan));
d = ast_waitstream(chan, "");
} else {
ast_streamfile(chan, word5, ast_channel_language(chan));
d = ast_waitstream(chan, "");
}
}
return d;
}
static int sayword_exec(struct ast_channel *chan, const char *data)
{
int res = 0;
char *s;
int inum;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(word1);
AST_APP_ARG(word2);
AST_APP_ARG(word5);
AST_APP_ARG(num);
);
if (!data) {
ast_log(LOG_WARNING, "SayCountPL requires 4 arguments: word-1,word-2,word-5,number\n");
return -1;
}
s = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, s);
/* Check to see if params passed */
if (!args.word1 || !args.word2 || !args.word5 || !args.num) {
ast_log(LOG_WARNING, "SayCountPL requires 4 arguments: word-1,word-2,word-3,number\n");
return -1;
}
if (sscanf(args.num, "%30d", &inum) != 1) {
ast_log(LOG_WARNING, "'%s' is not a valid number\n", args.num);
return -1;
}
/* do the saying part (after a bit of maths) */
res = saywords(chan, args.word1, args.word2, args.word5, inum);
return res;
}
static int unload_module(void)
{
return ast_unregister_application(app);
}
static int load_module(void)
{
int res;
res = ast_register_application_xml(app, sayword_exec);
return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Say polish counting words");

@ -1,311 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2005, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
*
* Special thanks to comphealth.com for sponsoring this
* GPL application.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief DAHDI Barge support
*
* \author Mark Spencer <markster@digium.com>
*
* \note Special thanks to comphealth.com for sponsoring this
* GPL application.
*
* \ingroup applications
*/
/*** MODULEINFO
<depend>dahdi</depend>
<defaultenabled>no</defaultenabled>
<support_level>deprecated</support_level>
<replacement>app_chanspy</replacement>
***/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <dahdi/user.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/app.h"
#include "asterisk/cli.h"
#include "asterisk/say.h"
#include "asterisk/utils.h"
/*** DOCUMENTATION
<application name="DAHDIBarge" language="en_US">
<synopsis>
Barge in (monitor) DAHDI channel.
</synopsis>
<syntax>
<parameter name="channel">
<para>Channel to barge.</para>
</parameter>
</syntax>
<description>
<para>Barges in on a specified DAHDI <replaceable>channel</replaceable> or prompts
if one is not specified. Returns <literal>-1</literal> when caller user hangs
up and is independent of the state of the channel being monitored.
</para>
</description>
</application>
***/
static const char app[] = "DAHDIBarge";
#define CONF_SIZE 160
static int careful_write(int fd, unsigned char *data, int len)
{
int res;
while(len) {
res = write(fd, data, len);
if (res < 1) {
if (errno != EAGAIN) {
ast_log(LOG_WARNING, "Failed to write audio data to conference: %s\n", strerror(errno));
return -1;
} else
return 0;
}
len -= res;
data += res;
}
return 0;
}
static int conf_run(struct ast_channel *chan, int confno, int confflags)
{
int fd;
struct dahdi_confinfo dahdic;
struct ast_frame *f;
struct ast_channel *c;
struct ast_frame fr;
int outfd;
int ms;
int nfds;
int res;
int flags;
int retrydahdi;
int origfd;
int ret = -1;
struct dahdi_bufferinfo bi;
char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
char *buf = __buf + AST_FRIENDLY_OFFSET;
/* Set it into U-law mode (write) */
if (ast_set_write_format_by_id(chan, AST_FORMAT_ULAW) < 0) {
ast_log(LOG_WARNING, "Unable to set '%s' to write ulaw mode\n", ast_channel_name(chan));
goto outrun;
}
/* Set it into U-law mode (read) */
if (ast_set_read_format_by_id(chan, AST_FORMAT_ULAW) < 0) {
ast_log(LOG_WARNING, "Unable to set '%s' to read ulaw mode\n", ast_channel_name(chan));
goto outrun;
}
ast_indicate(chan, -1);
retrydahdi = strcasecmp(ast_channel_tech(chan)->type, "DAHDI");
dahdiretry:
origfd = ast_channel_fd(chan, 0);
if (retrydahdi) {
fd = open("/dev/dahdi/pseudo", O_RDWR);
if (fd < 0) {
ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
goto outrun;
}
/* Make non-blocking */
flags = fcntl(fd, F_GETFL);
if (flags < 0) {
ast_log(LOG_WARNING, "Unable to get flags: %s\n", strerror(errno));
close(fd);
goto outrun;
}
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) {
ast_log(LOG_WARNING, "Unable to set flags: %s\n", strerror(errno));
close(fd);
goto outrun;
}
/* Setup buffering information */
memset(&bi, 0, sizeof(bi));
bi.bufsize = CONF_SIZE;
bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
bi.numbufs = 4;
if (ioctl(fd, DAHDI_SET_BUFINFO, &bi)) {
ast_log(LOG_WARNING, "Unable to set buffering information: %s\n", strerror(errno));
close(fd);
goto outrun;
}
nfds = 1;
} else {
/* XXX Make sure we're not running on a pseudo channel XXX */
fd = ast_channel_fd(chan, 0);
nfds = 0;
}
memset(&dahdic, 0, sizeof(dahdic));
/* Check to see if we're in a conference... */
dahdic.chan = 0;
if (ioctl(fd, DAHDI_GETCONF, &dahdic)) {
ast_log(LOG_WARNING, "Error getting conference\n");
close(fd);
goto outrun;
}
if (dahdic.confmode) {
/* Whoa, already in a conference... Retry... */
if (!retrydahdi) {
ast_debug(1, "DAHDI channel is in a conference already, retrying with pseudo\n");
retrydahdi = 1;
goto dahdiretry;
}
}
memset(&dahdic, 0, sizeof(dahdic));
/* Add us to the conference */
dahdic.chan = 0;
dahdic.confno = confno;
dahdic.confmode = DAHDI_CONF_MONITORBOTH;
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
ast_log(LOG_WARNING, "Error setting conference\n");
close(fd);
goto outrun;
}
ast_debug(1, "Placed channel %s in DAHDI channel %d monitor\n", ast_channel_name(chan), confno);
for(;;) {
outfd = -1;
ms = -1;
c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
if (c) {
if (ast_channel_fd(c, 0) != origfd) {
if (retrydahdi) {
/* Kill old pseudo */
close(fd);
}
ast_debug(1, "Ooh, something swapped out under us, starting over\n");
retrydahdi = 0;
goto dahdiretry;
}
f = ast_read(c);
if (!f)
break;
if ((f->frametype == AST_FRAME_DTMF) && (f->subclass.integer == '#')) {
ret = 0;
ast_frfree(f);
break;
} else if (fd != ast_channel_fd(chan, 0)) {
if (f->frametype == AST_FRAME_VOICE) {
if (f->subclass.format.id == AST_FORMAT_ULAW) {
/* Carefully write */
careful_write(fd, f->data.ptr, f->datalen);
} else
ast_log(LOG_WARNING, "Huh? Got a non-ulaw (%s) frame in the conference\n", ast_getformatname(&f->subclass.format));
}
}
ast_frfree(f);
} else if (outfd > -1) {
res = read(outfd, buf, CONF_SIZE);
if (res > 0) {
memset(&fr, 0, sizeof(fr));
fr.frametype = AST_FRAME_VOICE;
ast_format_set(&fr.subclass.format, AST_FORMAT_ULAW, 0);
fr.datalen = res;
fr.samples = res;
fr.data.ptr = buf;
fr.offset = AST_FRIENDLY_OFFSET;
if (ast_write(chan, &fr) < 0) {
ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
/* break; */
}
} else
ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
}
}
if (fd != ast_channel_fd(chan, 0))
close(fd);
else {
/* Take out of conference */
/* Add us to the conference */
dahdic.chan = 0;
dahdic.confno = 0;
dahdic.confmode = 0;
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
ast_log(LOG_WARNING, "Error setting conference\n");
}
}
outrun:
return ret;
}
static int conf_exec(struct ast_channel *chan, const char *data)
{
int res = -1;
int retrycnt = 0;
int confflags = 0;
int confno = 0;
char confnostr[80] = "";
if (!ast_strlen_zero(data)) {
if ((sscanf(data, "DAHDI/%30d", &confno) != 1) &&
(sscanf(data, "%30d", &confno) != 1)) {
ast_log(LOG_WARNING, "DAHDIBarge Argument (if specified) must be a channel number, not '%s'\n", (char *)data);
return 0;
}
}
if (ast_channel_state(chan) != AST_STATE_UP)
ast_answer(chan);
while(!confno && (++retrycnt < 4)) {
/* Prompt user for conference number */
confnostr[0] = '\0';
res = ast_app_getdata(chan, "conf-getchannel",confnostr, sizeof(confnostr) - 1, 0);
if (res <0) goto out;
if (sscanf(confnostr, "%30d", &confno) != 1)
confno = 0;
}
if (confno) {
/* XXX Should prompt user for pin if pin is required XXX */
/* Run the conference */
res = conf_run(chan, confno, confflags);
}
out:
/* Do the conference */
return res;
}
static int unload_module(void)
{
return ast_unregister_application(app);
}
static int load_module(void)
{
return ((ast_register_application_xml(app, conf_exec)) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS);
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Barge in on DAHDI channel application");

@ -1,134 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2005, Digium, Inc.
*
* Matt O'Gorman <mogorman@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief ReadFile application -- Reads in a File for you.
*
* \author Matt O'Gorman <mogorman@digium.com>
*
* \ingroup applications
*/
/*** MODULEINFO
<defaultenabled>no</defaultenabled>
<support_level>deprecated</support_level>
<replacement>func_env (FILE())</replacement>
***/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/module.h"
/*** DOCUMENTATION
<application name="ReadFile" language="en_US">
<synopsis>
Read the contents of a text file into a channel variable.
</synopsis>
<syntax argsep="=">
<parameter name="varname" required="true">
<para>Result stored here.</para>
</parameter>
<parameter name="fileparams" required="true">
<argument name="file" required="true">
<para>The name of the file to read.</para>
</argument>
<argument name="length" required="false">
<para>Maximum number of characters to capture.</para>
<para>If not specified defaults to max.</para>
</argument>
</parameter>
</syntax>
<description>
<para>Read the contents of a text file into channel variable <replaceable>varname</replaceable></para>
<warning><para>ReadFile has been deprecated in favor of Set(varname=${FILE(file,0,length)})</para></warning>
</description>
<see-also>
<ref type="application">System</ref>
<ref type="application">Read</ref>
</see-also>
</application>
***/
static char *app_readfile = "ReadFile";
static int readfile_exec(struct ast_channel *chan, const char *data)
{
int res=0;
char *s, *varname=NULL, *file=NULL, *length=NULL, *returnvar=NULL;
int len=0;
static int deprecation_warning = 0;
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "ReadFile require an argument!\n");
return -1;
}
s = ast_strdupa(data);
varname = strsep(&s, "=");
file = strsep(&s, ",");
length = s;
if (deprecation_warning++ % 10 == 0)
ast_log(LOG_WARNING, "ReadFile has been deprecated in favor of Set(%s=${FILE(%s,0,%s)})\n", varname, file, length);
if (!varname || !file) {
ast_log(LOG_ERROR, "No file or variable specified!\n");
return -1;
}
if (length) {
if ((sscanf(length, "%30d", &len) != 1) || (len < 0)) {
ast_log(LOG_WARNING, "%s is not a positive number, defaulting length to max\n", length);
len = 0;
}
}
if ((returnvar = ast_read_textfile(file))) {
if (len > 0) {
if (len < strlen(returnvar))
returnvar[len]='\0';
else
ast_log(LOG_WARNING, "%s is longer than %d, and %d \n", file, len, (int)strlen(returnvar));
}
pbx_builtin_setvar_helper(chan, varname, returnvar);
ast_free(returnvar);
}
return res;
}
static int unload_module(void)
{
return ast_unregister_application(app_readfile);
}
static int load_module(void)
{
return ast_register_application_xml(app_readfile, readfile_exec);
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Stores output of file into a variable");

@ -15,40 +15,6 @@ MODULE_PREFIX=chan
MENUSELECT_CATEGORY=CHANNELS
MENUSELECT_DESCRIPTION=Channel Drivers
ifeq ($(OSARCH),OpenBSD)
PTLIB=-lpt
H323LIB=-lh323
endif
ifeq ($(OSARCH),linux-gnu)
PTLIB=-lpt_linux_x86_r
H323LIB=-lh323_linux_x86_r
CHANH323LIB=-ldl
endif
ifeq ($(OSARCH),FreeBSD)
PTLIB=-lpt_FreeBSD_x86_r
H323LIB=-lh323_FreeBSD_x86_r
CHANH323LIB=-pthread
endif
ifeq ($(OSARCH),NetBSD)
PTLIB=-lpt_NetBSD_x86_r
H323LIB=-lh323_NetBSD_x86_r
endif
ifeq ($(wildcard h323/libchanh323.a),)
MODULE_EXCLUDE += chan_h323
endif
ifndef OPENH323DIR
OPENH323DIR=$(HOME)/openh323
endif
ifndef PWLIBDIR
PWLIBDIR=$(HOME)/pwlib
endif
all: _all
include $(ASTTOPDIR)/Makefile.moddir_rules
@ -57,20 +23,12 @@ ifneq ($(findstring $(OSARCH), mingw32 cygwin ),)
LIBS+= -lres_monitor.so -lres_features.so
endif
ifneq ($(wildcard h323/Makefile.ast),)
include h323/Makefile.ast
endif
clean::
$(MAKE) -C misdn clean
rm -f dahdi/*.o dahdi/*.i
rm -f sip/*.o sip/*.i
rm -f iax2/*.o iax2/*.i
rm -f pjsip/*.o pjsip/*.i
rm -f h323/libchanh323.a h323/Makefile.ast h323/*.o h323/*.dep
dist-clean::
rm -f h323/Makefile
$(if $(filter chan_iax2,$(EMBEDDED_MODS)),modules.link,chan_iax2.so): $(subst .c,.o,$(wildcard iax2/*.c))
$(subst .c,.o,$(wildcard iax2/*.c)): _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_iax2)
@ -91,20 +49,6 @@ CHAN_DAHDI_OBJS= \
$(if $(filter chan_dahdi,$(EMBEDDED_MODS)),modules.link,chan_dahdi.so): $(CHAN_DAHDI_OBJS)
$(CHAN_DAHDI_OBJS): _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_dahdi)
ifneq ($(filter chan_h323,$(EMBEDDED_MODS)),)
modules.link: h323/libchanh323.a
else
ifeq ($(OSARCH),linux-gnu)
chan_h323.so: chan_h323.o h323/libchanh323.a
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
$(CMD_PREFIX) $(CXX) $(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(ASTLDFLAGS) $(SOLINK) -o $@ $< h323/libchanh323.a $(H323LDLIBS)
else
chan_h323.so: chan_h323.o h323/libchanh323.a
$(ECHO_PREFIX) echo " [LD] $^ -> $@"
$(CMD_PREFIX) $(CXX) $(PTHREAD_CFLAGS) $(_ASTLDFLAGS) $(ASTLDFLAGS) $(SOLINK) -o $@ $< h323/libchanh323.a $(CHANH323LIB) -L$(PWLIBDIR)/lib $(PTLIB) -L$(OPENH323DIR)/lib $(H323LIB) -L/usr/lib -lcrypto -lssl -lexpat
endif
endif
chan_misdn.o: _ASTCFLAGS+=-Imisdn
misdn_config.o: _ASTCFLAGS+=-Imisdn
@ -122,9 +66,3 @@ chan_usbradio.o: ./xpmr/xpmr.c ./xpmr/xpmr.h ./xpmr/xpmr_coef.h
chan_usbradio.so: LIBS+=-lusb -lasound
chan_usbradio.so: _ASTCFLAGS+=-DNDEBUG
h323/Makefile.ast:
$(CMD_PREFIX) $(MAKE) -C h323 Makefile.ast
h323/libchanh323.a: h323/Makefile.ast
$(CMD_PREFIX) $(MAKE) -C h323 libchanh323.a

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -111,7 +111,7 @@
* \todo Fix TCP/TLS handling in dialplan, SRV records, transfers and much more
* \todo Save TCP/TLS sessions in registry
* If someone registers a SIPS uri, this forces us to set up a TLS connection back.
* \todo Add TCP/TLS information to function SIPPEER and SIPCHANINFO
* \todo Add TCP/TLS information to function SIPPEER and CHANNEL function
* \todo If tcpenable=yes, we must open a TCP socket on the same address as the IP for UDP.
* The tcpbindaddr config option should only be used to open ADDITIONAL ports
* So we should propably go back to
@ -463,40 +463,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
</syntax>
<description></description>
</function>
<function name="SIPCHANINFO" language="en_US">
<synopsis>
Gets the specified SIP parameter from the current channel.
</synopsis>
<syntax>
<parameter name="item" required="true">
<enumlist>
<enum name="peerip">
<para>The IP address of the peer.</para>
</enum>
<enum name="recvip">
<para>The source IP address of the peer.</para>
</enum>
<enum name="from">
<para>The SIP URI from the <literal>From:</literal> header.</para>
</enum>
<enum name="uri">
<para>The SIP URI from the <literal>Contact:</literal> header.</para>
</enum>
<enum name="useragent">
<para>The Useragent header used by the peer.</para>
</enum>
<enum name="peername">
<para>The name of the peer.</para>
</enum>
<enum name="t38passthrough">
<para><literal>1</literal> if T38 is offered or enabled in this channel,
otherwise <literal>0</literal>.</para>
</enum>
</enumlist>
</parameter>
</syntax>
<description></description>
</function>
<function name="CHECKSIPDOMAIN" language="en_US">
<synopsis>
Checks if domain is a local domain.
@ -22390,15 +22356,11 @@ static int function_sippeer(struct ast_channel *chan, const char *cmd, char *dat
struct sip_peer *peer;
char *colname;
if ((colname = strchr(data, ':'))) { /*! \todo Will be deprecated after 1.4 */
static int deprecation_warning = 0;
*colname++ = '\0';
if (deprecation_warning++ % 10 == 0)
ast_log(LOG_WARNING, "SIPPEER(): usage of ':' to separate arguments is deprecated. Please use ',' instead.\n");
} else if ((colname = strchr(data, ',')))
if ((colname = strchr(data, ','))) {
*colname++ = '\0';
else
} else {
colname = "ip";
}
if (!(peer = sip_find_peer(data, NULL, TRUE, FINDPEERS, FALSE, 0)))
return -1;
@ -22495,77 +22457,6 @@ static struct ast_custom_function sippeer_function = {
.read = function_sippeer,
};
/*! \brief ${SIPCHANINFO()} Dialplan function - reads sip channel data */
static int function_sipchaninfo_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
struct sip_pvt *p;
static int deprecated = 0;
*buf = 0;
if (!chan) {
ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
return -1;
}
if (!data) {
ast_log(LOG_WARNING, "This function requires a parameter name.\n");
return -1;
}
ast_channel_lock(chan);
if (!IS_SIP_TECH(ast_channel_tech(chan))) {
ast_log(LOG_WARNING, "This function can only be used on SIP channels.\n");
ast_channel_unlock(chan);
return -1;
}
if (deprecated++ % 20 == 0) {
/* Deprecated in 1.6.1 */
ast_log(LOG_WARNING, "SIPCHANINFO() is deprecated. Please transition to using CHANNEL().\n");
}
p = ast_channel_tech_pvt(chan);
/* If there is no private structure, this channel is no longer alive */
if (!p) {
ast_channel_unlock(chan);
return -1;
}
if (!strcasecmp(data, "peerip")) {
ast_copy_string(buf, ast_sockaddr_stringify_addr(&p->sa), len);
} else if (!strcasecmp(data, "recvip")) {
ast_copy_string(buf, ast_sockaddr_stringify_addr(&p->recv), len);
} else if (!strcasecmp(data, "from")) {
ast_copy_string(buf, p->from, len);
} else if (!strcasecmp(data, "uri")) {
ast_copy_string(buf, p->uri, len);
} else if (!strcasecmp(data, "useragent")) {
ast_copy_string(buf, p->useragent, len);
} else if (!strcasecmp(data, "peername")) {
ast_copy_string(buf, p->peername, len);
} else if (!strcasecmp(data, "t38passthrough")) {
if ((p->t38.state == T38_DISABLED) || (p->t38.state == T38_REJECTED)) {
ast_copy_string(buf, "0", len);
} else { /* T38 is offered or enabled in this call */
ast_copy_string(buf, "1", len);
}
} else {
ast_channel_unlock(chan);
return -1;
}
ast_channel_unlock(chan);
return 0;
}
/*! \brief Structure to declare a dialplan function: SIPCHANINFO */
static struct ast_custom_function sipchaninfo_function = {
.name = "SIPCHANINFO",
.read = function_sipchaninfo_read,
};
/*! \brief update redirecting information for a channel based on headers
*
*/
@ -34425,7 +34316,6 @@ static int load_module(void)
/* Register dialplan functions */
ast_custom_function_register(&sip_header_function);
ast_custom_function_register(&sippeer_function);
ast_custom_function_register(&sipchaninfo_function);
ast_custom_function_register(&checksipdomain_function);
/* Register manager commands */
@ -34518,7 +34408,6 @@ static int unload_module(void)
ast_msg_tech_unregister(&sip_msg_tech);
/* Unregister dial plan functions */
ast_custom_function_unregister(&sipchaninfo_function);
ast_custom_function_unregister(&sippeer_function);
ast_custom_function_unregister(&sip_header_function);
ast_custom_function_unregister(&checksipdomain_function);

@ -1,43 +0,0 @@
Build
-- Hold lock when creating new H.323 channel to sync the audio channels
-- Decrement usage counter when appropriate
-- Actually unregister everything in unload_module
-- Add IP based authentication using 'host'in type=user's
0.1.0
-- Intergration into the mainline Asterisk codebase
-- Remove reduandant debug info
-- Add Caller*id support
-- Inband DTMF
-- Retool port usage (to avoid possible seg fault condition)
0.0.6
-- Configurable support for user-input (DTMF)
-- Reworked Gatekeeper support
-- Native bridging (but is still broken, help!)
-- Locally implement a non-broken G.723.1 Capability
-- Utilize the cleaner RTP method implemented by Mark
-- AllowGkRouted, thanks to Panny from http://hotlinks.co.uk
-- Clened up inbound call flow
-- Prefix, E.164 and Gateway support
-- Multi-homed support
-- Killed more seg's
0.0.5
-- Added H.323 Alias support
-- Clened up inbound call flow
-- Fixed RTP port logic
-- Stomped on possible seg fault conditions thanks to Iain Stevenson
0.0.4
-- Fixed one-way audio on inbound calls. Found
race condition in monitor thread.
0.0.3
-- Changed name to chan_h323
-- Also renamed file names to futher avoid confusion
0.0.2
-- First public offering
-- removed most hardcoded values
-- lots of changes to alias/exension operation
0.0.1
-- initial build, lots of hardcoded crap
-- Proof of concept for External RTP

@ -1,18 +0,0 @@
To build Open H.323 see:
http://www.openh323.org/build.html#unix
You only need to do 'make opt'. Anything else you will be simply waisting time and HD space.
Also, you will notice they never tell you to 'make install' so don't do it.
On FreeBSD, the Makefiles are configured to
locate the compiled openh323 port, if it has
been built. Here is one way to build
openh323 and ptlib on such that the Makefiles
find it:
# cd /usr/ports/net/openh323
# make
It is not necessary to install the port. The
asterisk makefiles do not use any files
installed by the port.

@ -1,53 +0,0 @@
#
# Makefile
#
# Make file for OpenH323 support layer
#
.PHONY: Makefile.ast clean
default:: @OPENH323_BUILD@
# Verify those options with main Makefile
STDCCFLAGS = -DNDEBUG
STDCCFLAGS += -I../../include -include ../../include/asterisk/autoconfig.h
STDCCFLAGS += -fPIC
#OPTCCFLAGS +=
CFLAGS = -pipe
TARGET = libchanh323.a
TARGET += Makefile.ast
SOURCES = ast_h323.cxx compat_h323.cxx cisco-h225.cxx caps_h323.cxx
OBJDIR = .
OBJS =
ifndef OPENH323DIR
OPENH323DIR=@OPENH323DIR@
endif
ifneq ($(wildcard $(OPENH323DIR)/openh323u.mak),)
include $(OPENH323DIR)/openh323u.mak
endif
notrace::
$(MAKE) NOTRACE=1 opt
$(SOURCES):: Makefile ../../Makefile
touch $@
libchanh323.a: $(OBJS)
ar crv $@ $(OBJS)
#
# We have this file in svn, so this is commented out to ensure it doesn't try
# to run implicitly. However, it's still here for reference.
#
#cisco-h225.cxx:: cisco-h225.asn
# asnparser -m CISCO_H225 -c $<
Makefile.ast:
@echo H323CFLAGS = $(STDCCFLAGS) $(OPTCCFLAGS) $(CFLAGS) >$@.tmp
@echo H323LDFLAGS = $(CFLAGS) $(LDFLAGS) >>$@.tmp
@echo H323LDLIBS = $(LDLIBS) $(ENDLDLIBS) $(ENDLDFLAGS) >>$@.tmp
@if [ -r $@ ] && cmp -s $@ $@.tmp; then rm -f $@.tmp; else mv -f $@.tmp $@; fi
clean::

@ -1,144 +0,0 @@
Open H.323 Channel Driver for Asterisk
By Jeremy McNamara
For The NuFone Network
First public release on November 10th, 2002
Dependancies (based on OpenH323/PWLib ones):
openssl-0.9.6b+
openssl-devel-0.9.6b+
expat-1.95+
expat-dev-1.95+
Tested with Open H.323 version v1.18.0, PWLib v1.10.0 and GCC v3.2.2. Usage of any
other (especially prior OpenH323 v1.17.3 and PWLib v1.9.2) versions is not
supported.
NOTICE: Whatever you do, DO NOT USE distrubution specific installs
of Open H.323 and PWLib. In fact, you should check to make sure
your distro did not install them for you without your knowledge.
To compile this code
--------------------
Once PWLib and Open H.323 have been compiled per their specific build
instructions, issue a make in the asterisk/channels/h323 directory with
argument used to build PWLib and OpenH323 (for example, make opt), then go
back to the Asterisk source top level directory and issue a make install.
The most common compile error
----------------------------
If you receive ANYTHING that says 'undefined symbol' you are experiencing
typical version skew. For example:
libh323_linux_x86_r.so.1: undefined symbol: GetNumberValueAt__C14PAbstractArrayi
You need to search and destroy every version of libh323 and libpt then
completely recompile everything
Example commands to make sure everything gets cleaned and then
rebult in proper order:
cd /path/to/pwlib
./configure
make clean opt
cd /path/to/openh323
./configure
make clean opt
cd /path/to/asterisk/channels/h323
make opt
cd /path/to/asterisk
make install
Most common run-time error
-------------------------
libpt_linux_x86_r.so.1: cannot open shared object file: No such
file or directory
You have not set the LD_LIBRARY_PATH environment variable.
Example environment for sh/bash:
PWLIBDIR=$HOME/pwlib
export PWLIBDIR
OPENH323DIR=$HOME/openh323
export OPENH323DIR
LD_LIBRARY_PATH=$PWLIBDIR/lib:$OPENH323DIR/lib
export LD_LIBRARY_PATH
We recomend puting the above directives into your /etc/profile so
you do not have to remember to export those values every time you
want to recompile. Make sure to logout and log back in, so your
envrionment can pick up the new variables.
Upgrading Asterisk
-----------------
After you svn update (or make update) Asterisk you have to go into
asterisk/channels/h323 and issue a make clean all, before compiling the
rest of asterisk. Doing this process every time you upgrade Asterisk
will ensure a sane build.
Dialing an H.323 channel
------------------------
Without a gatekeeper:
exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN}@peer
or
exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN}@ip.or.hostname
'peer' is defined in h323.conf as:
[peer]
type=peer
host=1.2.3.4
disallow=all
allow=ulaw
Using a gatekeeper:
exten => _1NXXNXXXXXX,1,Dial,H323/${EXTEN}
When using a gatekeeper you cannot utilize the type=peer features,
since the H.323 spec states that when a Gatekeeper is part of an H.323 network,
the Gatekeeper shall be used for all communication.
Developer Contact
----------------
If you have trouble contact 'JerJer' in #Asterisk on
irc.freenode.net and/or send reasonable debug information to support@nufone.net.
If are lucky enough to segfault this code please run a
backtrace and send the gory details. Segmentation faults are not
tolerated, no matter what Distro you run (even debian)!
a simple bt example:
# /usr/sbin/asterisk -vvvgc
...
[chan_h323.so]
Segmentation Fault (core dumped)
# ls core.*
core.1976
# gdb /usr/sbin/asterisk core.1976
...lots of useless garbage here...
(gdb) bt
Send whatever shows up right after the 'bt'
Also, a full debug screen output is almost needed. Make sure you are
in the full console mode (-c) and turn on 'h.323 debug' or worst case
senerio 'h.323 trace 4'. A nice way to capture debug info is with
script (man script).
If you are motivated to update/fix this code please submit a
disclaimer along with the patch to the Asterisk bug
tracker: https://issues.asterisk.org/
Jeremy McNamara
The NuFone Network

@ -1,9 +0,0 @@
The NuFone Network's Open H.323 Channel Driver for Asterisk
TODO:
- H.323 Native Bridging
- Gatekeeping support (started)
- Acutally implement the options for broken H.323 stacks

File diff suppressed because it is too large Load Diff

@ -1,187 +0,0 @@
/*
* ast_h323.h
*
* OpenH323 Channel Driver for ASTERISK PBX.
* By Jeremy McNamara
* For The NuFone Network
*
* This code has been derived from code created by
* Michael Manousos and Mark Spencer
*
* This file is part of the chan_h323 driver for Asterisk
*
* chan_h323 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* chan_h323 is distributed WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Version Info: $Id$
*/
#ifndef AST_H323_H
#define AST_H323_H
#include "ast_ptlib.h"
#define VERSION(a,b,c) ((a)*10000+(b)*100+(c))
class MyH323EndPoint : public H323EndPoint
{
PCLASSINFO(MyH323EndPoint, H323EndPoint);
public:
MyH323EndPoint();
int MyMakeCall(const PString &, PString &, void *_callReference, void *_opts);
PBoolean ClearCall(const PString &, H323Connection::CallEndReason reason);
PBoolean ClearCall(const PString &);
void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
void OnConnectionEstablished(H323Connection &, const PString &);
void OnConnectionCleared(H323Connection &, const PString &);
virtual H323Connection * CreateConnection(unsigned, void *, H323Transport *, H323SignalPDU *);
void SendUserTone(const PString &, char);
PBoolean OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
PBoolean ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
void SetEndpointTypeInfo( H225_EndpointType & info ) const;
void SetGateway(void);
PStringArray SupportedPrefixes;
};
class MyH323Connection : public H323Connection
{
PCLASSINFO(MyH323Connection, H323Connection);
public:
MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
~MyH323Connection();
H323Channel * CreateRealTimeLogicalChannel(const H323Capability &,
H323Channel::Directions,
unsigned,
const H245_H2250LogicalChannelParameters *,
RTP_QOS *);
H323Connection::AnswerCallResponse OnAnswerCall(const PString &,
const H323SignalPDU &,
H323SignalPDU &);
void OnReceivedReleaseComplete(const H323SignalPDU &);
PBoolean OnAlerting(const H323SignalPDU &, const PString &);
PBoolean OnSendReleaseComplete(H323SignalPDU &);
PBoolean OnReceivedSignalSetup(const H323SignalPDU &);
PBoolean OnReceivedFacility(const H323SignalPDU &);
PBoolean OnSendSignalSetup(H323SignalPDU &);
PBoolean OnStartLogicalChannel(H323Channel &);
PBoolean OnClosingLogicalChannel(H323Channel &);
virtual void SendUserInputTone(char tone, unsigned duration = 0, unsigned logicalChannel = 0, unsigned rtpTimestamp = 0);
virtual void OnUserInputTone(char, unsigned, unsigned, unsigned);
virtual void OnUserInputString(const PString &value);
PBoolean OnReceivedProgress(const H323SignalPDU &);
PBoolean MySendProgress();
void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
void OnSetLocalCapabilities();
void SetCapabilities(int, int, void *, int);
PBoolean OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
H245_TerminalCapabilitySetReject &);
void SetCause(int _cause) { cause = _cause; };
virtual PBoolean StartControlChannel(const H225_TransportAddress & h245Address);
void SetCallOptions(void *opts, PBoolean isIncoming);
void SetCallDetails(void *callDetails, const H323SignalPDU &setupPDU, PBoolean isIncoming);
virtual H323Connection::CallEndReason SendSignalSetup(const PString&, const H323TransportAddress&);
#ifdef TUNNELLING
virtual PBoolean HandleSignalPDU(H323SignalPDU &pdu);
PBoolean EmbedTunneledInfo(H323SignalPDU &pdu);
#endif
#ifdef H323_H450
virtual void OnReceivedLocalCallHold(int linkedId);
virtual void OnReceivedLocalCallRetrieve(int linkedId);
#endif
void MyHoldCall(BOOL localHold);
PString sourceAliases;
PString destAliases;
PString sourceE164;
PString destE164;
int cid_presentation;
int cid_ton;
PString rdnis;
int redirect_reason;
int transfer_capability;
WORD sessionId;
PBoolean bridging;
#ifdef TUNNELLING
int remoteTunnelOptions;
int tunnelOptions;
#endif
unsigned holdHandling;
unsigned progressSetup;
unsigned progressAlert;
int cause;
RTP_DataFrame::PayloadTypes dtmfCodec[2];
int dtmfMode;
};
class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
{
PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
public:
MyH323_ExternalRTPChannel(
MyH323Connection & connection,
const H323Capability & capability,
Directions direction,
unsigned sessionID);
~MyH323_ExternalRTPChannel();
/* Overrides */
PBoolean Start(void);
PBoolean OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
protected:
BYTE payloadCode;
PIPSocket::Address localIpAddr;
PIPSocket::Address remoteIpAddr;
/* Additional functions in order to have chan_h323 compile with H323Plus */
#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
BOOL OnReceivedAltPDU(const H245_ArrayOf_GenericInformation & alternate );
BOOL OnSendingAltPDU(H245_ArrayOf_GenericInformation & alternate) const;
void OnSendOpenAckAlt(H245_ArrayOf_GenericInformation & alternate) const;
BOOL OnReceivedAckAltPDU(const H245_ArrayOf_GenericInformation & alternate);
#endif
WORD localPort;
WORD remotePort;
};
#ifdef H323_H450
#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
#include <h450/h450pdu.h>
#else
#include <h450pdu.h>
#endif
class MyH4504Handler : public H4504Handler
{
PCLASSINFO(MyH4504Handler, H4504Handler);
public:
MyH4504Handler(MyH323Connection &_conn, H450xDispatcher &_disp);
virtual void OnReceivedLocalCallHold(int linkedId);
virtual void OnReceivedLocalCallRetrieve(int linkedId);
private:
MyH323Connection *conn;
};
#endif
#endif /* !defined AST_H323_H */

@ -1,34 +0,0 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2009, Digium, Inc.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/* PTLib is Copyright (c) 2003 Equivalence Pty. Ltd. */
/*!
* \file
* \brief PTLib compatibility with previous versions of OPAL/PTLib/PWLib
*/
#ifndef AST_PTLIB_H
#define AST_PTLIB_H
#include <ptbuildopts.h>
#if !defined(P_USE_STANDARD_CXX_BOOL) && !defined(P_USE_INTEGER_BOOL)
typedef BOOL PBoolean;
#define PTrue TRUE
#define PFalse FALSE
#endif
#endif /* !defined AST_PTLIB_H */

@ -1,383 +0,0 @@
#include <ptlib.h>
#include <h323.h>
#include <h245.h>
#include "ast_h323.h"
#include "caps_h323.h"
#define DEFINE_G711_CAPABILITY(cls, code, capName) \
class cls : public AST_G711Capability { \
public: \
cls() : AST_G711Capability(240, code) { } \
}; \
H323_REGISTER_CAPABILITY(cls, capName) \
DEFINE_G711_CAPABILITY(AST_G711ALaw64Capability, H323_G711Capability::ALaw, OPAL_G711_ALAW_64K);
DEFINE_G711_CAPABILITY(AST_G711uLaw64Capability, H323_G711Capability::muLaw, OPAL_G711_ULAW_64K);
H323_REGISTER_CAPABILITY(AST_G7231Capability, OPAL_G7231);
H323_REGISTER_CAPABILITY(AST_G729Capability, OPAL_G729);
H323_REGISTER_CAPABILITY(AST_G729ACapability, OPAL_G729A);
H323_REGISTER_CAPABILITY(AST_GSM0610Capability, OPAL_GSM0610);
H323_REGISTER_CAPABILITY(AST_CiscoG726Capability, CISCO_G726r32);
H323_REGISTER_CAPABILITY(AST_CiscoDtmfCapability, CISCO_DTMF_RELAY);
OPAL_MEDIA_FORMAT_DECLARE(OpalG711ALaw64kFormat,
OPAL_G711_ALAW_64K,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::PCMA,
TRUE, // Needs jitter
64000, // bits/sec
8, // bytes/frame
8, // 1 millisecond/frame
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalG711uLaw64kFormat,
OPAL_G711_ULAW_64K,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::PCMU,
TRUE, // Needs jitter
64000, // bits/sec
8, // bytes/frame
8, // 1 millisecond/frame
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalG729Format,
OPAL_G729,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::G729,
TRUE, // Needs jitter
8000, // bits/sec
10, // bytes
80, // 10 milliseconds
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalG729AFormat,
OPAL_G729 "A",
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::G729,
TRUE, // Needs jitter
8000, // bits/sec
10, // bytes
80, // 10 milliseconds
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalG7231_6k3Format,
OPAL_G7231_6k3,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::G7231,
TRUE, // Needs jitter
6400, // bits/sec
24, // bytes
240, // 30 milliseconds
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalG7231A_6k3Format,
OPAL_G7231A_6k3,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::G7231,
TRUE, // Needs jitter
6400, // bits/sec
24, // bytes
240, // 30 milliseconds
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalGSM0610Format,
OPAL_GSM0610,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::GSM,
TRUE, // Needs jitter
13200, // bits/sec
33, // bytes
160, // 20 milliseconds
OpalMediaFormat::AudioTimeUnits,
0);
OPAL_MEDIA_FORMAT_DECLARE(OpalCiscoG726Format,
CISCO_G726r32,
OpalMediaFormat::DefaultAudioSessionID,
RTP_DataFrame::G726,
TRUE, // Needs jitter
32000, // bits/sec
4, // bytes
8, // 1 millisecond
OpalMediaFormat::AudioTimeUnits,
0);
#if 0
OPAL_MEDIA_FORMAT_DECLARE(OpalCiscoDTMFRelayFormat,
CISCO_DTMF_RELAY,
OpalMediaFormat::DefaultAudioSessionID,
(RTP_DataFrame::PayloadTypes)121, // Choose this for Cisco IOS compatibility
TRUE, // Needs jitter
100, // bits/sec
4, // bytes/frame
8*150, // 150 millisecond
OpalMediaFormat::AudioTimeUnits,
0);
#endif
/*
* Capability: G.711
*/
AST_G711Capability::AST_G711Capability(int rx_frames, H323_G711Capability::Mode m, H323_G711Capability::Speed s)
: H323AudioCapability(rx_frames, 30) // 240ms max, 30ms desired
{
mode = m;
speed = s;
}
PObject * AST_G711Capability::Clone() const
{
return new AST_G711Capability(*this);
}
unsigned AST_G711Capability::GetSubType() const
{
static const unsigned G711SubType[2][2] = {
{ H245_AudioCapability::e_g711Alaw64k, H245_AudioCapability::e_g711Alaw56k },
{ H245_AudioCapability::e_g711Ulaw64k, H245_AudioCapability::e_g711Ulaw56k }
};
return G711SubType[mode][speed];
}
PString AST_G711Capability::GetFormatName() const
{
static const char * const G711Name[2][2] = {
{ OPAL_G711_ALAW_64K, OPAL_G711_ALAW_56K },
{ OPAL_G711_ULAW_64K, OPAL_G711_ULAW_56K },
};
return G711Name[mode][speed];
}
H323Codec * AST_G711Capability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
/*
* Capability: G.723.1
*/
AST_G7231Capability::AST_G7231Capability(int rx_frames, PBoolean annexA_)
: H323AudioCapability(rx_frames, 4)
{
annexA = annexA_;
}
PObject::Comparison AST_G7231Capability::Compare(const PObject & obj) const
{
Comparison result = H323AudioCapability::Compare(obj);
if (result != EqualTo) {
return result;
}
PINDEX otherAnnexA = ((const AST_G7231Capability &)obj).annexA;
if (annexA < otherAnnexA) {
return LessThan;
}
if (annexA > otherAnnexA) {
return GreaterThan;
}
return EqualTo;
}
PObject * AST_G7231Capability::Clone() const
{
return new AST_G7231Capability(*this);
}
PString AST_G7231Capability::GetFormatName() const
{
return (annexA ? OPAL_G7231 "A" : OPAL_G7231);
}
unsigned AST_G7231Capability::GetSubType() const
{
return H245_AudioCapability::e_g7231;
}
PBoolean AST_G7231Capability::OnSendingPDU(H245_AudioCapability & cap,
unsigned packetSize) const
{
cap.SetTag(H245_AudioCapability::e_g7231);
H245_AudioCapability_g7231 & g7231 = cap;
g7231.m_maxAl_sduAudioFrames = packetSize;
g7231.m_silenceSuppression = annexA;
return TRUE;
}
PBoolean AST_G7231Capability::OnReceivedPDU(const H245_AudioCapability & cap,
unsigned & packetSize)
{
if (cap.GetTag() != H245_AudioCapability::e_g7231) {
return FALSE;
}
const H245_AudioCapability_g7231 & g7231 = cap;
packetSize = g7231.m_maxAl_sduAudioFrames;
annexA = g7231.m_silenceSuppression;
return TRUE;
}
H323Codec * AST_G7231Capability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
/*
* Capability: G.729
*/
AST_G729Capability::AST_G729Capability(int rx_frames)
: H323AudioCapability(rx_frames, 2)
{
}
PObject * AST_G729Capability::Clone() const
{
return new AST_G729Capability(*this);
}
unsigned AST_G729Capability::GetSubType() const
{
return H245_AudioCapability::e_g729;
}
PString AST_G729Capability::GetFormatName() const
{
return OPAL_G729;
}
H323Codec * AST_G729Capability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
/*
* Capability: G.729A
*/
AST_G729ACapability::AST_G729ACapability(int rx_frames)
: H323AudioCapability(rx_frames, 6)
{
}
PObject * AST_G729ACapability::Clone() const
{
return new AST_G729ACapability(*this);
}
unsigned AST_G729ACapability::GetSubType() const
{
return H245_AudioCapability::e_g729AnnexA;
}
PString AST_G729ACapability::GetFormatName() const
{
return OPAL_G729A;
}
H323Codec * AST_G729ACapability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
/*
* Capability: GSM full rate
*/
AST_GSM0610Capability::AST_GSM0610Capability(int rx_frames, int comfortNoise_, int scrambled_)
: H323AudioCapability(rx_frames, 2)
{
comfortNoise = comfortNoise_;
scrambled = scrambled_;
}
PObject * AST_GSM0610Capability::Clone() const
{
return new AST_GSM0610Capability(*this);
}
unsigned AST_GSM0610Capability::GetSubType() const
{
return H245_AudioCapability::e_gsmFullRate;
}
PBoolean AST_GSM0610Capability::OnSendingPDU(H245_AudioCapability & cap,
unsigned packetSize) const
{
cap.SetTag(H245_AudioCapability::e_gsmFullRate);
H245_GSMAudioCapability & gsm = cap;
gsm.m_audioUnitSize = packetSize * 33;
gsm.m_comfortNoise = comfortNoise;
gsm.m_scrambled = scrambled;
return TRUE;
}
PBoolean AST_GSM0610Capability::OnReceivedPDU(const H245_AudioCapability & cap,
unsigned & packetSize)
{
if (cap.GetTag() != H245_AudioCapability::e_gsmFullRate)
return FALSE;
const H245_GSMAudioCapability & gsm = cap;
packetSize = (gsm.m_audioUnitSize + 32) / 33;
comfortNoise = gsm.m_comfortNoise;
scrambled = gsm.m_scrambled;
return TRUE;
}
PString AST_GSM0610Capability::GetFormatName() const
{
return OPAL_GSM0610;
}
H323Codec * AST_GSM0610Capability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
/*
* Capability: G.726 32 Kbps
*/
AST_CiscoG726Capability::AST_CiscoG726Capability(int rx_frames)
: H323NonStandardAudioCapability(rx_frames, 240,
181, 0, 18,
(const BYTE *)"G726r32", 0)
{
}
PObject *AST_CiscoG726Capability::Clone() const
{
return new AST_CiscoG726Capability(*this);
}
H323Codec *AST_CiscoG726Capability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
PString AST_CiscoG726Capability::GetFormatName() const
{
return PString(CISCO_G726r32);
}
/*
* Capability: Cisco RTP DTMF Relay
*/
AST_CiscoDtmfCapability::AST_CiscoDtmfCapability()
: H323NonStandardDataCapability(0, 181, 0, 18, (const BYTE *)"RtpDtmfRelay", 0)
{
rtpPayloadType = (RTP_DataFrame::PayloadTypes)121;
}
PObject *AST_CiscoDtmfCapability::Clone() const
{
return new AST_CiscoDtmfCapability(*this);
}
H323Codec *AST_CiscoDtmfCapability::CreateCodec(H323Codec::Direction direction) const
{
return NULL;
}
PString AST_CiscoDtmfCapability::GetFormatName() const
{
return PString(CISCO_DTMF_RELAY);
}

@ -1,172 +0,0 @@
#ifndef __AST_H323CAPS_H
#define __AST_H323CAPS_H
/**This class describes the G.711 codec capability.
*/
class AST_G711Capability : public H323AudioCapability
{
PCLASSINFO(AST_G711Capability, H323AudioCapability);
public:
AST_G711Capability(int rx_frames = 125, H323_G711Capability::Mode _mode = H323_G711Capability::muLaw, H323_G711Capability::Speed _speed = H323_G711Capability::At64k);
virtual PObject *Clone() const;
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
virtual unsigned GetSubType() const;
virtual PString GetFormatName() const;
protected:
H323_G711Capability::Mode mode;
H323_G711Capability::Speed speed;
};
/**This class describes the G.723.1 codec capability.
*/
class AST_G7231Capability : public H323AudioCapability
{
PCLASSINFO(AST_G7231Capability, H323AudioCapability);
public:
AST_G7231Capability(int rx_frames = 7, PBoolean annexA = TRUE);
Comparison Compare(const PObject & obj) const;
virtual PObject * Clone() const;
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
virtual unsigned GetSubType() const;
virtual PString GetFormatName() const;
virtual PBoolean OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const;
virtual PBoolean OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
protected:
PBoolean annexA;
};
/**This class describes the (fake) G729 codec capability.
*/
class AST_G729Capability : public H323AudioCapability
{
PCLASSINFO(AST_G729Capability, H323AudioCapability);
public:
AST_G729Capability(int rx_frames = 24);
/* Create a copy of the object. */
virtual PObject * Clone() const;
/* Create the codec instance, allocating resources as required. */
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
/* Get the sub-type of the capability. This is a code dependent on the
main type of the capability.
This returns one of the four possible combinations of mode and speed
using the enum values of the protocol ASN H245_AudioCapability class. */
virtual unsigned GetSubType() const;
/* Get the name of the media data format this class represents. */
virtual PString GetFormatName() const;
};
/* This class describes the VoiceAge G729A codec capability. */
class AST_G729ACapability : public H323AudioCapability
{
PCLASSINFO(AST_G729ACapability, H323AudioCapability);
public:
/* Create a new G.729A capability. */
AST_G729ACapability(int rx_frames = 24);
/* Create a copy of the object. */
virtual PObject * Clone() const;
/* Create the codec instance, allocating resources as required. */
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
/* Get the sub-type of the capability. This is a code dependent on the
main type of the capability.
This returns one of the four possible combinations of mode and speed
using the enum values of the protocol ASN H245_AudioCapability class. */
virtual unsigned GetSubType() const;
/* Get the name of the media data format this class represents. */
virtual PString GetFormatName() const;
};
/* This class describes the GSM-06.10 codec capability. */
class AST_GSM0610Capability : public H323AudioCapability
{
PCLASSINFO(AST_GSM0610Capability, H323AudioCapability);
public:
/* Create a new GSM capability. */
AST_GSM0610Capability(int rx_frames = 24, int comfortNoise = 0, int scrambled = 0);
/* Create a copy of the object. */
virtual PObject * Clone() const;
/* Create the codec instance, allocating resources as required. */
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
/* Get the sub-type of the capability. This is a code dependent on the
main type of the capability.
This returns one of the four possible combinations of mode and speed
using the enum values of the protocol ASN H245_AudioCapability class. */
virtual unsigned GetSubType() const;
/* Get the name of the media data format this class represents. */
virtual PString GetFormatName() const;
PBoolean OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const;
PBoolean OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
protected:
int comfortNoise;
int scrambled;
};
#define CISCO_G726r32 "G726r32"
class AST_CiscoG726Capability : public H323NonStandardAudioCapability {
PCLASSINFO(AST_CiscoG726Capability, H323NonStandardAudioCapability);
public:
/* Create a new Cisco G.726 capability */
AST_CiscoG726Capability(int rx_frames = 80);
/* Create a copy of the object. */
virtual PObject * Clone() const;
/* Create the codec instance, allocating resources as required. */
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
/* Get the name of the media data format this class represents. */
virtual PString GetFormatName() const;
};
#define CISCO_DTMF_RELAY "UserInput/RtpDtmfRelay"
class AST_CiscoDtmfCapability : public H323NonStandardDataCapability
{
PCLASSINFO(AST_CiscoDtmfCapability, H323NonStandardDataCapability);
public:
/* Create a new Cisco RTP DTMF Relay capability */
AST_CiscoDtmfCapability();
/* Create a copy of the object. */
virtual PObject *Clone() const;
/* Create the codec instance, allocating resources as required. */
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
/* Get the name of the media data format this class represents. */
virtual PString GetFormatName() const;
virtual H323Channel *CreateChannel(H323Connection &,
H323Channel::Directions,
unsigned,
const H245_H2250LogicalChannelParameters *) const
{
return NULL;
}
};
#endif /* __AST_H323CAPS_H */

@ -1,276 +0,0 @@
/*
* chan_h323.h
*
* OpenH323 Channel Driver for ASTERISK PBX.
* By Jeremy McNamara
* For The NuFone Network
*
* This code has been derived from code created by
* Michael Manousos and Mark Spencer
*
* This file is part of the chan_h323 driver for Asterisk
*
* chan_h323 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* chan_h323 is distributed WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Version Info: $Id$
*/
#ifndef CHAN_H323_H
#define CHAN_H323_H
#include <arpa/inet.h>
#include "asterisk/format.h"
#include "asterisk/app.h"
/*
* Enable support for sending/reception of tunnelled Q.SIG messages and
* some sort of IEs (especially RedirectingNumber) which Cisco CallManager
* isn't like to pass in standard Q.931 message.
*
*/
#define TUNNELLING
#define H323_TUNNEL_CISCO (1 << 0)
#define H323_TUNNEL_QSIG (1 << 1)
#define H323_HOLD_NOTIFY (1 << 0)
#define H323_HOLD_Q931ONLY (1 << 1)
#define H323_HOLD_H450 (1 << 2)
typedef int64_t h323_format;
/** call_option struct holds various bits
* of information for each call */
typedef struct call_options {
char cid_num[80];
char cid_name[80];
char cid_rdnis[80];
int redirect_reason;
int presentation;
int type_of_number;
int transfer_capability;
int fastStart;
int h245Tunneling;
int silenceSuppression;
int progress_setup;
int progress_alert;
int progress_audio;
int dtmfcodec[2];
int dtmfmode;
h323_format capability;
int bridge;
int nat;
int tunnelOptions;
int holdHandling;
int autoframing; /*!< turn on to override local settings with remote framing length */
struct ast_codec_pref prefs;
} call_options_t;
/* structure to hold the valid asterisk users */
struct oh323_user {
ASTOBJ_COMPONENTS(struct oh323_user);
// char name[80];
char context[80];
char secret[80];
char accountcode[AST_MAX_ACCOUNT_CODE];
int amaflags;
int host;
struct sockaddr_in addr;
struct ast_ha *ha;
call_options_t options;
};
/* structure to hold the valid asterisk peers
All peers are registered to a GK if there is one */
struct oh323_peer {
ASTOBJ_COMPONENTS(struct oh323_peer);
char mailbox[AST_MAX_MAILBOX_UNIQUEID];
int delme;
struct sockaddr_in addr;
struct ast_ha *ha;
call_options_t options;
};
/* structure to hold the H.323 aliases which get registered to
the H.323 endpoint and gatekeeper */
struct oh323_alias {
ASTOBJ_COMPONENTS(struct oh323_alias);
char e164[20]; /* tells a GK to route this E.164 to this alias */
char prefix[500]; /* tells a GK this alias supports these prefixes */
char secret[20]; /* the H.235 password to send to the GK for authentication */
char context[80];
};
/** call_details struct call detail records
to asterisk for processing and used for matching up
asterisk channels to acutal h.323 connections */
typedef struct call_details {
unsigned int call_reference;
char *call_token;
char *call_source_aliases;
char *call_dest_alias;
char *call_source_name;
char *call_source_e164;
char *call_dest_e164;
char *redirect_number;
int redirect_reason;
int presentation;
int type_of_number;
int transfer_capability;
char *sourceIp;
} call_details_t;
typedef struct rtp_info {
char addr[32];
unsigned int port;
} rtp_info_t;
/* This is a callback prototype function, called pass
DTMF down the RTP. */
typedef int (*receive_digit_cb)(unsigned, char, const char *, int);
extern receive_digit_cb on_receive_digit;
/* This is a callback prototype function, called to collect
the external RTP port from Asterisk. */
typedef rtp_info_t *(*on_rtp_cb)(unsigned, const char *);
extern on_rtp_cb on_external_rtp_create;
/* This is a callback prototype function, called to send
the remote IP and RTP port from H.323 to Asterisk */
typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int);
extern start_rtp_cb on_start_rtp_channel;
/* This is a callback that happens when call progress is
* made, and handles inband progress */
typedef int (*progress_cb)(unsigned, const char *, int);
extern progress_cb on_progress;
/* This is a callback prototype function, called upon
an incoming call happens. */
typedef call_options_t *(*setup_incoming_cb)(call_details_t *);
extern setup_incoming_cb on_incoming_call;
/* This is a callback prototype function, called upon
an outbound call. */
typedef int (*setup_outbound_cb)(call_details_t *);
extern setup_outbound_cb on_outgoing_call;
/* This is a callback prototype function, called when
OnAlerting is invoked */
typedef void (*chan_ringing_cb)(unsigned, const char *);
extern chan_ringing_cb on_chan_ringing;
/* This is a callback protoype function, called when
OnConnectionEstablished is inovked */
typedef void (*con_established_cb)(unsigned, const char *);
extern con_established_cb on_connection_established;
/* This is a callback prototype function, called when
OnConnectionCleared callback is invoked */
typedef void (*clear_con_cb)(unsigned, const char *);
extern clear_con_cb on_connection_cleared;
/* This is a callback prototype function, called when
an H.323 call is answered */
typedef int (*answer_call_cb)(unsigned, const char *);
extern answer_call_cb on_answer_call;
/* This is a callback prototype function, called when
we know which RTP payload type RFC2833 will be
transmitted */
typedef void (*rfc2833_cb)(unsigned, const char *, int, int);
extern rfc2833_cb on_set_rfc2833_payload;
typedef void (*hangup_cb)(unsigned, const char *, int);
extern hangup_cb on_hangup;
typedef void (*setcapabilities_cb)(unsigned, const char *);
extern setcapabilities_cb on_setcapabilities;
typedef void (*setpeercapabilities_cb)(unsigned, const char *, int, struct ast_codec_pref *);
extern setpeercapabilities_cb on_setpeercapabilities;
typedef void (*onhold_cb)(unsigned, const char *, int);
extern onhold_cb on_hold;
/* debug flag */
extern int h323debug;
#define H323_DTMF_RFC2833 (1 << 0)
#define H323_DTMF_CISCO (1 << 1)
#define H323_DTMF_SIGNAL (1 << 2)
#define H323_DTMF_INBAND (1 << 3)
#define H323_DTMF_RFC2833_PT 101
#define H323_DTMF_CISCO_PT 121
#ifdef __cplusplus
extern "C" {
#endif
void h323_gk_urq(void);
void h323_end_point_create(void);
void h323_end_process(void);
int h323_end_point_exist(void);
void h323_debug(int, unsigned);
/* callback function handler*/
void h323_callback_register(setup_incoming_cb,
setup_outbound_cb,
on_rtp_cb,
start_rtp_cb,
clear_con_cb,
chan_ringing_cb,
con_established_cb,
receive_digit_cb,
answer_call_cb,
progress_cb,
rfc2833_cb,
hangup_cb,
setcapabilities_cb,
setpeercapabilities_cb,
onhold_cb);
int h323_set_capabilities(const char *, int, int, struct ast_codec_pref *, int);
int h323_set_alias(struct oh323_alias *);
int h323_set_gk(int, char *, char *);
void h323_set_id(char *);
void h323_show_tokens(void);
void h323_show_version(void);
/* H323 listener related funcions */
int h323_start_listener(int, struct sockaddr_in);
void h323_native_bridge(const char *, const char *, char *);
/* Send a DTMF tone to remote endpoint */
void h323_send_tone(const char *call_token, char tone);
/* H323 create and destroy sessions */
int h323_make_call(char *dest, call_details_t *cd, call_options_t *);
int h323_clear_call(const char *, int cause);
/* H.323 alerting and progress */
int h323_send_alerting(const char *token);
int h323_send_progress(const char *token);
int h323_answering_call(const char *token, int);
int h323_soft_hangup(const char *data);
int h323_show_codec(int fd, int argc, char *argv[]);
int h323_hold_call(const char *token, int);
#ifdef __cplusplus
}
#endif
#endif

@ -1,74 +0,0 @@
CISCO-H225-MESSAGES DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
H323_UU_NonStdInfo ::= SEQUENCE
{
version INTEGER OPTIONAL,
protoParam ProtoParam OPTIONAL,
commonParam CommonParam OPTIONAL,
...,
dummy1 OCTET STRING OPTIONAL,
progIndParam ProgIndParam OPTIONAL,
callMgrParam CallMgrParam OPTIONAL,
callSignallingParam CallSignallingParam OPTIONAL,
dummy2 OCTET STRING OPTIONAL,
callPreserveParam CallPreserveParam OPTIONAL
}
CommonParam ::= SEQUENCE
{
redirectIEinfo RedirectIEinfo,
...
}
RedirectIEinfo ::= SEQUENCE
{
redirectIE OCTET STRING,
...
}
ProgIndParam ::= SEQUENCE
{
progIndIEinfo ProgIndIEinfo,
...
}
ProgIndIEinfo ::= SEQUENCE
{
progIndIE OCTET STRING,
...
}
ProtoParam ::= SEQUENCE
{
qsigNonStdInfo QsigNonStdInfo,
...
}
QsigNonStdInfo ::= SEQUENCE
{
iei INTEGER,
rawMesg OCTET STRING,
...
}
CallMgrParam ::= SEQUENCE
{
interclusterVersion INTEGER,
enterpriseID OCTET STRING,
...
}
CallPreserveParam ::= SEQUENCE
{
callPreserveIE BOOLEAN,
...
}
CallSignallingParam ::= SEQUENCE
{
connectedNumber OCTET STRING (1..127) OPTIONAL,
...
}
END

@ -1,853 +0,0 @@
//
// cisco-h225.cxx
//
// Code automatically generated by asnparse.
//
#ifdef P_USE_PRAGMA
#pragma implementation "cisco-h225.h"
#endif
#include <ptlib.h>
#include "cisco-h225.h"
#define new PNEW
#if ! H323_DISABLE_CISCO_H225
//
// RedirectIEinfo
//
CISCO_H225_RedirectIEinfo::CISCO_H225_RedirectIEinfo(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_RedirectIEinfo::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+13) << "redirectIE = " << setprecision(indent) << m_redirectIE << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_RedirectIEinfo::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_RedirectIEinfo), PInvalidCast);
#endif
const CISCO_H225_RedirectIEinfo & other = (const CISCO_H225_RedirectIEinfo &)obj;
Comparison result;
if ((result = m_redirectIE.Compare(other.m_redirectIE)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_RedirectIEinfo::GetDataLength() const
{
PINDEX length = 0;
length += m_redirectIE.GetObjectLength();
return length;
}
PBoolean CISCO_H225_RedirectIEinfo::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_redirectIE.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_RedirectIEinfo::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_redirectIE.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_RedirectIEinfo::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_RedirectIEinfo::Class()), PInvalidCast);
#endif
return new CISCO_H225_RedirectIEinfo(*this);
}
//
// ProgIndIEinfo
//
CISCO_H225_ProgIndIEinfo::CISCO_H225_ProgIndIEinfo(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_ProgIndIEinfo::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+12) << "progIndIE = " << setprecision(indent) << m_progIndIE << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_ProgIndIEinfo::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_ProgIndIEinfo), PInvalidCast);
#endif
const CISCO_H225_ProgIndIEinfo & other = (const CISCO_H225_ProgIndIEinfo &)obj;
Comparison result;
if ((result = m_progIndIE.Compare(other.m_progIndIE)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_ProgIndIEinfo::GetDataLength() const
{
PINDEX length = 0;
length += m_progIndIE.GetObjectLength();
return length;
}
PBoolean CISCO_H225_ProgIndIEinfo::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_progIndIE.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_ProgIndIEinfo::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_progIndIE.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_ProgIndIEinfo::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_ProgIndIEinfo::Class()), PInvalidCast);
#endif
return new CISCO_H225_ProgIndIEinfo(*this);
}
//
// QsigNonStdInfo
//
CISCO_H225_QsigNonStdInfo::CISCO_H225_QsigNonStdInfo(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_QsigNonStdInfo::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+6) << "iei = " << setprecision(indent) << m_iei << '\n';
strm << setw(indent+10) << "rawMesg = " << setprecision(indent) << m_rawMesg << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_QsigNonStdInfo::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_QsigNonStdInfo), PInvalidCast);
#endif
const CISCO_H225_QsigNonStdInfo & other = (const CISCO_H225_QsigNonStdInfo &)obj;
Comparison result;
if ((result = m_iei.Compare(other.m_iei)) != EqualTo)
return result;
if ((result = m_rawMesg.Compare(other.m_rawMesg)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_QsigNonStdInfo::GetDataLength() const
{
PINDEX length = 0;
length += m_iei.GetObjectLength();
length += m_rawMesg.GetObjectLength();
return length;
}
PBoolean CISCO_H225_QsigNonStdInfo::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_iei.Decode(strm))
return FALSE;
if (!m_rawMesg.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_QsigNonStdInfo::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_iei.Encode(strm);
m_rawMesg.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_QsigNonStdInfo::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_QsigNonStdInfo::Class()), PInvalidCast);
#endif
return new CISCO_H225_QsigNonStdInfo(*this);
}
//
// CallMgrParam
//
CISCO_H225_CallMgrParam::CISCO_H225_CallMgrParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_CallMgrParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+22) << "interclusterVersion = " << setprecision(indent) << m_interclusterVersion << '\n';
strm << setw(indent+15) << "enterpriseID = " << setprecision(indent) << m_enterpriseID << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_CallMgrParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_CallMgrParam), PInvalidCast);
#endif
const CISCO_H225_CallMgrParam & other = (const CISCO_H225_CallMgrParam &)obj;
Comparison result;
if ((result = m_interclusterVersion.Compare(other.m_interclusterVersion)) != EqualTo)
return result;
if ((result = m_enterpriseID.Compare(other.m_enterpriseID)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_CallMgrParam::GetDataLength() const
{
PINDEX length = 0;
length += m_interclusterVersion.GetObjectLength();
length += m_enterpriseID.GetObjectLength();
return length;
}
PBoolean CISCO_H225_CallMgrParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_interclusterVersion.Decode(strm))
return FALSE;
if (!m_enterpriseID.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_CallMgrParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_interclusterVersion.Encode(strm);
m_enterpriseID.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_CallMgrParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_CallMgrParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_CallMgrParam(*this);
}
//
// CallPreserveParam
//
CISCO_H225_CallPreserveParam::CISCO_H225_CallPreserveParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_CallPreserveParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+17) << "callPreserveIE = " << setprecision(indent) << m_callPreserveIE << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_CallPreserveParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_CallPreserveParam), PInvalidCast);
#endif
const CISCO_H225_CallPreserveParam & other = (const CISCO_H225_CallPreserveParam &)obj;
Comparison result;
if ((result = m_callPreserveIE.Compare(other.m_callPreserveIE)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_CallPreserveParam::GetDataLength() const
{
PINDEX length = 0;
length += m_callPreserveIE.GetObjectLength();
return length;
}
PBoolean CISCO_H225_CallPreserveParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_callPreserveIE.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_CallPreserveParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_callPreserveIE.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_CallPreserveParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_CallPreserveParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_CallPreserveParam(*this);
}
//
// CallSignallingParam
//
CISCO_H225_CallSignallingParam::CISCO_H225_CallSignallingParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 1, TRUE, 0)
{
m_connectedNumber.SetConstraints(PASN_Object::FixedConstraint, 1, 127);
}
#ifndef PASN_NOPRINTON
void CISCO_H225_CallSignallingParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
if (HasOptionalField(e_connectedNumber))
strm << setw(indent+18) << "connectedNumber = " << setprecision(indent) << m_connectedNumber << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_CallSignallingParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_CallSignallingParam), PInvalidCast);
#endif
const CISCO_H225_CallSignallingParam & other = (const CISCO_H225_CallSignallingParam &)obj;
Comparison result;
if ((result = m_connectedNumber.Compare(other.m_connectedNumber)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_CallSignallingParam::GetDataLength() const
{
PINDEX length = 0;
if (HasOptionalField(e_connectedNumber))
length += m_connectedNumber.GetObjectLength();
return length;
}
PBoolean CISCO_H225_CallSignallingParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (HasOptionalField(e_connectedNumber) && !m_connectedNumber.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_CallSignallingParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
if (HasOptionalField(e_connectedNumber))
m_connectedNumber.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_CallSignallingParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_CallSignallingParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_CallSignallingParam(*this);
}
//
// CommonParam
//
CISCO_H225_CommonParam::CISCO_H225_CommonParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_CommonParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+17) << "redirectIEinfo = " << setprecision(indent) << m_redirectIEinfo << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_CommonParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_CommonParam), PInvalidCast);
#endif
const CISCO_H225_CommonParam & other = (const CISCO_H225_CommonParam &)obj;
Comparison result;
if ((result = m_redirectIEinfo.Compare(other.m_redirectIEinfo)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_CommonParam::GetDataLength() const
{
PINDEX length = 0;
length += m_redirectIEinfo.GetObjectLength();
return length;
}
PBoolean CISCO_H225_CommonParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_redirectIEinfo.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_CommonParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_redirectIEinfo.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_CommonParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_CommonParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_CommonParam(*this);
}
//
// ProgIndParam
//
CISCO_H225_ProgIndParam::CISCO_H225_ProgIndParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_ProgIndParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+16) << "progIndIEinfo = " << setprecision(indent) << m_progIndIEinfo << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_ProgIndParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_ProgIndParam), PInvalidCast);
#endif
const CISCO_H225_ProgIndParam & other = (const CISCO_H225_ProgIndParam &)obj;
Comparison result;
if ((result = m_progIndIEinfo.Compare(other.m_progIndIEinfo)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_ProgIndParam::GetDataLength() const
{
PINDEX length = 0;
length += m_progIndIEinfo.GetObjectLength();
return length;
}
PBoolean CISCO_H225_ProgIndParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_progIndIEinfo.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_ProgIndParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_progIndIEinfo.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_ProgIndParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_ProgIndParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_ProgIndParam(*this);
}
//
// ProtoParam
//
CISCO_H225_ProtoParam::CISCO_H225_ProtoParam(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 0, TRUE, 0)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_ProtoParam::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
strm << setw(indent+17) << "qsigNonStdInfo = " << setprecision(indent) << m_qsigNonStdInfo << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_ProtoParam::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_ProtoParam), PInvalidCast);
#endif
const CISCO_H225_ProtoParam & other = (const CISCO_H225_ProtoParam &)obj;
Comparison result;
if ((result = m_qsigNonStdInfo.Compare(other.m_qsigNonStdInfo)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_ProtoParam::GetDataLength() const
{
PINDEX length = 0;
length += m_qsigNonStdInfo.GetObjectLength();
return length;
}
PBoolean CISCO_H225_ProtoParam::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (!m_qsigNonStdInfo.Decode(strm))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_ProtoParam::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
m_qsigNonStdInfo.Encode(strm);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_ProtoParam::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_ProtoParam::Class()), PInvalidCast);
#endif
return new CISCO_H225_ProtoParam(*this);
}
//
// H323_UU_NonStdInfo
//
CISCO_H225_H323_UU_NonStdInfo::CISCO_H225_H323_UU_NonStdInfo(unsigned tag, PASN_Object::TagClass tagClass)
: PASN_Sequence(tag, tagClass, 3, TRUE, 6)
{
}
#ifndef PASN_NOPRINTON
void CISCO_H225_H323_UU_NonStdInfo::PrintOn(ostream & strm) const
{
int indent = strm.precision() + 2;
strm << "{\n";
if (HasOptionalField(e_version))
strm << setw(indent+10) << "version = " << setprecision(indent) << m_version << '\n';
if (HasOptionalField(e_protoParam))
strm << setw(indent+13) << "protoParam = " << setprecision(indent) << m_protoParam << '\n';
if (HasOptionalField(e_commonParam))
strm << setw(indent+14) << "commonParam = " << setprecision(indent) << m_commonParam << '\n';
if (HasOptionalField(e_dummy1))
strm << setw(indent+9) << "dummy1 = " << setprecision(indent) << m_dummy1 << '\n';
if (HasOptionalField(e_progIndParam))
strm << setw(indent+15) << "progIndParam = " << setprecision(indent) << m_progIndParam << '\n';
if (HasOptionalField(e_callMgrParam))
strm << setw(indent+15) << "callMgrParam = " << setprecision(indent) << m_callMgrParam << '\n';
if (HasOptionalField(e_callSignallingParam))
strm << setw(indent+22) << "callSignallingParam = " << setprecision(indent) << m_callSignallingParam << '\n';
if (HasOptionalField(e_dummy2))
strm << setw(indent+9) << "dummy2 = " << setprecision(indent) << m_dummy2 << '\n';
if (HasOptionalField(e_callPreserveParam))
strm << setw(indent+20) << "callPreserveParam = " << setprecision(indent) << m_callPreserveParam << '\n';
strm << setw(indent-1) << setprecision(indent-2) << "}";
}
#endif
PObject::Comparison CISCO_H225_H323_UU_NonStdInfo::Compare(const PObject & obj) const
{
#ifndef PASN_LEANANDMEAN
PAssert(PIsDescendant(&obj, CISCO_H225_H323_UU_NonStdInfo), PInvalidCast);
#endif
const CISCO_H225_H323_UU_NonStdInfo & other = (const CISCO_H225_H323_UU_NonStdInfo &)obj;
Comparison result;
if ((result = m_version.Compare(other.m_version)) != EqualTo)
return result;
if ((result = m_protoParam.Compare(other.m_protoParam)) != EqualTo)
return result;
if ((result = m_commonParam.Compare(other.m_commonParam)) != EqualTo)
return result;
return PASN_Sequence::Compare(other);
}
PINDEX CISCO_H225_H323_UU_NonStdInfo::GetDataLength() const
{
PINDEX length = 0;
if (HasOptionalField(e_version))
length += m_version.GetObjectLength();
if (HasOptionalField(e_protoParam))
length += m_protoParam.GetObjectLength();
if (HasOptionalField(e_commonParam))
length += m_commonParam.GetObjectLength();
return length;
}
PBoolean CISCO_H225_H323_UU_NonStdInfo::Decode(PASN_Stream & strm)
{
if (!PreambleDecode(strm))
return FALSE;
if (HasOptionalField(e_version) && !m_version.Decode(strm))
return FALSE;
if (HasOptionalField(e_protoParam) && !m_protoParam.Decode(strm))
return FALSE;
if (HasOptionalField(e_commonParam) && !m_commonParam.Decode(strm))
return FALSE;
if (!KnownExtensionDecode(strm, e_dummy1, m_dummy1))
return FALSE;
if (!KnownExtensionDecode(strm, e_progIndParam, m_progIndParam))
return FALSE;
if (!KnownExtensionDecode(strm, e_callMgrParam, m_callMgrParam))
return FALSE;
if (!KnownExtensionDecode(strm, e_callSignallingParam, m_callSignallingParam))
return FALSE;
if (!KnownExtensionDecode(strm, e_dummy2, m_dummy2))
return FALSE;
if (!KnownExtensionDecode(strm, e_callPreserveParam, m_callPreserveParam))
return FALSE;
return UnknownExtensionsDecode(strm);
}
void CISCO_H225_H323_UU_NonStdInfo::Encode(PASN_Stream & strm) const
{
PreambleEncode(strm);
if (HasOptionalField(e_version))
m_version.Encode(strm);
if (HasOptionalField(e_protoParam))
m_protoParam.Encode(strm);
if (HasOptionalField(e_commonParam))
m_commonParam.Encode(strm);
KnownExtensionEncode(strm, e_dummy1, m_dummy1);
KnownExtensionEncode(strm, e_progIndParam, m_progIndParam);
KnownExtensionEncode(strm, e_callMgrParam, m_callMgrParam);
KnownExtensionEncode(strm, e_callSignallingParam, m_callSignallingParam);
KnownExtensionEncode(strm, e_dummy2, m_dummy2);
KnownExtensionEncode(strm, e_callPreserveParam, m_callPreserveParam);
UnknownExtensionsEncode(strm);
}
PObject * CISCO_H225_H323_UU_NonStdInfo::Clone() const
{
#ifndef PASN_LEANANDMEAN
PAssert(IsClass(CISCO_H225_H323_UU_NonStdInfo::Class()), PInvalidCast);
#endif
return new CISCO_H225_H323_UU_NonStdInfo(*this);
}
#endif // if ! H323_DISABLE_CISCO_H225
// End of cisco-h225.cxx

@ -1,300 +0,0 @@
//
// cisco-h225.h
//
// Code automatically generated by asnparse.
//
#if ! H323_DISABLE_CISCO_H225
#ifndef __CISCO_H225_H
#define __CISCO_H225_H
#ifdef P_USE_PRAGMA
#pragma interface
#endif
#include <ptclib/asner.h>
#include "ast_ptlib.h"
//
// RedirectIEinfo
//
class CISCO_H225_RedirectIEinfo : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_RedirectIEinfo, PASN_Sequence);
#endif
public:
CISCO_H225_RedirectIEinfo(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
PASN_OctetString m_redirectIE;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// ProgIndIEinfo
//
class CISCO_H225_ProgIndIEinfo : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_ProgIndIEinfo, PASN_Sequence);
#endif
public:
CISCO_H225_ProgIndIEinfo(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
PASN_OctetString m_progIndIE;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// QsigNonStdInfo
//
class CISCO_H225_QsigNonStdInfo : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_QsigNonStdInfo, PASN_Sequence);
#endif
public:
CISCO_H225_QsigNonStdInfo(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
PASN_Integer m_iei;
PASN_OctetString m_rawMesg;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// CallMgrParam
//
class CISCO_H225_CallMgrParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_CallMgrParam, PASN_Sequence);
#endif
public:
CISCO_H225_CallMgrParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
PASN_Integer m_interclusterVersion;
PASN_OctetString m_enterpriseID;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// CallPreserveParam
//
class CISCO_H225_CallPreserveParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_CallPreserveParam, PASN_Sequence);
#endif
public:
CISCO_H225_CallPreserveParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
PASN_Boolean m_callPreserveIE;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// CallSignallingParam
//
class CISCO_H225_CallSignallingParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_CallSignallingParam, PASN_Sequence);
#endif
public:
CISCO_H225_CallSignallingParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
enum OptionalFields {
e_connectedNumber
};
PASN_OctetString m_connectedNumber;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// CommonParam
//
class CISCO_H225_CommonParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_CommonParam, PASN_Sequence);
#endif
public:
CISCO_H225_CommonParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
CISCO_H225_RedirectIEinfo m_redirectIEinfo;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// ProgIndParam
//
class CISCO_H225_ProgIndParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_ProgIndParam, PASN_Sequence);
#endif
public:
CISCO_H225_ProgIndParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
CISCO_H225_ProgIndIEinfo m_progIndIEinfo;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// ProtoParam
//
class CISCO_H225_ProtoParam : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_ProtoParam, PASN_Sequence);
#endif
public:
CISCO_H225_ProtoParam(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
CISCO_H225_QsigNonStdInfo m_qsigNonStdInfo;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
//
// H323_UU_NonStdInfo
//
class CISCO_H225_H323_UU_NonStdInfo : public PASN_Sequence
{
#ifndef PASN_LEANANDMEAN
PCLASSINFO(CISCO_H225_H323_UU_NonStdInfo, PASN_Sequence);
#endif
public:
CISCO_H225_H323_UU_NonStdInfo(unsigned tag = UniversalSequence, TagClass tagClass = UniversalTagClass);
enum OptionalFields {
e_version,
e_protoParam,
e_commonParam,
e_dummy1,
e_progIndParam,
e_callMgrParam,
e_callSignallingParam,
e_dummy2,
e_callPreserveParam
};
PASN_Integer m_version;
CISCO_H225_ProtoParam m_protoParam;
CISCO_H225_CommonParam m_commonParam;
PASN_OctetString m_dummy1;
CISCO_H225_ProgIndParam m_progIndParam;
CISCO_H225_CallMgrParam m_callMgrParam;
CISCO_H225_CallSignallingParam m_callSignallingParam;
PASN_OctetString m_dummy2;
CISCO_H225_CallPreserveParam m_callPreserveParam;
PINDEX GetDataLength() const;
PBoolean Decode(PASN_Stream & strm);
void Encode(PASN_Stream & strm) const;
#ifndef PASN_NOPRINTON
void PrintOn(ostream & strm) const;
#endif
Comparison Compare(const PObject & obj) const;
PObject * Clone() const;
};
#endif // __CISCO_H225_H
#endif // if ! H323_DISABLE_CISCO_H225
// End of cisco-h225.h

@ -1,139 +0,0 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
/*
* ast_h323.cpp
*
* OpenH323 Channel Driver for ASTERISK PBX.
* By Jeremy McNamara
* For The NuFone Network
*
* chan_h323 has been derived from code created by
* Michael Manousos and Mark Spencer
*
* This file is part of the chan_h323 driver for Asterisk
*
* chan_h323 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* chan_h323 is distributed WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Version Info: $Id$
*/
#include <ptlib.h>
#include <h323.h>
#include <transports.h>
#include "ast_h323.h"
#include "compat_h323.h"
#if VERSION(OPENH323_MAJOR,OPENH323_MINOR,OPENH323_BUILD) < VERSION(1,17,3)
MyH323TransportTCP::MyH323TransportTCP(
H323EndPoint & endpoint,
PIPSocket::Address binding,
PBoolean listen)
: H323TransportTCP(endpoint, binding, listen)
{
}
PBoolean MyH323TransportTCP::Connect()
{
if (IsListening())
return TRUE;
PTCPSocket * socket = new PTCPSocket(remotePort);
Open(socket);
channelPointerMutex.StartRead();
socket->SetReadTimeout(10000/*endpoint.GetSignallingChannelConnectTimeout()*/);
localPort = endpoint.GetNextTCPPort();
WORD firstPort = localPort;
for (;;) {
PTRACE(4, "H323TCP\tConnecting to "
<< remoteAddress << ':' << remotePort
<< " (local port=" << localPort << ')');
if (socket->Connect(localAddress, localPort, remoteAddress))
break;
int errnum = socket->GetErrorNumber();
if (localPort == 0 || (errnum != EADDRINUSE && errnum != EADDRNOTAVAIL)) {
PTRACE(1, "H323TCP\tCould not connect to "
<< remoteAddress << ':' << remotePort
<< " (local port=" << localPort << ") - "
<< socket->GetErrorText() << '(' << errnum << ')');
channelPointerMutex.EndRead();
return SetErrorValues(socket->GetErrorCode(), errnum);
}
localPort = endpoint.GetNextTCPPort();
if (localPort == firstPort) {
PTRACE(1, "H323TCP\tCould not bind to any port in range " <<
endpoint.GetTCPPortBase() << " to " << endpoint.GetTCPPortMax());
channelPointerMutex.EndRead();
return SetErrorValues(socket->GetErrorCode(), errnum);
}
}
socket->SetReadTimeout(PMaxTimeInterval);
channelPointerMutex.EndRead();
return OnOpen();
}
#endif
PBoolean MyH323TransportUDP::DiscoverGatekeeper(H323Gatekeeper &gk, H323RasPDU &pdu, const H323TransportAddress &address)
{
PThread *thd = PThread::Current();
/* If we run in OpenH323's thread use it instead of creating new one */
if (thd)
return H323TransportUDP::DiscoverGatekeeper(gk, pdu, address);
/* Make copy of arguments to pass them into thread */
discoverGatekeeper = &gk;
discoverPDU = &pdu;
discoverAddress = &address;
/* Assume discovery thread isn't finished */
discoverReady = FALSE;
/* Create discovery thread */
thd = PThread::Create(PCREATE_NOTIFIER(DiscoverMain), 0,
PThread::NoAutoDeleteThread,
PThread::NormalPriority,
"GkDiscovery:%x");
/* Wait until discovery thread signal us its finished */
for(;;) {
discoverMutex.Wait();
if (discoverReady) /* Thread has been finished */
break;
discoverMutex.Signal();
}
discoverMutex.Signal();
/* Cleanup/delete thread */
thd->WaitForTermination();
delete thd;
return discoverResult;
}
void MyH323TransportUDP::DiscoverMain(PThread &thread, INT arg)
{
PWaitAndSignal m(discoverMutex);
discoverResult = H323TransportUDP::DiscoverGatekeeper(*discoverGatekeeper, *discoverPDU, *discoverAddress);
discoverReady = TRUE;
}

@ -1,96 +0,0 @@
#ifndef COMPAT_H323_H
#define COMPAT_H323_H
#include "ast_ptlib.h"
#if VERSION(OPENH323_MAJOR,OPENH323_MINOR,OPENH323_BUILD) < VERSION(1,17,3)
/**
* Workaround for broken (less than 1.17.3) OpenH323 stack to be able to
* make TCP connections from specific address
*/
class MyH323TransportTCP : public H323TransportTCP
{
PCLASSINFO(MyH323TransportTCP, H323TransportTCP);
public:
MyH323TransportTCP(
H323EndPoint & endpoint, ///< H323 End Point object
PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(), ///< Local interface to use
PBoolean listen = FALSE ///< Flag for need to wait for remote to connect
);
/**Connect to the remote party.
*/
virtual PBoolean Connect();
};
#else
#define MyH323TransportTCP H323TransportTCP
#endif /* <VERSION(1,17,3) */
class MyH323TransportUDP: public H323TransportUDP
{
PCLASSINFO(MyH323TransportUDP, H323TransportUDP);
public:
MyH323TransportUDP(H323EndPoint &endpoint,
PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
WORD localPort = 0,
WORD remotePort = 0): H323TransportUDP(endpoint, binding, localPort, remotePort)
{
}
virtual PBoolean DiscoverGatekeeper(H323Gatekeeper &,
H323RasPDU &,
const H323TransportAddress &);
protected:
PDECLARE_NOTIFIER(PThread, MyH323TransportUDP, DiscoverMain);
H323Gatekeeper *discoverGatekeeper;
H323RasPDU *discoverPDU;
const H323TransportAddress *discoverAddress;
PBoolean discoverResult;
PBoolean discoverReady;
PMutex discoverMutex;
};
template <class _Abstract_T, typename _Key_T = PString>
class MyPFactory: public PFactory<_Abstract_T, _Key_T>
{
public:
template <class _Concrete_T> class Worker: public PFactory<_Abstract_T, _Key_T>::WorkerBase
{
public:
Worker(const _Key_T &_key, bool singleton = false)
:PFactory<_Abstract_T, _Key_T>::WorkerBase(singleton), key(_key)
{
PFactory<_Abstract_T, _Key_T>::Register(key, this);
}
~Worker()
{
PFactory<_Abstract_T, _Key_T>::Unregister(key);
}
protected:
virtual _Abstract_T *Create(const _Key_T &) const { return new _Concrete_T; }
private:
PString key;
};
};
#ifdef H323_REGISTER_CAPABILITY
#undef H323_REGISTER_CAPABILITY
#endif
#define H323_REGISTER_CAPABILITY(cls, capName) static MyPFactory<H323Capability>::Worker<cls> cls##Factory(capName, true)
#ifdef OPAL_MEDIA_FORMAT_DECLARE
#undef OPAL_MEDIA_FORMAT_DECLARE
#endif
#define OPAL_MEDIA_FORMAT_DECLARE(classname, _fullName, _defaultSessionID, _rtpPayloadType, _needsJitter,_bandwidth, _frameSize, _frameTime, _timeUnits, _timeStamp) \
class classname : public OpalMediaFormat \
{ \
public: \
classname() \
: OpalMediaFormat(_fullName, _defaultSessionID, _rtpPayloadType, _needsJitter, _bandwidth, \
_frameSize, _frameTime, _timeUnits, _timeStamp){} \
}; \
static MyPFactory<OpalMediaFormat>::Worker<classname> classname##Factory(_fullName, true)
#endif /* !defined AST_H323_H */

@ -1,5 +0,0 @@
{
global:
_Z11PAssertFuncPKc;
local: *;
};

@ -95,8 +95,3 @@ documentation_language = en_US ; Set the language you want documentation
;astctlowner = root
;astctlgroup = apache
;astctl = asterisk.ctl
[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6

@ -1,27 +0,0 @@
[general]
;context=default ; Context to dump call into
;bindaddr=0.0.0.0 ; Address to bind to
;externip=127.0.0.1 ; Set your external ip if you are behind a NAT.
;stunaddr=mystunserver.com ; Get your external ip from a STUN server.
; Note, if the STUN query is successful, this will
; replace any value placed in externip;
;allowguest=yes ; Allow calls from people not in list of peers
;disallow=all
;allow=gsm
;allow=ulaw
;parkinglot=soccer ; Sets the default parking lot for call parking
; Parkinglots are configured in features.conf
;[guest] ; special account for options on guest account
;disallow=all
;allow=ulaw
;context=guest
;[ogorman]
;username=ogorman@gmail.com ; username of the peer your
; calling or accepting calls from
;disallow=all
;allow=ulaw
;context=default
;connection=asterisk ; client or component in jabber.conf for the
; call to leave on.

@ -1,39 +0,0 @@
[general]
;debug=yes ; Enable debugging (disabled by default).
;autoprune=yes ; Auto remove users from buddy list. Depending on your
; setup (ie, using your personal Gtalk account for a test)
; you might lose your contacts list. Default is 'no'.
;autoregister=yes ; Auto register users from buddy list.
;collection_nodes=yes ; Enable support for XEP-0248 for use with
; distributed device state. Default is 'no'.
;pubsub_autocreate=yes ; Whether or not the PubSub server supports/is using
; auto-create for nodes. If it is, we have to
; explicitly pre-create nodes before publishing them.
; Default is 'no'.
;auth_policy=accept ; Auto accept users' subscription requests (default).
; Set to deny for auto denial.
;[asterisk]
;type=client ; Client or Component connection
;serverhost=astjab.org ; Route to server for example, talk.google.com
;pubsub_node=pubsub.astjab.org ; Node to use for publishing events via PubSub
;username=asterisk@astjab.org/asterisk ; Username with optional resource.
;secret=blah ; Password
;priority=1 ; Resource priority
;port=5222 ; Port to use defaults to 5222
;usetls=yes ; Use tls or not
;usesasl=yes ; Use sasl or not
;buddy=mogorman@astjab.org ; Manual addition of buddy to list.
; For distributed events, these buddies are
; automatically added in the whitelist as
; 'owners' of the node(s).
;distribute_events=yes ; Whether or not to distribute events using
; this connection. Default is 'no'.
;status=available ; One of: chat, available, away, xaway, or dnd
;statusmessage="I am available" ; Have custom status message for Asterisk
;timeout=5 ; Timeout (in seconds) on the message stack, defaults to 5.
; Messages stored longer than this value will be deleted by Asterisk.
; This option applies to incoming messages only, which are intended to
; be processed by the JABBER_RECEIVE dialplan function.
;sendtodialplan=yes ; Send incoming messages into the dialplan. Off by default.
;context=messages ; Dialplan context to send incoming messages to. If not set,
; "default" will be used.

@ -1,20 +0,0 @@
;[general]
;context=default ;;Context to dump call into
;bindaddr=0.0.0.0 ;;Address to bind to
;allowguest=yes ;;Allow calls from people not in
;;list of peers
;
;[guest] ;;special account for options on guest account
;disallow=all
;allow=ulaw
;context=guest
;
;[ogorman]
;username=ogorman@gmail.com ;;username of the peer your
;;calling or accepting calls from
;disallow=all
;allow=ulaw
;context=default
;connection=asterisk ;;client or component in jabber.conf
;;for the call to leave on.
;

@ -134,18 +134,6 @@ enum ast_option_flags {
extern struct ast_flags ast_options;
enum ast_compat_flags {
AST_COMPAT_DELIM_PBX_REALTIME = (1 << 0),
AST_COMPAT_DELIM_RES_AGI = (1 << 1),
AST_COMPAT_APP_SET = (1 << 2),
};
#define ast_compat_pbx_realtime ast_test_flag(&ast_compat, AST_COMPAT_DELIM_PBX_REALTIME)
#define ast_compat_res_agi ast_test_flag(&ast_compat, AST_COMPAT_DELIM_RES_AGI)
#define ast_compat_app_set ast_test_flag(&ast_compat, AST_COMPAT_APP_SET)
extern struct ast_flags ast_compat;
extern int option_verbose;
extern int ast_option_maxfiles; /*!< Max number of open file handles (files, sockets) */
extern int option_debug; /*!< Debugging */

@ -317,7 +317,6 @@ int daemon(int, int); /* defined in libresolv of all places */
/*! @{ */
struct ast_flags ast_options = { AST_DEFAULT_OPTIONS };
struct ast_flags ast_compat = { 0 };
/*! Maximum active system verbosity level. */
int ast_verb_sys_level;
@ -3646,20 +3645,7 @@ static void ast_readconfig(void)
if (!ast_opt_remote) {
pbx_live_dangerously(live_dangerously);
}
for (v = ast_variable_browse(cfg, "compat"); v; v = v->next) {
float version;
if (sscanf(v->value, "%30f", &version) != 1) {
fprintf(stderr, "Compatibility version for option '%s' is not a number: '%s'\n", v->name, v->value);
continue;
}
if (!strcasecmp(v->name, "app_set")) {
ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_APP_SET);
} else if (!strcasecmp(v->name, "res_agi")) {
ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_DELIM_RES_AGI);
} else if (!strcasecmp(v->name, "pbx_realtime")) {
ast_set2_flag(&ast_compat, version < 1.5 ? 1 : 0, AST_COMPAT_DELIM_PBX_REALTIME);
}
}
ast_config_destroy(cfg);
}

@ -11465,10 +11465,6 @@ int pbx_builtin_setvar(struct ast_channel *chan, const char *data)
{
char *name, *value, *mydata;
if (ast_compat_app_set) {
return pbx_builtin_setvar_multiple(chan, data);
}
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Set requires one variable name/value pair.\n");
return 0;

@ -303,7 +303,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCH);
if (var) {
char *tmp="";
char *appdata_tmp = "";
char *app = NULL;
struct ast_variable *v;
@ -311,31 +311,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
if (!strcasecmp(v->name, "app"))
app = ast_strdupa(v->value);
else if (!strcasecmp(v->name, "appdata")) {
if (ast_compat_pbx_realtime) {
char *ptr;
int in = 0;
tmp = ast_alloca(strlen(v->value) * 2 + 1);
for (ptr = tmp; *v->value; v->value++) {
if (*v->value == ',') {
*ptr++ = '\\';
*ptr++ = ',';
} else if (*v->value == '|' && !in) {
*ptr++ = ',';
} else {
*ptr++ = *v->value;
}
/* Don't escape '|', meaning 'or', inside expressions ($[ ]) */
if (v->value[0] == '[' && v->value[-1] == '$') {
in++;
} else if (v->value[0] == ']' && in) {
in--;
}
}
*ptr = '\0';
} else {
tmp = ast_strdupa(v->value);
}
appdata_tmp = ast_strdupa(v->value);
}
}
ast_variables_destroy(var);
@ -350,8 +326,8 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
appdata[0] = 0; /* just in case the substitute var func isn't called */
if(!ast_strlen_zero(tmp))
pbx_substitute_variables_helper(chan, tmp, appdata, sizeof(appdata) - 1);
if(!ast_strlen_zero(appdata_tmp))
pbx_substitute_variables_helper(chan, appdata_tmp, appdata, sizeof(appdata) - 1);
ast_verb(3, "Executing [%s@%s:%d] %s(\"%s\", \"%s\")\n",
ast_channel_exten(chan), ast_channel_context(chan), ast_channel_priority(chan),
term_color(tmp1, app, COLOR_BRCYAN, 0, sizeof(tmp1)),

@ -56,7 +56,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#endif
#include "asterisk/utils.h"
extern struct ast_flags ast_compat;
extern int localized_pbx_load_module(void);
static char expr_output[2096];
@ -3384,11 +3383,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
for (first = 1; first >= 0; first--) {
switch_set = new_prio();
switch_set->type = AEL_APPCALL;
if (!ast_compat_app_set) {
switch_set->app = strdup("MSet");
} else {
switch_set->app = strdup("Set");
}
switch_set->app = strdup("MSet");
/* Are we likely inside a gosub subroutine? */
if (!strcmp(mother_exten->name, "~~s~~") && first) {
/* If we're not actually within a gosub, this will fail, but the
@ -3413,11 +3408,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
for (first = 1; first >= 0; first--) {
switch_set = new_prio();
switch_set->type = AEL_APPCALL;
if (!ast_compat_app_set) {
switch_set->app = strdup("MSet");
} else {
switch_set->app = strdup("Set");
}
switch_set->app = strdup("MSet");
/* Are we likely inside a gosub subroutine? */
if (!strcmp(exten->name, "~~s~~")) {
/* If we're not actually within a gosub, this will fail, but the
@ -3453,11 +3444,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
pr = new_prio();
pr->type = AEL_APPCALL;
snprintf(buf1, BUF_SIZE, "%s=$[%s]", p->u1.str, p->u2.val);
if (!ast_compat_app_set) {
pr->app = strdup("MSet");
} else {
pr->app = strdup("Set");
}
pr->app = strdup("MSet");
remove_spaces_before_equals(buf1);
pr->appargs = strdup(buf1);
pr->origin = p;
@ -3468,11 +3455,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
pr = new_prio();
pr->type = AEL_APPCALL;
snprintf(buf1, BUF_SIZE, "LOCAL(%s)=$[%s]", p->u1.str, p->u2.val);
if (!ast_compat_app_set) {
pr->app = strdup("MSet");
} else {
pr->app = strdup("Set");
}
pr->app = strdup("MSet");
remove_spaces_before_equals(buf1);
pr->appargs = strdup(buf1);
pr->origin = p;
@ -3535,11 +3518,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
for_test->goto_false = for_end;
for_loop->type = AEL_CONTROL1; /* simple goto */
for_end->type = AEL_APPCALL;
if (!ast_compat_app_set) {
for_init->app = strdup("MSet");
} else {
for_init->app = strdup("Set");
}
for_init->app = strdup("MSet");
strcpy(buf2,p->u1.for_init);
remove_spaces_before_equals(buf2);
@ -3600,11 +3579,7 @@ static int gen_prios(struct ael_extension *exten, char *label, pval *statement,
strncat(buf2,strp2+1, BUF_SIZE-strlen(strp2+1)-2);
strcat(buf2,"]");
for_inc->appargs = strdup(buf2);
if (!ast_compat_app_set) {
for_inc->app = strdup("MSet");
} else {
for_inc->app = strdup("Set");
}
for_inc->app = strdup("MSet");
} else {
strp2 = p->u3.for_inc;
while (*strp2 && isspace(*strp2))
@ -4489,11 +4464,7 @@ int ast_compile_ael2(struct ast_context **local_contexts, struct ast_hashtab *lo
/* for each arg, set up a "Set" command */
struct ael_priority *np2 = new_prio();
np2->type = AEL_APPCALL;
if (!ast_compat_app_set) {
np2->app = strdup("MSet");
} else {
np2->app = strdup("Set");
}
np2->app = strdup("MSet");
snprintf(buf,sizeof(buf),"LOCAL(%s)=${ARG%d}", lp->u1.str, argc++);
remove_spaces_before_equals(buf);
np2->appargs = strdup(buf);

@ -2767,24 +2767,7 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
if (!(workaround = ast_test_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS))) {
ast_set_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS);
}
if (ast_compat_res_agi && argc >= 3 && !ast_strlen_zero(argv[2])) {
char *compat = ast_alloca(strlen(argv[2]) * 2 + 1), *cptr;
const char *vptr;
for (cptr = compat, vptr = argv[2]; *vptr; vptr++) {
if (*vptr == ',') {
*cptr++ = '\\';
*cptr++ = ',';
} else if (*vptr == '|') {
*cptr++ = ',';
} else {
*cptr++ = *vptr;
}
}
*cptr = '\0';
res = pbx_exec(chan, app_to_exec, compat);
} else {
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
}
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
if (!workaround) {
ast_clear_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS);
}

File diff suppressed because it is too large Load Diff

@ -98,36 +98,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
an application such as Answer() or Progress().</para>
</description>
</application>
<application name="WaitMusicOnHold" language="en_US">
<synopsis>
Wait, playing Music On Hold.
</synopsis>
<syntax>
<parameter name="delay" required="true" />
</syntax>
<description>
<para> !!! DEPRECATED. Use MusicOnHold instead !!!</para>
<para>Plays hold music specified number of seconds. Returns <literal>0</literal> when done,
or <literal>-1</literal> on hangup. If no hold music is available, the delay will still occur
with no sound.</para>
<para> !!! DEPRECATED. Use MusicOnHold instead !!!</para>
</description>
</application>
<application name="SetMusicOnHold" language="en_US">
<synopsis>
Set default Music On Hold class.
</synopsis>
<syntax>
<parameter name="class" required="yes" />
</syntax>
<description>
<para>!!! DEPRECATED. USe Set(CHANNEL(musicclass)=...) instead !!!</para>
<para>Sets the default class for music on hold for a given channel.
When music on hold is activated, this class will be used to select which
music is played.</para>
<para>!!! DEPRECATED. USe Set(CHANNEL(musicclass)=...) instead !!!</para>
</description>
</application>
<application name="StartMusicOnHold" language="en_US">
<synopsis>
Play Music On Hold.
@ -153,8 +123,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
***/
static const char play_moh[] = "MusicOnHold";
static const char wait_moh[] = "WaitMusicOnHold";
static const char set_moh[] = "SetMusicOnHold";
static const char start_moh[] = "StartMusicOnHold";
static const char stop_moh[] = "StopMusicOnHold";
@ -862,46 +830,6 @@ static int play_moh_exec(struct ast_channel *chan, const char *data)
return res;
}
static int wait_moh_exec(struct ast_channel *chan, const char *data)
{
static int deprecation_warning = 0;
int res;
if (!deprecation_warning) {
deprecation_warning = 1;
ast_log(LOG_WARNING, "WaitMusicOnHold application is deprecated and will be removed. Use MusicOnHold with duration parameter instead\n");
}
if (!data || !atoi(data)) {
ast_log(LOG_WARNING, "WaitMusicOnHold requires an argument (number of seconds to wait)\n");
return -1;
}
if (ast_moh_start(chan, NULL, NULL)) {
ast_log(LOG_WARNING, "Unable to start music on hold for %d seconds on channel %s\n", atoi(data), ast_channel_name(chan));
return 0;
}
res = ast_safe_sleep(chan, atoi(data) * 1000);
ast_moh_stop(chan);
return res;
}
static int set_moh_exec(struct ast_channel *chan, const char *data)
{
static int deprecation_warning = 0;
if (!deprecation_warning) {
deprecation_warning = 1;
ast_log(LOG_WARNING, "SetMusicOnHold application is deprecated and will be removed. Use Set(CHANNEL(musicclass)=...) instead\n");
}
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "SetMusicOnHold requires an argument (class)\n");
return -1;
}
ast_channel_musicclass_set(chan, data);
return 0;
}
static int start_moh_exec(struct ast_channel *chan, const char *data)
{
char *parse;
@ -2008,10 +1936,6 @@ static int load_module(void)
res = ast_register_application_xml(play_moh, play_moh_exec);
ast_register_atexit(ast_moh_destroy);
ast_cli_register_multiple(cli_moh, ARRAY_LEN(cli_moh));
if (!res)
res = ast_register_application_xml(wait_moh, wait_moh_exec);
if (!res)
res = ast_register_application_xml(set_moh, set_moh_exec);
if (!res)
res = ast_register_application_xml(start_moh, start_moh_exec);
if (!res)
@ -2058,8 +1982,6 @@ static int unload_module(void)
ast_moh_destroy();
res = ast_unregister_application(play_moh);
res |= ast_unregister_application(wait_moh);
res |= ast_unregister_application(set_moh);
res |= ast_unregister_application(start_moh);
res |= ast_unregister_application(stop_moh);
ast_cli_unregister_multiple(cli_moh, ARRAY_LEN(cli_moh));

@ -37,8 +37,6 @@ void ast_register_file_version(const char *file, const char *version) { }
void ast_unregister_file_version(const char *file) { }
#endif
struct ast_flags ast_compat = { 7 };
/*** MODULEINFO
<depend>res_ael_share</depend>
***/

@ -56,7 +56,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/pval.h"
#include "asterisk/extconf.h"
struct ast_flags ast_compat = { 7 };
const char *ast_config_AST_CONFIG_DIR = "/etc/asterisk"; /* placeholder */
void get_start_stop(unsigned int *word, int bitsperword, int totalbits, int *start, int *end);

Loading…
Cancel
Save